From 36bb3b9990efab803f6bab34c0fd68f267b2dbc2 Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 27 Sep 2023 01:29:25 +0800 Subject: [PATCH] New proxy setting --- .../tv/ui/activity/SettingActivity.java | 1 + .../main/java/com/fongmi/android/tv/App.java | 1 + .../com/fongmi/android/tv/api/ApiConfig.java | 2 + .../java/com/fongmi/android/tv/bean/Rule.java | 8 +++ .../android/tv/player/extractor/Magnet.java | 4 +- .../com/fongmi/android/tv/utils/Sniffer.java | 4 +- .../tv/ui/fragment/SettingFragment.java | 2 +- .../java/com/github/catvod/net/OkHttp.java | 44 +++++--------- ...nterceptor.java => OkhttpInterceptor.java} | 2 +- .../com/github/catvod/net/ProxySelector.java | 57 +++++++++++++++++++ .../java/com/github/catvod/utils/Github.java | 2 +- .../java/com/xunlei/downloadlib/Util.java | 5 -- .../downloadlib/parameter/TorrentInfo.java | 4 +- 13 files changed, 91 insertions(+), 45 deletions(-) rename catvod/src/main/java/com/github/catvod/net/{DeflateInterceptor.java => OkhttpInterceptor.java} (96%) create mode 100644 catvod/src/main/java/com/github/catvod/net/ProxySelector.java 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 cef6ccb60..ecd27ace9 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 @@ -323,6 +323,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit @Override public void setProxy(String proxy) { Setting.putProxy(proxy); + OkHttp.get().setProxy(proxy); Notify.progress(getActivity()); ApiConfig.load(Config.vod(), getCallback()); mBinding.proxyText.setText(Util.scheme(proxy)); diff --git a/app/src/main/java/com/fongmi/android/tv/App.java b/app/src/main/java/com/fongmi/android/tv/App.java index ba1fbca7f..93bef9e26 100644 --- a/app/src/main/java/com/fongmi/android/tv/App.java +++ b/app/src/main/java/com/fongmi/android/tv/App.java @@ -106,6 +106,7 @@ public class App extends Application { super.onCreate(); Notify.createChannel(); Logger.addLogAdapter(getLogAdapter()); + OkHttp.get().setProxy(Setting.getProxy()); OkHttp.get().setDoh(Doh.objectFrom(Setting.getDoh())); CaocConfig.Builder.create().backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT).errorActivity(CrashActivity.class).apply(); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { 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 e06036876..da7abba16 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 @@ -15,6 +15,7 @@ import com.fongmi.android.tv.utils.Utils; import com.github.catvod.bean.Doh; import com.github.catvod.crawler.Spider; import com.github.catvod.crawler.SpiderNull; +import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Json; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -282,6 +283,7 @@ public class ApiConfig { } public void setRules(List rules) { + for (Rule rule : rules) if ("proxy".equals(rule.getName())) OkHttp.selector().setHosts(rule.getHosts()); this.rules = rules; } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Rule.java b/app/src/main/java/com/fongmi/android/tv/bean/Rule.java index eaf151df3..d64f04f59 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Rule.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Rule.java @@ -1,5 +1,7 @@ package com.fongmi.android.tv.bean; +import android.text.TextUtils; + import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.annotations.SerializedName; @@ -11,6 +13,8 @@ import java.util.List; public class Rule { + @SerializedName("name") + private String name; @SerializedName("hosts") private List hosts; @SerializedName("regex") @@ -22,6 +26,10 @@ public class Rule { return items == null ? Collections.emptyList() : items; } + public String getName() { + return TextUtils.isEmpty(name) ? "" : name; + } + public List getHosts() { return hosts == null ? Collections.emptyList() : hosts; } diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/Magnet.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/Magnet.java index 952c6d7a7..4c9fec716 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/Magnet.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/Magnet.java @@ -17,7 +17,6 @@ import java.util.concurrent.Callable; public class Magnet implements Callable> { - private final List ads; private final String url; private int time; @@ -27,7 +26,6 @@ public class Magnet implements Callable> { public Magnet(String url) { this.url = url; - this.ads = Sniffer.getRegex("magnet"); } private void sleep() { @@ -43,7 +41,7 @@ public class Magnet implements Callable> { if (!torrent && !taskId.getRealUrl().startsWith("magnet")) return List.of(Episode.create(taskId.getFileName(), taskId.getRealUrl())); if (torrent) Download.create(url, taskId.getSaveFile()).start(); else while (XLTaskHelper.get().getTaskInfo(taskId).getTaskStatus() != 2 && time < 5000) sleep(); - List medias = XLTaskHelper.get().getTorrentInfo(taskId.getSaveFile()).getMedias(ads); + List medias = XLTaskHelper.get().getTorrentInfo(taskId.getSaveFile()).getMedias(); for (TorrentFileInfo media : medias) episodes.add(Episode.create(media.getFileName(), media.getSize(), media.getPlayUrl())); XLTaskHelper.get().stopTask(taskId); return episodes; 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 f0f260ef5..c6b74ab19 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 @@ -55,8 +55,8 @@ public class Sniffer { return regex; } - public static List getRegex(String key) { - for (Rule rule : ApiConfig.get().getRules()) for (String host : rule.getHosts()) if (host.equals(key)) return rule.getRegex(); + public static List getProxy() { + for (Rule rule : ApiConfig.get().getRules()) if ("proxy".equals(rule.getName())) return rule.getHosts(); return Collections.emptyList(); } 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 7140b6612..aa874d851 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 @@ -330,7 +330,7 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit @Override public void setProxy(String proxy) { Setting.putProxy(proxy); - OkHttp.get().resetProxy(); + OkHttp.get().setProxy(proxy); Notify.progress(getActivity()); ApiConfig.load(Config.vod(), getCallback()); mBinding.proxyText.setText(Util.scheme(proxy)); 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 058278204..2b4bc432c 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkHttp.java +++ b/catvod/src/main/java/com/github/catvod/net/OkHttp.java @@ -9,17 +9,12 @@ import com.github.catvod.utils.Path; import com.github.catvod.utils.Util; import com.google.common.net.HttpHeaders; -import java.net.Authenticator; -import java.net.InetSocketAddress; -import java.net.PasswordAuthentication; -import java.net.Proxy; import java.util.Map; import java.util.Objects; import java.util.concurrent.TimeUnit; import okhttp3.Cache; import okhttp3.Call; -import okhttp3.Credentials; import okhttp3.Dns; import okhttp3.FormBody; import okhttp3.Headers; @@ -36,6 +31,7 @@ public class OkHttp { private DnsOverHttps dns; private OkHttpClient client; + private ProxySelector selector; private static class Loader { static volatile OkHttp INSTANCE = new OkHttp(); @@ -55,6 +51,16 @@ public class OkHttp { client = null; } + public void setProxy(String proxy) { + selector().setProxy(proxy); + client = null; + } + + public static ProxySelector selector() { + if (get().selector != null) return get().selector; + return get().selector = new ProxySelector(); + } + public static OkHttpClient client() { if (get().client != null) return get().client; return get().client = getBuilder().build(); @@ -87,7 +93,7 @@ public class OkHttp { } public static Call newCall(String url, Headers headers) { - return newCall(url, headers); + return client().newCall(new Request.Builder().url(url).headers(headers).build()); } public static Call newCall(String url, Headers headers, ArrayMap params) { @@ -115,30 +121,8 @@ public class OkHttp { } private static OkHttpClient.Builder getBuilder() { - return new OkHttpClient.Builder().addInterceptor(new DeflateInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier(SSLCompat.VERIFIER).sslSocketFactory(new SSLCompat(), SSLCompat.TM); - } - - private static OkHttpClient.Builder getBuilder(String proxy) { - Uri uri = Uri.parse(proxy); - String userInfo = uri.getUserInfo(); - OkHttpClient.Builder builder = client().newBuilder(); - if (userInfo != null && userInfo.contains(":")) setAuthenticator(builder, userInfo); - if (uri.getScheme() == null || uri.getHost() == null || uri.getPort() <= 0) return builder; - if (uri.getScheme().startsWith("http")) builder.proxy(new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved(uri.getHost(), uri.getPort()))); - if (uri.getScheme().startsWith("socks")) builder.proxy(new Proxy(Proxy.Type.SOCKS, InetSocketAddress.createUnresolved(uri.getHost(), uri.getPort()))); + OkHttpClient.Builder builder = new OkHttpClient.Builder().addInterceptor(new OkhttpInterceptor()).connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS).readTimeout(TIMEOUT, TimeUnit.MILLISECONDS).writeTimeout(TIMEOUT, TimeUnit.MILLISECONDS).dns(dns()).hostnameVerifier(SSLCompat.VERIFIER).sslSocketFactory(new SSLCompat(), SSLCompat.TM); + builder.proxySelector(selector()); return builder; } - - private static void setAuthenticator(OkHttpClient.Builder builder, String userInfo) { - builder.proxyAuthenticator((route, response) -> { - String credential = Credentials.basic(userInfo.split(":")[0], userInfo.split(":")[1]); - return response.request().newBuilder().header("Proxy-Authorization", credential).build(); - }); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(userInfo.split(":")[0], userInfo.split(":")[1].toCharArray()); - } - }); - } } diff --git a/catvod/src/main/java/com/github/catvod/net/DeflateInterceptor.java b/catvod/src/main/java/com/github/catvod/net/OkhttpInterceptor.java similarity index 96% rename from catvod/src/main/java/com/github/catvod/net/DeflateInterceptor.java rename to catvod/src/main/java/com/github/catvod/net/OkhttpInterceptor.java index ed8bf1a67..635ad9284 100644 --- a/catvod/src/main/java/com/github/catvod/net/DeflateInterceptor.java +++ b/catvod/src/main/java/com/github/catvod/net/OkhttpInterceptor.java @@ -16,7 +16,7 @@ import okhttp3.ResponseBody; import okio.BufferedSource; import okio.Okio; -public class DeflateInterceptor implements Interceptor { +public class OkhttpInterceptor implements Interceptor { @NonNull @Override diff --git a/catvod/src/main/java/com/github/catvod/net/ProxySelector.java b/catvod/src/main/java/com/github/catvod/net/ProxySelector.java new file mode 100644 index 000000000..aa5f695ce --- /dev/null +++ b/catvod/src/main/java/com/github/catvod/net/ProxySelector.java @@ -0,0 +1,57 @@ +package com.github.catvod.net; + +import android.net.Uri; + +import java.io.IOException; +import java.net.Authenticator; +import java.net.InetSocketAddress; +import java.net.PasswordAuthentication; +import java.net.Proxy; +import java.net.SocketAddress; +import java.net.URI; +import java.util.Collections; +import java.util.List; + +public class ProxySelector extends java.net.ProxySelector { + + private List hosts; + private Proxy proxy; + + public void setHosts(List hosts) { + this.hosts = hosts; + } + + public void setProxy(String proxy) { + this.proxy = getProxy(proxy); + } + + @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); + for (String host : hosts) if (uri.getHost().contains(host)) return Collections.singletonList(proxy); + return Collections.singletonList(Proxy.NO_PROXY); + } + + @Override + public void connectFailed(URI uri, SocketAddress socketAddress, IOException e) { + } + + private Proxy getProxy(String proxy) { + Uri uri = Uri.parse(proxy); + String userInfo = uri.getUserInfo(); + if (userInfo != null && userInfo.contains(":")) setAuthenticator(userInfo); + if (uri.getScheme() == null || uri.getHost() == null || uri.getPort() <= 0) return Proxy.NO_PROXY; + if (uri.getScheme().startsWith("http")) return new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved(uri.getHost(), uri.getPort())); + if (uri.getScheme().startsWith("socks")) return new Proxy(Proxy.Type.SOCKS, InetSocketAddress.createUnresolved(uri.getHost(), uri.getPort())); + return Proxy.NO_PROXY; + } + + private void setAuthenticator(String userInfo) { + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(userInfo.split(":")[0], userInfo.split(":")[1].toCharArray()); + } + }); + } +} diff --git a/catvod/src/main/java/com/github/catvod/utils/Github.java b/catvod/src/main/java/com/github/catvod/utils/Github.java index 2ed3bf02c..eac675994 100644 --- a/catvod/src/main/java/com/github/catvod/utils/Github.java +++ b/catvod/src/main/java/com/github/catvod/utils/Github.java @@ -50,7 +50,7 @@ public class Github { } private String getProxy() { - return TextUtils.isEmpty(proxy) ? "" : proxy; + return TextUtils.isEmpty(proxy) ? A + M : proxy; } private static String getUrl(String path, String name) { diff --git a/thunder/src/main/java/com/xunlei/downloadlib/Util.java b/thunder/src/main/java/com/xunlei/downloadlib/Util.java index 386950125..8f182c7e7 100644 --- a/thunder/src/main/java/com/xunlei/downloadlib/Util.java +++ b/thunder/src/main/java/com/xunlei/downloadlib/Util.java @@ -12,9 +12,4 @@ public class Util { public static boolean isMedia(String ext, long size) { return (VIDEO.contains(ext) || AUDIO.contains(ext)) && size > MINIMAL; } - - public static boolean notAd(List ads, String name) { - for (String ad : ads) if (name.contains(ad)) return false; - return true; - } } diff --git a/thunder/src/main/java/com/xunlei/downloadlib/parameter/TorrentInfo.java b/thunder/src/main/java/com/xunlei/downloadlib/parameter/TorrentInfo.java index cb0626287..1aa3aa450 100644 --- a/thunder/src/main/java/com/xunlei/downloadlib/parameter/TorrentInfo.java +++ b/thunder/src/main/java/com/xunlei/downloadlib/parameter/TorrentInfo.java @@ -27,9 +27,9 @@ public class TorrentInfo { return mSubFileInfo == null ? new TorrentFileInfo[0] : mSubFileInfo; } - public List getMedias(List ads) { + public List getMedias() { List items = new ArrayList<>(); - for (TorrentFileInfo item : getSubFileInfo()) if (Util.isMedia(item.getExt(), item.getFileSize()) && Util.notAd(ads, item.getFileName())) items.add(item.file(getFile())); + for (TorrentFileInfo item : getSubFileInfo()) if (Util.isMedia(item.getExt(), item.getFileSize())) items.add(item.file(getFile())); TorrentFileInfo.Sorter.sort(items); return items; }