From d121db2c7f827640113ef797eb40a747d5f0a630 Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 14 Jul 2023 09:26:55 +0800 Subject: [PATCH] js support load jar --- .../com/fongmi/android/tv/api/ApiConfig.java | 6 +-- .../com/fongmi/android/tv/api/Decoder.java | 2 +- .../com/fongmi/android/tv/api/JarLoader.java | 52 ++++++++++++------- .../com/fongmi/android/tv/api/JsLoader.java | 46 ++++------------ .../com/fongmi/android/tv/api/LiveConfig.java | 2 +- .../com/fongmi/android/tv/api/PyLoader.java | 4 +- .../com/fongmi/android/tv/bean/Channel.java | 2 +- .../com/fongmi/android/tv/bean/Parse.java | 2 +- .../com/fongmi/android/tv/bean/Result.java | 2 +- .../fongmi/android/tv/player/ParseJob.java | 10 ++-- .../java/com/github/catvod}/utils/Json.java | 2 +- drpy/src/main/java/com/hiker/drpy/Spider.java | 38 +++++++------- 12 files changed, 76 insertions(+), 92 deletions(-) rename {app/src/main/java/com/fongmi/android/tv => catvod/src/main/java/com/github/catvod}/utils/Json.java (98%) diff --git a/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java b/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java index cf5fca4f6..54261bfca 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java @@ -10,7 +10,7 @@ import com.fongmi.android.tv.bean.Parse; import com.fongmi.android.tv.bean.Rule; import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.impl.Callback; -import com.fongmi.android.tv.utils.Json; +import com.github.catvod.utils.Json; import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.Utils; import com.github.catvod.bean.Doh; @@ -260,11 +260,11 @@ public class ApiConfig { } } - public JSONObject jsonExt(String key, LinkedHashMap jxs, String url) throws Exception { + public JSONObject jsonExt(String key, LinkedHashMap jxs, String url) throws Throwable { return jarLoader.jsonExt(key, jxs, url); } - public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap> jxs, String url) throws Exception { + public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap> jxs, String url) throws Throwable { return jarLoader.jsonExtMix(flag, key, name, jxs, url); } diff --git a/app/src/main/java/com/fongmi/android/tv/api/Decoder.java b/app/src/main/java/com/fongmi/android/tv/api/Decoder.java index 78c27e8ce..b6bf158d5 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/Decoder.java +++ b/app/src/main/java/com/fongmi/android/tv/api/Decoder.java @@ -3,7 +3,7 @@ package com.fongmi.android.tv.api; import android.util.Base64; import com.fongmi.android.tv.utils.FileUtil; -import com.fongmi.android.tv.utils.Json; +import com.github.catvod.utils.Json; import com.fongmi.android.tv.utils.Utils; import com.github.catvod.net.OkHttp; import com.google.common.io.BaseEncoding; diff --git a/app/src/main/java/com/fongmi/android/tv/api/JarLoader.java b/app/src/main/java/com/fongmi/android/tv/api/JarLoader.java index 2fa3db59b..f5e682858 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/JarLoader.java +++ b/app/src/main/java/com/fongmi/android/tv/api/JarLoader.java @@ -28,36 +28,45 @@ public class JarLoader { private String recent; public JarLoader() { - this.loaders = new ConcurrentHashMap<>(); - this.methods = new ConcurrentHashMap<>(); - this.spiders = new ConcurrentHashMap<>(); + loaders = new ConcurrentHashMap<>(); + methods = new ConcurrentHashMap<>(); + spiders = new ConcurrentHashMap<>(); } public void clear() { for (Spider spider : spiders.values()) spider.destroy(); - this.loaders.clear(); - this.methods.clear(); - this.spiders.clear(); + loaders.clear(); + methods.clear(); + spiders.clear(); } public void setRecent(String recent) { this.recent = recent; } - private void load(String key, File file) throws Throwable { + private void load(String key, File file) { DexClassLoader loader = new DexClassLoader(file.getAbsolutePath(), FileUtil.getCachePath(), null, App.get().getClassLoader()); - Class classInit = loader.loadClass("com.github.catvod.spider.Init"); - Method method = classInit.getMethod("init", Context.class); - method.invoke(classInit, App.get()); loaders.put(key, loader); - putProxy(key); + setContext(key); + getProxy(key); } - private void putProxy(String key) { + private void setContext(String key) { try { - Class classProxy = loaders.get(key).loadClass("com.github.catvod.spider.Proxy"); - methods.put(key, classProxy.getMethod("proxy", Map.class)); - } catch (Exception e) { + Class clz = loaders.get(key).loadClass("com.github.catvod.spider.Init"); + Method method = clz.getMethod("init", Context.class); + method.invoke(clz, App.get()); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + private void getProxy(String key) { + try { + Class clz = loaders.get(key).loadClass("com.github.catvod.spider.Proxy"); + Method method = clz.getMethod("proxy", Map.class); + methods.put(key, method); + } catch (Throwable e) { e.printStackTrace(); } } @@ -70,7 +79,7 @@ public class JarLoader { } } - public void parseJar(String key, String jar) throws Throwable { + public void parseJar(String key, String jar) { String[] texts = jar.split(";md5;"); String md5 = !jar.startsWith("file") && texts.length > 1 ? texts[1].trim() : ""; jar = texts[0]; @@ -87,6 +96,11 @@ 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 = Utils.getMd5(jar); @@ -103,13 +117,13 @@ public class JarLoader { } } - public JSONObject jsonExt(String key, LinkedHashMap jxs, String url) throws Exception { + public JSONObject jsonExt(String key, LinkedHashMap jxs, String url) throws Throwable { Class clz = loaders.get("").loadClass("com.github.catvod.parser.Json" + key); Method method = clz.getMethod("parse", LinkedHashMap.class, String.class); return (JSONObject) method.invoke(null, jxs, url); } - public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap> jxs, String url) throws Exception { + public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap> jxs, String url) throws Throwable { Class clz = loaders.get("").loadClass("com.github.catvod.parser.Mix" + key); Method method = clz.getMethod("parse", LinkedHashMap.class, String.class, String.class, String.class); return (JSONObject) method.invoke(null, jxs, name, flag, url); @@ -120,7 +134,7 @@ public class JarLoader { Method method = methods.get(Utils.getMd5(recent)); if (method != null) return (Object[]) method.invoke(null, params); else return null; - } catch (Exception e) { + } catch (Throwable e) { e.printStackTrace(); return null; } diff --git a/app/src/main/java/com/fongmi/android/tv/api/JsLoader.java b/app/src/main/java/com/fongmi/android/tv/api/JsLoader.java index aa9891fc0..310af8773 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/JsLoader.java +++ b/app/src/main/java/com/fongmi/android/tv/api/JsLoader.java @@ -1,13 +1,9 @@ package com.fongmi.android.tv.api; import com.fongmi.android.tv.App; -import com.fongmi.android.tv.utils.FileUtil; -import com.fongmi.android.tv.utils.Utils; import com.github.catvod.crawler.Spider; import com.github.catvod.crawler.SpiderNull; -import com.github.catvod.net.OkHttp; -import java.io.File; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -16,52 +12,28 @@ 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()) spider.destroy(); - this.spiders.clear(); + jarLoader.clear(); + spiders.clear(); } public void setRecent(String recent) { this.recent = recent; } - private File download(String jar) { + private DexClassLoader dex(String key, String jar) { try { - return FileUtil.write(FileUtil.getJar(jar), OkHttp.newCall(jar).execute().body().bytes()); - } catch (Exception e) { - return FileUtil.getJar(jar); - } - } - - private File getFile(String jar) { - String[] texts = jar.split(";md5;"); - String md5 = !jar.startsWith("file") && texts.length > 1 ? texts[1].trim() : ""; - jar = texts[0]; - if (jar.startsWith("img+")) { - return Decoder.getSpider(jar, md5); - } else if (md5.length() > 0 && FileUtil.equals(jar, md5)) { - return FileUtil.getJar(jar); - } else if (jar.startsWith("http")) { - return download(jar); - } else if (jar.startsWith("file")) { - return FileUtil.getLocal(jar); - } else if (!jar.isEmpty()) { - return getFile(Utils.convert(ApiConfig.getUrl(), jar)); - } else { - return null; - } - } - - private DexClassLoader dex(String jar) { - try { - return jar.isEmpty() ? null : new DexClassLoader(getFile(jar).getAbsolutePath(), FileUtil.getCachePath(), null, App.get().getClassLoader()); - } catch (Exception e) { + return jar.isEmpty() ? null : jarLoader.getLoader(key, jar); + } catch (Throwable e) { return null; } } @@ -69,7 +41,7 @@ public class JsLoader { public Spider getSpider(String key, String api, String ext, String jar) { try { if (spiders.containsKey(key)) return spiders.get(key); - Spider spider = new com.hiker.drpy.Spider(api, dex(jar)); + Spider spider = new com.hiker.drpy.Spider(api, dex(key, jar)); spider.init(App.get(), ext); spiders.put(key, spider); return spider; @@ -84,7 +56,7 @@ public class JsLoader { Spider spider = spiders.get(recent); if (spider != null) return spider.proxyLocal(params); else return null; - } catch (Exception e) { + } catch (Throwable e) { e.printStackTrace(); return null; } diff --git a/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java b/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java index c3c13127b..fcbae5e03 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java @@ -13,7 +13,7 @@ import com.fongmi.android.tv.bean.Keep; import com.fongmi.android.tv.bean.Live; import com.fongmi.android.tv.db.AppDatabase; import com.fongmi.android.tv.impl.Callback; -import com.fongmi.android.tv.utils.Json; +import com.github.catvod.utils.Json; import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.Prefers; import com.google.gson.JsonElement; diff --git a/app/src/main/java/com/fongmi/android/tv/api/PyLoader.java b/app/src/main/java/com/fongmi/android/tv/api/PyLoader.java index 0f86d11d9..fe60008e6 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/PyLoader.java +++ b/app/src/main/java/com/fongmi/android/tv/api/PyLoader.java @@ -23,7 +23,7 @@ public class PyLoader { public void clear() { for (Spider spider : spiders.values()) spider.destroy(); - this.spiders.clear(); + spiders.clear(); } public void setRecent(String recent) { @@ -56,7 +56,7 @@ public class PyLoader { Spider spider = spiders.get(recent); if (spider != null) return spider.proxyLocal(params); else return null; - } catch (Exception e) { + } catch (Throwable e) { e.printStackTrace(); return null; } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java index 51c1c7ae1..31d817dca 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java @@ -6,7 +6,7 @@ import android.widget.ImageView; import com.fongmi.android.tv.R; import com.fongmi.android.tv.utils.ImgUtil; -import com.fongmi.android.tv.utils.Json; +import com.github.catvod.utils.Json; import com.fongmi.android.tv.utils.ResUtil; import com.google.common.net.HttpHeaders; import com.google.gson.Gson; diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Parse.java b/app/src/main/java/com/fongmi/android/tv/bean/Parse.java index 1dc181b67..695aeb885 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Parse.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Parse.java @@ -5,7 +5,7 @@ import android.text.TextUtils; import androidx.annotation.NonNull; import com.fongmi.android.tv.R; -import com.fongmi.android.tv.utils.Json; +import com.github.catvod.utils.Json; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.Utils; import com.google.gson.Gson; diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Result.java b/app/src/main/java/com/fongmi/android/tv/bean/Result.java index 7cbd97fe7..1aa5bab86 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Result.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Result.java @@ -5,7 +5,7 @@ import android.text.TextUtils; import androidx.annotation.NonNull; import com.fongmi.android.tv.gson.FilterAdapter; -import com.fongmi.android.tv.utils.Json; +import com.github.catvod.utils.Json; import com.fongmi.android.tv.utils.Trans; import com.google.gson.Gson; import com.google.gson.JsonElement; diff --git a/app/src/main/java/com/fongmi/android/tv/player/ParseJob.java b/app/src/main/java/com/fongmi/android/tv/player/ParseJob.java index 30fb725fd..9437ff6fa 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/ParseJob.java +++ b/app/src/main/java/com/fongmi/android/tv/player/ParseJob.java @@ -7,7 +7,7 @@ import com.fongmi.android.tv.bean.Parse; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.impl.ParseCallback; import com.fongmi.android.tv.ui.custom.CustomWebView; -import com.fongmi.android.tv.utils.Json; +import com.github.catvod.utils.Json; import com.fongmi.android.tv.utils.Utils; import com.github.catvod.net.OkHttp; import com.google.gson.JsonObject; @@ -71,13 +71,13 @@ public class ParseJob implements ParseCallback { return () -> { try { doInBackground(result.getKey(), result.getUrl(), result.getFlag()); - } catch (Exception e) { + } catch (Throwable e) { onParseError(); } }; } - private void doInBackground(String key, String webUrl, String flag) throws Exception { + private void doInBackground(String key, String webUrl, String flag) throws Throwable { switch (parse.getType()) { case 0: //嗅探 startWeb(key, parse, webUrl); @@ -106,13 +106,13 @@ public class ParseJob implements ParseCallback { checkResult(getHeader(object), url, item.getName(), error); } - private void jsonExtend(String webUrl) throws Exception { + private void jsonExtend(String webUrl) throws Throwable { LinkedHashMap jxs = new LinkedHashMap<>(); for (Parse item : ApiConfig.get().getParses()) if (item.getType() == 1) jxs.put(item.getName(), item.extUrl()); checkResult(Result.fromObject(ApiConfig.get().jsonExt(parse.getUrl(), jxs, webUrl))); } - private void jsonMix(String webUrl, String flag) throws Exception { + private void jsonMix(String webUrl, String flag) throws Throwable { LinkedHashMap> jxs = new LinkedHashMap<>(); for (Parse item : ApiConfig.get().getParses()) jxs.put(item.getName(), item.mixMap()); checkResult(Result.fromObject(ApiConfig.get().jsonExtMix(flag, parse.getUrl(), parse.getName(), jxs, webUrl))); diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Json.java b/catvod/src/main/java/com/github/catvod/utils/Json.java similarity index 98% rename from app/src/main/java/com/fongmi/android/tv/utils/Json.java rename to catvod/src/main/java/com/github/catvod/utils/Json.java index 7f39e426b..03ab6838b 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Json.java +++ b/catvod/src/main/java/com/github/catvod/utils/Json.java @@ -1,4 +1,4 @@ -package com.fongmi.android.tv.utils; +package com.github.catvod.utils; import com.google.gson.JsonElement; import com.google.gson.JsonObject; diff --git a/drpy/src/main/java/com/hiker/drpy/Spider.java b/drpy/src/main/java/com/hiker/drpy/Spider.java index f40f6565f..066850013 100644 --- a/drpy/src/main/java/com/hiker/drpy/Spider.java +++ b/drpy/src/main/java/com/hiker/drpy/Spider.java @@ -2,6 +2,7 @@ package com.hiker.drpy; import android.content.Context; +import com.github.catvod.utils.Json; import com.hiker.drpy.method.Global; import com.hiker.drpy.method.Local; import com.whl.quickjs.android.QuickJSLoader; @@ -128,7 +129,7 @@ public class Spider extends com.github.catvod.crawler.Spider { if (dex != null) createDex(); ctx.evaluateModule(getContent(context), api); jsObject = (JSObject) ctx.getProperty(ctx.getGlobalObject(), key); - jsObject.getJSFunction("init").call(extend); + jsObject.getJSFunction("init").call(Json.valid(extend) ? ctx.parse(extend) : extend); } private void createCtx() { @@ -140,29 +141,26 @@ public class Spider extends com.github.catvod.crawler.Spider { private void createDex() { try { - Class apiClz = dex.loadClass("com.github.catvod.js.Method"); - JSObject apiObj = ctx.getGlobalObject().getJSObject("jsapi"); - injectApi(apiClz, apiObj); - } catch (Exception e) { + JSObject obj = ctx.createNewJSObject(); + Class clz = dex.loadClass("com.github.catvod.js.Method"); + ctx.getGlobalObject().setProperty("jsapi", obj); + inject(clz, obj); + } catch (Throwable e) { e.printStackTrace(); } } - private void injectApi(Class apiClz, JSObject apiObj) throws Exception { - for (Class clz : apiClz.getDeclaredClasses()) { - Object javaObj = clz.getDeclaredConstructor(apiClz).newInstance(apiClz.getDeclaredConstructor(QuickJSContext.class).newInstance(ctx)); - JSObject clzObj = ctx.createNewJSObject(); - for (Method method : clz.getDeclaredMethods()) { - if (!method.isAnnotationPresent(JSMethod.class)) continue; - clzObj.setProperty(method.getName(), args -> { - try { - return method.invoke(javaObj, args); - } catch (Exception e) { - return null; - } - }); - } - apiObj.setProperty(clz.getSimpleName(), clzObj); + private void inject(Class clz, JSObject jsObj) throws Throwable { + Object javaObj = clz.getDeclaredConstructor(QuickJSContext.class).newInstance(ctx); + for (Method method : clz.getMethods()) { + if (!method.isAnnotationPresent(JSMethod.class)) continue; + jsObj.setProperty(method.getName(), args -> { + try { + return method.invoke(javaObj, args); + } catch (Throwable e) { + return null; + } + }); } }