Support ad block

pull/3/head
FongMi 4 years ago
parent d42736ab28
commit 26b1a6ba14
  1. 33
      app/src/main/java/com/fongmi/bear/ApiConfig.java
  2. 9
      app/src/main/java/com/fongmi/bear/player/Player.java
  3. 2
      app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java
  4. 59
      app/src/main/java/com/fongmi/bear/ui/custom/CustomWebView.java

@ -34,11 +34,12 @@ import okhttp3.Response;
public class ApiConfig {
private final JarLoader jarLoader;
private final List<String> ads;
private final List<String> flags;
private final List<Parse> parses;
private final List<Live> lives;
private final List<Site> sites;
private final JarLoader loader;
private final Handler handler;
private Parse parse;
private Site home;
@ -52,19 +53,21 @@ public class ApiConfig {
}
public ApiConfig() {
this.sites = new ArrayList<>();
this.ads = new ArrayList<>();
this.flags = new ArrayList<>();
this.parses = new ArrayList<>();
this.lives = new ArrayList<>();
this.jarLoader = new JarLoader();
this.sites = new ArrayList<>();
this.loader = new JarLoader();
this.handler = new Handler(Looper.getMainLooper());
}
private void clear() {
this.sites.clear();
public void clear() {
this.ads.clear();
this.flags.clear();
this.parses.clear();
this.lives.clear();
this.sites.clear();
this.home = null;
}
@ -77,7 +80,6 @@ public class ApiConfig {
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) {
try {
clear();
JsonObject object = new Gson().fromJson(response.body().string(), JsonObject.class);
String spider = Json.safeString(object, "spider", "");
parseJson(object);
@ -110,32 +112,31 @@ public class ApiConfig {
if (site.getKey().equals(Prefers.getHome())) setHome(site);
sites.add(site);
}
if (home == null) {
setHome(sites.isEmpty() ? new Site() : sites.get(0));
}
if (home == null) setHome(sites.isEmpty() ? new Site() : sites.get(0));
flags.addAll(Json.safeList(object, "flags"));
ads.addAll(Json.safeList(object, "ads"));
}
private void loadJar(String spider) throws Exception {
Request request = new Request.Builder().url(spider).build();
Response response = OKHttp.get().client().newCall(request).execute();
jarLoader.load(response.body().bytes());
loader.load(response.body().bytes());
}
public Spider getCSP(Site site) {
return jarLoader.getSpider(site.getKey(), site.getApi(), site.getExt());
return loader.getSpider(site.getKey(), site.getApi(), site.getExt());
}
public Object[] proxyLocal(Map<?, ?> param) {
return jarLoader.proxyInvoke(param);
return loader.proxyInvoke(param);
}
public JSONObject jsonExt(String key, LinkedHashMap<String, String> jxs, String url) {
return jarLoader.jsonExt(key, jxs, url);
return loader.jsonExt(key, jxs, url);
}
public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap<String, HashMap<String, String>> jxs, String url) {
return jarLoader.jsonExtMix(flag, key, name, jxs, url);
return loader.jsonExtMix(flag, key, name, jxs, url);
}
public Site getSite(String key) {
@ -147,6 +148,10 @@ public class ApiConfig {
return sites;
}
public String getAds() {
return ads.toString();
}
public List<String> getFlags() {
return flags;
}

@ -9,6 +9,7 @@ import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.util.HashMap;
import java.util.Map;
public class Player implements com.google.android.exoplayer2.Player.Listener {
@ -26,6 +27,7 @@ public class Player implements com.google.android.exoplayer2.Player.Listener {
}
public Player() {
webView = new CustomWebView(App.get());
exoPlayer = new ExoPlayer.Builder(App.get()).build();
exoPlayer.addListener(this);
}
@ -57,17 +59,16 @@ public class Player implements com.google.android.exoplayer2.Player.Listener {
private void loadWebView(String url) {
activity.runOnUiThread(() -> {
if (webView != null) webView.destroy();
webView = new CustomWebView(App.get()).init();
webView.loadUrl(url);
webView.start(url);
});
}
public void setMediaSource(HashMap<String, String> headers, String url) {
public void setMediaSource(Map<String, String> headers, String url) {
activity.runOnUiThread(() -> {
exoPlayer.setMediaSource(ExoUtil.getSource(headers, url));
exoPlayer.prepare();
exoPlayer.play();
webView.stop();
});
}

@ -56,6 +56,7 @@ public class SettingActivity extends BaseActivity {
Prefers.putUrl(bindingDialog.url.getText().toString().trim());
mBinding.url.setText(Prefers.getUrl());
Notify.progress(this);
ApiConfig.get().clear();
loadConfig();
});
bindingDialog.url.setOnEditorActionListener((textView, actionId, event) -> {
@ -75,6 +76,7 @@ public class SettingActivity extends BaseActivity {
@Override
public void error(int resId) {
mBinding.home.setText(ApiConfig.get().getHome().getName());
Notify.dismiss();
Notify.show(resId);
}

@ -3,8 +3,6 @@ package com.fongmi.bear.ui.custom;
import android.annotation.SuppressLint;
import android.content.Context;
import android.net.http.SslError;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
import android.webkit.SslErrorHandler;
import android.webkit.WebResourceRequest;
@ -16,16 +14,20 @@ import android.webkit.WebViewClient;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.fongmi.bear.ApiConfig;
import com.fongmi.bear.player.Player;
import com.fongmi.bear.utils.Utils;
import java.util.HashMap;
import java.util.Map;
import java.io.ByteArrayInputStream;
public class CustomWebView extends WebView {
private WebResourceResponse empty;
private String ads;
public CustomWebView(@NonNull Context context) {
super(context);
initSettings();
}
public CustomWebView(@NonNull Context context, @Nullable AttributeSet attrs) {
@ -37,7 +39,9 @@ public class CustomWebView extends WebView {
}
@SuppressLint("SetJavaScriptEnabled")
public CustomWebView init() {
public void initSettings() {
this.ads = ApiConfig.get().getAds();
this.empty = new WebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes()));
getSettings().setUseWideViewPort(true);
getSettings().setDatabaseEnabled(true);
getSettings().setDomStorageEnabled(true);
@ -45,13 +49,28 @@ public class CustomWebView extends WebView {
getSettings().setBlockNetworkImage(true);
getSettings().setLoadWithOverviewMode(true);
getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
setWebViewClient(webViewClient());
return this;
}
public void start(String url) {
stopLoading();
loadUrl(url);
}
private WebViewClient webViewClient() {
return new WebViewClient() {
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
String host = request.getUrl().getHost();
if (ads.contains(host)) return empty;
if (Utils.isVideoFormat(url)) Player.get().setMediaSource(request.getRequestHeaders(), url);
return super.shouldInterceptRequest(view, request);
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
@ -61,29 +80,11 @@ public class CustomWebView extends WebView {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
HashMap<String, String> headers = new HashMap<>();
Map<String, String> hds = request.getRequestHeaders();
for (String k : hds.keySet()) {
if (k.equalsIgnoreCase("user-agent") || k.equalsIgnoreCase("referer") || k.equalsIgnoreCase("origin")) {
headers.put(k, hds.get(k));
}
}
if (Utils.isVideoFormat(url)) {
if (headers.isEmpty()) {
new Handler(Looper.getMainLooper()).post(() -> destroy());
Player.get().setMediaSource(headers, url);
} else {
new Handler(Looper.getMainLooper()).post(() -> destroy());
Player.get().setMediaSource(new HashMap<>(), url);
}
}
return super.shouldInterceptRequest(view, request);
}
};
}
public void stop() {
stopLoading();
loadUrl("about:blank");
}
}

Loading…
Cancel
Save