Optimize drpy

pull/123/head
FongMi 3 years ago
parent 5c5b6a7831
commit cd7f9a437f
  1. 18
      app/src/main/java/com/fongmi/android/tv/api/JsLoader.java
  2. 22
      drpy/src/main/java/com/hiker/drpy/Loader.java
  3. 72
      drpy/src/main/java/com/hiker/drpy/Spider.java
  4. 31
      drpy/src/main/java/com/hiker/drpy/Worker.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<String, Spider> 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;
}
}
}

@ -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();
}
}

@ -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 <T> Future<T> submit(Callable<T> 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<String, String> 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<String> 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<String, String> map) {
JSObject obj = ctx.createNewJSObject();
if (map == null || map.isEmpty()) return obj;

@ -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 <T> Future<T> submit(Callable<T> callable) {
return get().executor.submit(callable);
}
}
Loading…
Cancel
Save