From 8defdeab79491d0a31923516f5da8367c48bc4ae Mon Sep 17 00:00:00 2001 From: jun <215613905@qq.com> Date: Thu, 27 Mar 2025 22:27:56 +0800 Subject: [PATCH] fix bug --- .../catvod/crawler/python/IPyLoader.java | 1 - .../com/github/tvbox/osc/api/ApiConfig.java | 19 ++- .../com/github/catvod/crawler/pyLoader.java | 6 - .../com/github/catvod/crawler/pyLoader.java | 143 +----------------- .../freedom/pyramid/PythonLoader.java | 41 +++-- .../freedom/pyramid/PythonSpider.java | 38 ++--- 6 files changed, 58 insertions(+), 190 deletions(-) diff --git a/app/src/main/java/com/github/catvod/crawler/python/IPyLoader.java b/app/src/main/java/com/github/catvod/crawler/python/IPyLoader.java index 5815ef55..4f25aee2 100644 --- a/app/src/main/java/com/github/catvod/crawler/python/IPyLoader.java +++ b/app/src/main/java/com/github/catvod/crawler/python/IPyLoader.java @@ -9,6 +9,5 @@ public interface IPyLoader { void setConfig(String jsonStr); void setRecentPyKey(String pyApi); Spider getSpider(String key, String cls, String ext); - Object[] proxyInvoke(Map params, String key, String api, String ext); Object[] proxyInvoke(Map params); } \ No newline at end of file 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 508d011b..a7753b65 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 @@ -864,11 +864,18 @@ public class ApiConfig { Hawk.put(HawkConfig.LIVE_PLAY_TYPE,livePlayType); } //设置UA - if(livesOBJ.has("ua")){ - String ua =livesOBJ.get("ua").getAsString(); - HashMap liveHeader=new HashMap<>(); - liveHeader.put("User-Agent",ua); - Hawk.put(HawkConfig.LIVE_WEB_HEADER,liveHeader); + if(livesOBJ.has("header")) { + JsonObject headerObj = livesOBJ.getAsJsonObject("header"); + HashMap liveHeader = new HashMap<>(); + for (Map.Entry entry : headerObj.entrySet()) { + liveHeader.put(entry.getKey(), entry.getValue().getAsString()); + } + Hawk.put(HawkConfig.LIVE_WEB_HEADER, liveHeader); + } else if(livesOBJ.has("ua")) { + String ua = livesOBJ.get("ua").getAsString(); + HashMap liveHeader = new HashMap<>(); + liveHeader.put("User-Agent", ua); + Hawk.put(HawkConfig.LIVE_WEB_HEADER, liveHeader); }else { Hawk.put(HawkConfig.LIVE_WEB_HEADER,null); } @@ -911,7 +918,7 @@ public class ApiConfig { return pyLoader.getSpider(MD5.string2MD5(url), url, ""); } - public Object[] proxyLocal(Map param) { + public Object[] proxyLocal(Map param){ SourceBean sourceBean = ApiConfig.get().getHomeSourceBean(); if(Hawk.get(HawkConfig.PLAYER_IS_LIVE,false)){ diff --git a/app/src/normal/java/com/github/catvod/crawler/pyLoader.java b/app/src/normal/java/com/github/catvod/crawler/pyLoader.java index 415fc04a..39dbca3b 100644 --- a/app/src/normal/java/com/github/catvod/crawler/pyLoader.java +++ b/app/src/normal/java/com/github/catvod/crawler/pyLoader.java @@ -28,12 +28,6 @@ public class pyLoader implements IPyLoader { return new SpiderNull(); } - @Override - public Object[] proxyInvoke(Map params, String key, String api, String ext) { - Log.i("PyLoader", "normal flavor: proxyInvoke(params, key, api, ext) 调用,但不支持 Python 功能。"); - return null; - } - @Override public Object[] proxyInvoke(Map params) { Log.i("PyLoader", "normal flavor: proxyInvoke(params) 调用,但不支持 Python 功能。"); diff --git a/app/src/python/java/com/github/catvod/crawler/pyLoader.java b/app/src/python/java/com/github/catvod/crawler/pyLoader.java index b4412970..ba3acd4d 100644 --- a/app/src/python/java/com/github/catvod/crawler/pyLoader.java +++ b/app/src/python/java/com/github/catvod/crawler/pyLoader.java @@ -51,16 +51,9 @@ public class pyLoader implements IPyLoader { } try { Log.i("PyLoader", "echo-getSpider url: " + getPyUrl(cls, ext)); - PythonSpider sp = (PythonSpider) pythonLoader.getSpider(key, getPyUrl(cls, ext)); - -// sp.init(App.getInstance(),getPyUrl(cls, ext)); -// PythonSpiderWrapper wrapper = new PythonSpiderWrapper(sp); -// wrapper.init(getPyUrl(cls, ext)); -// Log.i("PyLoader", "echo-getSpider getName: " + wrapper.getName()); -// Log.i("PyLoader", "echo-getSpider getName: " + sp.getName()); -// Log.i("PyLoader", "echo-getSpider liveContent: " + sp.liveContent("true")); - Log.i("PyLoader", "echo-getSpider homeContent: " + sp.homeContent(true)); - spiders.put(key, (Spider) sp); + Spider sp = pythonLoader.getSpider(key, getPyUrl(cls, ext)); +// Log.i("PyLoader", "echo-getSpider homeContent: " + sp.homeContent(true)); + spiders.put(key, sp); Log.i("PyLoader", "echo-getSpider 加载spider: " + key); return (Spider)sp; } catch (Throwable th) { @@ -70,140 +63,18 @@ public class pyLoader implements IPyLoader { } @Override - public Object[] proxyInvoke(Map params, String key, String api, String ext) { + public Object[] proxyInvoke(Map params){ + LOG.i("echo-recentPyApi" + recentPyApi); 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, getPyUrl(api, ext), params); - } catch (Throwable th) { - th.printStackTrace(); - } - return null; - } - - @Override - public Object[] proxyInvoke(Map params) { - try { - LOG.i("echo-recentPyApi" + recentPyApi); - PythonSpider originalSpider = (PythonSpider) pythonLoader.getSpider(MD5.string2MD5(recentPyApi), recentPyApi); -// PythonSpiderWrapper wrapper = new PythonSpiderWrapper(originalSpider); -// return wrapper.proxyLocal(params); + PythonSpider originalSpider = (PythonSpider) getSpider(MD5.string2MD5(recentPyApi), recentPyApi,""); return originalSpider.proxyLocal(params); } catch (Throwable th) { - LOG.i("echo-Throwable:---" + th.getMessage()); + LOG.i("echo-proxyInvoke_Throwable:---" + th.getMessage()); th.printStackTrace(); } return null; } - public static class PythonSpiderWrapper { - private final PythonSpider spider; - - public PythonSpiderWrapper(PythonSpider spider) { - this.spider = spider; - } - - public Object[] proxyLocal(Map param) { - try { - // 反射获取私有字段 app - Field appField = PythonSpider.class.getDeclaredField("app"); - appField.setAccessible(true); - PyObject app = (PyObject) appField.get(spider); - - // 反射获取私有字段 pySpider - Field pySpiderField = PythonSpider.class.getDeclaredField("pySpider"); - pySpiderField.setAccessible(true); - PyObject pySpider = (PyObject) pySpiderField.get(spider); - - // 调用 Python 接口获取原始结果 - assert app != null; - List poList = app.callAttr("localProxy", - new Object[]{pySpider, spider.map2json(param).toString()}).asList(); - int code = poList.get(0).toInt(); - String type = poList.get(1).toString(); - String action = poList.get(2).toString(); - InputStream stream = new ByteArrayInputStream(action.getBytes("utf8")); - Object extra = null; - if (poList.size() > 3) { - extra = poList.get(3).toJava(Map.class); - } - return new Object[]{code, type, stream, extra}; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public String getName() { - try { - // 反射获取私有字段 app - Field appField = PythonSpider.class.getDeclaredField("app"); - appField.setAccessible(true); - PyObject app = (PyObject) appField.get(spider); - - // 反射获取私有字段 pySpider - Field pySpiderField = PythonSpider.class.getDeclaredField("pySpider"); - pySpiderField.setAccessible(true); - PyObject pySpider = (PyObject) pySpiderField.get(spider); - - // 调用 Python 接口获取原始结果 - assert app != null; - String poList = String.valueOf(app.callAttr("getName", - new Object[]{pySpider})); - return poList; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public String homeContent(boolean filter) { - try { - // 反射获取私有字段 app - Field appField = PythonSpider.class.getDeclaredField("app"); - appField.setAccessible(true); - PyObject app = (PyObject) appField.get(spider); - - // 反射获取私有字段 pySpider - Field pySpiderField = PythonSpider.class.getDeclaredField("pySpider"); - pySpiderField.setAccessible(true); - PyObject pySpider = (PyObject) pySpiderField.get(spider); - - // 调用 Python 接口获取原始结果 - assert app != null; - String poList = String.valueOf(app.callAttr("homeContent", - new Object[]{pySpider,filter})); - return poList; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public void init(String filter) { - try { - // 反射获取私有字段 app - Field appField = PythonSpider.class.getDeclaredField("app"); - appField.setAccessible(true); - PyObject app = (PyObject) appField.get(spider); - - // 反射获取私有字段 pySpider - Field pySpiderField = PythonSpider.class.getDeclaredField("pySpider"); - pySpiderField.setAccessible(true); - PyObject pySpider = (PyObject) pySpiderField.get(spider); - - // 调用 Python 接口获取原始结果 - assert app != null; - app.callAttr("init", new Object[]{pySpider,filter}); - - } catch (Exception e) { - e.printStackTrace(); - } - } - } - private String getPyUrl(String api, String ext) throws UnsupportedEncodingException { StringBuilder urlBuilder = new StringBuilder(api); if (!ext.isEmpty()) { diff --git a/app/src/python/java/com/undcover/freedom/pyramid/PythonLoader.java b/app/src/python/java/com/undcover/freedom/pyramid/PythonLoader.java index 8698314c..0f65035b 100644 --- a/app/src/python/java/com/undcover/freedom/pyramid/PythonLoader.java +++ b/app/src/python/java/com/undcover/freedom/pyramid/PythonLoader.java @@ -122,7 +122,23 @@ public class PythonLoader { } try { PythonSpider sp = new PythonSpider(key, cache); - sp.init(app, url); + + Thread initThread = new Thread(() -> { + try { + sp.init(app, url); + } catch (Exception e) { + e.printStackTrace(); + } + }); + initThread.start(); + initThread.join(12_000); + + if (initThread.isAlive()) { + PyLog.e("echo-init方法执行超时超时"); + initThread.interrupt(); + throw new Exception("echo-init方法执行超时"); + } + spiders.put(key, sp); return sp; } catch (Throwable th) { @@ -131,29 +147,6 @@ public class PythonLoader { return new SpiderNull(); } - public Object[] proxyLocal(String key, String url, Map map) { - String what = map.get("do").toString(); - try { - if (what.equals("ck")) { - return new Object[]{200, "text/plain; charset=utf-8", new ByteArrayInputStream("ok".getBytes("UTF-8"))}; - } - if (what.equals("live")) { - String type = map.get("type"); - if (type.equals("txt")) { - String ext = map.get("ext"); - ext = new String(Base64.decode(ext, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8"); - return TxtSubscribe.load(ext); - } - return null; - } - PythonSpider spider = (PythonSpider) getSpider(key, url); - return spider.proxyLocal(map); - } catch (Exception e) { - e.printStackTrace(); - } - return new Object[]{}; - } - int port = -1; public void getPort() { diff --git a/app/src/python/java/com/undcover/freedom/pyramid/PythonSpider.java b/app/src/python/java/com/undcover/freedom/pyramid/PythonSpider.java index ef9d0ef4..bd442fb6 100644 --- a/app/src/python/java/com/undcover/freedom/pyramid/PythonSpider.java +++ b/app/src/python/java/com/undcover/freedom/pyramid/PythonSpider.java @@ -14,11 +14,10 @@ import org.json.JSONObject; import java.io.ByteArrayInputStream; import java.io.File; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; public class PythonSpider extends Spider { PyObject app; @@ -67,7 +66,7 @@ public class PythonSpider extends Spider { } app.callAttr("init", pySpider, extInfo); loadSuccess = true; - Log.i("PyLoader", "echo-init extInfo: " + extInfo); + Log.i("PyLoader", "echo-init extInfo: " +url+ extInfo); PyLog.d(name + ": 下載插件成功!"); } else { PyToast.showCancelableToast(name + "下载插件失败"); @@ -153,36 +152,41 @@ public class PythonSpider extends Spider { // return new Object[]{code, type, stream, extra}; // } - public Object[] proxyLocal(Map params) { - Log.i("tvbox","echo-proxyLocal"+params.toString()); + public Object[] proxyLocal(Map params) { + Log.i("PyLoader","echo-proxyLocal:param"+params.toString()); List list = app.callAttr("localProxy", pySpider, map2json(params).toString()).asList(); boolean base64 = list.size() > 4 && list.get(4).toInt() == 1; - boolean header = list.size() > 3 && list.get(3) != null; + boolean headerAvailable = list.size() > 3 && list.get(3) != null; Object[] result = new Object[4]; result[0] = list.get(0).toInt(); result[1] = list.get(1).toString(); result[2] = getStream(list.get(2), base64); - result[3] = header ? getHeader(list.get(3)) : null; + result[3] = headerAvailable ? getHeader(list.get(3)) : null; +// result[3] = null; return result; } - private Map getHeader(PyObject obj) { - try { - Map header = new HashMap<>(); - for (Map.Entry entry : obj.asMap().entrySet()) header.put(entry.getKey().toString(), entry.getValue().toString()); - return header; - } catch (Exception e) { + private Map getHeader(PyObject headerObj) { + if (headerObj == null) { return null; } + // 处理 headerObj + Map headerMap = new HashMap<>(); + for (PyObject key : headerObj.asMap().keySet()) { + headerMap.put(key.toString(), Objects.requireNonNull(headerObj.asMap().get(key)).toString()); + } + return headerMap; } private ByteArrayInputStream getStream(PyObject o, boolean base64) { - Log.i("tvbox","echo-getStream"+o.toString()); - if (o == null) return null; - if (o.type().toString().contains("bytes")) return new ByteArrayInputStream(o.toJava(byte[].class)); + if (o == null) return new ByteArrayInputStream(new byte[0]); + String typeStr = o.type().toString(); + if (typeStr.contains("bytes")) return new ByteArrayInputStream(o.toJava(byte[].class)); String content = o.toString(); - if (base64 && content.contains("base64,")) content = content.split("base64,")[1]; + if (base64 && content.contains("base64,")) { + content = content.split("base64,")[1]; + } return new ByteArrayInputStream(base64 ? decode(content) : content.getBytes()); }