diff --git a/quickjs/src/main/assets/js/lib/http.js b/quickjs/src/main/assets/js/lib/http.js new file mode 100644 index 000000000..2cce4bd95 --- /dev/null +++ b/quickjs/src/main/assets/js/lib/http.js @@ -0,0 +1,17 @@ +let req = (url, options) => http(url, Object.assign({ + async: false +}, options)); + +function http(url, options = {}) { + if (options?.async === false) return _http(url, options) + return new Promise(resolve => _http(url, Object.assign({ + complete: res => resolve(res) + }, options))).catch(err => { + console.error(err.name, err.message, err.stack) + return { + ok: false, + status: 500, + url + } + }) +} \ No newline at end of file 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 720d7fcf9..090b7fa10 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java @@ -10,6 +10,7 @@ import com.fongmi.quickjs.method.Local; import com.fongmi.quickjs.utils.JSUtil; import com.fongmi.quickjs.utils.Module; import com.github.catvod.utils.Json; +import com.github.catvod.utils.Path; import com.whl.quickjs.android.QuickJSLoader; import com.whl.quickjs.wrapper.JSArray; import com.whl.quickjs.wrapper.JSMethod; @@ -57,8 +58,8 @@ public class Spider extends com.github.catvod.crawler.Spider { return executor.submit(callable); } - private Object[] call(String func, Object... args) throws Exception { - return submit(Function.call(jsObject, func, args)).get(); + private Object call(String func, Object... args) throws Exception { + return executor.submit((Function.call(jsObject, func, args))).get(); } @Override @@ -68,49 +69,49 @@ public class Spider extends com.github.catvod.crawler.Spider { @Override public String homeContent(boolean filter) throws Exception { - return (String) call("home", filter)[0]; + return (String) call("home", filter); } @Override public String homeVideoContent() throws Exception { - return (String) call("homeVod")[0]; + return (String) call("homeVod"); } @Override public String categoryContent(String tid, String pg, boolean filter, HashMap extend) throws Exception { JSObject obj = submit(() -> JSUtil.toObj(ctx, extend)).get(); - return (String) call("category", tid, pg, filter, obj)[0]; + return (String) call("category", tid, pg, filter, obj); } @Override public String detailContent(List ids) throws Exception { - return (String) call("detail", ids.get(0))[0]; + return (String) call("detail", ids.get(0)); } @Override public String searchContent(String key, boolean quick) throws Exception { - return (String) call("search", key, quick)[0]; + return (String) call("search", key, quick); } @Override public String searchContent(String key, boolean quick, String pg) throws Exception { - return (String) call("search", key, quick, pg)[0]; + return (String) call("search", key, quick, pg); } @Override public String playerContent(String flag, String id, List vipFlags) throws Exception { JSArray array = submit(() -> JSUtil.toArray(ctx, vipFlags)).get(); - return (String) call("play", flag, id, array)[0]; + return (String) call("play", flag, id, array); } @Override public boolean manualVideoCheck() throws Exception { - return (Boolean) call("sniffer")[0]; + return (Boolean) call("sniffer"); } @Override public boolean isVideoFormat(String url) throws Exception { - return (Boolean) call("isVideo", url)[0]; + return (Boolean) call("isVideo", url); } @Override @@ -142,6 +143,7 @@ public class Spider extends com.github.catvod.crawler.Spider { QuickJSLoader.initConsoleLog(ctx); Global.create(ctx, executor).setProperty(); ctx.getGlobalObject().setProperty("local", Local.class); + ctx.getGlobalObject().getContext().evaluate(Path.asset("js/lib/http.js")); } private void createDex() { @@ -191,6 +193,7 @@ public class Spider extends com.github.catvod.crawler.Spider { String global = "globalThis." + key; String content = Module.get().load(api); if (content.contains("__jsEvalReturn")) { + ctx.evaluate("req = http"); return content.concat(global).concat(" = __jsEvalReturn()"); } else if (content.contains("__JS_SPIDER__")) { return content.replace("__JS_SPIDER__", global); @@ -214,7 +217,7 @@ 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)[0]; + String json = (String) call("proxy", array, object); Res res = Res.objectFrom(json); Object[] result = new Object[3]; result[0] = 200; diff --git a/quickjs/src/main/java/com/fongmi/quickjs/method/Function.java b/quickjs/src/main/java/com/fongmi/quickjs/method/Function.java index 63a2303d4..68bf53dac 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/method/Function.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/method/Function.java @@ -6,7 +6,7 @@ import com.whl.quickjs.wrapper.JSObject; import java.util.concurrent.Callable; -public class Function implements Callable { +public class Function implements Callable { private final JSObject jsObject; private final Object[] args; @@ -24,14 +24,13 @@ public class Function implements Callable { } @Override - public Object[] call() throws Exception { + public Object call() throws Exception { result = jsObject.getJSFunction(name).call(args); - boolean jsObj = result instanceof JSObject; - if (!jsObj) return new Object[]{result}; + if (!(result instanceof JSObject)) return result; JSObject promise = (JSObject) result; JSFunction then = promise.getJSFunction("then"); if (then != null) then.call(jsCallFunction); - return new Object[]{result}; + return result; } private final JSCallFunction jsCallFunction = new JSCallFunction() { diff --git a/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java b/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java index a4cc90189..2d4408b6e 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java @@ -87,7 +87,7 @@ public class Global { @Keep @JSMethod - public JSObject _http(String url, JSObject options) throws IOException { + public JSObject _http(String url, JSObject options) { JSFunction complete = options.getJSFunction("complete"); if (complete == null) return req(url, options); Req req = Req.objectFrom(ctx.stringify(options)); @@ -97,10 +97,14 @@ public class Global { @Keep @JSMethod - public JSObject req(String url, JSObject options) throws IOException { - Req req = Req.objectFrom(ctx.stringify(options)); - Response res = Connect.to(url, req).execute(); - return Connect.success(ctx, req, res); + public JSObject req(String url, JSObject options) { + try { + Req req = Req.objectFrom(ctx.stringify(options)); + Response res = Connect.to(url, req).execute(); + return Connect.success(ctx, req, res); + } catch (Exception e) { + return Connect.error(ctx); + } } @Keep @@ -177,16 +181,12 @@ public class Global { return new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response res) { - executor.submit(() -> { - complete.call(Connect.success(ctx, req, res)); - }); + if (!executor.isShutdown()) executor.submit(() -> {complete.call(Connect.success(ctx, req, res));}); } @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { - executor.submit(() -> { - complete.call(Connect.error(ctx)); - }); + if (!executor.isShutdown()) executor.submit(() -> {complete.call(Connect.error(ctx));}); } }; } @@ -195,9 +195,7 @@ public class Global { timer.schedule(new TimerTask() { @Override public void run() { - if (!executor.isShutdown()) executor.submit(() -> { - func.call(); - }); + if (!executor.isShutdown()) executor.submit(() -> {func.call();}); } }, delay); }