From da8d041f8687ec0588f451092cdf107a98b3b6ef Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 12 Feb 2023 23:51:01 +0800 Subject: [PATCH] Update parse system --- .../tv/ui/activity/DetailActivity.java | 6 ++- app/src/main/assets/parse.html | 23 ------------ .../com/fongmi/android/tv/api/ApiConfig.java | 15 ++++++-- .../com/fongmi/android/tv/bean/Parse.java | 11 +++++- .../android/tv/player/parse/ParseJob.java | 37 ++++++++++--------- .../com/fongmi/android/tv/server/Nano.java | 12 ------ .../com/fongmi/android/tv/server/Server.java | 13 ++----- .../com/fongmi/android/tv/utils/Utils.java | 4 +- 8 files changed, 50 insertions(+), 71 deletions(-) delete mode 100644 app/src/main/assets/parse.html diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index f4015ba27..bd85803d2 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -813,8 +813,10 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void checkParse() { int position = getParsePosition(); - if (position == mParseAdapter.size() - 1) initParse(); - if (position == 0 || position == mParseAdapter.size() - 1) checkFlag(); + boolean last = position == mParseAdapter.size() - 1; + boolean pass = position < 2 || last; + if (last) initParse(); + if (pass) checkFlag(); else nextParse(position); } diff --git a/app/src/main/assets/parse.html b/app/src/main/assets/parse.html deleted file mode 100644 index 5550ce890..000000000 --- a/app/src/main/assets/parse.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - 解析 - - - - - - - - - \ No newline at end of file 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 c6f7ea5cb..5f3eb7ddc 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 @@ -158,10 +158,13 @@ public class ApiConfig { Parse item = Parse.objectFrom(element); if (!parses.contains(item)) parses.add(item); } + if (parses.size() > 0) { + parses.add(0, Parse.mixWeb()); + parses.add(0, Parse.mixJson()); + } } private void initOther(JsonObject object) { - if (parses.size() > 0) parses.add(0, Parse.mix()); if (home == null) setHome(sites.isEmpty() ? new Site() : sites.get(0)); if (parse == null) setParse(parses.isEmpty() ? new Parse() : parses.get(0)); setFlags(Json.safeListString(object, "flags")); @@ -223,10 +226,16 @@ public class ApiConfig { return parses == null ? Collections.emptyList() : parses; } + public List getParses(int type) { + List items = new ArrayList<>(); + for (Parse item : getParses()) if (item.getType() == type) items.add(item); + return items; + } + public List getParses(int type, String flag) { List items = new ArrayList<>(); - for (Parse item : getParses()) if (item.getType() == type && item.getExt().getFlag().contains(flag)) items.add(item); - if (items.isEmpty()) for (Parse item : getParses()) if (item.getType() == type) items.add(item); + for (Parse item : getParses(type)) if (item.getExt().getFlag().contains(flag)) items.add(item); + if (items.isEmpty()) items.addAll(getParses(type)); return items; } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Parse.java b/app/src/main/java/com/fongmi/android/tv/bean/Parse.java index 9aa03663e..9bef9ab35 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Parse.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Parse.java @@ -52,9 +52,16 @@ public class Parse { return parse; } - public static Parse mix() { + public static Parse mixJson() { Parse parse = new Parse(); - parse.setName("超級解析"); + parse.setName("Json聚合"); + parse.setType(2); + return parse; + } + + public static Parse mixWeb() { + Parse parse = new Parse(); + parse.setName("Web聚合"); parse.setType(3); return parse; } diff --git a/app/src/main/java/com/fongmi/android/tv/player/parse/ParseJob.java b/app/src/main/java/com/fongmi/android/tv/player/parse/ParseJob.java index dd7faf4fa..80652b9d5 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/parse/ParseJob.java +++ b/app/src/main/java/com/fongmi/android/tv/player/parse/ParseJob.java @@ -8,12 +8,12 @@ import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.bean.Parse; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.net.OkHttp; -import com.fongmi.android.tv.server.Server; import com.fongmi.android.tv.ui.custom.CustomWebView; import com.fongmi.android.tv.utils.Json; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -27,9 +27,9 @@ import okhttp3.Response; public class ParseJob { + private final List webViews; private ExecutorService executor; private ExecutorService infinite; - private CustomWebView webView; private Callback callback; private Parse parse; @@ -40,6 +40,7 @@ public class ParseJob { public ParseJob(Callback callback) { this.executor = Executors.newFixedThreadPool(2); this.infinite = Executors.newCachedThreadPool(); + this.webViews = new ArrayList<>(); this.callback = callback; } @@ -79,15 +80,17 @@ public class ParseJob { private void doInBackground(String key, String webUrl, String flag) throws Exception { switch (parse.getType()) { case 0: //嗅探 - App.post(() -> startWeb(key, parse.getUrl() + webUrl, parse.getHeaders(), callback)); + App.post(() -> startWeb(key, parse, webUrl, callback)); break; case 1: //Json jsonParse(parse, webUrl, false); break; - case 3: //聚合 - mixWeb(webUrl, flag); + case 2: //Json聚合 mixJson(webUrl, flag); break; + case 3: //Web聚合 + mixWeb(webUrl, flag); + break; } } @@ -108,10 +111,9 @@ public class ParseJob { } private void mixWeb(String webUrl, String flag) { - StringBuilder sb = new StringBuilder(); List items = ApiConfig.get().getParses(0, flag); - for (Parse item : items) sb.append(item.getUrl()).append(";"); - if (sb.length() > 0) App.post(() -> startWeb(Server.getParse(sb.toString(), webUrl), callback)); + for (Parse item : items) App.post(() -> startWeb(item, webUrl, callback)); + if (items.isEmpty()) onParseError(); } private void jsonParse(CountDownLatch latch, Parse item, String webUrl) { @@ -133,16 +135,12 @@ public class ParseJob { if (code == 200) onParseSuccess(headers, url, item.getName()); } - private void startWeb(String url, Callback callback) { - startWeb(url, new HashMap<>(), callback); + private void startWeb(Parse item, String webUrl, Callback callback) { + startWeb("", item, webUrl, callback); } - private void startWeb(String url, Map headers, Callback callback) { - startWeb("", url, headers, callback); - } - - private void startWeb(String key, String url, Map headers, Callback callback) { - webView = CustomWebView.create(App.get()).start(key, url, headers, callback); + private void startWeb(String key, Parse item, String webUrl, Callback callback) { + webViews.add(CustomWebView.create(App.get()).start(key, item.getUrl() + webUrl, item.getHeaders(), callback)); } private HashMap getHeader(JsonObject object) { @@ -165,14 +163,17 @@ public class ParseJob { }); } + private void stopWeb() { + for (CustomWebView webView : webViews) webView.stop(false); + } + public void stop() { if (executor != null) executor.shutdownNow(); if (infinite != null) infinite.shutdownNow(); - if (webView != null) webView.stop(false); infinite = null; executor = null; callback = null; - webView = null; + stopWeb(); } public interface Callback { diff --git a/app/src/main/java/com/fongmi/android/tv/server/Nano.java b/app/src/main/java/com/fongmi/android/tv/server/Nano.java index 1313e9850..d2b3ef573 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/Nano.java +++ b/app/src/main/java/com/fongmi/android/tv/server/Nano.java @@ -70,7 +70,6 @@ public class Nano extends NanoHTTPD { switch (session.getMethod()) { case GET: if (url.startsWith("/file")) return doFile(url); - else if (url.startsWith("/parse")) return doParse(session.getParms()); else if (url.startsWith("/proxy")) return doProxy(session.getParms()); break; case POST: @@ -106,17 +105,6 @@ public class Nano extends NanoHTTPD { } } - private Response doParse(Map params) { - try { - String jxs = params.get("jxs"); - String url = params.get("url"); - String html = String.format(FileUtil.getAsset("parse.html"), jxs, url); - return newFixedLengthResponse(Response.Status.OK, MIME_HTML, html); - } catch (Exception e) { - return newFixedLengthResponse(Response.Status.INTERNAL_ERROR, MIME_PLAINTEXT, "500"); - } - } - private Response doProxy(Map params) { try { Object[] rs = ApiConfig.get().proxyLocal(params); diff --git a/app/src/main/java/com/fongmi/android/tv/server/Server.java b/app/src/main/java/com/fongmi/android/tv/server/Server.java index 37981a5a3..36f84efa5 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/Server.java +++ b/app/src/main/java/com/fongmi/android/tv/server/Server.java @@ -6,7 +6,6 @@ import android.text.format.Formatter; import com.fongmi.android.tv.App; import com.fongmi.android.tv.event.ServerEvent; -import com.fongmi.android.tv.utils.Utils; import java.net.Inet4Address; import java.net.InetAddress; @@ -27,14 +26,6 @@ public class Server implements Nano.Listener { return Loader.INSTANCE; } - public static String getParse(String jxs, String url) { - return get().getAddress(true) + "/parse?jxs=" + Utils.substring(jxs) + "&url=" + url; - } - - public static String getProxy() { - return get().getAddress(true) + "/proxy?"; - } - public Server() { this.port = 9978; } @@ -43,6 +34,10 @@ public class Server implements Nano.Listener { return "http://" + (local ? "127.0.0.1" : getIP()) + ":" + port; } + public String getAddress(String path) { + return getAddress(true) + "/" + path; + } + public void start() { if (nano != null) return; do { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java index 8f39e8169..a0addbce2 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java @@ -84,7 +84,7 @@ public class Utils { } public static String checkProxy(String url) { - if (url.startsWith("proxy://")) return url.replace("proxy://", Server.getProxy()); + if (url.startsWith("proxy://")) return url.replace("proxy://", Server.get().getAddress("proxy?")); return url; } @@ -95,7 +95,7 @@ public class Utils { } public static String convert(String text) { - return text.startsWith("file") ? Server.get().getAddress(true) + "/" + text : text; + return text.startsWith("file") ? Server.get().getAddress(text) : text; } public static String convert(String baseUrl, String text) {