web嗅探支持ext里的UA传递;支持点击播放的站点嗅探;热词联想小调整;rules规则小调整

pull/62/head
于俊 3 years ago
parent 64b8c46249
commit 8a1727a0cf
  1. 1
      app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java
  2. 5
      app/src/main/java/com/github/tvbox/osc/bean/SourceBean.java
  3. 24
      app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java
  4. 2
      app/src/main/java/com/github/tvbox/osc/ui/activity/SearchActivity.java
  5. 50
      app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java
  6. 6
      app/src/main/java/com/github/tvbox/osc/util/VideoParseRuler.java

@ -260,6 +260,7 @@ public class ApiConfig {
sb.setJar(DefaultConfig.safeJsonString(obj, "jar", "")); sb.setJar(DefaultConfig.safeJsonString(obj, "jar", ""));
sb.setPlayerType(DefaultConfig.safeJsonInt(obj, "playerType", -1)); sb.setPlayerType(DefaultConfig.safeJsonInt(obj, "playerType", -1));
sb.setCategories(DefaultConfig.safeJsonStringList(obj, "categories")); sb.setCategories(DefaultConfig.safeJsonStringList(obj, "categories"));
sb.setClickSelector(DefaultConfig.safeJsonString(obj, "click", ""));
if (firstSite == null) if (firstSite == null)
firstSite = sb; firstSite = sb;
sourceBeanList.put(siteKey, sb); sourceBeanList.put(siteKey, sb);

@ -15,6 +15,7 @@ public class SourceBean {
private String jar; // 自定义jar private String jar; // 自定义jar
private ArrayList<String> categories = null; // 分类&排序 private ArrayList<String> categories = null; // 分类&排序
private int playerType; // 0 system 1 ikj 2 exo 10 mxplayer -1 以参数设置页面的为准 private int playerType; // 0 system 1 ikj 2 exo 10 mxplayer -1 以参数设置页面的为准
private String clickSelector; // 需要点击播放的嗅探站点selector ddrk.me;#id
public String getKey() { public String getKey() {
return key; return key;
@ -107,4 +108,8 @@ public class SourceBean {
public int getPlayerType() { return playerType; } public int getPlayerType() { return playerType; }
public void setPlayerType(int playerType) { this.playerType = playerType; } public void setPlayerType(int playerType) { this.playerType = playerType; }
public String getClickSelector() { return clickSelector; }
public void setClickSelector(String clickSelector) { this.clickSelector = clickSelector; }
} }

@ -900,7 +900,6 @@ public class PlayActivity extends BaseActivity {
} else { } else {
url = jsonPlayData.getString("url"); url = jsonPlayData.getString("url");
} }
String msg = jsonPlayData.optString("msg", "");
if (url.startsWith("//")) { if (url.startsWith("//")) {
url = "http:" + url; url = "http:" + url;
} }
@ -945,6 +944,26 @@ public class PlayActivity extends BaseActivity {
setTip("正在嗅探播放地址", true, false); setTip("正在嗅探播放地址", true, false);
mHandler.removeMessages(100); mHandler.removeMessages(100);
mHandler.sendEmptyMessageDelayed(100, 20 * 1000); mHandler.sendEmptyMessageDelayed(100, 20 * 1000);
// 解析ext
try {
HashMap<String, String> reqHeaders = new HashMap<>();
JSONObject jsonObject = new JSONObject(pb.getExt());
if (jsonObject.has("header")) {
JSONObject headerJson = jsonObject.optJSONObject("header");
Iterator<String> keys = headerJson.keys();
while (keys.hasNext()) {
String key = keys.next();
if (key.equalsIgnoreCase("user-agent")) {
webUserAgent = headerJson.getString(key).trim();
}else {
reqHeaders.put(key, headerJson.optString(key, ""));
}
}
if(reqHeaders.size()>0)webHeaderMap = reqHeaders;
}
} catch (Throwable e) {
e.printStackTrace();
}
loadWebView(pb.getUrl() + webUrl); loadWebView(pb.getUrl() + webUrl);
} else if (pb.getType() == 1) { // json 解析 } else if (pb.getType() == 1) { // json 解析
setTip("正在解析播放地址", true, false); setTip("正在解析播放地址", true, false);
@ -1088,6 +1107,9 @@ public class PlayActivity extends BaseActivity {
setTip("解析错误", false, true); setTip("解析错误", false, true);
} else { } else {
if (rs.has("parse") && rs.optInt("parse", 0) == 1) { if (rs.has("parse") && rs.optInt("parse", 0) == 1) {
if (rs.has("ua")) {
webUserAgent = rs.optString("ua").trim();
}
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {

@ -291,7 +291,7 @@ public class SearchActivity extends BaseActivity {
JsonArray itemList = json.get("item").getAsJsonArray(); JsonArray itemList = json.get("item").getAsJsonArray();
for (JsonElement ele : itemList) { for (JsonElement ele : itemList) {
JsonObject obj = (JsonObject) ele; JsonObject obj = (JsonObject) ele;
hots.add(obj.get("word").getAsString().trim()); hots.add(obj.get("word").getAsString().trim().replaceAll("<|>|《|》|-", "").split(" ")[0]);
} }
wordAdapter.setNewData(hots); wordAdapter.setNewData(hots);
} catch (Throwable th) { } catch (Throwable th) {

@ -4,6 +4,7 @@ import android.annotation.TargetApi;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.net.http.SslError; import android.net.http.SslError;
import android.os.Build; import android.os.Build;
@ -919,7 +920,6 @@ public class PlayFragment extends BaseLazyFragment {
} else { } else {
url = jsonPlayData.getString("url"); url = jsonPlayData.getString("url");
} }
String msg = jsonPlayData.optString("msg", "");
if (url.startsWith("//")) { if (url.startsWith("//")) {
url = "http:" + url; url = "http:" + url;
} }
@ -964,7 +964,28 @@ public class PlayFragment extends BaseLazyFragment {
setTip("正在嗅探播放地址", true, false); setTip("正在嗅探播放地址", true, false);
mHandler.removeMessages(100); mHandler.removeMessages(100);
mHandler.sendEmptyMessageDelayed(100, 20 * 1000); mHandler.sendEmptyMessageDelayed(100, 20 * 1000);
// 解析ext
try {
HashMap<String, String> reqHeaders = new HashMap<>();
JSONObject jsonObject = new JSONObject(pb.getExt());
if (jsonObject.has("header")) {
JSONObject headerJson = jsonObject.optJSONObject("header");
Iterator<String> keys = headerJson.keys();
while (keys.hasNext()) {
String key = keys.next();
if (key.equalsIgnoreCase("user-agent")) {
webUserAgent = headerJson.getString(key).trim();
}else {
reqHeaders.put(key, headerJson.optString(key, ""));
}
}
if(reqHeaders.size()>0)webHeaderMap = reqHeaders;
}
} catch (Throwable e) {
e.printStackTrace();
}
loadWebView(pb.getUrl() + webUrl); loadWebView(pb.getUrl() + webUrl);
} else if (pb.getType() == 1) { // json 解析 } else if (pb.getType() == 1) { // json 解析
setTip("正在解析播放地址", true, false); setTip("正在解析播放地址", true, false);
// 解析ext // 解析ext
@ -1107,6 +1128,9 @@ public class PlayFragment extends BaseLazyFragment {
setTip("解析错误", false, true); setTip("解析错误", false, true);
} else { } else {
if (rs.has("parse") && rs.optInt("parse", 0) == 1) { if (rs.has("parse") && rs.optInt("parse", 0) == 1) {
if (rs.has("ua")) {
webUserAgent = rs.optString("ua").trim();
}
requireActivity().runOnUiThread(new Runnable() { requireActivity().runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
@ -1126,13 +1150,10 @@ public class PlayFragment extends BaseLazyFragment {
Iterator<String> keys = hds.keys(); Iterator<String> keys = hds.keys();
while (keys.hasNext()) { while (keys.hasNext()) {
String key = keys.next(); String key = keys.next();
if (headers == null) {
headers = new HashMap<>();
}
headers.put(key, hds.getString(key)); headers.put(key, hds.getString(key));
} }
} catch (Throwable th) { } catch (Throwable th) {
th.printStackTrace();
} }
} }
if (rs.has("jxFrom")) { if (rs.has("jxFrom")) {
@ -1405,6 +1426,19 @@ public class PlayFragment extends BaseLazyFragment {
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return false; return false;
} }
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted( view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view,url);
String click=sourceBean.getClickSelector();
if(!click.isEmpty() && url.contains(click.split(";")[0])){
mSysWebView.loadUrl("javascript:$(\""+ click.split(";")[1]+"\").click();");
}
}
WebResourceResponse checkIsVideo(String url, HashMap<String, String> headers) { WebResourceResponse checkIsVideo(String url, HashMap<String, String> headers) {
if (url.endsWith("/favicon.ico")) { if (url.endsWith("/favicon.ico")) {
@ -1564,6 +1598,10 @@ public class PlayFragment extends BaseLazyFragment {
@Override @Override
public void onLoadFinished(XWalkView view, String url) { public void onLoadFinished(XWalkView view, String url) {
super.onLoadFinished(view, url); super.onLoadFinished(view, url);
String click=sourceBean.getClickSelector();
if(!click.isEmpty() && url.contains(click.split(";")[0])){
mXwalkWebView.loadUrl("javascript:$(\""+ click.split(";")[1]+"\").click();");
}
} }
@Override @Override
@ -1608,7 +1646,7 @@ public class PlayFragment extends BaseLazyFragment {
if (loadFoundCount.incrementAndGet() == 1) { if (loadFoundCount.incrementAndGet() == 1) {
mHandler.removeMessages(100); mHandler.removeMessages(100);
url = loadFoundVideoUrls.poll(); url = loadFoundVideoUrls.poll();
if (webHeaders != null && !webHeaders.isEmpty()) { if (!webHeaders.isEmpty()) {
playUrl(url, webHeaders); playUrl(url, webHeaders);
} else { } else {
playUrl(url, null); playUrl(url, null);

@ -29,8 +29,9 @@ public class VideoParseRuler {
boolean isVideo = DefaultConfig.isVideoFormat(url); boolean isVideo = DefaultConfig.isVideoFormat(url);
if (!HOSTS_RULE.isEmpty() && !isVideo && webUrl != null) { if (!HOSTS_RULE.isEmpty() && !isVideo && webUrl != null) {
Uri uri = Uri.parse(webUrl); Uri uri = Uri.parse(webUrl);
isVideo = checkVideoForOneHostRules(uri.getHost(), url); if(getHostRules(uri.getHost()) != null){
if (!isVideo) { isVideo = checkVideoForOneHostRules(uri.getHost(), url);
}else {
isVideo = checkVideoForOneHostRules("*", url); isVideo = checkVideoForOneHostRules("*", url);
} }
} }
@ -45,7 +46,6 @@ public class VideoParseRuler {
boolean isVideo = false; boolean isVideo = false;
ArrayList<ArrayList<String>> hostRules = getHostRules(host); ArrayList<ArrayList<String>> hostRules = getHostRules(host);
if (hostRules != null && hostRules.size() > 0) { if (hostRules != null && hostRules.size() > 0) {
boolean isVideoRuleCheck = false; boolean isVideoRuleCheck = false;
for(int i=0; i<hostRules.size(); i++) { for(int i=0; i<hostRules.size(); i++) {
boolean checkIsVideo = true; boolean checkIsVideo = true;

Loading…
Cancel
Save