diff --git a/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java b/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java index 915eba9a..5e38350b 100644 --- a/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java @@ -61,6 +61,7 @@ public class ApiConfig { private JarLoader jarLoader = new JarLoader(); + private String userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"; private ApiConfig() { sourceBeanList = new LinkedHashMap<>(); @@ -102,6 +103,7 @@ public class ApiConfig { apiFix = "http://" + apiFix; } OkGo.get(apiFix) + .headers("User-Agent", userAgent) .execute(new AbsCallback() { @Override public void onSuccess(Response response) { diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java index 6c3405b5..b75f1ef3 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java @@ -92,6 +92,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; import me.jessyan.autosize.AutoSize; import tv.danmaku.ijk.media.player.IMediaPlayer; @@ -481,6 +482,7 @@ public class PlayActivity extends BaseActivity { } void playUrl(String url, HashMap headers) { + LOG.i("playUrl:" + url); runOnUiThread(new Runnable() { @Override public void run() { @@ -582,7 +584,6 @@ public class PlayActivity extends BaseActivity { String flag = info.optString("flag"); String url = info.getString("url"); HashMap headers = null; - webUserAgent = null; webHeaderMap = null; if (info.has("header")) { try { @@ -594,9 +595,6 @@ public class PlayActivity extends BaseActivity { headers = new HashMap<>(); } headers.put(key, hds.getString(key)); - if (key.equalsIgnoreCase("user-agent")) { - webUserAgent = hds.getString(key).trim(); - } } webHeaderMap = headers; } catch (Throwable th) { @@ -776,6 +774,7 @@ public class PlayActivity extends BaseActivity { mController.setTitle(playTitleInfo); stopParse(); + loadFoundCount.set(0); if(mVideoView!=null) mVideoView.release(); String subtitleCacheKey = mVodInfo.sourceKey + "-" + mVodInfo.id + "-" + mVodInfo.playFlag + "-" + mVodInfo.playIndex+ "-" + vs.name + "-subt"; String progressKey = mVodInfo.sourceKey + mVodInfo.id + mVodInfo.playFlag + mVodInfo.playIndex + vs.name; @@ -814,7 +813,6 @@ public class PlayActivity extends BaseActivity { private String progressKey; private String parseFlag; private String webUrl; - private String webUserAgent; private Map webHeaderMap; private void initParse(String flag, boolean useParse, String playUrl, final String url) { @@ -844,7 +842,6 @@ public class PlayActivity extends BaseActivity { parseBean.setUrl(playUrl); } } - loadFound = false; doParse(parseBean); } @@ -881,7 +878,6 @@ public class PlayActivity extends BaseActivity { void stopParse() { mHandler.removeMessages(100); stopLoadWebView(false); - loadFound = false; OkGo.getInstance().cancelTag("json_jx"); if (parseThreadPool != null) { try { @@ -897,6 +893,7 @@ public class PlayActivity extends BaseActivity { private void doParse(ParseBean pb) { stopParse(); + loadFoundCount.set(0); if (pb.getType() == 0) { setTip("正在嗅探播放地址", true, false); mHandler.removeMessages(100); @@ -1094,7 +1091,7 @@ public class PlayActivity extends BaseActivity { private WebView mSysWebView; private SysWebClient mSysWebClient; private Map loadedUrls = new HashMap<>(); - private boolean loadFound = false; + private AtomicInteger loadFoundCount = new AtomicInteger(0); void loadWebView(String url) { if (mSysWebView == null && mXwalkWebView == null) { @@ -1161,14 +1158,9 @@ public class PlayActivity extends BaseActivity { runOnUiThread(new Runnable() { @Override public void run() { - // webUserAgent = "Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36"; if (mXwalkWebView != null) { mXwalkWebView.stopLoading(); Map map = new HashMap() ; - - if(webUserAgent != null) { - mXwalkWebView.getSettings().setUserAgentString(webUserAgent); - } //mXwalkWebView.clearCache(true); if(webHeaderMap != null){ mXwalkWebView.loadUrl(url,webHeaderMap); @@ -1178,9 +1170,6 @@ public class PlayActivity extends BaseActivity { } if (mSysWebView != null) { mSysWebView.stopLoading(); - if(webUserAgent != null) { - mSysWebView.getSettings().setUserAgentString(webUserAgent); - } //mSysWebView.clearCache(true); if(webHeaderMap != null){ mSysWebView.loadUrl(url,webHeaderMap); @@ -1369,20 +1358,21 @@ public class PlayActivity extends BaseActivity { ad = loadedUrls.get(url); } - if (!ad && !loadFound) { + if (!ad) { if (checkVideoFormat(url)) { - mHandler.removeMessages(100); - loadFound = true; - if (headers != null && !headers.isEmpty()) { - playUrl(url, headers); - } else { - playUrl(url, null); + if (loadFoundCount.incrementAndGet() == 1) { + mHandler.removeMessages(100); + if (headers != null && !headers.isEmpty()) { + playUrl(url, headers); + } else { + playUrl(url, null); + } + stopLoadWebView(false); } - stopLoadWebView(false); } } - return ad || loadFound ? + return ad || loadFoundCount.get() > 0 ? AdBlocker.createEmptyResource() : null; } @@ -1391,10 +1381,7 @@ public class PlayActivity extends BaseActivity { @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { WebResourceResponse response = checkIsVideo(url, null); -// if (response == null) -// return super.shouldInterceptRequest(view, url); -// else - return response; + return response; } @Nullable @@ -1410,21 +1397,16 @@ public class PlayActivity extends BaseActivity { HashMap webHeaders = new HashMap<>(); try { Map hds = request.getRequestHeaders(); - for (String k : hds.keySet()) { - if (k.equalsIgnoreCase("user-agent") - || k.equalsIgnoreCase("referer") - || k.equalsIgnoreCase("origin")) { - webHeaders.put(k, " " + hds.get(k)); + if (!hds.isEmpty() && hds.size() > 0) { + for (String k : hds.keySet()) { + webHeaders.put(k, hds.get(k)); } } } catch (Throwable th) { - + th.printStackTrace(); } WebResourceResponse response = checkIsVideo(url, webHeaders); -// if (response == null) -// return super.shouldInterceptRequest(view, request); -// else - return response; + return response; } @Override @@ -1541,32 +1523,31 @@ public class PlayActivity extends BaseActivity { } else { ad = loadedUrls.get(url); } - if (!ad && !loadFound) { + if (!ad ) { if (checkVideoFormat(url)) { - mHandler.removeMessages(100); - loadFound = true; - HashMap webHeaders = new HashMap<>(); - try { - Map hds = request.getRequestHeaders(); - for (String k : hds.keySet()) { - if (k.equalsIgnoreCase("user-agent") - || k.equalsIgnoreCase("referer") - || k.equalsIgnoreCase("origin")) { - webHeaders.put(k, " " + hds.get(k)); + if (loadFoundCount.incrementAndGet() == 1) { + mHandler.removeMessages(100); + HashMap webHeaders = new HashMap<>(); + try { + Map hds = request.getRequestHeaders(); + if (!hds.isEmpty() && hds.size() > 0) { + for (String k : hds.keySet()) { + webHeaders.put(k, hds.get(k)); + } } + } catch (Throwable th) { + th.printStackTrace(); } - } catch (Throwable th) { - - } - if (webHeaders != null && !webHeaders.isEmpty()) { - playUrl(url, webHeaders); - } else { - playUrl(url, null); + if (webHeaders != null && !webHeaders.isEmpty()) { + playUrl(url, webHeaders); + } else { + playUrl(url, null); + } + stopLoadWebView(false); } - stopLoadWebView(false); } } - return ad || loadFound ? + return ad || loadFoundCount.get() > 0 ? createXWalkWebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes())) : super.shouldInterceptLoadRequest(view, request); } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java b/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java index f154fde4..ef6bbe96 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java @@ -91,6 +91,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; import me.jessyan.autosize.AutoSize; import tv.danmaku.ijk.media.player.IMediaPlayer; @@ -478,6 +479,7 @@ public class PlayFragment extends BaseLazyFragment { } void playUrl(String url, HashMap headers) { + LOG.i("playUrl:" + url); requireActivity().runOnUiThread(new Runnable() { @Override public void run() { @@ -579,7 +581,6 @@ public class PlayFragment extends BaseLazyFragment { String flag = info.optString("flag"); String url = info.getString("url"); HashMap headers = null; - webUserAgent = null; webHeaderMap = null; if (info.has("header")) { try { @@ -591,9 +592,6 @@ public class PlayFragment extends BaseLazyFragment { headers = new HashMap<>(); } headers.put(key, hds.getString(key)); - if (key.equalsIgnoreCase("user-agent")) { - webUserAgent = hds.getString(key).trim(); - } } webHeaderMap = headers; } catch (Throwable th) { @@ -789,6 +787,7 @@ public class PlayFragment extends BaseLazyFragment { mController.setTitle(playTitleInfo); stopParse(); + loadFoundCount.set(0); if(mVideoView!=null) mVideoView.release(); String subtitleCacheKey = mVodInfo.sourceKey + "-" + mVodInfo.id + "-" + mVodInfo.playFlag + "-" + mVodInfo.playIndex+ "-" + vs.name + "-subt"; String progressKey = mVodInfo.sourceKey + mVodInfo.id + mVodInfo.playFlag + mVodInfo.playIndex + vs.name; @@ -827,7 +826,6 @@ public class PlayFragment extends BaseLazyFragment { private String progressKey; private String parseFlag; private String webUrl; - private String webUserAgent; private Map webHeaderMap; private void initParse(String flag, boolean useParse, String playUrl, final String url) { @@ -857,7 +855,6 @@ public class PlayFragment extends BaseLazyFragment { parseBean.setUrl(playUrl); } } - loadFound = false; doParse(parseBean); } @@ -895,7 +892,6 @@ public class PlayFragment extends BaseLazyFragment { void stopParse() { mHandler.removeMessages(100); stopLoadWebView(false); - loadFound = false; OkGo.getInstance().cancelTag("json_jx"); if (parseThreadPool != null) { try { @@ -911,6 +907,7 @@ public class PlayFragment extends BaseLazyFragment { private void doParse(ParseBean pb) { stopParse(); + loadFoundCount.set(0); if (pb.getType() == 0) { setTip("正在嗅探播放地址", true, false); mHandler.removeMessages(100); @@ -1108,7 +1105,7 @@ public class PlayFragment extends BaseLazyFragment { private WebView mSysWebView; private SysWebClient mSysWebClient; private Map loadedUrls = new HashMap<>(); - private boolean loadFound = false; + private AtomicInteger loadFoundCount = new AtomicInteger(0); void loadWebView(String url) { if (mSysWebView == null && mXwalkWebView == null) { @@ -1176,12 +1173,8 @@ public class PlayFragment extends BaseLazyFragment { requireActivity().runOnUiThread(new Runnable() { @Override public void run() { - // webUserAgent = "Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36"; if (mXwalkWebView != null) { mXwalkWebView.stopLoading(); -// if(webUserAgent != null) { -// mXwalkWebView.getSettings().setUserAgentString(webUserAgent); -// } //mXwalkWebView.clearCache(true); if(webHeaderMap != null){ mXwalkWebView.loadUrl(url,webHeaderMap); @@ -1191,9 +1184,6 @@ public class PlayFragment extends BaseLazyFragment { } if (mSysWebView != null) { mSysWebView.stopLoading(); -// if(webUserAgent != null) { -// mSysWebView.getSettings().setUserAgentString(webUserAgent); -// } //mSysWebView.clearCache(true); if(webHeaderMap != null){ mSysWebView.loadUrl(url,webHeaderMap); @@ -1387,20 +1377,21 @@ public class PlayFragment extends BaseLazyFragment { ad = loadedUrls.get(url); } - if (!ad && !loadFound) { + if (!ad) { if (checkVideoFormat(url)) { - mHandler.removeMessages(100); - loadFound = true; - if (headers != null && !headers.isEmpty()) { - playUrl(url, headers); - } else { - playUrl(url, null); + if (loadFoundCount.incrementAndGet() == 1) { + mHandler.removeMessages(100); + if (headers != null && !headers.isEmpty()) { + playUrl(url, headers); + } else { + playUrl(url, null); + } + stopLoadWebView(false); } - stopLoadWebView(false); } } - return ad || loadFound ? + return ad || loadFoundCount.get() > 0 ? AdBlocker.createEmptyResource() : null; } @@ -1409,10 +1400,7 @@ public class PlayFragment extends BaseLazyFragment { @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { WebResourceResponse response = checkIsVideo(url, null); -// if (response == null) -// return super.shouldInterceptRequest(view, url); -// else - return response; + return response; } @Nullable @@ -1428,21 +1416,16 @@ public class PlayFragment extends BaseLazyFragment { HashMap webHeaders = new HashMap<>(); try { Map hds = request.getRequestHeaders(); - for (String k : hds.keySet()) { - if (k.equalsIgnoreCase("user-agent") - || k.equalsIgnoreCase("referer") - || k.equalsIgnoreCase("origin")) { - webHeaders.put(k, " " + hds.get(k)); + if (!hds.isEmpty() && hds.size() > 0) { + for (String k : hds.keySet()) { + webHeaders.put(k, hds.get(k)); } } } catch (Throwable th) { - + th.printStackTrace(); } WebResourceResponse response = checkIsVideo(url, webHeaders); -// if (response == null) -// return super.shouldInterceptRequest(view, request); -// else - return response; + return response; } @Override @@ -1559,32 +1542,31 @@ public class PlayFragment extends BaseLazyFragment { } else { ad = loadedUrls.get(url); } - if (!ad && !loadFound) { + if (!ad ) { if (checkVideoFormat(url)) { - mHandler.removeMessages(100); - loadFound = true; - HashMap webHeaders = new HashMap<>(); - try { - Map hds = request.getRequestHeaders(); - for (String k : hds.keySet()) { - if (k.equalsIgnoreCase("user-agent") - || k.equalsIgnoreCase("referer") - || k.equalsIgnoreCase("origin")) { - webHeaders.put(k, " " + hds.get(k)); + if (loadFoundCount.incrementAndGet() == 1) { + mHandler.removeMessages(100); + HashMap webHeaders = new HashMap<>(); + try { + Map hds = request.getRequestHeaders(); + if (!hds.isEmpty() && hds.size() > 0) { + for (String k : hds.keySet()) { + webHeaders.put(k, hds.get(k)); + } } + } catch (Throwable th) { + th.printStackTrace(); } - } catch (Throwable th) { - - } - if (webHeaders != null && !webHeaders.isEmpty()) { - playUrl(url, webHeaders); - } else { - playUrl(url, null); + if (webHeaders != null && !webHeaders.isEmpty()) { + playUrl(url, webHeaders); + } else { + playUrl(url, null); + } + stopLoadWebView(false); } - stopLoadWebView(false); } } - return ad || loadFound ? + return ad || loadFoundCount.get() > 0 ? createXWalkWebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes())) : super.shouldInterceptLoadRequest(view, request); }