diff --git a/app/build.gradle b/app/build.gradle index 602aa7c1..60049a53 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -108,6 +108,7 @@ dependencies { implementation 'com.github.hedzr:android-file-chooser:v1.2.0-final' implementation 'commons-io:commons-io:2.11.0' implementation 'com.googlecode.juniversalchardet:juniversalchardet:1.0.3' + implementation(name:'pyramid',ext:'aar') implementation(name:'xwalk_shared_library-23.53.589.4',ext:'aar') //支持http3 implementation ('com.google.net.cronet:cronet-okhttp:0.1.0') diff --git a/app/libs/pyramid.aar b/app/libs/pyramid.aar new file mode 100644 index 00000000..de5f21b9 Binary files /dev/null and b/app/libs/pyramid.aar differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 0f836c6d..c293abf1 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -214,3 +214,9 @@ # Cronet支持http3 -keep class com.google.net.cronet.**{*;} -keep class org.chromium.net.**{*;} + +# Python支持 +-keep public class com.undcover.freedom.pyramid.** { *; } +-dontwarn com.undcover.freedom.pyramid.** +-keep public class com.chaquo.python.** { *; } +-dontwarn com.chaquo.python.** diff --git a/app/src/main/java/com/github/catvod/crawler/PyLoader.java b/app/src/main/java/com/github/catvod/crawler/PyLoader.java new file mode 100644 index 00000000..ad395cfb --- /dev/null +++ b/app/src/main/java/com/github/catvod/crawler/PyLoader.java @@ -0,0 +1,54 @@ +package com.github.catvod.crawler; + +import com.github.tvbox.osc.base.App; +import com.undcover.freedom.pyramid.PythonLoader; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +public class PyLoader { + private final PythonLoader pythonLoader = PythonLoader.getInstance().setApplication(App.getInstance()); + private static ConcurrentHashMap spiders = new ConcurrentHashMap<>(); + + private String lastConfig = null; // 记录上次的配置 + + public void setConfig(String jsonStr) { + if (jsonStr != null && !jsonStr.equals(lastConfig)) { + pythonLoader.setConfig(jsonStr); + lastConfig = jsonStr; + } + } + public Spider getSpider(String key, String cls, String ext) { + if (spiders.containsKey(key)) +// Log.i("PyLoader", "echo-getSpider spider缓存: " + key); +// LOG.i(""); + return spiders.get(key); + try { + Spider sp = pythonLoader.getSpider(key, getPyUrl(cls,ext)); + spiders.put(key, sp); + return sp; + } catch (Throwable th) { + th.printStackTrace(); + } + return new SpiderNull(); + } + + public Object[] proxyInvoke(String key,String url,Map params) { + try { + String doStr = params.get("do"); + assert doStr != null; + if (doStr.equals("ck") || doStr.equals("live"))return pythonLoader.proxyLocal("", "", params); + return (Object[]) pythonLoader.proxyLocal(key, url, params); + } catch (Throwable th) { + th.printStackTrace(); + } + return null; + } + + private String getPyUrl(String api,String ext) + { + StringBuilder urlBuilder = new StringBuilder(api); + if (!ext.isEmpty()) { + urlBuilder.append(api.contains("?") ? "&" : "?").append("extend=").append(ext); + } + return urlBuilder.toString(); + } +} diff --git a/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java b/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java index ee7b2b03..4bb4ab94 100644 --- a/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java @@ -7,6 +7,7 @@ import android.util.Base64; import com.github.catvod.crawler.JarLoader; import com.github.catvod.crawler.JsLoader; +import com.github.catvod.crawler.PyLoader; import com.github.catvod.crawler.Spider; import com.github.tvbox.osc.base.App; import com.github.tvbox.osc.bean.LiveChannelGroup; @@ -36,6 +37,8 @@ import com.lzy.okgo.callback.AbsCallback; import com.lzy.okgo.model.Response; import com.orhanobut.hawk.Hawk; +import com.github.catvod.crawler.SpiderNull; + import org.json.JSONObject; import java.io.BufferedReader; @@ -76,6 +79,7 @@ public class ApiConfig { private final JarLoader jarLoader = new JarLoader(); private final JsLoader jsLoader = new JsLoader(); + private final PyLoader pyLoader = new PyLoader(); private final Gson gson; private final String userAgent = "okhttp/3.15"; @@ -417,6 +421,7 @@ public class ApiConfig { private static String jarCache ="true"; private void parseJson(String apiUrl, String jsonStr) { + pyLoader.setConfig(jsonStr); JsonObject infoJson = gson.fromJson(jsonStr, JsonObject.class); // spider spider = DefaultConfig.safeJsonString(infoJson, "spider", ""); @@ -435,7 +440,11 @@ public class ApiConfig { sb.setApi(obj.get("api").getAsString().trim()); sb.setSearchable(DefaultConfig.safeJsonInt(obj, "searchable", 1)); sb.setQuickSearch(DefaultConfig.safeJsonInt(obj, "quickSearch", 1)); - sb.setFilterable(DefaultConfig.safeJsonInt(obj, "filterable", 1)); + if(siteKey.startsWith("py_")){ + sb.setFilterable(1); + }else { + sb.setFilterable(DefaultConfig.safeJsonInt(obj, "filterable", 1)); + } sb.setPlayerUrl(DefaultConfig.safeJsonString(obj, "playUrl", "")); if(obj.has("ext") && (obj.get("ext").isJsonObject() || obj.get("ext").isJsonArray())){ sb.setExt(obj.get("ext").toString()); @@ -870,11 +879,23 @@ public class ApiConfig { public Spider getCSP(SourceBean sourceBean) { boolean js = sourceBean.getApi().endsWith(".js") || sourceBean.getApi().contains(".js?"); if (js) return jsLoader.getSpider(sourceBean.getKey(), sourceBean.getApi(), sourceBean.getExt(), sourceBean.getJar()); + if (sourceBean.getKey().startsWith("py_") || sourceBean.getApi().endsWith(".py")) { + try { + return pyLoader.getSpider(sourceBean.getKey(), sourceBean.getApi(), sourceBean.getExt()); + } catch (Exception e) { + return new SpiderNull(); + } + } return jarLoader.getSpider(sourceBean.getKey(), sourceBean.getApi(), sourceBean.getExt(), sourceBean.getJar()); } public Object[] proxyLocal(Map param) { - return jarLoader.proxyInvoke(param); + SourceBean sourceBean = ApiConfig.get().getHomeSourceBean(); + if (sourceBean.getKey().startsWith("py_") || sourceBean.getApi().endsWith(".py")) { + return pyLoader.proxyInvoke(sourceBean.getKey(), getPyUrl(sourceBean), param); + }else { + return jarLoader.proxyInvoke(param); + } } public JSONObject jsonExt(String key, LinkedHashMap jxs, String url) { @@ -1025,4 +1046,15 @@ public class ApiConfig { superPb.setType(4); parseBeanList.add(0, superPb); } + + private String getPyUrl(SourceBean sb) + { + String api = sb.getApi(); + String ext = sb.getExt(); + StringBuilder urlBuilder = new StringBuilder(api); + if (!ext.isEmpty()) { + urlBuilder.append(api.contains("?") ? "&" : "?").append("extend=").append(ext); + } + return urlBuilder.toString(); + } }