New proxy setting

pull/142/head
FongMi 3 years ago
parent 3fde222ce2
commit 36bb3b9990
  1. 1
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java
  2. 1
      app/src/main/java/com/fongmi/android/tv/App.java
  3. 2
      app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java
  4. 8
      app/src/main/java/com/fongmi/android/tv/bean/Rule.java
  5. 4
      app/src/main/java/com/fongmi/android/tv/player/extractor/Magnet.java
  6. 4
      app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java
  7. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java
  8. 44
      catvod/src/main/java/com/github/catvod/net/OkHttp.java
  9. 2
      catvod/src/main/java/com/github/catvod/net/OkhttpInterceptor.java
  10. 57
      catvod/src/main/java/com/github/catvod/net/ProxySelector.java
  11. 2
      catvod/src/main/java/com/github/catvod/utils/Github.java
  12. 5
      thunder/src/main/java/com/xunlei/downloadlib/Util.java
  13. 4
      thunder/src/main/java/com/xunlei/downloadlib/parameter/TorrentInfo.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));

@ -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() {

@ -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<Rule> rules) {
for (Rule rule : rules) if ("proxy".equals(rule.getName())) OkHttp.selector().setHosts(rule.getHosts());
this.rules = rules;
}

@ -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<String> 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<String> getHosts() {
return hosts == null ? Collections.emptyList() : hosts;
}

@ -17,7 +17,6 @@ import java.util.concurrent.Callable;
public class Magnet implements Callable<List<Episode>> {
private final List<String> ads;
private final String url;
private int time;
@ -27,7 +26,6 @@ public class Magnet implements Callable<List<Episode>> {
public Magnet(String url) {
this.url = url;
this.ads = Sniffer.getRegex("magnet");
}
private void sleep() {
@ -43,7 +41,7 @@ public class Magnet implements Callable<List<Episode>> {
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<TorrentFileInfo> medias = XLTaskHelper.get().getTorrentInfo(taskId.getSaveFile()).getMedias(ads);
List<TorrentFileInfo> 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;

@ -55,8 +55,8 @@ public class Sniffer {
return regex;
}
public static List<String> getRegex(String key) {
for (Rule rule : ApiConfig.get().getRules()) for (String host : rule.getHosts()) if (host.equals(key)) return rule.getRegex();
public static List<String> getProxy() {
for (Rule rule : ApiConfig.get().getRules()) if ("proxy".equals(rule.getName())) return rule.getHosts();
return Collections.emptyList();
}

@ -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));

@ -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<String, String> 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());
}
});
}
}

@ -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

@ -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<String> hosts;
private Proxy proxy;
public void setHosts(List<String> hosts) {
this.hosts = hosts;
}
public void setProxy(String proxy) {
this.proxy = getProxy(proxy);
}
@Override
public List<Proxy> 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());
}
});
}
}

@ -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) {

@ -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<String> ads, String name) {
for (String ad : ads) if (name.contains(ad)) return false;
return true;
}
}

@ -27,9 +27,9 @@ public class TorrentInfo {
return mSubFileInfo == null ? new TorrentFileInfo[0] : mSubFileInfo;
}
public List<TorrentFileInfo> getMedias(List<String> ads) {
public List<TorrentFileInfo> getMedias() {
List<TorrentFileInfo> 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;
}

Loading…
Cancel
Save