diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java index 60157b119..2405631c3 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java @@ -203,8 +203,7 @@ public class LiveConfig { } private String parseJar(Live live, String spider) { - if (live.getJar().isEmpty() && live.getApi().startsWith("csp_")) return spider; - return live.getJar(); + return live.getJar().isEmpty() ? spider : live.getJar(); } private void bootLive() { diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java index f966468c3..5c1d454b6 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java @@ -208,8 +208,7 @@ public class VodConfig { } private String parseJar(Site site, String spider) { - if (site.getJar().isEmpty() && site.getApi().startsWith("csp_")) return spider; - return site.getJar(); + return site.getJar().isEmpty() ? spider : site.getJar(); } public List getDoh() { diff --git a/app/src/main/java/com/fongmi/android/tv/api/loader/BaseLoader.java b/app/src/main/java/com/fongmi/android/tv/api/loader/BaseLoader.java index ccc1f8f51..ff53ab74f 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/loader/BaseLoader.java +++ b/app/src/main/java/com/fongmi/android/tv/api/loader/BaseLoader.java @@ -45,7 +45,7 @@ public class BaseLoader { boolean py = api.contains(".py"); boolean csp = api.startsWith("csp_"); if (py) return pyLoader.getSpider(key, api, ext); - else if (js) return jsLoader.getSpider(key, api, ext); + else if (js) return jsLoader.getSpider(key, api, ext, jar); else if (csp) return jarLoader.getSpider(key, api, ext, jar); else return new SpiderNull(); } diff --git a/app/src/main/java/com/fongmi/android/tv/api/loader/JarLoader.java b/app/src/main/java/com/fongmi/android/tv/api/loader/JarLoader.java index 0672dacfb..3c4398600 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/loader/JarLoader.java +++ b/app/src/main/java/com/fongmi/android/tv/api/loader/JarLoader.java @@ -101,6 +101,17 @@ public class JarLoader { } } + public DexClassLoader getLoader(String jar) { + try { + String jaKey = Util.md5(jar); + if (!loaders.containsKey(jaKey)) parseJar(jaKey, jar); + return loaders.get(jaKey); + } catch (Throwable e) { + e.printStackTrace(); + return null; + } + } + public Spider getSpider(String key, String api, String ext, String jar) { try { String jaKey = Util.md5(jar); 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 868da1a9e..9ba45c575 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 @@ -10,14 +10,17 @@ import java.util.concurrent.ConcurrentHashMap; public class JsLoader { private final ConcurrentHashMap spiders; + private final JarLoader jarLoader; private String recent; public JsLoader() { + jarLoader = new JarLoader(); spiders = new ConcurrentHashMap<>(); } public void clear() { for (Spider spider : spiders.values()) App.execute(spider::destroy); + jarLoader.clear(); spiders.clear(); } @@ -25,10 +28,10 @@ public class JsLoader { this.recent = recent; } - public Spider getSpider(String key, String api, String ext) { + public Spider getSpider(String key, String api, String ext, String jar) { try { if (spiders.containsKey(key)) return spiders.get(key); - Spider spider = new com.fongmi.quickjs.crawler.Spider(key, api); + Spider spider = new com.fongmi.quickjs.crawler.Spider(key, api, jarLoader.getLoader(jar)); spider.init(App.get(), ext); spiders.put(key, spider); return spider; 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 c1f1b3954..9d7b8be02 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java @@ -14,12 +14,14 @@ import com.github.catvod.utils.Json; import com.github.catvod.utils.UriUtil; import com.github.catvod.utils.Util; import com.whl.quickjs.wrapper.JSArray; +import com.whl.quickjs.wrapper.JSMethod; import com.whl.quickjs.wrapper.JSObject; import com.whl.quickjs.wrapper.QuickJSContext; import org.json.JSONArray; import java.io.ByteArrayInputStream; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -29,21 +31,24 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import dalvik.system.DexClassLoader; import java9.util.concurrent.CompletableFuture; public class Spider extends com.github.catvod.crawler.Spider { private final ExecutorService executor; + private final DexClassLoader dex; private QuickJSContext ctx; private JSObject jsObject; private final String key; private final String api; private boolean cat; - public Spider(String key, String api) throws Exception { + public Spider(String key, String api, DexClassLoader dex) throws Exception { this.executor = Executors.newSingleThreadExecutor(); this.key = key; this.api = api; + this.dex = dex; initializeJS(); } @@ -146,6 +151,7 @@ public class Spider extends com.github.catvod.crawler.Spider { private void initializeJS() throws Exception { submit(() -> { createCtx(); + createDex(); createObj(); return null; }).get(); @@ -170,6 +176,49 @@ public class Spider extends com.github.catvod.crawler.Spider { }); } + private void createDex() { + try { + JSObject obj = ctx.createNewJSObject(); + Class clz = dex.loadClass("com.github.catvod.js.Method"); + Class[] classes = clz.getDeclaredClasses(); + ctx.getGlobalObject().setProperty("jsapi", obj); + if (classes.length == 0) invokeSingle(clz, obj); + if (classes.length >= 1) invokeMultiple(clz, obj); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + private void invokeSingle(Class clz, JSObject jsObj) throws Throwable { + invoke(clz, jsObj, clz.getDeclaredConstructor(QuickJSContext.class).newInstance(ctx)); + } + + private void invokeMultiple(Class clz, JSObject jsObj) throws Throwable { + for (Class subClz : clz.getDeclaredClasses()) { + Object javaObj = subClz.getDeclaredConstructor(clz).newInstance(clz.getDeclaredConstructor(QuickJSContext.class).newInstance(ctx)); + JSObject subObj = ctx.createNewJSObject(); + invoke(subClz, subObj, javaObj); + jsObj.setProperty(subClz.getSimpleName(), subObj); + } + } + + private void invoke(Class clz, JSObject jsObj, Object javaObj) { + for (Method method : clz.getMethods()) { + if (!method.isAnnotationPresent(JSMethod.class)) continue; + invoke(jsObj, method, javaObj); + } + } + + private void invoke(JSObject jsObj, Method method, Object javaObj) { + jsObj.setProperty(method.getName(), args -> { + try { + return method.invoke(javaObj, args); + } catch (Throwable e) { + return null; + } + }); + } + private void createObj() { String spider = "__JS_SPIDER__"; String global = "globalThis." + spider;