Optimize loader - part 2

release
FongMi 2 years ago
parent 89bc6b3326
commit 95c4a39b52
  1. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java
  2. 13
      app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java
  3. 9
      app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java
  4. 8
      app/src/main/java/com/fongmi/android/tv/api/loader/BaseLoader.java
  5. 9
      app/src/main/java/com/fongmi/android/tv/api/loader/JarLoader.java
  6. 17
      app/src/main/java/com/fongmi/android/tv/api/loader/JsLoader.java
  7. 4
      app/src/main/java/com/fongmi/android/tv/bean/Live.java
  8. 4
      app/src/main/java/com/fongmi/android/tv/bean/Site.java
  9. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java
  10. 51
      quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.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();

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

@ -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<Doh> getDoh() {
List<Doh> items = Doh.get(App.get());
if (doh == null) return items;

@ -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<String, String> jxs, String url) throws Throwable {
return jarLoader.jsonExt(key, jxs, url);
}

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

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

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

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

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

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

Loading…
Cancel
Save