From a5cc1f3d2a0a337d32c067ea4012632fc25689e4 Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 12 Jan 2026 17:53:49 +0800 Subject: [PATCH 1/5] Add proxy error log --- .../java/com/fongmi/android/tv/api/loader/JsLoader.java | 2 ++ .../java/com/fongmi/android/tv/server/process/Proxy.java | 1 + quickjs/src/main/java/com/fongmi/quickjs/utils/Module.java | 6 +++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/fongmi/android/tv/api/loader/JsLoader.java b/app/src/main/java/com/fongmi/android/tv/api/loader/JsLoader.java index bd56d75fb..ffb0dabcf 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/loader/JsLoader.java +++ b/app/src/main/java/com/fongmi/android/tv/api/loader/JsLoader.java @@ -2,6 +2,7 @@ package com.fongmi.android.tv.api.loader; import com.fongmi.android.tv.App; import com.fongmi.quickjs.crawler.Loader; +import com.fongmi.quickjs.utils.Module; import com.github.catvod.crawler.Spider; import com.github.catvod.crawler.SpiderNull; @@ -21,6 +22,7 @@ public class JsLoader { public void clear() { spiders.values().forEach(Spider::destroy); + Module.get().clear(); spiders.clear(); } diff --git a/app/src/main/java/com/fongmi/android/tv/server/process/Proxy.java b/app/src/main/java/com/fongmi/android/tv/server/process/Proxy.java index 03866d096..8ff5f6580 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/process/Proxy.java +++ b/app/src/main/java/com/fongmi/android/tv/server/process/Proxy.java @@ -31,6 +31,7 @@ public class Proxy implements Process { if (rs.length > 3 && rs[3] != null) for (Map.Entry entry : ((Map) rs[3]).entrySet()) response.addHeader(entry.getKey(), entry.getValue()); return response; } catch (Throwable e) { + e.printStackTrace(); return Nano.error(e.getMessage()); } } diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Module.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Module.java index 8e935544a..fccbb4312 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Module.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Module.java @@ -20,7 +20,7 @@ public class Module { } public Module() { - this.cache = new LruCache<>(MAX_SIZE); + cache = new LruCache<>(MAX_SIZE); } public String fetch(String name) { @@ -31,4 +31,8 @@ public class Module { else if (name.startsWith("lib/")) cache.put(name, content = Asset.read("js/" + name)); return content; } + + public void clear() { + cache.evictAll(); + } } From d3394d27a72d2aa7f2bffa16f50dfda75af2003f Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 12 Jan 2026 19:09:37 +0800 Subject: [PATCH 2/5] Clean code --- .../src/main/java/com/fongmi/quickjs/crawler/Spider.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java index a0f2b7ebe..329ccff92 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java @@ -115,8 +115,7 @@ public class Spider extends com.github.catvod.crawler.Spider { @Override public Object[] proxy(Map params) throws Exception { - if ("catvod".equals(params.get("from"))) return proxy2(params); - else return submit(() -> proxy1(params)).get(); + return "catvod".equals(params.get("from")) ? proxy2(params) : proxy1(params); } @Override @@ -205,8 +204,8 @@ public class Spider extends com.github.catvod.crawler.Spider { } private Object[] proxy1(Map params) throws Exception { - JSObject obj = JSUtil.toObject(ctx, params); - JSONArray array = new JSONArray(((JSArray) jsObject.getJSFunction("proxy").call(obj)).stringify()); + JSObject obj = submit(() -> JSUtil.toObject(ctx, params)).get(); + JSONArray array = submit(() -> new JSONArray(((JSArray) (jsObject.getJSFunction("proxy").call(obj))).stringify())).get(); Map headers = array.length() > 3 ? Json.toMap(array.optString(3)) : null; boolean base64 = array.length() > 4 && array.optInt(4) == 1; Object[] result = new Object[4]; From 35167712aac22f516a80761f8038e8de8d30368c Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 12 Jan 2026 19:11:40 +0800 Subject: [PATCH 3/5] Revert "Clean code" This reverts commit d3394d27a72d2aa7f2bffa16f50dfda75af2003f. --- .../src/main/java/com/fongmi/quickjs/crawler/Spider.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java index 329ccff92..a0f2b7ebe 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java @@ -115,7 +115,8 @@ public class Spider extends com.github.catvod.crawler.Spider { @Override public Object[] proxy(Map params) throws Exception { - return "catvod".equals(params.get("from")) ? proxy2(params) : proxy1(params); + if ("catvod".equals(params.get("from"))) return proxy2(params); + else return submit(() -> proxy1(params)).get(); } @Override @@ -204,8 +205,8 @@ public class Spider extends com.github.catvod.crawler.Spider { } private Object[] proxy1(Map params) throws Exception { - JSObject obj = submit(() -> JSUtil.toObject(ctx, params)).get(); - JSONArray array = submit(() -> new JSONArray(((JSArray) (jsObject.getJSFunction("proxy").call(obj))).stringify())).get(); + JSObject obj = JSUtil.toObject(ctx, params); + JSONArray array = new JSONArray(((JSArray) jsObject.getJSFunction("proxy").call(obj)).stringify()); Map headers = array.length() > 3 ? Json.toMap(array.optString(3)) : null; boolean base64 = array.length() > 4 && array.optInt(4) == 1; Object[] result = new Object[4]; From 6f8ec3f855357375b614d592dd34848a20081486 Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 13 Jan 2026 01:21:02 +0800 Subject: [PATCH 4/5] Fix js proxy --- .../com/fongmi/quickjs/crawler/Spider.java | 13 ++-- .../java/com/fongmi/quickjs/utils/Async.java | 59 +++++++++++++------ 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java index a0f2b7ebe..7cc23c158 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java @@ -115,8 +115,7 @@ public class Spider extends com.github.catvod.crawler.Spider { @Override public Object[] proxy(Map params) throws Exception { - if ("catvod".equals(params.get("from"))) return proxy2(params); - else return submit(() -> proxy1(params)).get(); + return "catvod".equals(params.get("from")) ? proxy2(params) : proxy1(params); } @Override @@ -205,8 +204,10 @@ public class Spider extends com.github.catvod.crawler.Spider { } private Object[] proxy1(Map params) throws Exception { - JSObject obj = JSUtil.toObject(ctx, params); - JSONArray array = new JSONArray(((JSArray) jsObject.getJSFunction("proxy").call(obj)).stringify()); + JSObject obj = submit(() -> JSUtil.toObject(ctx, params)).get(); + JSArray proxy = (JSArray) call("proxy", obj); + String json = submit(proxy::stringify).get(); + JSONArray array = new JSONArray(json); Map headers = array.length() > 3 ? Json.toMap(array.optString(3)) : null; boolean base64 = array.length() > 4 && array.optInt(4) == 1; Object[] result = new Object[4]; @@ -222,8 +223,8 @@ public class Spider extends com.github.catvod.crawler.Spider { String header = params.get("header"); JSArray array = submit(() -> JSUtil.toArray(ctx, Arrays.asList(url.split("/")))).get(); Object object = submit(() -> ctx.parse(header)).get(); - String json = (String) call("proxy", array, object); - Res res = Res.objectFrom(json); + String proxy = (String) call("proxy", array, object); + Res res = Res.objectFrom(proxy); Object[] result = new Object[3]; result[0] = res.getCode(); result[1] = res.getContentType(); diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Async.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Async.java index 79dedd352..6a617d7fb 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Async.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Async.java @@ -8,9 +8,9 @@ import java.util.concurrent.CompletableFuture; public class Async { - private final CompletableFuture future; + private CompletableFuture future; - public static CompletableFuture run(JSObject object, String name, Object[] args) { + public static CompletableFuture run(JSObject object, String name, Object... args) { return new Async().call(object, name, args); } @@ -18,13 +18,10 @@ public class Async { this.future = new CompletableFuture<>(); } - private CompletableFuture call(JSObject object, String name, Object[] args) { - JSFunction function = object.getJSFunction(name); - if (function == null) return empty(); - Object result = function.call(args); - if (result instanceof JSObject) then(result); - else future.complete(result); - function.release(); + private CompletableFuture call(JSObject object, String name, Object... args) { + JSFunction func = object.getJSFunction(name); + if (func == null) return empty(); + call(func, args); return future; } @@ -33,18 +30,44 @@ public class Async { return future; } - private void then(Object result) { - JSObject promise = (JSObject) result; + private void call(JSFunction func, Object... args) { + try { + Object result = func.call(args); + if (result instanceof JSObject) then((JSObject) result); + else future.complete(result); + } catch (Throwable e) { + future.completeExceptionally(e); + } finally { + func.release(); + } + } + + private void then(JSObject promise) { JSFunction then = promise.getJSFunction("then"); - if (then != null) then.call(callback); - if (then != null) then.release(); + if (then == null) { + future.complete(promise); + } else { + consume(then, onSuccess); + consume(promise.getJSFunction("catch"), onError); + } } - private final JSCallFunction callback = new JSCallFunction() { - @Override - public Object call(Object... args) { - future.complete(args[0]); - return null; + private void consume(JSFunction func, JSCallFunction callback) { + if (func == null) return; + try { + func.call(callback); + } finally { + func.release(); } + } + + private final JSCallFunction onSuccess = args -> { + future.complete(args != null && args.length > 0 ? args[0] : null); + return null; + }; + + private final JSCallFunction onError = args -> { + future.complete(null); + return null; }; } From e8066e85bcb6bf9741c05ffe53d9ee1751f2d8b5 Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 13 Jan 2026 01:23:22 +0800 Subject: [PATCH 5/5] Update build.gradle --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3b40753b5..59c8a2fb6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { minSdk 24 //noinspection ExpiredTargetSdkVersion targetSdk 28 - versionCode 512 - versionName "5.1.2" + versionCode 513 + versionName "5.1.3" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString(), "eventBusIndex": "com.fongmi.android.tv.event.EventIndex"]