From 24150e89ecd6b0be618795bd85dc0771942f86e6 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 24 Sep 2023 01:10:18 +0800 Subject: [PATCH] Clean code --- .../com/fongmi/android/tv/bean/Channel.java | 15 +++++++ .../java/com/fongmi/android/tv/bean/Live.java | 6 +++ .../com/fongmi/android/tv/bean/Result.java | 10 +++++ .../java/com/fongmi/android/tv/bean/Site.java | 10 ++++- .../fongmi/android/tv/impl/NewPipeImpl.java | 2 +- .../android/tv/model/SiteViewModel.java | 3 ++ .../com/fongmi/android/tv/player/ExoUtil.java | 20 +++++----- .../android/tv/utils/OkHttpGlideModule.java | 2 +- .../tv/ui/fragment/SettingFragment.java | 1 + .../com/github/catvod/crawler/Spider.java | 11 +++++ .../java/com/github/catvod/net/OkHttp.java | 40 ++++++++++++++----- .../java/com/github/catvod/utils/Github.java | 2 +- .../com/fongmi/quickjs/crawler/Spider.java | 2 +- .../com/fongmi/quickjs/method/Global.java | 12 +++--- .../com/fongmi/quickjs/utils/Connect.java | 4 +- 15 files changed, 109 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java index 53a8af9b7..5ca880357 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java @@ -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()); diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Live.java b/app/src/main/java/com/fongmi/android/tv/bean/Live.java index 0aa427f4c..336cb2315 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Live.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Live.java @@ -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; } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Result.java b/app/src/main/java/com/fongmi/android/tv/bean/Result.java index e7d7fa3d9..0ea5af514 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Result.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Result.java @@ -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,14 @@ public class Result implements Parcelable { this.msg = msg; } + public boolean isProxy() { + return proxy; + } + + public void setProxy(boolean proxy) { + this.proxy = proxy; + } + public boolean hasMsg() { return getMsg().length() > 0; } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Site.java b/app/src/main/java/com/fongmi/android/tv/bean/Site.java index 09eaaaabd..0f3ccd070 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Site.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Site.java @@ -22,7 +22,7 @@ import java.util.List; import okhttp3.Headers; -@Entity(ignoredColumns = {"type", "api", "playUrl", "timeout", "playerType", "ext", "jar", "style", "categories", "header"}) +@Entity(ignoredColumns = {"type", "api", "playUrl", "timeout", "playerType", "ext", "jar", "style", "categories", "header", "proxy"}) public class Site implements Parcelable { @NonNull @@ -60,6 +60,8 @@ public class Site implements Parcelable { private List categories; @SerializedName("header") private JsonElement header; + @SerializedName("proxy") + private boolean proxy; private boolean activated; @@ -187,6 +189,10 @@ public class Site implements Parcelable { return header; } + public boolean isProxy() { + return proxy; + } + public boolean isActivated() { return activated; } @@ -281,6 +287,7 @@ public class Site implements Parcelable { dest.writeString(this.jar); dest.writeParcelable(this.style, flags); dest.writeStringList(this.categories); + dest.writeByte(this.proxy ? (byte) 1 : (byte) 0); dest.writeByte(this.activated ? (byte) 1 : (byte) 0); } @@ -300,6 +307,7 @@ public class Site implements Parcelable { this.jar = in.readString(); this.style = in.readParcelable(Style.class.getClassLoader()); this.categories = in.createStringArrayList(); + this.proxy = in.readByte() != 0; this.activated = in.readByte() != 0; } diff --git a/app/src/main/java/com/fongmi/android/tv/impl/NewPipeImpl.java b/app/src/main/java/com/fongmi/android/tv/impl/NewPipeImpl.java index 8ed668f18..5d7b276ee 100644 --- a/app/src/main/java/com/fongmi/android/tv/impl/NewPipeImpl.java +++ b/app/src/main/java/com/fongmi/android/tv/impl/NewPipeImpl.java @@ -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.client(true).newCall(builder.build()).execute(); if (response.code() == 429) { response.close(); throw new ReCaptchaException("reCaptcha Challenge requested", url); diff --git a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java index 127924d0a..2616ae1a0 100644 --- a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java +++ b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java @@ -160,6 +160,7 @@ public class SiteViewModel extends ViewModel { if (result.getFlag().isEmpty()) result.setFlag(flag); result.setUrl(Source.get().fetch(result)); result.setHeader(site.getHeader()); + result.setProxy(site.isProxy()); checkDanmaku(result); result.setKey(key); return result; @@ -173,6 +174,7 @@ public class SiteViewModel extends ViewModel { if (result.getFlag().isEmpty()) result.setFlag(flag); result.setUrl(Source.get().fetch(result)); result.setHeader(site.getHeader()); + result.setProxy(site.isProxy()); checkDanmaku(result); return result; } else if (site.isEmpty() && key.equals("push_agent")) { @@ -188,6 +190,7 @@ public class SiteViewModel extends ViewModel { Result result = new Result(); result.setUrl(url); result.setFlag(flag); + result.setProxy(site.isProxy()); result.setHeader(site.getHeader()); result.setPlayUrl(site.getPlayUrl()); result.setParse(Sniffer.isVideoFormat(url.v()) && result.getPlayUrl().isEmpty() ? 0 : 1); diff --git a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java index 37b03f017..20ebb7689 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java @@ -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 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 headers, String url, String format, List subs, Drm drm, int errorCode) { + private static MediaSource getSource(Map headers, boolean proxy, String url, String format, List 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 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 ? Setting.getProxy() : "") : new OkHttpDataSource.Factory((Call.Factory) OkHttp.client(proxy)); return httpDataSourceFactory; } - private static synchronized DataSource.Factory getDataSourceFactory(Map headers) { - if (dataSourceFactory == null) dataSourceFactory = buildReadOnlyCacheDataSource(new DefaultDataSource.Factory(App.get(), getHttpDataSourceFactory()), getCache()); + private static synchronized DataSource.Factory getDataSourceFactory(Map headers, boolean proxy) { + if (dataSourceFactory == null) dataSourceFactory = buildReadOnlyCacheDataSource(new DefaultDataSource.Factory(App.get(), getHttpDataSourceFactory(proxy)), getCache()); httpDataSourceFactory.setDefaultRequestProperties(Utils.checkUa(headers)); return dataSourceFactory; } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/OkHttpGlideModule.java b/app/src/main/java/com/fongmi/android/tv/utils/OkHttpGlideModule.java index 9c2c48124..729121c6b 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/OkHttpGlideModule.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/OkHttpGlideModule.java @@ -22,6 +22,6 @@ public class OkHttpGlideModule extends AppGlideModule { @Override public void registerComponents(@NonNull Context context, @Nullable Glide glide, Registry registry) { - registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory((Call.Factory) OkHttp.client())); + registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory((Call.Factory) OkHttp.client(true))); } } \ No newline at end of file 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..689ce7564 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 @@ -28,6 +28,7 @@ import com.fongmi.android.tv.impl.ConfigCallback; import com.fongmi.android.tv.impl.LiveCallback; import com.fongmi.android.tv.impl.ProxyCallback; import com.fongmi.android.tv.impl.SiteCallback; +import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.ui.activity.MainActivity; import com.fongmi.android.tv.ui.base.BaseFragment; import com.fongmi.android.tv.ui.custom.dialog.ConfigDialog; diff --git a/catvod/src/main/java/com/github/catvod/crawler/Spider.java b/catvod/src/main/java/com/github/catvod/crawler/Spider.java index 96c5cb654..02bd7c128 100644 --- a/catvod/src/main/java/com/github/catvod/crawler/Spider.java +++ b/catvod/src/main/java/com/github/catvod/crawler/Spider.java @@ -12,6 +12,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 { } @@ -55,6 +62,10 @@ public abstract class Spider { return false; } + public boolean proxy() { + return proxy; + } + public Object[] proxyLocal(Map params) throws Exception { return null; } 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 8aa0547f9..81cdb352e 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkHttp.java +++ b/catvod/src/main/java/com/github/catvod/net/OkHttp.java @@ -36,6 +36,7 @@ public class OkHttp { private static final int CACHE = 100 * 1024 * 1024; private DnsOverHttps dns; + private OkHttpClient proxy; private OkHttpClient client; private static class Loader { @@ -54,34 +55,53 @@ public class OkHttp { 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(); client = null; + proxy = null; } public void resetProxy() { Authenticator.setDefault(null); - client = null; + proxy = null; } public static OkHttpClient client() { if (get().client != null) return get().client; - return get().client = getBuilder(Prefers.getString("proxy")).build(); + return get().client = getBuilder().build(); + } + + public static OkHttpClient proxy() { + if (get().proxy != null) return get().proxy; + return get().proxy = getBuilder(Prefers.getString("proxy")).build(); } public static OkHttpClient client(int timeout) { return client().newBuilder().connectTimeout(timeout, TimeUnit.MILLISECONDS).readTimeout(timeout, TimeUnit.MILLISECONDS).writeTimeout(timeout, TimeUnit.MILLISECONDS).build(); } + public static OkHttpClient proxy(int timeout) { + return proxy().newBuilder().connectTimeout(timeout, TimeUnit.MILLISECONDS).readTimeout(timeout, TimeUnit.MILLISECONDS).writeTimeout(timeout, TimeUnit.MILLISECONDS).build(); + } + public static OkHttpClient noRedirect(int timeout) { return client().newBuilder().connectTimeout(timeout, TimeUnit.MILLISECONDS).readTimeout(timeout, TimeUnit.MILLISECONDS).writeTimeout(timeout, TimeUnit.MILLISECONDS).followRedirects(false).followSslRedirects(false).build(); } - public static OkHttpClient client(boolean redirect, int timeout) { - return redirect ? client(timeout) : noRedirect(timeout); + public static OkHttpClient noRedirectProxy(int timeout) { + return proxy().newBuilder().connectTimeout(timeout, TimeUnit.MILLISECONDS).readTimeout(timeout, TimeUnit.MILLISECONDS).writeTimeout(timeout, TimeUnit.MILLISECONDS).followRedirects(false).followSslRedirects(false).build(); + } + + public static OkHttpClient client(boolean proxy) { + return proxy ? proxy() : client(); + } + + public static OkHttpClient client(boolean proxy, boolean redirect, int timeout) { + if (proxy) return redirect ? proxy(timeout) : noRedirectProxy(timeout); + else return redirect ? client(timeout) : noRedirect(timeout); } public static Call newCall(String url) { Uri uri = Uri.parse(url); if (uri.getUserInfo() != null) return newCall(url, Headers.of(HttpHeaders.AUTHORIZATION, Util.basic(uri))); - return client().newCall(new Request.Builder().url(url).build()); + return client(true).newCall(new Request.Builder().url(url).build()); } public static Call newCall(OkHttpClient client, String url) { @@ -89,19 +109,19 @@ public class OkHttp { } public static Call newCall(String url, Headers headers) { - return client().newCall(new Request.Builder().url(url).headers(headers).build()); + return client(true).newCall(new Request.Builder().url(url).headers(headers).build()); } public static Call newCall(String url, ArrayMap params) { - return client().newCall(new Request.Builder().url(buildUrl(url, params)).build()); + return client(true).newCall(new Request.Builder().url(buildUrl(url, params)).build()); } public static Call newCall(String url, ArrayMap params, Headers headers) { - return client().newCall(new Request.Builder().url(buildUrl(url, params)).headers(headers).build()); + return client(true).newCall(new Request.Builder().url(buildUrl(url, params)).headers(headers).build()); } public static Call newCall(String url, RequestBody body, Headers headers) { - return client().newCall(new Request.Builder().url(url).post(body).headers(headers).build()); + return client(true).newCall(new Request.Builder().url(url).post(body).headers(headers).build()); } public static Call newCall(OkHttpClient client, String url, RequestBody body) { @@ -127,7 +147,7 @@ public class OkHttp { private static OkHttpClient.Builder getBuilder(String proxy) { Uri uri = Uri.parse(proxy); String userInfo = uri.getUserInfo(); - OkHttpClient.Builder builder = getBuilder(); + 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()))); 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..900a66057 100644 --- a/catvod/src/main/java/com/github/catvod/utils/Github.java +++ b/catvod/src/main/java/com/github/catvod/utils/Github.java @@ -30,7 +30,7 @@ public class Github { } private Github() { - client = OkHttp.client(TIMEOUT); + client = OkHttp.proxy(TIMEOUT); check(A); check(B); check(C); diff --git a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java index 3073e8d83..3e1fc0b6f 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java @@ -144,7 +144,7 @@ public class Spider extends com.github.catvod.crawler.Spider { private void createCtx() { ctx = QuickJSContext.create(); QuickJSLoader.initConsoleLog(ctx); - Global.create(ctx, executor).setProperty(); + Global.create(ctx, executor, proxy()).setProperty(); ctx.getGlobalObject().setProperty("local", Local.class); ctx.getGlobalObject().getContext().evaluate(Path.asset("js/lib/http.js")); ctx.setModuleLoader(new QuickJSContext.DefaultModuleLoader() { diff --git a/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java b/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java index 76f610f9a..8badb734d 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/method/Global.java @@ -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); diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java index 2f0775fce..bf640151c 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java @@ -22,8 +22,8 @@ import okhttp3.Response; public class Connect { - public static Call to(String url, Req req) { - OkHttpClient client = OkHttp.client(req.isRedirect(), req.getTimeout()); + public static Call to(String url, Req req, boolean proxy) { + OkHttpClient client = OkHttp.client(proxy, req.isRedirect(), req.getTimeout()); return client.newCall(getRequest(url, req, Headers.of(req.getHeader()))); }