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 5e38350b..bd331b32 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,7 +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 String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"; private ApiConfig() { sourceBeanList = new LinkedHashMap<>(); @@ -180,7 +180,9 @@ public class ApiConfig { } } - OkGo.get(jarUrl).execute(new AbsCallback() { + OkGo.get(jarUrl) + .headers("User-Agent", userAgent) + .execute(new AbsCallback() { @Override public File convertResponse(okhttp3.Response response) throws Throwable { 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 ecd469bd..3d8dab47 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 @@ -88,6 +88,7 @@ import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; @@ -731,12 +732,13 @@ public class PlayActivity extends BaseActivity { hasNext = mVodInfo.playIndex + 1 < mVodInfo.seriesMap.get(mVodInfo.playFlag).size(); } if (!hasNext) { - if(mVodInfo!=null && isProgress){ + if(isProgress && mVodInfo!=null){ mVodInfo.playIndex=0; Toast.makeText(this, "已经是最后一集了!,即将跳到第一集继续播放", Toast.LENGTH_SHORT).show(); + }else { + Toast.makeText(this, "已经是最后一集了!", Toast.LENGTH_SHORT).show(); + return; } - Toast.makeText(this, "已经是最后一集了!", Toast.LENGTH_SHORT).show(); - return; }else { mVodInfo.playIndex++; } @@ -761,6 +763,10 @@ public class PlayActivity extends BaseActivity { private int autoRetryCount = 0; boolean autoRetry() { + if (loadFoundVideoUrls != null && loadFoundVideoUrls.size() > 0) { + autoRetryFromLoadFoundVideoUrls(); + return true; + } if (autoRetryCount < 2) { play(false); autoRetryCount++; @@ -771,6 +777,18 @@ public class PlayActivity extends BaseActivity { } } + void autoRetryFromLoadFoundVideoUrls() { + String videoUrl = loadFoundVideoUrls.poll(); + HashMap header = loadFoundVideoUrlsHeader.get(videoUrl); + playUrl(videoUrl, header); + } + + void initParseLoadFound() { + loadFoundCount.set(0); + loadFoundVideoUrls = new LinkedList(); + loadFoundVideoUrlsHeader = new HashMap>(); + } + public void play(boolean reset) { VodInfo.VodSeries vs = mVodInfo.seriesMap.get(mVodInfo.playFlag).get(mVodInfo.playIndex); EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_REFRESH, mVodInfo.playIndex)); @@ -779,7 +797,7 @@ public class PlayActivity extends BaseActivity { mController.setTitle(playTitleInfo); stopParse(); - loadFoundCount.set(0); + initParseLoadFound(); 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; @@ -899,7 +917,7 @@ public class PlayActivity extends BaseActivity { private void doParse(ParseBean pb) { stopParse(); - loadFoundCount.set(0); + initParseLoadFound(); if (pb.getType() == 0) { setTip("正在嗅探播放地址", true, false); mHandler.removeMessages(100); @@ -1097,6 +1115,8 @@ public class PlayActivity extends BaseActivity { private WebView mSysWebView; private SysWebClient mSysWebClient; private Map loadedUrls = new HashMap<>(); + private LinkedList loadFoundVideoUrls = new LinkedList<>(); + private HashMap> loadFoundVideoUrlsHeader = new HashMap<>(); private AtomicInteger loadFoundCount = new AtomicInteger(0); void loadWebView(String url) { @@ -1357,8 +1377,11 @@ public class PlayActivity extends BaseActivity { if (!ad) { if (checkVideoFormat(url)) { - LOG.i("checkVideoFormat:" + url ); + loadFoundVideoUrls.add(url); + loadFoundVideoUrlsHeader.put(url, headers); + LOG.i("loadFoundVideoUrl:" + url ); if (loadFoundCount.incrementAndGet() == 1) { + url = loadFoundVideoUrls.poll(); mHandler.removeMessages(100); if (headers != null && !headers.isEmpty()) { playUrl(url, headers); @@ -1395,13 +1418,15 @@ public class PlayActivity extends BaseActivity { HashMap webHeaders = new HashMap<>(); try { Map hds = request.getRequestHeaders(); - if (!hds.isEmpty() && hds.size() > 0) { - for (String k : hds.keySet()) { + for (String k : hds.keySet()) { + if (k.equalsIgnoreCase("user-agent") + || k.equalsIgnoreCase("referer") + || k.equalsIgnoreCase("origin")) { webHeaders.put(k, hds.get(k)); } } } catch (Throwable th) { - th.printStackTrace(); + } WebResourceResponse response = checkIsVideo(url, webHeaders); return response; @@ -1526,20 +1551,25 @@ public class PlayActivity extends BaseActivity { } if (!ad ) { if (checkVideoFormat(url)) { - LOG.i("checkVideoFormat:" + url ); - 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)); - } + 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)); } - } catch (Throwable th) { - th.printStackTrace(); } + } catch (Throwable th) { + + } + loadFoundVideoUrls.add(url); + loadFoundVideoUrlsHeader.put(url, webHeaders); + LOG.i("loadFoundVideoUrl:" + url ); + if (loadFoundCount.incrementAndGet() == 1) { + mHandler.removeMessages(100); + url = loadFoundVideoUrls.poll(); if (webHeaders != null && !webHeaders.isEmpty()) { playUrl(url, webHeaders); } else { diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/PushActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/PushActivity.java index 4c96302c..cbdbb67e 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/PushActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/PushActivity.java @@ -13,6 +13,9 @@ import com.github.tvbox.osc.base.BaseActivity; import com.github.tvbox.osc.server.ControlManager; import com.github.tvbox.osc.ui.tv.QRCodeGen; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import me.jessyan.autosize.utils.AutoSizeUtils; public class PushActivity extends BaseActivity { @@ -42,8 +45,13 @@ public class PushActivity extends BaseActivity { if (manager != null) { if (manager.hasPrimaryClip() && manager.getPrimaryClip() != null && manager.getPrimaryClip().getItemCount() > 0) { ClipData.Item addedText = manager.getPrimaryClip().getItemAt(0); + String clipText = addedText.getText().toString().trim(); + Matcher m = Pattern.compile("(https?://[A-Za-z0-9:_@$#\\/\\.\\?\\=\\&\\%\\-]+)").matcher(clipText); + if (m.find()) { + clipText = m.group(1); + } Intent newIntent = new Intent(mContext, DetailActivity.class); - newIntent.putExtra("id", addedText.getText().toString().trim()); + newIntent.putExtra("id", clipText); newIntent.putExtra("sourceKey", "push_agent"); newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); PushActivity.this.startActivity(newIntent); 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 0541bfe5..695f149b 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 @@ -88,6 +88,7 @@ import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; @@ -779,6 +780,10 @@ public class PlayFragment extends BaseLazyFragment { private int autoRetryCount = 0; boolean autoRetry() { + if (loadFoundVideoUrls != null && loadFoundVideoUrls.size() > 0) { + autoRetryFromLoadFoundVideoUrls(); + return true; + } if (autoRetryCount < 2) { play(false); autoRetryCount++; @@ -789,6 +794,18 @@ public class PlayFragment extends BaseLazyFragment { } } + void autoRetryFromLoadFoundVideoUrls() { + String videoUrl = loadFoundVideoUrls.poll(); + HashMap header = loadFoundVideoUrlsHeader.get(videoUrl); + playUrl(videoUrl, header); + } + + void initParseLoadFound() { + loadFoundCount.set(0); + loadFoundVideoUrls = new LinkedList(); + loadFoundVideoUrlsHeader = new HashMap>(); + } + public void play(boolean reset) { if(mVodInfo==null)return; VodInfo.VodSeries vs = mVodInfo.seriesMap.get(mVodInfo.playFlag).get(mVodInfo.playIndex); @@ -798,7 +815,7 @@ public class PlayFragment extends BaseLazyFragment { mController.setTitle(playTitleInfo); stopParse(); - loadFoundCount.set(0); + initParseLoadFound(); 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; @@ -919,7 +936,7 @@ public class PlayFragment extends BaseLazyFragment { private void doParse(ParseBean pb) { stopParse(); - loadFoundCount.set(0); + initParseLoadFound(); if (pb.getType() == 0) { setTip("正在嗅探播放地址", true, false); mHandler.removeMessages(100); @@ -1117,6 +1134,8 @@ public class PlayFragment extends BaseLazyFragment { private WebView mSysWebView; private SysWebClient mSysWebClient; private Map loadedUrls = new HashMap<>(); + private LinkedList loadFoundVideoUrls = new LinkedList<>(); + private HashMap> loadFoundVideoUrlsHeader = new HashMap<>(); private AtomicInteger loadFoundCount = new AtomicInteger(0); void loadWebView(String url) { @@ -1382,8 +1401,11 @@ public class PlayFragment extends BaseLazyFragment { if (!ad) { if (checkVideoFormat(url)) { - LOG.i("checkVideoFormat:" + url ); + loadFoundVideoUrls.add(url); + loadFoundVideoUrlsHeader.put(url, headers); + LOG.i("loadFoundVideoUrl:" + url ); if (loadFoundCount.incrementAndGet() == 1) { + url = loadFoundVideoUrls.poll(); mHandler.removeMessages(100); if (headers != null && !headers.isEmpty()) { playUrl(url, headers); @@ -1420,13 +1442,15 @@ public class PlayFragment extends BaseLazyFragment { HashMap webHeaders = new HashMap<>(); try { Map hds = request.getRequestHeaders(); - if (!hds.isEmpty() && hds.size() > 0) { - for (String k : hds.keySet()) { + for (String k : hds.keySet()) { + if (k.equalsIgnoreCase("user-agent") + || k.equalsIgnoreCase("referer") + || k.equalsIgnoreCase("origin")) { webHeaders.put(k, hds.get(k)); } } } catch (Throwable th) { - th.printStackTrace(); + } WebResourceResponse response = checkIsVideo(url, webHeaders); return response; @@ -1551,20 +1575,25 @@ public class PlayFragment extends BaseLazyFragment { } if (!ad ) { if (checkVideoFormat(url)) { - LOG.i("checkVideoFormat:" + url ); - 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)); - } + 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)); } - } catch (Throwable th) { - th.printStackTrace(); } + } catch (Throwable th) { + + } + loadFoundVideoUrls.add(url); + loadFoundVideoUrlsHeader.put(url, webHeaders); + LOG.i("loadFoundVideoUrl:" + url ); + if (loadFoundCount.incrementAndGet() == 1) { + mHandler.removeMessages(100); + url = loadFoundVideoUrls.poll(); if (webHeaders != null && !webHeaders.isEmpty()) { playUrl(url, webHeaders); } else { diff --git a/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java b/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java index e59b66e1..bf3e8e2c 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java @@ -107,9 +107,9 @@ public class DefaultConfig { //增加对flv|avi|mkv|rm|wmv|mpg等几种视频格式的支持 //private static final Pattern snifferMatch = Pattern.compile("http((?!http).){26,}?\\.(m3u8|mp4)\\?.*|http((?!http).){26,}\\.(m3u8|mp4)|http((?!http).){26,}?/m3u8\\?pt=m3u8.*|http((?!http).)*?default\\.ixigua\\.com/.*|http((?!http).)*?cdn-tos[^\\?]*|http((?!http).)*?/obj/tos[^\\?]*|http.*?/player/m3u8play\\.php\\?url=.*|http.*?/player/.*?[pP]lay\\.php\\?url=.*|http.*?/playlist/m3u8/\\?vid=.*|http.*?\\.php\\?type=m3u8&.*|http.*?/download.aspx\\?.*|http.*?/api/up_api.php\\?.*|https.*?\\.66yk\\.cn.*|http((?!http).)*?netease\\.com/file/.*"); - private static final Pattern snifferMatch = Pattern.compile("http((?!http).)*?default\\.365yg\\.com/.*|http((?!http).){26,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)\\?.*|http((?!http).){26,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)|http((?!http).){20,}?/m3u8\\?pt=m3u8.*|http((?!http).)*?default\\.ixigua\\.com/.*|http((?!http).)*?dycdn-tos\\.pstatp[^\\?]*|http.*?/play.{0,3}\\?[^url]{2,8}=.*|http.*?/player/m3u8play\\.php\\?url=.*|http.*?/player/.*?[pP]lay\\.php\\?url=.*|http.*?/playlist/m3u8/\\?vid=.*|http.*?\\.php\\?type=m3u8&.*|http.*?/download.aspx\\?.*|http.*?/api/up_api.php\\?.*|https.*?\\.66yk\\.cn.*|http((?!http).)*?netease\\.com/file/.*"); + private static final Pattern snifferMatch = Pattern.compile("http((?!http).)*?default\\.365yg\\.com/.*|http((?!http).){20,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)\\?.*|http((?!http).){20,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)|http((?!http).){20,}?/m3u8\\?pt=m3u8.*|http((?!http).)*?default\\.ixigua\\.com/.*|http((?!http).)*?dycdn-tos\\.pstatp[^\\?]*|http.*?/play.{0,3}\\?[^url]{2,8}=.*|http.*?/player/m3u8play\\.php\\?url=.*|http.*?/player/.*?[pP]lay\\.php\\?url=.*|http.*?/playlist/m3u8/\\?vid=.*|http.*?\\.php\\?type=m3u8&.*|http.*?/download.aspx\\?.*|http.*?/api/up_api.php\\?.*|https.*?\\.66yk\\.cn.*|http((?!http).)*?netease\\.com/file/.*"); public static boolean isVideoFormat(String url) { - if (url.contains("=http") || url.contains(".html")) { + if (url.contains("=http") || url.contains("?http") || url.contains(".html")) { return false; } if (snifferMatch.matcher(url).find()) {