From e8179858f06720aee8569262e30fec3653465cfb Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 13 Oct 2022 17:26:38 +0800 Subject: [PATCH] Support local py --- .../com/fongmi/android/tv/api/ApiConfig.java | 2 +- .../com/fongmi/android/tv/api/JarLoader.java | 2 +- .../com/fongmi/android/tv/api/PyLoader.java | 9 +- .../com/fongmi/android/tv/utils/FileUtil.java | 1 + pyramid/build.gradle | 1 + .../com/undcover/freedom/pyramid/Loader.java | 8 +- .../com/undcover/freedom/pyramid/Spider.java | 5 + pyramid/src/main/python/app.py | 98 ++++--------------- 8 files changed, 37 insertions(+), 89 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java b/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java index cb23048c8..5ebb71d36 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java @@ -140,7 +140,7 @@ public class ApiConfig { if (ext.startsWith("http")) return ext; else if (ext.startsWith("file")) return FileUtil.read(ext); else if (ext.startsWith("img+")) return Decoder.getExt(ext); - else if (ext.endsWith(".json")) return parseExt(Utils.convert(ext)); + else if (ext.endsWith(".json") || ext.endsWith(".py")) return parseExt(Utils.convert(ext)); return ext; } diff --git a/app/src/main/java/com/fongmi/android/tv/api/JarLoader.java b/app/src/main/java/com/fongmi/android/tv/api/JarLoader.java index 79398d537..c2f2d13c4 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/JarLoader.java +++ b/app/src/main/java/com/fongmi/android/tv/api/JarLoader.java @@ -85,7 +85,7 @@ public class JarLoader { String spKey = (current = Utils.getMD5(jar)) + key; if (spiders.containsKey(spKey)) return spiders.get(spKey); if (!loaders.containsKey(current)) parseJar(current, jar); - Spider spider = (Spider) loaders.get(current).loadClass("com.github.catvod.spider." + api.replace("csp_", "")).newInstance(); + Spider spider = (Spider) loaders.get(current).loadClass("com.github.catvod.spider." + api.split("csp_")[1]).newInstance(); spider.init(App.get(), ext); spiders.put(spKey, spider); return spider; diff --git a/app/src/main/java/com/fongmi/android/tv/api/PyLoader.java b/app/src/main/java/com/fongmi/android/tv/api/PyLoader.java index 4b89a638f..ef4e514c7 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/PyLoader.java +++ b/app/src/main/java/com/fongmi/android/tv/api/PyLoader.java @@ -1,7 +1,6 @@ package com.fongmi.android.tv.api; import android.content.Context; -import android.net.Uri; import com.fongmi.android.tv.App; import com.github.catvod.crawler.Spider; @@ -35,11 +34,9 @@ public class PyLoader { public Spider getSpider(String key, String api, String ext) { try { if (spiders.containsKey(key)) return spiders.get(key); - String extend = Uri.parse(ext).getQueryParameter("extend"); - Method method = loader.getClass().getMethod("spider", Context.class, String.class); - Spider spider = (Spider) method.invoke(loader, App.get(), ext); - extend = extend == null ? "" : extend; - spider.init(App.get(), extend); + Method method = loader.getClass().getMethod("spider", Context.class, String.class, String.class); + Spider spider = (Spider) method.invoke(loader, App.get(), api.split("py_")[1], ext); + spider.init(App.get()); spiders.put(key, spider); return spider; } catch (Exception e) { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java index 930c8260d..b06714d8e 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java @@ -44,6 +44,7 @@ public class FileUtil { } public static File getLocal(String path) { + if (path.contains(getRootPath())) return new File(path); return new File(path.replace("file:/", getRootPath())); } diff --git a/pyramid/build.gradle b/pyramid/build.gradle index 30862923b..11d2cac3e 100644 --- a/pyramid/build.gradle +++ b/pyramid/build.gradle @@ -13,6 +13,7 @@ android { python { buildPython "C:/Users/FongMi.DIREK/Anaconda3/python.exe" pip { + install "pycrypto" install "requests" install "lxml" } diff --git a/pyramid/src/main/java/com/undcover/freedom/pyramid/Loader.java b/pyramid/src/main/java/com/undcover/freedom/pyramid/Loader.java index adc47e1f6..77a2eacf3 100644 --- a/pyramid/src/main/java/com/undcover/freedom/pyramid/Loader.java +++ b/pyramid/src/main/java/com/undcover/freedom/pyramid/Loader.java @@ -13,13 +13,13 @@ public class Loader { private void init(Context context) { if (!Python.isStarted()) Python.start(new AndroidPlatform(context)); - cache = context.getCacheDir().getAbsolutePath(); + cache = context.getCacheDir().getAbsolutePath() + "/plugin/"; app = Python.getInstance().getModule("app"); } - public com.github.catvod.crawler.Spider spider(Context context, String ext) { + public Spider spider(Context context, String name, String ext) { if (app == null) init(context); - String path = app.callAttr("downloadPlugin", cache, ext).toString(); - return new Spider(app, app.callAttr("loadFromDisk", path)); + PyObject obj = app.callAttr("init_py", cache, name, ext); + return new Spider(app, obj); } } diff --git a/pyramid/src/main/java/com/undcover/freedom/pyramid/Spider.java b/pyramid/src/main/java/com/undcover/freedom/pyramid/Spider.java index 4fcd06d32..4f09afdc2 100644 --- a/pyramid/src/main/java/com/undcover/freedom/pyramid/Spider.java +++ b/pyramid/src/main/java/com/undcover/freedom/pyramid/Spider.java @@ -20,6 +20,11 @@ public class Spider extends com.github.catvod.crawler.Spider { this.obj = obj; } + @Override + public void init(Context context) { + app.callAttr("init", obj); + } + @Override public void init(Context context, String extend) { app.callAttr("init", obj, extend); diff --git a/pyramid/src/main/python/app.py b/pyramid/src/main/python/app.py index adbb45dd2..632bf5fbb 100644 --- a/pyramid/src/main/python/app.py +++ b/pyramid/src/main/python/app.py @@ -1,98 +1,47 @@ import os import requests from importlib.machinery import SourceFileLoader -from urllib import parse import json -def createFile(file_path): +def create_file(file_path): if os.path.exists(file_path) is False: os.makedirs(file_path) -def redirectResponse(tUrl): - rsp = requests.get(tUrl, allow_redirects=False, verify=False) +def write_file(name, content): + with open(name, 'wb') as f: + f.write(content) + + +def redirect(url): + rsp = requests.get(url, allow_redirects=False, verify=False) if 'Location' in rsp.headers: - return redirectResponse(rsp.headers['Location']) + return redirect(rsp.headers['Location']) else: return rsp -def downloadFile(name, url): - try: - rsp = redirectResponse(url) - with open(name, 'wb') as f: - f.write(rsp.content) - print(url) - except: - print(name + ' =======================================> error') - print(url) +def download_file(name, ext): + if ext.startswith('http'): + write_file(name, redirect(ext).content) + else: + write_file(name, str.encode(ext)) -def downloadPlugin(basePath, url): - createFile(basePath) - name = url.split('/')[-1].split('.')[0] - if url.startswith('file://'): - pyName = url.replace('file://', '') - else: - pyName = basePath + name + '.py' - downloadFile(pyName, url) - sPath = gParam['SpiderPath'] - sPath[name] = pyName - sParam = gParam['SpiderParam'] - paramList = parse.parse_qs(parse.urlparse(url).query).get('extend') - if paramList == None: - paramList = [''] - sParam[name] = paramList[0] - return pyName - - -def loadFromDisk(fileName): - name = fileName.split('/')[-1].split('.')[0] - spList = gParam['SpiderList'] - if name not in spList: - sp = SourceFileLoader(name, fileName).load_module().Spider() - spList[name] = sp - return spList[name] +def init_py(path, name, ext): + create_file(path) + py_name = path + name + '.py' + download_file(py_name, ext) + return SourceFileLoader(name, py_name).load_module().Spider() def str2json(content): return json.loads(content) -gParam = { - "SpiderList": {}, - "SpiderPath": {}, - "SpiderParam": {} -} - - -def getDependence(ru): - result = ru.getDependence() - return result - - -def getName(ru): - result = ru.getName() - return result - - -def init(ru, extend): - spoList = [] - spList = gParam['SpiderList'] - sPath = gParam['SpiderPath'] - sParam = gParam['SpiderParam'] - for key in ru.getDependence(): - sp = None - if key in spList.keys(): - sp = spList[key] - elif key in sPath.keys(): - sp = loadFromDisk(sPath[key]) - if sp != None: - sp.setExtendInfo(sParam[key]) - spoList.append(sp) - ru.setExtendInfo(extend) - ru.init(spoList) +def init(ru): + ru.init() def homeContent(ru, filter): @@ -131,11 +80,6 @@ def searchContent(ru, key, quick): return formatJo -def localProxy(ru, param): - result = ru.localProxy(str2json(param)) - return result - - def run(): pass