From 95c4a39b5206198dcb1038dedf86edfe4eae3ab2 Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 2 Aug 2024 00:46:27 +0800 Subject: [PATCH] Optimize loader - part 2 --- .../android/tv/ui/activity/HomeActivity.java | 2 - .../android/tv/api/config/LiveConfig.java | 13 ++--- .../android/tv/api/config/VodConfig.java | 9 +++- .../android/tv/api/loader/BaseLoader.java | 8 +-- .../android/tv/api/loader/JarLoader.java | 9 ---- .../android/tv/api/loader/JsLoader.java | 17 +------ .../java/com/fongmi/android/tv/bean/Live.java | 4 ++ .../java/com/fongmi/android/tv/bean/Site.java | 4 ++ .../android/tv/ui/activity/MainActivity.java | 2 - .../com/fongmi/quickjs/crawler/Spider.java | 51 +------------------ 10 files changed, 27 insertions(+), 92 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java index ef5d4b3dd..b79b589b1 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java @@ -30,7 +30,6 @@ import com.fongmi.android.tv.Updater; import com.fongmi.android.tv.api.config.LiveConfig; import com.fongmi.android.tv.api.config.VodConfig; import com.fongmi.android.tv.api.config.WallConfig; -import com.fongmi.android.tv.api.loader.BaseLoader; import com.fongmi.android.tv.bean.Config; import com.fongmi.android.tv.bean.Func; import com.fongmi.android.tv.bean.History; @@ -493,7 +492,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen @Override protected void onDestroy() { super.onDestroy(); - BaseLoader.get().clear(); WallConfig.get().clear(); LiveConfig.get().clear(); VodConfig.get().clear(); 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 41e99be26..f88a06fdc 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 @@ -7,7 +7,6 @@ import com.fongmi.android.tv.R; import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.api.Decoder; import com.fongmi.android.tv.api.LiveParser; -import com.fongmi.android.tv.api.loader.BaseLoader; import com.fongmi.android.tv.bean.Channel; import com.fongmi.android.tv.bean.Config; import com.fongmi.android.tv.bean.Depot; @@ -46,10 +45,6 @@ public class LiveConfig { return Loader.INSTANCE; } - public static int getCid() { - return get().getConfig().getId(); - } - public static String getUrl() { return get().getConfig().getUrl(); } @@ -162,7 +157,6 @@ public class LiveConfig { try { initLive(object); initOther(object); - BaseLoader.get().parseJar(object); } catch (Throwable e) { e.printStackTrace(); } finally { @@ -171,11 +165,13 @@ public class LiveConfig { } private void initLive(JsonObject object) { + String spider = Json.safeString(object, "spider"); for (JsonElement element : Json.safeListElement(object, "lives")) { Live live = Live.objectFrom(element); if (lives.contains(live)) continue; live.setApi(parseApi(live.getApi())); live.setExt(parseExt(live.getExt())); + live.setJar(parseJar(live, spider)); lives.add(live.sync()); } for (Live live : lives) { @@ -202,6 +198,11 @@ public class LiveConfig { return ext; } + private String parseJar(Live live, String spider) { + if (live.getJar().isEmpty() && live.getApi().startsWith("csp_")) return spider; + return live.getJar(); + } + private void bootLive() { Setting.putBootLive(false); LiveActivity.start(App.get()); 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 b9eb5f195..bf72814cd 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 @@ -105,6 +105,7 @@ public class VodConfig { this.flags.clear(); this.parses.clear(); this.loadLive = true; + BaseLoader.get().clear(); return this; } @@ -151,7 +152,6 @@ public class VodConfig { initSite(object); initParse(object); initOther(object); - BaseLoader.get().parseJar(object); if (loadLive && object.has("lives")) initLive(object); config.logo(Json.safeString(object, "logo")); config.json(object.toString()).update(); @@ -167,11 +167,13 @@ public class VodConfig { initSite(object.getAsJsonObject("video")); return; } + String spider = Json.safeString(object, "spider"); for (JsonElement element : Json.safeListElement(object, "sites")) { Site site = Site.objectFrom(element); if (sites.contains(site)) continue; site.setApi(parseApi(site.getApi())); site.setExt(parseExt(site.getExt())); + site.setJar(parseJar(site, spider)); sites.add(site.trans().sync()); } for (Site site : sites) { @@ -217,6 +219,11 @@ public class VodConfig { return ext; } + private String parseJar(Site site, String spider) { + if (site.getJar().isEmpty() && site.getApi().startsWith("csp_")) return spider; + return site.getJar(); + } + public List getDoh() { List items = Doh.get(App.get()); if (doh == null) return items; 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 3c3f7b094..eb3bee212 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 @@ -4,8 +4,6 @@ import com.fongmi.android.tv.api.config.LiveConfig; import com.fongmi.android.tv.api.config.VodConfig; import com.github.catvod.crawler.Spider; import com.github.catvod.crawler.SpiderNull; -import com.github.catvod.utils.Json; -import com.google.gson.JsonObject; import org.json.JSONObject; @@ -44,7 +42,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, jar); + else if (js) return jsLoader.getSpider(key, api, ext); else if (csp) return jarLoader.getSpider(key, api, ext, jar); else return new SpiderNull(); } @@ -77,10 +75,6 @@ public class BaseLoader { } } - public void parseJar(JsonObject object) { - jarLoader.parseJar(Json.safeString(object, "spider")); - } - public JSONObject jsonExt(String key, LinkedHashMap jxs, String url) throws Throwable { return jarLoader.jsonExt(key, jxs, url); } 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 1029f4578..6d17a9d6a 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 @@ -80,10 +80,6 @@ public class JarLoader { } } - public void parseJar(String jar) { - parseJar("", jar); - } - public void parseJar(String key, String jar) { if (loaders.containsKey(key)) return; String[] texts = jar.split(";md5;"); @@ -102,11 +98,6 @@ public class JarLoader { } } - public DexClassLoader getLoader(String key, String jar) { - if (!loaders.containsKey(key)) parseJar(key, jar); - return loaders.get(key); - } - 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 b3e4a6cec..868da1a9e 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 @@ -7,22 +7,17 @@ import com.github.catvod.crawler.SpiderNull; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import dalvik.system.DexClassLoader; - 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(); } @@ -30,18 +25,10 @@ public class JsLoader { this.recent = recent; } - private DexClassLoader dex(String key, String jar) { - try { - return jar.isEmpty() ? null : jarLoader.getLoader(key, jar); - } catch (Throwable e) { - return null; - } - } - - public Spider getSpider(String key, String api, String ext, String jar) { + public Spider getSpider(String key, String api, String ext) { try { if (spiders.containsKey(key)) return spiders.get(key); - Spider spider = new com.fongmi.quickjs.crawler.Spider(key, api, dex(key, jar)); + Spider spider = new com.fongmi.quickjs.crawler.Spider(key, api); spider.init(App.get(), ext); spiders.put(key, spider); return spider; diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Live.java b/app/src/main/java/com/fongmi/android/tv/bean/Live.java index c27d80472..c51192ea0 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Live.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Live.java @@ -175,6 +175,10 @@ public class Live { return TextUtils.isEmpty(jar) ? "" : jar; } + public void setJar(String jar) { + this.jar = jar; + } + public String getClick() { return TextUtils.isEmpty(click) ? "" : click; } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Site.java b/app/src/main/java/com/fongmi/android/tv/bean/Site.java index 1d41bff2f..25c72c3dc 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Site.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Site.java @@ -153,6 +153,10 @@ public class Site implements Parcelable { return TextUtils.isEmpty(jar) ? "" : jar; } + public void setJar(String jar) { + this.jar = jar; + } + public String getClick() { return TextUtils.isEmpty(click) ? "" : click; } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java index 353355ba5..176dc702a 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java @@ -21,7 +21,6 @@ import com.fongmi.android.tv.Updater; import com.fongmi.android.tv.api.config.LiveConfig; import com.fongmi.android.tv.api.config.VodConfig; import com.fongmi.android.tv.api.config.WallConfig; -import com.fongmi.android.tv.api.loader.BaseLoader; import com.fongmi.android.tv.bean.Config; import com.fongmi.android.tv.databinding.ActivityMainBinding; import com.fongmi.android.tv.db.AppDatabase; @@ -219,7 +218,6 @@ public class MainActivity extends BaseActivity implements NavigationBarView.OnIt @Override protected void onDestroy() { super.onDestroy(); - BaseLoader.get().clear(); WallConfig.get().clear(); LiveConfig.get().clear(); VodConfig.get().clear(); 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 a7aaa14b0..087a77534 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java @@ -14,14 +14,12 @@ 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; @@ -31,24 +29,21 @@ 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, DexClassLoader dex) throws Exception { + public Spider(String key, String api) throws Exception { this.executor = Executors.newSingleThreadExecutor(); this.key = key; this.api = api; - this.dex = dex; initializeJS(); } @@ -145,7 +140,6 @@ public class Spider extends com.github.catvod.crawler.Spider { private void initializeJS() throws Exception { submit(() -> { if (ctx == null) createCtx(); - if (dex != null) createDex(); createObj(); return null; }).get(); @@ -171,49 +165,6 @@ 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 jsEval = "__jsEvalReturn"; String spider = "__JS_SPIDER__";