Optimize loader

pull/563/head
okjack 2 years ago
parent 8ff7be729f
commit eb100f385a
  1. 5
      app/src/main/java/com/fongmi/android/tv/api/LiveParser.java
  2. 47
      app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java
  3. 62
      app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java
  4. 85
      app/src/main/java/com/fongmi/android/tv/api/loader/BaseLoader.java
  5. 7
      app/src/main/java/com/fongmi/android/tv/api/loader/JarLoader.java
  6. 31
      app/src/main/java/com/fongmi/android/tv/api/loader/JsLoader.java
  7. 14
      app/src/main/java/com/fongmi/android/tv/api/loader/PyLoader.java
  8. 15
      app/src/main/java/com/fongmi/android/tv/bean/Live.java
  9. 15
      app/src/main/java/com/fongmi/android/tv/bean/Site.java
  10. 3
      app/src/main/java/com/fongmi/android/tv/model/LiveViewModel.java
  11. 18
      app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java
  12. 7
      app/src/main/java/com/fongmi/android/tv/player/ParseJob.java
  13. 4
      app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java
  14. 51
      quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java

@ -4,7 +4,6 @@ import android.util.Base64;
import androidx.media3.common.MimeTypes;
import com.fongmi.android.tv.api.config.LiveConfig;
import com.fongmi.android.tv.bean.Catchup;
import com.fongmi.android.tv.bean.Channel;
import com.fongmi.android.tv.bean.ClearKey;
@ -13,7 +12,6 @@ import com.fongmi.android.tv.bean.Group;
import com.fongmi.android.tv.bean.Live;
import com.fongmi.android.tv.player.Players;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.crawler.Spider;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Json;
import com.github.catvod.utils.Path;
@ -71,8 +69,7 @@ public class LiveParser {
}
private static void spider(Live live, String text) throws Exception {
Spider spider = LiveConfig.get().getSpider(live);
if (text.isEmpty()) text = spider.liveContent();
if (text.isEmpty()) text = live.spider().liveContent();
if (Json.valid(text)) json(live, text);
else text(live, text);
}

@ -7,9 +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.JarLoader;
import com.fongmi.android.tv.api.loader.JsLoader;
import com.fongmi.android.tv.api.loader.PyLoader;
import com.fongmi.android.tv.bean.Channel;
import com.fongmi.android.tv.bean.Config;
import com.fongmi.android.tv.bean.Depot;
@ -22,8 +19,6 @@ import com.fongmi.android.tv.impl.Callback;
import com.fongmi.android.tv.ui.activity.LiveActivity;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderNull;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Json;
import com.google.gson.JsonElement;
@ -32,16 +27,12 @@ import com.google.gson.JsonObject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class LiveConfig {
private List<Live> lives;
private List<Rule> rules;
private List<String> ads;
private JarLoader jarLoader;
private PyLoader pyLoader;
private JsLoader jsLoader;
private Config config;
private boolean sync;
private Live home;
@ -91,9 +82,6 @@ public class LiveConfig {
this.ads = new ArrayList<>();
this.rules = new ArrayList<>();
this.lives = new ArrayList<>();
this.jarLoader = new JarLoader();
this.pyLoader = new PyLoader();
this.jsLoader = new JsLoader();
return config(Config.live());
}
@ -109,9 +97,6 @@ public class LiveConfig {
this.ads.clear();
this.rules.clear();
this.lives.clear();
this.jarLoader.clear();
this.pyLoader.clear();
this.jsLoader.clear();
return this;
}
@ -180,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) {
@ -211,33 +198,9 @@ public class LiveConfig {
return ext;
}
public Spider getSpider(Live live) {
boolean js = live.getApi().contains(".js");
boolean py = live.getApi().contains(".py");
boolean csp = live.getApi().startsWith("csp_");
if (py) return pyLoader.getSpider(live.getName(), live.getApi(), live.getExt());
else if (js) return jsLoader.getSpider(live.getName(), live.getApi(), live.getExt(), live.getJar());
else if (csp) return jarLoader.getSpider(live.getName(), live.getApi(), live.getExt(), live.getJar());
else return new SpiderNull();
}
public void setRecent(Live live) {
boolean js = live.getApi().contains(".js");
boolean py = live.getApi().contains(".py");
boolean csp = live.getApi().startsWith("csp_");
if (js) jsLoader.setRecent(live.getName());
else if (py) pyLoader.setRecent(live.getName());
else if (csp) jarLoader.setRecent(live.getJar());
}
public Object[] proxyLocal(Map<String, String> params) {
if ("js".equals(params.get("do"))) {
return jsLoader.proxyInvoke(params);
} else if ("py".equals(params.get("do"))) {
return pyLoader.proxyInvoke(params);
} else {
return jarLoader.proxyInvoke(params);
}
private String parseJar(Live live, String spider) {
if (live.getJar().isEmpty() && live.getApi().startsWith("csp_")) return spider;
return live.getJar();
}
private void bootLive() {

@ -5,9 +5,7 @@ import android.text.TextUtils;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.api.Decoder;
import com.fongmi.android.tv.api.loader.JarLoader;
import com.fongmi.android.tv.api.loader.JsLoader;
import com.fongmi.android.tv.api.loader.PyLoader;
import com.fongmi.android.tv.api.loader.BaseLoader;
import com.fongmi.android.tv.bean.Config;
import com.fongmi.android.tv.bean.Depot;
import com.fongmi.android.tv.bean.Parse;
@ -17,21 +15,14 @@ import com.fongmi.android.tv.impl.Callback;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.bean.Doh;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderNull;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Json;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class VodConfig {
@ -41,9 +32,6 @@ public class VodConfig {
private List<Parse> parses;
private List<String> flags;
private List<String> ads;
private JarLoader jarLoader;
private PyLoader pyLoader;
private JsLoader jsLoader;
private boolean loadLive;
private Config config;
private Parse parse;
@ -97,9 +85,6 @@ public class VodConfig {
this.sites = new ArrayList<>();
this.flags = new ArrayList<>();
this.parses = new ArrayList<>();
this.jarLoader = new JarLoader();
this.pyLoader = new PyLoader();
this.jsLoader = new JsLoader();
this.loadLive = false;
return this;
}
@ -119,10 +104,8 @@ public class VodConfig {
this.sites.clear();
this.flags.clear();
this.parses.clear();
this.jarLoader.clear();
this.pyLoader.clear();
this.jsLoader.clear();
this.loadLive = true;
BaseLoader.get().clear();
return this;
}
@ -180,7 +163,6 @@ public class VodConfig {
initParse(object);
initOther(object);
if (loadLive && object.has("lives")) initLive(object);
jarLoader.parseJar("", Json.safeString(object, "spider"));
config.logo(Json.safeString(object, "logo"));
config.json(object.toString()).update();
App.post(callback::success);
@ -195,11 +177,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) {
@ -245,41 +229,9 @@ public class VodConfig {
return ext;
}
public Spider getSpider(Site site) {
boolean js = site.getApi().contains(".js");
boolean py = site.getApi().contains(".py");
boolean csp = site.getApi().startsWith("csp_");
if (py) return pyLoader.getSpider(site.getKey(), site.getApi(), site.getExt());
else if (js) return jsLoader.getSpider(site.getKey(), site.getApi(), site.getExt(), site.getJar());
else if (csp) return jarLoader.getSpider(site.getKey(), site.getApi(), site.getExt(), site.getJar());
else return new SpiderNull();
}
public void setRecent(Site site) {
boolean js = site.getApi().contains(".js");
boolean py = site.getApi().contains(".py");
boolean csp = site.getApi().startsWith("csp_");
if (js) jsLoader.setRecent(site.getKey());
else if (py) pyLoader.setRecent(site.getKey());
else if (csp) jarLoader.setRecent(site.getJar());
}
public Object[] proxyLocal(Map<String, String> params) {
if ("js".equals(params.get("do"))) {
return jsLoader.proxyInvoke(params);
} else if ("py".equals(params.get("do"))) {
return pyLoader.proxyInvoke(params);
} else {
return jarLoader.proxyInvoke(params);
}
}
public JSONObject jsonExt(String key, LinkedHashMap<String, String> jxs, String url) throws Throwable {
return jarLoader.jsonExt(key, jxs, url);
}
public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap<String, HashMap<String, String>> jxs, String url) throws Throwable {
return jarLoader.jsonExtMix(flag, key, name, jxs, url);
private String parseJar(Site site, String spider) {
if (site.getJar().isEmpty() && site.getApi().startsWith("csp_")) return spider;
return site.getJar();
}
public List<Doh> getDoh() {

@ -0,0 +1,85 @@
package com.fongmi.android.tv.api.loader;
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 org.json.JSONObject;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class BaseLoader {
private final JarLoader jarLoader;
private final PyLoader pyLoader;
private final JsLoader jsLoader;
private static class Loader {
static volatile BaseLoader INSTANCE = new BaseLoader();
}
public static BaseLoader get() {
return Loader.INSTANCE;
}
private BaseLoader() {
this.jarLoader = new JarLoader();
this.pyLoader = new PyLoader();
this.jsLoader = new JsLoader();
}
public void clear() {
this.jarLoader.clear();
this.pyLoader.clear();
this.jsLoader.clear();
}
public Spider getSpider(String key, String api, String ext, String jar) {
boolean js = api.contains(".js");
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 (csp) return jarLoader.getSpider(key, api, ext, jar);
else return new SpiderNull();
}
public Spider getSpider(Map<String, String> params) {
if (!params.containsKey("siteKey")) return new SpiderNull();
boolean live = params.containsKey("live") && "true".equals(params.get("live"));
boolean vod = !params.containsKey("live") || "false".equals(params.get("live"));
if (live) return LiveConfig.get().getLive(params.get("siteKey")).spider();
if (vod) return VodConfig.get().getSite(params.get("siteKey")).spider();
return new SpiderNull();
}
public void setRecent(String key, String api, String jar) {
boolean js = api.contains(".js");
boolean py = api.contains(".py");
boolean csp = api.startsWith("csp_");
if (js) jsLoader.setRecent(key);
else if (py) pyLoader.setRecent(key);
else if (csp) jarLoader.setRecent(jar);
}
public Object[] proxyLocal(Map<String, String> params) {
if ("js".equals(params.get("do"))) {
return jsLoader.proxyInvoke(params);
} else if ("py".equals(params.get("do"))) {
return pyLoader.proxyInvoke(params);
} else {
return jarLoader.proxyInvoke(params);
}
}
public JSONObject jsonExt(String key, LinkedHashMap<String, String> jxs, String url) throws Throwable {
return jarLoader.jsonExt(key, jxs, url);
}
public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap<String, HashMap<String, String>> jxs, String url) throws Throwable {
return jarLoader.jsonExtMix(flag, key, name, jxs, url);
}
}

@ -80,7 +80,7 @@ public class JarLoader {
}
}
public void parseJar(String key, String jar) {
public synchronized void parseJar(String key, String jar) {
if (loaders.containsKey(key)) return;
String[] texts = jar.split(";md5;");
String md5 = texts.length > 1 ? texts[1].trim() : "";
@ -100,11 +100,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);

@ -1,30 +1,23 @@
package com.fongmi.android.tv.api.loader;
import com.fongmi.android.tv.App;
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 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();
}
@ -32,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;
@ -53,18 +38,10 @@ public class JsLoader {
}
}
private Spider find(Map<String, String> params) {
if (!params.containsKey("siteKey")) return spiders.get(recent);
boolean live = params.containsKey("live") && "true".equals(params.get("live"));
boolean vod = !params.containsKey("live") || "false".equals(params.get("live"));
if (vod) return VodConfig.get().getSpider(VodConfig.get().getSite(params.get("siteKey")));
if (live) return LiveConfig.get().getSpider(LiveConfig.get().getLive(params.get("siteKey")));
return new SpiderNull();
}
public Object[] proxyInvoke(Map<String, String> params) {
try {
return find(params).proxyLocal(params);
if (!params.containsKey("siteKey")) return spiders.get(recent).proxyLocal(params);
return BaseLoader.get().getSpider(params).proxyLocal(params);
} catch (Throwable e) {
e.printStackTrace();
return null;

@ -3,8 +3,6 @@ package com.fongmi.android.tv.api.loader;
import android.content.Context;
import com.fongmi.android.tv.App;
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;
@ -53,18 +51,10 @@ public class PyLoader {
}
}
private Spider find(Map<String, String> params) {
if (!params.containsKey("siteKey")) return spiders.get(recent);
boolean live = params.containsKey("live") && "true".equals(params.get("live"));
boolean vod = !params.containsKey("live") || "false".equals(params.get("live"));
if (vod) return VodConfig.get().getSpider(VodConfig.get().getSite(params.get("siteKey")));
if (live) return LiveConfig.get().getSpider(LiveConfig.get().getLive(params.get("siteKey")));
return new SpiderNull();
}
public Object[] proxyInvoke(Map<String, String> params) {
try {
return find(params).proxyLocal(params);
if (!params.containsKey("siteKey")) return spiders.get(recent).proxyLocal(params);
return BaseLoader.get().getSpider(params).proxyLocal(params);
} catch (Throwable e) {
e.printStackTrace();
return null;

@ -11,8 +11,10 @@ import androidx.room.PrimaryKey;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.Constant;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.api.loader.BaseLoader;
import com.fongmi.android.tv.db.AppDatabase;
import com.fongmi.android.tv.gson.ExtAdapter;
import com.github.catvod.crawler.Spider;
import com.github.catvod.utils.Json;
import com.google.common.net.HttpHeaders;
import com.google.gson.JsonElement;
@ -177,6 +179,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;
}
@ -306,6 +312,15 @@ public class Live {
return this;
}
public Live recent() {
BaseLoader.get().setRecent(getName(), getApi(), getJar());
return this;
}
public Spider spider() {
return BaseLoader.get().getSpider(getName(), getApi(), getExt(), getJar());
}
public Map<String, String> getHeaders() {
Map<String, String> headers = Json.toMap(getHeader());
if (!getUa().isEmpty()) headers.put(HttpHeaders.USER_AGENT, getUa());

@ -12,8 +12,10 @@ import androidx.room.PrimaryKey;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.Constant;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.api.loader.BaseLoader;
import com.fongmi.android.tv.db.AppDatabase;
import com.fongmi.android.tv.gson.ExtAdapter;
import com.github.catvod.crawler.Spider;
import com.github.catvod.utils.Json;
import com.github.catvod.utils.Trans;
import com.google.gson.JsonElement;
@ -156,6 +158,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;
}
@ -275,6 +281,15 @@ public class Site implements Parcelable {
return this;
}
public Site recent() {
BaseLoader.get().setRecent(getKey(), getApi(), getJar());
return this;
}
public Spider spider() {
return BaseLoader.get().getSpider(getKey(), getApi(), getExt(), getJar());
}
public static Site find(String key) {
return AppDatabase.get().getSiteDao().find(key);
}

@ -60,9 +60,8 @@ public class LiveViewModel extends ViewModel {
public void getLive(Live item) {
execute(LIVE, () -> {
LiveConfig.get().setRecent(item);
LiveParser.start(item.recent());
setTimeZone(item.getEpg());
LiveParser.start(item);
verify(item);
return item;
});

@ -72,10 +72,9 @@ public class SiteViewModel extends ViewModel {
execute(result, () -> {
Site site = VodConfig.get().getHome();
if (site.getType() == 3) {
Spider spider = VodConfig.get().getSpider(site);
Spider spider = site.recent().spider();
String homeContent = spider.homeContent(true);
SpiderDebug.log(homeContent);
VodConfig.get().setRecent(site);
Result result = Result.fromJson(homeContent);
if (result.getList().size() > 0) return result;
String homeVideoContent = spider.homeVideoContent();
@ -100,10 +99,9 @@ public class SiteViewModel extends ViewModel {
execute(result, () -> {
Site site = VodConfig.get().getSite(key);
if (site.getType() == 3) {
Spider spider = VodConfig.get().getSpider(site);
Spider spider = site.recent().spider();
String categoryContent = spider.categoryContent(tid, page, filter, extend);
SpiderDebug.log(categoryContent);
VodConfig.get().setRecent(site);
return Result.fromJson(categoryContent);
} else {
ArrayMap<String, String> params = new ArrayMap<>();
@ -123,10 +121,9 @@ public class SiteViewModel extends ViewModel {
execute(result, () -> {
Site site = VodConfig.get().getSite(key);
if (site.getType() == 3) {
Spider spider = VodConfig.get().getSpider(site);
Spider spider = site.recent().spider();
String detailContent = spider.detailContent(Arrays.asList(id));
SpiderDebug.log(detailContent);
VodConfig.get().setRecent(site);
Result result = Result.fromJson(detailContent);
if (!result.getList().isEmpty()) result.getList().get(0).setVodFlags();
if (!result.getList().isEmpty()) Source.get().parse(result.getList().get(0).getVodFlags());
@ -158,10 +155,9 @@ public class SiteViewModel extends ViewModel {
Source.get().stop();
Site site = VodConfig.get().getSite(key);
if (site.getType() == 3) {
Spider spider = VodConfig.get().getSpider(site);
Spider spider = site.recent().spider();
String playerContent = spider.playerContent(flag, id, VodConfig.get().getFlags());
SpiderDebug.log(playerContent);
VodConfig.get().setRecent(site);
Result result = Result.fromJson(playerContent);
if (result.getFlag().isEmpty()) result.setFlag(flag);
result.setUrl(Source.get().fetch(result));
@ -213,8 +209,7 @@ public class SiteViewModel extends ViewModel {
public void searchContent(Site site, String keyword, boolean quick) throws Throwable {
if (site.getType() == 3) {
Spider spider = VodConfig.get().getSpider(site);
String searchContent = spider.searchContent(Trans.t2s(keyword), quick);
String searchContent = site.spider().searchContent(Trans.t2s(keyword), quick);
SpiderDebug.log(site.getName() + "," + searchContent);
post(site, Result.fromJson(searchContent));
} else {
@ -230,8 +225,7 @@ public class SiteViewModel extends ViewModel {
public void searchContent(Site site, String keyword, String page) {
execute(result, () -> {
if (site.getType() == 3) {
Spider spider = VodConfig.get().getSpider(site);
String searchContent = spider.searchContent(Trans.t2s(keyword), false, page);
String searchContent = site.spider().searchContent(Trans.t2s(keyword), false, page);
SpiderDebug.log(site.getName() + "," + searchContent);
Result result = Result.fromJson(searchContent);
for (Vod vod : result.getList()) vod.setSite(site);

@ -5,6 +5,7 @@ import android.text.TextUtils;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.Constant;
import com.fongmi.android.tv.api.config.VodConfig;
import com.fongmi.android.tv.api.loader.BaseLoader;
import com.fongmi.android.tv.bean.Parse;
import com.fongmi.android.tv.bean.Result;
import com.fongmi.android.tv.impl.ParseCallback;
@ -120,13 +121,13 @@ public class ParseJob implements ParseCallback {
private void jsonExtend(String webUrl) throws Throwable {
LinkedHashMap<String, String> jxs = new LinkedHashMap<>();
for (Parse item : VodConfig.get().getParses()) if (item.getType() == 1) jxs.put(item.getName(), item.extUrl());
checkResult(Result.fromObject(VodConfig.get().jsonExt(parse.getUrl(), jxs, webUrl)));
checkResult(Result.fromObject(BaseLoader.get().jsonExt(parse.getUrl(), jxs, webUrl)));
}
private void jsonMix(String webUrl, String flag) throws Throwable {
LinkedHashMap<String, HashMap<String, String>> jxs = new LinkedHashMap<>();
for (Parse item : VodConfig.get().getParses()) jxs.put(item.getName(), item.mixMap());
checkResult(Result.fromObject(VodConfig.get().jsonExtMix(flag, parse.getUrl(), parse.getName(), jxs, webUrl)));
checkResult(Result.fromObject(BaseLoader.get().jsonExtMix(flag, parse.getUrl(), parse.getName(), jxs, webUrl)));
}
private void godParse(String webUrl, String flag) throws Exception {
@ -191,7 +192,7 @@ public class ParseJob implements ParseCallback {
private Map<String, String> getHeader(JsonObject object) {
Map<String, String> headers = new HashMap<>();
for (Map.Entry<String, JsonElement> entry : object.entrySet()) if (entry.getKey().equalsIgnoreCase(HttpHeaders.USER_AGENT) || entry.getKey().equalsIgnoreCase(HttpHeaders.REFERER)) headers.put(UrlUtil.fixHeader(entry.getKey()), object.get(entry.getKey()).getAsString());
for (Map.Entry<String, JsonElement> entry : object.entrySet()) if (entry.getKey().equalsIgnoreCase(HttpHeaders.USER_AGENT) || entry.getKey().equalsIgnoreCase(HttpHeaders.REFERER) || entry.getKey().equalsIgnoreCase("ua")) headers.put(UrlUtil.fixHeader(entry.getKey()), object.get(entry.getKey()).getAsString());
if (headers.isEmpty()) return parse.getHeaders();
return headers;
}

@ -28,7 +28,6 @@ import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.api.config.LiveConfig;
import com.fongmi.android.tv.api.config.VodConfig;
import com.fongmi.android.tv.bean.Site;
import com.fongmi.android.tv.impl.ParseCallback;
import com.fongmi.android.tv.ui.dialog.WebDialog;
import com.fongmi.android.tv.utils.Sniffer;
@ -211,8 +210,7 @@ public class CustomWebView extends WebView implements DialogInterface.OnDismissL
private boolean isVideoFormat(String url) {
try {
Logger.t(TAG).d(url);
Site site = VodConfig.get().getSite(key);
Spider spider = VodConfig.get().getSpider(site);
Spider spider = VodConfig.get().getSite(key).spider();
if (spider.manualVideoCheck()) return spider.isVideoFormat(url);
return Sniffer.isVideoFormat(url);
} catch (Exception ignored) {

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