From eb100f385a8c778f434275c00a9dbf46ff53143b Mon Sep 17 00:00:00 2001 From: okjack Date: Sat, 3 Aug 2024 12:28:29 +0800 Subject: [PATCH] Optimize loader --- .../com/fongmi/android/tv/api/LiveParser.java | 5 +- .../android/tv/api/config/LiveConfig.java | 47 ++-------- .../android/tv/api/config/VodConfig.java | 62 ++------------ .../android/tv/api/loader/BaseLoader.java | 85 +++++++++++++++++++ .../android/tv/api/loader/JarLoader.java | 7 +- .../android/tv/api/loader/JsLoader.java | 31 +------ .../android/tv/api/loader/PyLoader.java | 14 +-- .../java/com/fongmi/android/tv/bean/Live.java | 15 ++++ .../java/com/fongmi/android/tv/bean/Site.java | 15 ++++ .../android/tv/model/LiveViewModel.java | 3 +- .../android/tv/model/SiteViewModel.java | 18 ++-- .../fongmi/android/tv/player/ParseJob.java | 7 +- .../android/tv/ui/custom/CustomWebView.java | 4 +- .../com/fongmi/quickjs/crawler/Spider.java | 51 +---------- 14 files changed, 148 insertions(+), 216 deletions(-) create mode 100644 app/src/main/java/com/fongmi/android/tv/api/loader/BaseLoader.java diff --git a/app/src/main/java/com/fongmi/android/tv/api/LiveParser.java b/app/src/main/java/com/fongmi/android/tv/api/LiveParser.java index 058541f8e..f8bf21227 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/LiveParser.java +++ b/app/src/main/java/com/fongmi/android/tv/api/LiveParser.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); } diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java index f1939d7df..f88a06fdc 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java @@ -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 lives; private List rules; private List 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 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() { diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java index 30bdabe33..25472fc77 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java @@ -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 parses; private List flags; private List 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 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 jxs, String url) throws Throwable { - return jarLoader.jsonExt(key, jxs, url); - } - - public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap> 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 getDoh() { diff --git a/app/src/main/java/com/fongmi/android/tv/api/loader/BaseLoader.java b/app/src/main/java/com/fongmi/android/tv/api/loader/BaseLoader.java new file mode 100644 index 000000000..eb3bee212 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/api/loader/BaseLoader.java @@ -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 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 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 jxs, String url) throws Throwable { + return jarLoader.jsonExt(key, jxs, url); + } + + public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap> jxs, String url) throws Throwable { + return jarLoader.jsonExtMix(flag, key, name, jxs, url); + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/api/loader/JarLoader.java b/app/src/main/java/com/fongmi/android/tv/api/loader/JarLoader.java index fd5b35c80..e0d699d18 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/loader/JarLoader.java +++ b/app/src/main/java/com/fongmi/android/tv/api/loader/JarLoader.java @@ -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); diff --git a/app/src/main/java/com/fongmi/android/tv/api/loader/JsLoader.java b/app/src/main/java/com/fongmi/android/tv/api/loader/JsLoader.java index 48c888df7..868da1a9e 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/loader/JsLoader.java +++ b/app/src/main/java/com/fongmi/android/tv/api/loader/JsLoader.java @@ -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 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 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 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; diff --git a/app/src/main/java/com/fongmi/android/tv/api/loader/PyLoader.java b/app/src/main/java/com/fongmi/android/tv/api/loader/PyLoader.java index a947c52d5..ea7b158ee 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/loader/PyLoader.java +++ b/app/src/main/java/com/fongmi/android/tv/api/loader/PyLoader.java @@ -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 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 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; diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Live.java b/app/src/main/java/com/fongmi/android/tv/bean/Live.java index 599ef2080..f3869b94f 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Live.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Live.java @@ -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 getHeaders() { Map headers = Json.toMap(getHeader()); if (!getUa().isEmpty()) headers.put(HttpHeaders.USER_AGENT, getUa()); diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Site.java b/app/src/main/java/com/fongmi/android/tv/bean/Site.java index 982b80771..49d0204de 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Site.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Site.java @@ -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); } diff --git a/app/src/main/java/com/fongmi/android/tv/model/LiveViewModel.java b/app/src/main/java/com/fongmi/android/tv/model/LiveViewModel.java index 528d0ef51..8e9582464 100644 --- a/app/src/main/java/com/fongmi/android/tv/model/LiveViewModel.java +++ b/app/src/main/java/com/fongmi/android/tv/model/LiveViewModel.java @@ -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; }); diff --git a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java index 9027b7ca7..7735a981c 100644 --- a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java +++ b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java @@ -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 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); diff --git a/app/src/main/java/com/fongmi/android/tv/player/ParseJob.java b/app/src/main/java/com/fongmi/android/tv/player/ParseJob.java index 11a196773..d366acc0d 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/ParseJob.java +++ b/app/src/main/java/com/fongmi/android/tv/player/ParseJob.java @@ -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 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> 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 getHeader(JsonObject object) { Map headers = new HashMap<>(); - for (Map.Entry 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 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; } diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java index 3a8a0f47c..7c6aa0503 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java @@ -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) { diff --git a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java index a7aaa14b0..087a77534 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java @@ -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__";