pull/585/head
FongMi 12 months ago
parent 3c5c7b1fb8
commit 8eef3a327b
  1. 3
      app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java
  2. 3
      app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java
  3. 2
      app/src/main/java/com/fongmi/android/tv/api/loader/BaseLoader.java
  4. 11
      app/src/main/java/com/fongmi/android/tv/api/loader/JarLoader.java
  5. 7
      app/src/main/java/com/fongmi/android/tv/api/loader/JsLoader.java
  6. 51
      quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.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() {

@ -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<Doh> getDoh() {

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

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

@ -10,14 +10,17 @@ import java.util.concurrent.ConcurrentHashMap;
public class JsLoader {
private final ConcurrentHashMap<String, Spider> 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;

@ -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;

Loading…
Cancel
Save