pull/142/head
FongMi 3 years ago
parent 02a6d90e2e
commit 24150e89ec
  1. 15
      app/src/main/java/com/fongmi/android/tv/bean/Channel.java
  2. 6
      app/src/main/java/com/fongmi/android/tv/bean/Live.java
  3. 10
      app/src/main/java/com/fongmi/android/tv/bean/Result.java
  4. 10
      app/src/main/java/com/fongmi/android/tv/bean/Site.java
  5. 2
      app/src/main/java/com/fongmi/android/tv/impl/NewPipeImpl.java
  6. 3
      app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java
  7. 20
      app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java
  8. 2
      app/src/main/java/com/fongmi/android/tv/utils/OkHttpGlideModule.java
  9. 1
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java
  10. 11
      catvod/src/main/java/com/github/catvod/crawler/Spider.java
  11. 40
      catvod/src/main/java/com/github/catvod/net/OkHttp.java
  12. 2
      catvod/src/main/java/com/github/catvod/utils/Github.java
  13. 2
      quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java
  14. 12
      quickjs/src/main/java/com/fongmi/quickjs/method/Global.java
  15. 4
      quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.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());

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

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

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

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

@ -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 ? Setting.getProxy() : "") : new OkHttpDataSource.Factory((Call.Factory) OkHttp.client(proxy));
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;
}

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

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

@ -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<String, String> params) throws Exception {
return null;
}

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

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

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

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

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

Loading…
Cancel
Save