From cd7f9a437f0982b6ce6ac07bc789c504e49d9ca8 Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 13 Dec 2022 21:06:22 +0800 Subject: [PATCH] Optimize drpy --- .../com/fongmi/android/tv/api/JsLoader.java | 18 ++--- drpy/src/main/java/com/hiker/drpy/Loader.java | 22 +----- drpy/src/main/java/com/hiker/drpy/Spider.java | 72 +++++++++++++------ drpy/src/main/java/com/hiker/drpy/Worker.java | 31 -------- 4 files changed, 58 insertions(+), 85 deletions(-) delete mode 100644 drpy/src/main/java/com/hiker/drpy/Worker.java 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 606cad987..f590b327c 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,18 +1,14 @@ package com.fongmi.android.tv.api; -import android.content.Context; - import com.fongmi.android.tv.App; -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderNull; +import com.hiker.drpy.Loader; +import com.hiker.drpy.Spider; -import java.lang.reflect.Method; import java.util.concurrent.ConcurrentHashMap; public class JsLoader { private final ConcurrentHashMap spiders; - private Object loader; public JsLoader() { spiders = new ConcurrentHashMap<>(); @@ -20,14 +16,13 @@ public class JsLoader { } public void clear() { + for (Spider spider : spiders.values()) spider.destroy(); this.spiders.clear(); } private void init() { try { - loader = Class.forName("com.hiker.drpy.Loader").newInstance(); - Method method = loader.getClass().getMethod("init", Context.class); - method.invoke(loader, App.get()); + new Loader().init(App.get()); } catch (Exception e) { e.printStackTrace(); } @@ -36,14 +31,13 @@ public class JsLoader { public Spider getSpider(String key, String api, String ext) { try { if (spiders.containsKey(key)) return spiders.get(key); - Method method = loader.getClass().getMethod("spider", String.class, String.class); - Spider spider = (Spider) method.invoke(loader, api, ext); + Spider spider = new Spider(api, ext); spider.init(App.get(), ext); spiders.put(key, spider); return spider; } catch (Exception e) { e.printStackTrace(); - return new SpiderNull(); + return null; } } } diff --git a/drpy/src/main/java/com/hiker/drpy/Loader.java b/drpy/src/main/java/com/hiker/drpy/Loader.java index df4b128f7..5575792d9 100644 --- a/drpy/src/main/java/com/hiker/drpy/Loader.java +++ b/drpy/src/main/java/com/hiker/drpy/Loader.java @@ -4,17 +4,11 @@ import android.content.Context; import androidx.annotation.Keep; -import com.hiker.drpy.method.Console; -import com.hiker.drpy.method.Global; -import com.hiker.drpy.method.Local; import com.whl.quickjs.android.QuickJSLoader; import com.whl.quickjs.wrapper.JSModule; -import com.whl.quickjs.wrapper.QuickJSContext; public class Loader { - private QuickJSContext ctx; - static { QuickJSLoader.init(); } @@ -22,17 +16,11 @@ public class Loader { @Keep public void init(Context context) { setModuleLoader(context); - Worker.submit(this::initJS); } @Keep public Spider spider(String api, String ext) { - return new Spider(ctx, api, ext); - } - - @Keep - public void destroy() { - Worker.submit(() -> ctx.destroy()); + return new Spider(api, ext); } private void setModuleLoader(Context context) { @@ -48,12 +36,4 @@ public class Loader { } }); } - - private void initJS() { - ctx = QuickJSContext.create(); - ctx.getGlobalObject().setProperty("console", Console.class); - ctx.getGlobalObject().setProperty("local", Local.class); - Global.create(ctx).setProperty(); - } - } diff --git a/drpy/src/main/java/com/hiker/drpy/Spider.java b/drpy/src/main/java/com/hiker/drpy/Spider.java index 35cde5af8..8dd21dc4f 100644 --- a/drpy/src/main/java/com/hiker/drpy/Spider.java +++ b/drpy/src/main/java/com/hiker/drpy/Spider.java @@ -2,6 +2,9 @@ package com.hiker.drpy; import android.content.Context; +import com.hiker.drpy.method.Console; +import com.hiker.drpy.method.Global; +import com.hiker.drpy.method.Local; import com.whl.quickjs.wrapper.JSArray; import com.whl.quickjs.wrapper.JSObject; import com.whl.quickjs.wrapper.QuickJSContext; @@ -9,42 +12,44 @@ import com.whl.quickjs.wrapper.QuickJSContext; import java.util.HashMap; import java.util.List; import java.util.UUID; +import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; public class Spider extends com.github.catvod.crawler.Spider { - private final QuickJSContext ctx; - private JSObject jsObject; - private final String ext; + private final ExecutorService executor; private final String key; + private final String ext; private final String api; + private QuickJSContext ctx; + private JSObject jsObject; - public Spider(QuickJSContext ctx, String api, String ext) { + public Spider(String api, String ext) { + this.executor = Executors.newSingleThreadExecutor(); this.key = "__" + UUID.randomUUID().toString().replace("-", "") + "__"; - this.ctx = ctx; this.ext = ext; this.api = api; } - private String getContent(Context context) { - return Module.get().load(context, api) - .replace("export default{", "globalThis." + key + " ={") - .replace("export default {", "globalThis." + key + " ={") - .replace("__JS_SPIDER__", "globalThis." + key); + private void submit(Runnable runnable) { + executor.submit(runnable); } - @Override - public void init(Context context, String extend) throws Exception { - super.init(context, extend); - Worker.submit(() -> { - ctx.evaluateModule(getContent(context), api); - jsObject = (JSObject) ctx.getProperty(ctx.getGlobalObject(), key); - jsObject.getJSFunction("init").call(ext); - }); + private Future submit(Callable callable) { + return executor.submit(callable); } private String post(String func, Object... args) throws ExecutionException, InterruptedException { - return Worker.submit(() -> (String) jsObject.getJSFunction(func).call(args)).get(); + return submit(() -> (String) jsObject.getJSFunction(func).call(args)).get(); + } + + @Override + public void init(Context context, String extend) throws Exception { + super.init(context, extend); + submit(() -> createJS(context)); } @Override @@ -59,7 +64,7 @@ public class Spider extends com.github.catvod.crawler.Spider { @Override public String categoryContent(String tid, String pg, boolean filter, HashMap extend) throws Exception { - JSObject obj = Worker.submit(() -> convert(extend)).get(); + JSObject obj = submit(() -> convert(extend)).get(); return post("category", tid, pg, filter, obj); } @@ -75,10 +80,35 @@ public class Spider extends com.github.catvod.crawler.Spider { @Override public String playerContent(String flag, String id, List vipFlags) throws Exception { - JSArray array = Worker.submit(() -> convert(vipFlags)).get(); + JSArray array = submit(() -> convert(vipFlags)).get(); return post("play", flag, id, array); } + public void destroy() { + submit(() -> ctx.destroy()); + } + + private void createJS(Context context) { + if (jsObject == null) setProperty(); + ctx.evaluateModule(getContent(context), api); + jsObject = (JSObject) ctx.getProperty(ctx.getGlobalObject(), key); + jsObject.getJSFunction("init").call(ext); + } + + private void setProperty() { + ctx = QuickJSContext.create(); + ctx.getGlobalObject().setProperty("console", Console.class); + ctx.getGlobalObject().setProperty("local", Local.class); + Global.create(ctx).setProperty(); + } + + private String getContent(Context context) { + return Module.get().load(context, api) + .replace("export default{", "globalThis." + key + " ={") + .replace("export default {", "globalThis." + key + " ={") + .replace("__JS_SPIDER__", "globalThis." + key); + } + private JSObject convert(HashMap map) { JSObject obj = ctx.createNewJSObject(); if (map == null || map.isEmpty()) return obj; diff --git a/drpy/src/main/java/com/hiker/drpy/Worker.java b/drpy/src/main/java/com/hiker/drpy/Worker.java deleted file mode 100644 index c5c1fce49..000000000 --- a/drpy/src/main/java/com/hiker/drpy/Worker.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.hiker.drpy; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -public class Worker { - - private final ExecutorService executor; - - private static class Loader { - static volatile Worker INSTANCE = new Worker(); - } - - private static Worker get() { - return Loader.INSTANCE; - } - - public Worker() { - executor = Executors.newSingleThreadExecutor(); - } - - public static void submit(Runnable runnable) { - get().executor.submit(runnable); - } - - public static Future submit(Callable callable) { - return get().executor.submit(callable); - } -}