From 415cbafebf2bb23b9ef0966671737875d893d261 Mon Sep 17 00:00:00 2001 From: okjack Date: Thu, 18 Jul 2024 10:57:25 +0800 Subject: [PATCH] Live support ads and rules --- .../tv/ui/activity/SettingActivity.java | 1 + .../android/tv/api/config/LiveConfig.java | 65 ++++++++++++++++--- .../android/tv/api/config/VodConfig.java | 8 ++- .../android/tv/ui/custom/CustomWebView.java | 3 + .../com/fongmi/android/tv/utils/Sniffer.java | 2 + .../tv/ui/fragment/SettingFragment.java | 1 + .../github/catvod/net/OkProxySelector.java | 17 +++-- 7 files changed, 81 insertions(+), 16 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java index 6c42d1bbb..a71bfd850 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java @@ -312,6 +312,7 @@ public class SettingActivity extends BaseActivity implements BackupCallback, Con public void setProxy(String proxy) { Source.get().stop(); Setting.putProxy(proxy); + OkHttp.selector().clear(); OkHttp.get().setProxy(proxy); Notify.progress(getActivity()); VodConfig.load(Config.vod(), getCallback()); 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 48a7f4f1e..5950ae99b 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 @@ -13,20 +13,25 @@ import com.fongmi.android.tv.bean.Depot; import com.fongmi.android.tv.bean.Group; import com.fongmi.android.tv.bean.Keep; import com.fongmi.android.tv.bean.Live; +import com.fongmi.android.tv.bean.Rule; import com.fongmi.android.tv.db.AppDatabase; import com.fongmi.android.tv.impl.Callback; import com.fongmi.android.tv.ui.activity.LiveActivity; import com.fongmi.android.tv.utils.Notify; +import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Json; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class LiveConfig { private List lives; + private List rules; + private List ads; private Config config; private boolean sync; private Live home; @@ -73,6 +78,9 @@ public class LiveConfig { public LiveConfig init() { this.home = null; + this.ads = new ArrayList<>(); + this.rules = new ArrayList<>(); + this.lives = new ArrayList<>(); return config(Config.live()); } @@ -84,8 +92,10 @@ public class LiveConfig { } public LiveConfig clear() { - getLives().clear(); this.home = null; + this.ads.clear(); + this.rules.clear(); + this.lives.clear(); return this; } @@ -118,8 +128,7 @@ public class LiveConfig { private void parseText(String text, Callback callback) { Live live = new Live(config.getUrl()).sync(); LiveParser.text(live, text); - getLives().remove(live); - getLives().add(live); + lives.add(live); setHome(live, true); App.post(callback::success); } @@ -144,15 +153,33 @@ public class LiveConfig { } private void parseConfig(JsonObject object, Callback callback) { - List lives = Json.safeListElement(object, "lives"); - if (lives.size() > 0) for (JsonElement element : lives) add(Live.objectFrom(element).check()); - for (Live live : getLives()) if (live.getName().equals(config.getHome())) setHome(live, true); - if (home == null) setHome(getLives().isEmpty() ? new Live() : getLives().get(0), true); - if (callback != null) App.post(callback::success); + try { + initLive(object); + initOther(object); + } catch (Throwable e) { + e.printStackTrace(); + } finally { + if (callback != null) App.post(callback::success); + } + } + + private void initLive(JsonObject object) { + for (JsonElement element : Json.safeListElement(object, "lives")) { + Live live = Live.objectFrom(element); + if (lives.contains(live)) continue; + lives.add(live.sync()); + } + for (Live live : lives) { + if (live.getName().equals(config.getHome())) { + setHome(live, true); + } + } } - private void add(Live live) { - if (!getLives().contains(live)) getLives().add(live.sync()); + private void initOther(JsonObject object) { + if (home == null) setHome(lives.isEmpty() ? new Live() : lives.get(0), true); + setRules(Rule.arrayFrom(object.getAsJsonArray("rules"))); + setAds(Json.safeListString(object, "ads")); } private void bootLive() { @@ -208,6 +235,24 @@ public class LiveConfig { return sync || TextUtils.isEmpty(config.getUrl()) || url.equals(config.getUrl()); } + public List getRules() { + return rules == null ? Collections.emptyList() : rules; + } + + public void setRules(List rules) { + for (Rule rule : rules) if ("proxy".equals(rule.getName())) OkHttp.selector().addAll(rule.getHosts()); + rules.remove(Rule.create("proxy")); + this.rules = rules; + } + + public List getAds() { + return ads == null ? Collections.emptyList() : ads; + } + + private void setAds(List ads) { + this.ads = ads; + } + public List getLives() { return lives == null ? lives = new ArrayList<>() : lives; } 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 2555b1421..3f95c9b00 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 @@ -75,8 +75,12 @@ public class VodConfig { return get().getSites().indexOf(get().getHome()); } + public static boolean hasUrl() { + return getUrl() != null && getUrl().length() > 0; + } + public static boolean hasParse() { - return get().getParses().size() > 0; + return !get().getParses().isEmpty(); } public static void load(Config config, Callback callback) { @@ -302,7 +306,7 @@ public class VodConfig { } public void setRules(List rules) { - for (Rule rule : rules) if ("proxy".equals(rule.getName())) OkHttp.selector().setHosts(rule.getHosts()); + for (Rule rule : rules) if ("proxy".equals(rule.getName())) OkHttp.selector().addAll(rule.getHosts()); rules.remove(Rule.create("proxy")); this.rules = rules; } 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 bfe7e0106..3a8a0f47c 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 @@ -26,6 +26,7 @@ import com.fongmi.android.tv.App; import com.fongmi.android.tv.Constant; 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; @@ -201,7 +202,9 @@ public class CustomWebView extends WebView implements DialogInterface.OnDismissL private boolean isAd(String host) { for (String ad : VodConfig.get().getAds()) if (host.contains(ad)) return true; + for (String ad : LiveConfig.get().getAds()) if (host.contains(ad)) return true; for (String ad : VodConfig.get().getAds()) if (Pattern.compile(ad).matcher(host).find()) return true; + for (String ad : LiveConfig.get().getAds()) if (Pattern.compile(ad).matcher(host).find()) return true; return false; } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java b/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java index c61587971..cbd113615 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java @@ -3,6 +3,7 @@ package com.fongmi.android.tv.utils; import android.net.Uri; import android.text.TextUtils; +import com.fongmi.android.tv.api.config.LiveConfig; import com.fongmi.android.tv.api.config.VodConfig; import com.fongmi.android.tv.bean.Rule; import com.github.catvod.utils.Json; @@ -40,6 +41,7 @@ public class Sniffer { if (uri.getHost() == null) return Rule.empty(); String hosts = TextUtils.join(",", Arrays.asList(UrlUtil.host(uri), UrlUtil.host(uri.getQueryParameter("url")))); for (Rule rule : VodConfig.get().getRules()) for (String host : rule.getHosts()) if (Util.containOrMatch(hosts, host)) return rule; + for (Rule rule : LiveConfig.get().getRules()) for (String host : rule.getHosts()) if (Util.containOrMatch(hosts, host)) return rule; return Rule.empty(); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java index 6f13cfaef..84ecd8096 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java @@ -323,6 +323,7 @@ public class SettingFragment extends BaseFragment implements BackupCallback, Con public void setProxy(String proxy) { Source.get().stop(); Setting.putProxy(proxy); + OkHttp.selector().clear(); OkHttp.get().setProxy(proxy); Notify.progress(getActivity()); VodConfig.load(Config.vod(), getCallback()); diff --git a/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java b/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java index 66e63606c..f79b60d55 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java +++ b/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java @@ -12,16 +12,25 @@ import java.net.Proxy; import java.net.ProxySelector; import java.net.SocketAddress; import java.net.URI; +import java.util.ArrayList; import java.util.Collections; import java.util.List; public class OkProxySelector extends ProxySelector { - private List hosts; + private final List hosts; private Proxy proxy; - public void setHosts(List hosts) { - this.hosts = hosts; + public OkProxySelector() { + this.hosts = new ArrayList<>(); + } + + public void addAll(List hosts) { + this.hosts.addAll(hosts); + } + + public void clear() { + this.hosts.clear(); } public void setProxy(String proxy) { @@ -30,7 +39,7 @@ public class OkProxySelector extends ProxySelector { @Override public List select(URI uri) { - if (proxy == null || hosts == null || hosts.isEmpty() || uri.getHost() == null || "127.0.0.1".equals(uri.getHost())) return Collections.singletonList(Proxy.NO_PROXY); + if (proxy == null || hosts.isEmpty() || uri.getHost() == null || "127.0.0.1".equals(uri.getHost())) return Collections.singletonList(Proxy.NO_PROXY); for (String host : hosts) if (Util.containOrMatch(uri.getHost(), host)) return Collections.singletonList(proxy); return Collections.singletonList(Proxy.NO_PROXY); }