From a53a3710b8db8f3aeee79cae1fbb180104179f1c Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 17 Jul 2024 20:31:00 +0800 Subject: [PATCH] Live support ads and rules --- .../android/tv/api/config/LiveConfig.java | 65 ++++++++++++++++--- .../android/tv/api/config/VodConfig.java | 2 +- .../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 +++-- 6 files changed, 75 insertions(+), 15 deletions(-) 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 ebe56d922..8cf8e2ea2 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 @@ -296,7 +296,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 c69b1b6bd..fc2b58f8c 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 @@ -19,6 +19,7 @@ import androidx.annotation.NonNull; import com.fongmi.android.tv.App; import com.fongmi.android.tv.Constant; 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; @@ -170,7 +171,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 522e55cca..1b963910f 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 @@ -331,6 +331,7 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit 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); }