Support single proxy - part 1

pull/142/head
FongMi 3 years ago
parent aea1e3069b
commit 1736e2d545
  1. 2
      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. 6
      app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java
  4. 4
      app/src/main/java/com/fongmi/android/tv/api/JarLoader.java
  5. 4
      app/src/main/java/com/fongmi/android/tv/api/JsLoader.java
  6. 4
      app/src/main/java/com/fongmi/android/tv/api/PyLoader.java
  7. 15
      app/src/main/java/com/fongmi/android/tv/bean/Channel.java
  8. 6
      app/src/main/java/com/fongmi/android/tv/bean/Live.java
  9. 6
      app/src/main/java/com/fongmi/android/tv/bean/Result.java
  10. 2
      app/src/main/java/com/fongmi/android/tv/impl/NewPipeImpl.java
  11. 20
      app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java
  12. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java
  13. 11
      catvod/src/main/java/com/github/catvod/crawler/Spider.java
  14. 5
      catvod/src/main/java/com/github/catvod/net/DeflateInterceptor.java
  15. 49
      catvod/src/main/java/com/github/catvod/net/OkHttp.java
  16. 2
      catvod/src/main/java/com/github/catvod/utils/Github.java
  17. 4
      quickjs/src/main/java/com/fongmi/quickjs/bean/Req.java
  18. 12
      quickjs/src/main/java/com/fongmi/quickjs/method/Global.java
  19. 4
      quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java

@ -323,7 +323,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit
@Override
public void setProxy(String proxy) {
Setting.putProxy(proxy);
OkHttp.get().setProxy(proxy);
OkHttp.get().setProxy();
Notify.progress(getActivity());
ApiConfig.load(Config.vod(), getCallback());
mBinding.proxyText.setText(Util.scheme(proxy));

@ -106,7 +106,6 @@ 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() {

@ -232,9 +232,9 @@ public class ApiConfig {
boolean js = site.getApi().contains(".js");
boolean py = site.getApi().startsWith("py_");
boolean csp = site.getApi().startsWith("csp_");
if (py) return pyLoader.getSpider(site.getKey(), site.getApi(), site.getExt());
else if (js) return jsLoader.getSpider(site.getKey(), site.getApi(), site.getExt(), site.getJar());
else if (csp) return jarLoader.getSpider(site.getKey(), site.getApi(), site.getExt(), site.getJar());
if (py) return pyLoader.getSpider(site.getKey(), site.getApi(), site.getExt(), site.isProxy());
else if (js) return jsLoader.getSpider(site.getKey(), site.getApi(), site.getExt(), site.getJar(), site.isProxy());
else if (csp) return jarLoader.getSpider(site.getKey(), site.getApi(), site.getExt(), site.getJar(), site.isProxy());
else return new SpiderNull();
}

@ -101,14 +101,14 @@ public class JarLoader {
return loaders.get(key);
}
public Spider getSpider(String key, String api, String ext, String jar) {
public Spider getSpider(String key, String api, String ext, String jar, boolean proxy) {
try {
String jaKey = Util.md5(jar);
String spKey = jaKey + key;
if (spiders.containsKey(spKey)) return spiders.get(spKey);
if (!loaders.containsKey(jaKey)) parseJar(jaKey, jar);
Spider spider = (Spider) loaders.get(jaKey).loadClass("com.github.catvod.spider." + api.split("csp_")[1]).newInstance();
spider.init(App.get(), ext);
spider.proxy(proxy).init(App.get(), ext);
spiders.put(spKey, spider);
return spider;
} catch (Throwable e) {

@ -39,11 +39,11 @@ public class JsLoader {
}
}
public Spider getSpider(String key, String api, String ext, String jar) {
public Spider getSpider(String key, String api, String ext, String jar, boolean proxy) {
try {
if (spiders.containsKey(key)) return spiders.get(key);
Spider spider = new com.fongmi.quickjs.crawler.Spider(key, api, dex(key, jar));
spider.init(App.get(), ext);
spider.proxy(proxy).init(App.get(), ext);
spiders.put(key, spider);
return spider;
} catch (Throwable e) {

@ -37,12 +37,12 @@ public class PyLoader {
}
}
public Spider getSpider(String key, String api, String ext) {
public Spider getSpider(String key, String api, String ext, boolean proxy) {
try {
if (spiders.containsKey(key)) return spiders.get(key);
Method method = loader.getClass().getMethod("spider", Context.class, String.class, String.class);
Spider spider = (Spider) method.invoke(loader, App.get(), api.split("py_")[1], ext);
spider.init(App.get(), ext);
spider.proxy(proxy).init(App.get(), ext);
spiders.put(key, spider);
return spider;
} catch (Throwable e) {

@ -39,6 +39,8 @@ public class Channel {
private JsonElement header;
@SerializedName("playerType")
private Integer playerType;
@SerializedName("proxy")
private Boolean proxy;
@SerializedName("drm")
private Drm drm;
@ -143,6 +145,18 @@ public class Channel {
this.playerType = playerType;
}
public Boolean getProxy() {
return proxy;
}
public boolean isProxy() {
return proxy != null && proxy;
}
public void setProxy(boolean proxy) {
this.proxy = proxy;
}
public Drm getDrm() {
return drm;
}
@ -244,6 +258,7 @@ public class Channel {
}
public void live(Live live) {
if (live.isProxy() && getProxy() == null) setProxy(live.isProxy());
if (live.getUa().length() > 0 && getUa().isEmpty()) setUa(live.getUa());
if (live.getHeader() != null && getHeader() == null) setHeader(live.getHeader());
if (live.getReferer().length() > 0 && getReferer().isEmpty()) setReferer(live.getReferer());

@ -23,6 +23,8 @@ public class Live {
private boolean boot;
@SerializedName("pass")
private boolean pass;
@SerializedName("proxy")
private boolean proxy;
@SerializedName("name")
private String name;
@SerializedName("group")
@ -87,6 +89,10 @@ public class Live {
return pass;
}
public boolean isProxy() {
return proxy;
}
public String getName() {
return TextUtils.isEmpty(name) ? "" : name;
}

@ -78,6 +78,8 @@ public class Result implements Parcelable {
@JsonAdapter(MsgAdapter.class)
@SerializedName("msg")
private String msg;
@SerializedName("proxy")
private boolean proxy;
public static Result objectFrom(String str) {
try {
@ -257,6 +259,10 @@ public class Result implements Parcelable {
this.msg = msg;
}
public boolean isProxy() {
return proxy;
}
public boolean hasMsg() {
return getMsg().length() > 0;
}

@ -38,7 +38,7 @@ public class NewPipeImpl extends Downloader {
builder.header(headerName, headerValueList.get(0));
}
}
okhttp3.Response response = OkHttp.client().newCall(builder.build()).execute();
okhttp3.Response response = OkHttp.clientProxy().newCall(builder.build()).execute();
if (response.code() == 429) {
response.close();
throw new ReCaptchaException("reCaptcha Challenge requested", url);

@ -60,6 +60,7 @@ public class ExoUtil {
private static DataSource.Factory dataSourceFactory;
private static ExtractorsFactory extractorsFactory;
private static DatabaseProvider database;
private static boolean proxy;
private static Cache cache;
public static LoadControl buildLoadControl() {
@ -105,22 +106,23 @@ public class ExoUtil {
}
public static MediaSource getSource(Result result, int errorCode) {
return getSource(result.getHeaders(), result.getRealUrl(), result.getFormat(), result.getSubs(), null, errorCode);
return getSource(result.getHeaders(), result.isProxy(), result.getRealUrl(), result.getFormat(), result.getSubs(), null, errorCode);
}
public static MediaSource getSource(Channel channel, int errorCode) {
return getSource(channel.getHeaders(), channel.getUrl(), null, Collections.emptyList(), channel.getDrm(), errorCode);
return getSource(channel.getHeaders(), channel.isProxy(), channel.getUrl(), null, Collections.emptyList(), channel.getDrm(), errorCode);
}
public static MediaSource getSource(Map<String, String> headers, String url, int errorCode) {
return getSource(headers, url, null, Collections.emptyList(), null, errorCode);
return getSource(headers, false, url, null, Collections.emptyList(), null, errorCode);
}
private static MediaSource getSource(Map<String, String> headers, String url, String format, List<Sub> subs, Drm drm, int errorCode) {
private static MediaSource getSource(Map<String, String> headers, boolean proxy, String url, String format, List<Sub> subs, Drm drm, int errorCode) {
if (ExoUtil.proxy != proxy) reset();
Uri uri = Uri.parse(url.trim().replace("\\", ""));
String mimeType = getMimeType(format, errorCode);
if (uri.getUserInfo() != null) headers.put(HttpHeaders.AUTHORIZATION, Util.basic(uri));
return new DefaultMediaSourceFactory(getDataSourceFactory(headers), getExtractorsFactory()).createMediaSource(getMediaItem(uri, mimeType, subs, drm));
return new DefaultMediaSourceFactory(getDataSourceFactory(headers, ExoUtil.proxy = proxy), getExtractorsFactory()).createMediaSource(getMediaItem(uri, mimeType, subs, drm));
}
private static MediaItem getMediaItem(Uri uri, String mimeType, List<Sub> subs, Drm drm) {
@ -169,13 +171,13 @@ public class ExoUtil {
return extractorsFactory;
}
private static synchronized HttpDataSource.Factory getHttpDataSourceFactory() {
if (httpDataSourceFactory == null) httpDataSourceFactory = Setting.getHttp() == 0 ? new DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true).setProxy(Setting.getProxy()) : new OkHttpDataSource.Factory((Call.Factory) OkHttp.client());
private static synchronized HttpDataSource.Factory getHttpDataSourceFactory(boolean proxy) {
if (httpDataSourceFactory == null) httpDataSourceFactory = Setting.getHttp() == 0 ? new DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true).setProxy(proxy ? OkHttp.proxy() : null) : new OkHttpDataSource.Factory((Call.Factory) (proxy ? OkHttp.clientProxy() : OkHttp.client()));
return httpDataSourceFactory;
}
private static synchronized DataSource.Factory getDataSourceFactory(Map<String, String> headers) {
if (dataSourceFactory == null) dataSourceFactory = buildReadOnlyCacheDataSource(new DefaultDataSource.Factory(App.get(), getHttpDataSourceFactory()), getCache());
private static synchronized DataSource.Factory getDataSourceFactory(Map<String, String> headers, boolean proxy) {
if (dataSourceFactory == null) dataSourceFactory = buildReadOnlyCacheDataSource(new DefaultDataSource.Factory(App.get(), getHttpDataSourceFactory(proxy)), getCache());
httpDataSourceFactory.setDefaultRequestProperties(Utils.checkUa(headers));
return dataSourceFactory;
}

@ -330,7 +330,7 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit
@Override
public void setProxy(String proxy) {
Setting.putProxy(proxy);
OkHttp.get().setProxy(proxy);
OkHttp.get().setProxy();
Notify.progress(getActivity());
ApiConfig.load(Config.vod(), getCallback());
mBinding.proxyText.setText(Util.scheme(proxy));

@ -13,6 +13,13 @@ import okhttp3.Dns;
public abstract class Spider {
private boolean proxy;
public Spider proxy(boolean proxy) {
this.proxy = proxy;
return this;
}
public void init(Context context) throws Exception {
}
@ -56,6 +63,10 @@ public abstract class Spider {
return false;
}
public boolean isProxy() {
return proxy;
}
public Object[] proxyLocal(Map<String, String> params) throws Exception {
return null;
}

@ -21,10 +21,7 @@ public class DeflateInterceptor implements Interceptor {
@NonNull
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
return deflate(chain.proceed(chain.request()));
}
private Response deflate(Response response) {
Response response = chain.proceed(chain.request());
String encoding = response.header(HttpHeaders.CONTENT_ENCODING);
if (response.body() == null || encoding == null || !encoding.equals("deflate")) return response;
InflaterInputStream is = new InflaterInputStream(response.body().byteStream(), new Inflater(true));

@ -6,6 +6,7 @@ import androidx.collection.ArrayMap;
import com.github.catvod.bean.Doh;
import com.github.catvod.utils.Path;
import com.github.catvod.utils.Prefers;
import com.github.catvod.utils.Util;
import com.google.common.net.HttpHeaders;
@ -34,10 +35,11 @@ public class OkHttp {
private static final int TIMEOUT = 30 * 1000;
private static final int CACHE = 100 * 1024 * 1024;
private Uri proxy;
private DnsOverHttps dns;
private OkHttpClient client;
private OkHttpClient noRedirect;
private OkHttpClient clientProxy;
private OkHttpClient noRedirectProxy;
private static class Loader {
static volatile OkHttp INSTANCE = new OkHttp();
@ -50,15 +52,21 @@ public class OkHttp {
public void setDoh(Doh doh) {
OkHttpClient dohClient = new OkHttpClient.Builder().cache(new Cache(Path.doh(), CACHE)).hostnameVerifier(SSLCompat.VERIFIER).sslSocketFactory(new SSLCompat(), SSLCompat.TM).build();
dns = doh.getUrl().isEmpty() ? null : new DnsOverHttps.Builder().client(dohClient).url(HttpUrl.get(doh.getUrl())).bootstrapDnsHosts(doh.getHosts()).build();
noRedirectProxy = null;
clientProxy = null;
noRedirect = null;
client = null;
}
public void setProxy(String proxy) {
public void setProxy() {
Authenticator.setDefault(null);
this.proxy = Uri.parse(proxy);
noRedirect = null;
client = null;
noRedirectProxy = null;
clientProxy = null;
}
public static OkHttpClient client(boolean proxy, boolean redirect) {
if (proxy) return redirect ? clientProxy() : noRedirectProxy();
else return redirect ? client() : noRedirect();
}
public static OkHttpClient client() {
@ -71,18 +79,30 @@ public class OkHttp {
return get().noRedirect = client().newBuilder().followRedirects(false).followSslRedirects(false).build();
}
public static OkHttpClient clientProxy() {
if (get().clientProxy != null) return get().clientProxy;
return get().clientProxy = clientProxy(TIMEOUT);
}
public static OkHttpClient noRedirectProxy() {
if (get().noRedirectProxy != null) return get().noRedirectProxy;
return get().noRedirectProxy = clientProxy().newBuilder().followRedirects(false).followSslRedirects(false).build();
}
public static Dns dns() {
return get().dns != null ? get().dns : Dns.SYSTEM;
}
public static Uri proxy() {
return get().proxy;
return Uri.parse(Prefers.getString("proxy"));
}
public static OkHttpClient client(int timeout) {
OkHttpClient.Builder builder = 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);
if (proxy() != null && proxy().getScheme() != null && proxy().getHost() != null && proxy().getPort() > 0) setProxy(builder);
return builder.build();
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).build();
}
public static OkHttpClient clientProxy(int timeout) {
return getProxyBuilder(proxy(), timeout).build();
}
public static Call newCall(String url) {
@ -127,11 +147,14 @@ public class OkHttp {
return builder.build();
}
private static void setProxy(OkHttpClient.Builder builder) {
String userInfo = proxy().getUserInfo();
private static OkHttpClient.Builder getProxyBuilder(Uri uri, int timeout) {
String userInfo = uri.getUserInfo();
OkHttpClient.Builder builder = client(timeout).newBuilder();
if (userInfo != null && userInfo.contains(":")) setAuthenticator(builder, userInfo);
if (Util.scheme(proxy()).startsWith("http")) builder.proxy(new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved(proxy().getHost(), proxy().getPort())));
if (Util.scheme(proxy()).startsWith("socks")) builder.proxy(new Proxy(Proxy.Type.SOCKS, InetSocketAddress.createUnresolved(proxy().getHost(), proxy().getPort())));
if (uri.getScheme() != null && uri.getHost() != null && uri.getPort() > 0) return builder;
if (Util.scheme(uri).startsWith("http")) builder.proxy(new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved(uri.getHost(), uri.getPort())));
if (Util.scheme(uri).startsWith("socks")) builder.proxy(new Proxy(Proxy.Type.SOCKS, InetSocketAddress.createUnresolved(uri.getHost(), uri.getPort())));
return builder;
}
private static void setAuthenticator(OkHttpClient.Builder builder, String userInfo) {

@ -30,7 +30,7 @@ public class Github {
}
private Github() {
client = OkHttp.client(TIMEOUT);
client = OkHttp.clientProxy(TIMEOUT);
check(A);
check(B);
check(C);

@ -67,6 +67,10 @@ public class Req {
return headers;
}
public boolean isRedirect() {
return getRedirect() == 1;
}
public Map<String, String> getHeader() {
return Json.toMap(getHeaders());
}

@ -37,18 +37,20 @@ public class Global {
private final ExecutorService executor;
private final QuickJSContext ctx;
private final Parser parser;
private final boolean proxy;
private final Timer timer;
private final Gson gson;
public static Global create(QuickJSContext ctx, ExecutorService executor) {
return new Global(ctx, executor);
public static Global create(QuickJSContext ctx, ExecutorService executor, boolean proxy) {
return new Global(ctx, executor, proxy);
}
private Global(QuickJSContext ctx, ExecutorService executor) {
private Global(QuickJSContext ctx, ExecutorService executor, boolean proxy) {
this.parser = new Parser();
this.executor = executor;
this.timer = new Timer();
this.gson = new Gson();
this.proxy = proxy;
this.ctx = ctx;
}
@ -115,7 +117,7 @@ public class Global {
JSFunction complete = options.getJSFunction("complete");
if (complete == null) return req(url, options);
Req req = Req.objectFrom(ctx.stringify(options));
Connect.to(url, req).enqueue(getCallback(complete, req));
Connect.to(url, req, proxy).enqueue(getCallback(complete, req));
return null;
}
@ -124,7 +126,7 @@ public class Global {
public JSObject req(String url, JSObject options) {
try {
Req req = Req.objectFrom(ctx.stringify(options));
Response res = Connect.to(url, req).execute();
Response res = Connect.to(url, req, proxy).execute();
return Connect.success(ctx, req, res);
} catch (Exception e) {
return Connect.error(ctx);

@ -23,8 +23,8 @@ import okhttp3.Response;
public class Connect {
public static Call to(String url, Req req) {
OkHttpClient client = req.getRedirect() == 1 ? OkHttp.client() : OkHttp.noRedirect();
public static Call to(String url, Req req, boolean proxy) {
OkHttpClient client = OkHttp.client(proxy, req.isRedirect());
client = client.newBuilder().connectTimeout(req.getTimeout(), TimeUnit.MILLISECONDS).readTimeout(req.getTimeout(), TimeUnit.MILLISECONDS).writeTimeout(req.getTimeout(), TimeUnit.MILLISECONDS).build();
return client.newCall(getRequest(url, req, Headers.of(req.getHeader())));
}

Loading…
Cancel
Save