From d0ad588900edafb432288bbbb6723f4f3da993d1 Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 11 Feb 2025 23:43:24 +0800 Subject: [PATCH] Support hosts --- .../android/tv/api/config/LiveConfig.java | 5 +++ .../android/tv/api/config/VodConfig.java | 5 +++ .../java/com/github/catvod/net/OkDns.java | 40 +++++++++++++++++++ .../java/com/github/catvod/net/OkHttp.java | 21 +++++----- 4 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 catvod/src/main/java/com/github/catvod/net/OkDns.java 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 2405631c3..e04d3704f 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 @@ -199,6 +199,7 @@ public class LiveConfig { private void initOther(JsonObject object) { if (home == null) setHome(lives.isEmpty() ? new Live() : lives.get(0), true); setRules(Rule.arrayFrom(object.getAsJsonArray("rules"))); + setHosts(Json.safeListString(object, "hosts")); setAds(Json.safeListString(object, "ads")); } @@ -268,6 +269,10 @@ public class LiveConfig { this.rules = rules; } + public void setHosts(List hosts) { + OkHttp.dns().addAll(hosts); + } + public List getAds() { return ads == null ? Collections.emptyList() : ads; } 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 5c1d454b6..6b0c5276f 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 @@ -203,6 +203,7 @@ public class VodConfig { setRules(Rule.arrayFrom(object.getAsJsonArray("rules"))); setDoh(Doh.arrayFrom(object.getAsJsonArray("doh"))); setFlags(Json.safeListString(object, "flags")); + setHosts(Json.safeListString(object, "hosts")); setWall(Json.safeString(object, "wallpaper")); setAds(Json.safeListString(object, "ads")); } @@ -262,6 +263,10 @@ public class VodConfig { this.flags.addAll(flags); } + public void setHosts(List hosts) { + OkHttp.dns().addAll(hosts); + } + public List getAds() { return ads == null ? Collections.emptyList() : ads; } diff --git a/catvod/src/main/java/com/github/catvod/net/OkDns.java b/catvod/src/main/java/com/github/catvod/net/OkDns.java new file mode 100644 index 000000000..04a6fec42 --- /dev/null +++ b/catvod/src/main/java/com/github/catvod/net/OkDns.java @@ -0,0 +1,40 @@ +package com.github.catvod.net; + +import androidx.annotation.NonNull; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.HashMap; +import java.util.List; + +import okhttp3.Dns; + +public class OkDns implements Dns { + + private final HashMap map; + private Dns doh; + + public OkDns() { + this.map = new HashMap<>(); + } + + public void setDoh(Dns doh) { + this.doh = doh; + } + + public void addAll(List hosts) { + for (String host : hosts) { + if (!host.contains("=")) continue; + String[] splits = host.split("="); + map.put(splits[0], splits[1]); + } + } + + @NonNull + @Override + public List lookup(@NonNull String hostname) throws UnknownHostException { + if (map.containsKey(hostname)) return Dns.SYSTEM.lookup(map.get(hostname)); + return doh != null ? doh.lookup(hostname) : Dns.SYSTEM.lookup(hostname); + } +} + diff --git a/catvod/src/main/java/com/github/catvod/net/OkHttp.java b/catvod/src/main/java/com/github/catvod/net/OkHttp.java index 07c9a61e6..90ea09603 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkHttp.java +++ b/catvod/src/main/java/com/github/catvod/net/OkHttp.java @@ -23,7 +23,6 @@ import javax.net.ssl.X509TrustManager; import okhttp3.Cache; import okhttp3.Call; -import okhttp3.Dns; import okhttp3.FormBody; import okhttp3.Headers; import okhttp3.HttpUrl; @@ -39,10 +38,11 @@ public class OkHttp { private static final int CACHE = 100 * 1024 * 1024; private static final ProxySelector defaultSelector; - private boolean proxy; - private DnsOverHttps dns; - private OkHttpClient client; private OkProxySelector selector; + private OkHttpClient client; + private OkDns dns; + + private boolean proxy; static { defaultSelector = ProxySelector.getDefault(); @@ -56,16 +56,17 @@ public class OkHttp { return Loader.INSTANCE; } - public static Dns dns() { - return get().dns != null ? get().dns : Dns.SYSTEM; - } - public void setDoh(Doh doh) { - OkHttpClient dohClient = new OkHttpClient.Builder().cache(new Cache(Path.doh(), CACHE)).build(); - dns = doh.getUrl().isEmpty() ? null : new DnsOverHttps.Builder().client(dohClient).url(HttpUrl.get(doh.getUrl())).bootstrapDnsHosts(doh.getHosts()).build(); + OkHttpClient c = new OkHttpClient.Builder().cache(new Cache(Path.doh(), CACHE)).build(); + dns().setDoh(doh.getUrl().isEmpty() ? null : new DnsOverHttps.Builder().client(c).url(HttpUrl.get(doh.getUrl())).bootstrapDnsHosts(doh.getHosts()).build()); client = null; } + public static OkDns dns() { + if (get().dns != null) return get().dns; + return get().dns = new OkDns(); + } + public void setProxy(String proxy) { ProxySelector.setDefault(TextUtils.isEmpty(proxy) ? defaultSelector : selector()); if (!TextUtils.isEmpty(proxy)) selector().setProxy(proxy);