内置超级解析;

pull/144/head
jun 1 year ago
parent ca8eaae1b8
commit a9b5b36f3e
  1. 11
      app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java
  2. 34
      app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java
  3. 127
      app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java
  4. 130
      app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java
  5. 4
      app/src/main/java/com/github/tvbox/osc/util/Proxy.java

@ -474,6 +474,7 @@ public class ApiConfig {
pb.setType(DefaultConfig.safeJsonInt(obj, "type", 0));
parseBeanList.add(pb);
}
if(!parseBeanList.isEmpty())addSuperParse();
}
// 获取默认解析
if (parseBeanList != null && parseBeanList.size() > 0) {
@ -1012,4 +1013,14 @@ public class ApiConfig {
{
jarLoader.clear();
}
private void addSuperParse()
{
ParseBean superPb = new ParseBean();
superPb.setName("超级解析");
superPb.setUrl("SuperParse");
superPb.setExt("");
superPb.setType(4);
parseBeanList.add(0, superPb);
}
}

@ -232,23 +232,27 @@ public class HomeActivity extends BaseActivity {
@Override
public void onClick(View v) {
FastClickCheckUtil.check(v);
String cspCachePath = FileUtils.getFilePath()+"/csp/";
String jar=ApiConfig.get().getHomeSourceBean().getJar();
String jarUrl=!jar.isEmpty()?jar:ApiConfig.get().getSpider();
File cspCacheDir = new File(cspCachePath + MD5.string2MD5(jarUrl)+".jar");
if (!cspCacheDir.exists()){
if(dataInitOk && jarInitOk){
String cspCachePath = FileUtils.getFilePath()+"/csp/";
String jar=ApiConfig.get().getHomeSourceBean().getJar();
String jarUrl=!jar.isEmpty()?jar:ApiConfig.get().getSpider();
File cspCacheDir = new File(cspCachePath + MD5.string2MD5(jarUrl)+".jar");
if (!cspCacheDir.exists()){
Toast.makeText(mContext, "jar缓存已清除", Toast.LENGTH_LONG).show();
return;
}
new Thread(() -> {
try {
FileUtils.deleteFile(cspCacheDir);
} catch (Exception e) {
e.printStackTrace();
}
}).start();
ApiConfig.get().clearJarLoader();
Toast.makeText(mContext, "jar缓存已清除", Toast.LENGTH_LONG).show();
return;
}else {
jumpActivity(SettingActivity.class);
}
new Thread(() -> {
try {
FileUtils.deleteFile(cspCacheDir);
} catch (Exception e) {
e.printStackTrace();
}
}).start();
ApiConfig.get().clearJarLoader();
Toast.makeText(mContext, "jar缓存已清除", Toast.LENGTH_LONG).show();
}
});
tvName.setOnLongClickListener(new View.OnLongClickListener() {

@ -69,6 +69,7 @@ import com.github.tvbox.osc.util.MD5;
import com.github.tvbox.osc.util.PlayerHelper;
import com.github.tvbox.osc.util.VideoParseRuler;
import com.github.tvbox.osc.util.XWalkUtils;
import com.github.tvbox.osc.util.parser.SuperParse;
import com.github.tvbox.osc.util.thunder.Jianpian;
import com.github.tvbox.osc.util.thunder.Thunder;
import com.github.tvbox.osc.viewmodel.SourceViewModel;
@ -1077,7 +1078,10 @@ public class PlayActivity extends BaseActivity {
private void doParse(ParseBean pb) {
stopParse();
initParseLoadFound();
if (pb.getType() == 0) {
if (pb.getType() == 4) {
parseMix(pb,true);
}
else if (pb.getType() == 0) {
setTip("正在嗅探播放地址", true, false);
mHandler.removeMessages(100);
mHandler.sendEmptyMessageDelayed(100, 20 * 1000);
@ -1222,76 +1226,79 @@ public class PlayActivity extends BaseActivity {
}
});
} else if (pb.getType() == 3) { // json 聚合
setTip("正在解析播放地址", true, false);
parseThreadPool = Executors.newSingleThreadExecutor();
LinkedHashMap<String, HashMap<String, String>> jxs = new LinkedHashMap<>();
String extendName = "";
for (ParseBean p : ApiConfig.get().getParseBeanList()) {
HashMap<String, String> data = new HashMap<String, String>();
data.put("url", p.getUrl());
if (p.getUrl().equals(pb.getUrl())) {
extendName = p.getName();
}
data.put("type", p.getType() + "");
data.put("ext", p.getExt());
jxs.put(p.getName(), data);
}
String finalExtendName = extendName;
parseThreadPool.execute(new Runnable() {
@Override
public void run() {
JSONObject rs = ApiConfig.get().jsonExtMix(parseFlag + "111", pb.getUrl(), finalExtendName, jxs, webUrl);
if (rs == null || !rs.has("url") || rs.optString("url").isEmpty()) {
setTip("解析错误", false, true);
parseMix(pb,false);
}
}
private void parseMix(ParseBean pb,boolean isSuper){
setTip("正在解析播放地址", true, false);
parseThreadPool = Executors.newSingleThreadExecutor();
LinkedHashMap<String, HashMap<String, String>> jxs = new LinkedHashMap<>();
String extendName = "";
for (ParseBean p : ApiConfig.get().getParseBeanList()) {
HashMap<String, String> data = new HashMap<String, String>();
data.put("url", p.getUrl());
if (p.getUrl().equals(pb.getUrl())) {
extendName = p.getName();
}
data.put("type", p.getType() + "");
data.put("ext", p.getExt());
jxs.put(p.getName(), data);
}
String finalExtendName = extendName;
parseThreadPool.execute(new Runnable() {
@Override
public void run() {
JSONObject rs = isSuper? SuperParse.parse(jxs,parseFlag,webUrl):ApiConfig.get().jsonExtMix(parseFlag + "111", pb.getUrl(), finalExtendName, jxs, webUrl);
if (rs == null || !rs.has("url") || rs.optString("url").isEmpty()) {
setTip("解析错误", false, true);
} else {
if (rs.has("parse") && rs.optInt("parse", 0) == 1) {
if (rs.has("ua")) {
webUserAgent = rs.optString("ua").trim();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
String mixParseUrl = DefaultConfig.checkReplaceProxy(rs.optString("url", ""));
stopParse();
setTip("正在嗅探播放地址", true, false);
mHandler.removeMessages(100);
mHandler.sendEmptyMessageDelayed(100, 20 * 1000);
loadWebView(mixParseUrl);
}
});
} else {
if (rs.has("parse") && rs.optInt("parse", 0) == 1) {
if (rs.has("ua")) {
webUserAgent = rs.optString("ua").trim();
HashMap<String, String> headers = null;
if (rs.has("header")) {
try {
JSONObject hds = rs.getJSONObject("header");
Iterator<String> keys = hds.keys();
while (keys.hasNext()) {
String key = keys.next();
if (headers == null) {
headers = new HashMap<>();
}
headers.put(key, hds.getString(key));
}
} catch (Throwable th) {
}
}
if (rs.has("jxFrom")) {
runOnUiThread(new Runnable() {
@Override
public void run() {
String mixParseUrl = DefaultConfig.checkReplaceProxy(rs.optString("url", ""));
stopParse();
setTip("正在嗅探播放地址", true, false);
mHandler.removeMessages(100);
mHandler.sendEmptyMessageDelayed(100, 20 * 1000);
loadWebView(mixParseUrl);
Toast.makeText(mContext, "解析来自:" + rs.optString("jxFrom"), Toast.LENGTH_SHORT).show();
}
});
} else {
HashMap<String, String> headers = null;
if (rs.has("header")) {
try {
JSONObject hds = rs.getJSONObject("header");
Iterator<String> keys = hds.keys();
while (keys.hasNext()) {
String key = keys.next();
if (headers == null) {
headers = new HashMap<>();
}
headers.put(key, hds.getString(key));
}
} catch (Throwable th) {
}
}
if (rs.has("jxFrom")) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(mContext, "解析来自:" + rs.optString("jxFrom"), Toast.LENGTH_SHORT).show();
}
});
}
playUrl(rs.optString("url", ""), headers);
}
playUrl(rs.optString("url", ""), headers);
}
}
});
}
}
});
}
// webview
private XWalkView mXwalkWebView;
private XWalkWebClient mX5WebClient;

@ -69,6 +69,7 @@ import com.github.tvbox.osc.util.MD5;
import com.github.tvbox.osc.util.PlayerHelper;
import com.github.tvbox.osc.util.VideoParseRuler;
import com.github.tvbox.osc.util.XWalkUtils;
import com.github.tvbox.osc.util.parser.SuperParse;
import com.github.tvbox.osc.util.thunder.Jianpian;
import com.github.tvbox.osc.util.thunder.Thunder;
import com.github.tvbox.osc.viewmodel.SourceViewModel;
@ -1107,7 +1108,10 @@ public class PlayFragment extends BaseLazyFragment {
private void doParse(ParseBean pb) {
stopParse();
initParseLoadFound();
if (pb.getType() == 0) {
if (pb.getType() == 4) {
parseMix(pb,true);
}
else if (pb.getType() == 0) {
setTip("正在嗅探播放地址", true, false);
mHandler.removeMessages(100);
mHandler.sendEmptyMessageDelayed(100, 20 * 1000);
@ -1254,80 +1258,84 @@ public class PlayFragment extends BaseLazyFragment {
}
});
} else if (pb.getType() == 3) { // json 聚合
setTip("正在解析播放地址", true, false);
parseThreadPool = Executors.newSingleThreadExecutor();
LinkedHashMap<String, HashMap<String, String>> jxs = new LinkedHashMap<>();
String extendName = "";
for (ParseBean p : ApiConfig.get().getParseBeanList()) {
HashMap<String, String> data = new HashMap<String, String>();
data.put("url", p.getUrl());
if (p.getUrl().equals(pb.getUrl())) {
extendName = p.getName();
}
data.put("type", p.getType() + "");
data.put("ext", p.getExt());
jxs.put(p.getName(), data);
}
String finalExtendName = extendName;
parseThreadPool.execute(new Runnable() {
@Override
public void run() {
JSONObject rs = ApiConfig.get().jsonExtMix(parseFlag + "111", pb.getUrl(), finalExtendName, jxs, webUrl);
if (rs == null || !rs.has("url") || rs.optString("url").isEmpty()) {
parseMix(pb,false);
}
}
private void parseMix(ParseBean pb,boolean isSuper)
{
setTip("正在解析播放地址", true, false);
parseThreadPool = Executors.newSingleThreadExecutor();
LinkedHashMap<String, HashMap<String, String>> jxs = new LinkedHashMap<>();
String extendName = "";
for (ParseBean p : ApiConfig.get().getParseBeanList()) {
HashMap<String, String> data = new HashMap<String, String>();
data.put("url", p.getUrl());
if (p.getUrl().equals(pb.getUrl())) {
extendName = p.getName();
}
data.put("type", p.getType() + "");
data.put("ext", p.getExt());
jxs.put(p.getName(), data);
}
String finalExtendName = extendName;
parseThreadPool.execute(new Runnable() {
@Override
public void run() {
JSONObject rs = isSuper? SuperParse.parse(jxs, parseFlag, webUrl):ApiConfig.get().jsonExtMix(parseFlag + "111", pb.getUrl(), finalExtendName, jxs, webUrl);
if (rs == null || !rs.has("url") || rs.optString("url").isEmpty()) {
// errorWithRetry("解析错误", false);
setTip("解析错误", false, true);
setTip("解析错误", false, true);
} else {
if (rs.has("parse") && rs.optInt("parse", 0) == 1) {
if (rs.has("ua")) {
webUserAgent = rs.optString("ua").trim();
}
if(!isAdded())return;
requireActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
String mixParseUrl = DefaultConfig.checkReplaceProxy(rs.optString("url", ""));
stopParse();
setTip("正在嗅探播放地址", true, false);
mHandler.removeMessages(100);
mHandler.sendEmptyMessageDelayed(100, 20 * 1000);
loadWebView(mixParseUrl);
}
});
} else {
if (rs.has("parse") && rs.optInt("parse", 0) == 1) {
if (rs.has("ua")) {
webUserAgent = rs.optString("ua").trim();
HashMap<String, String> headers = null;
if (rs.has("header")) {
try {
JSONObject hds = rs.getJSONObject("header");
Iterator<String> keys = hds.keys();
while (keys.hasNext()) {
String key = keys.next();
if (headers == null) {
headers = new HashMap<>();
}
headers.put(key, hds.getString(key));
}
} catch (Throwable th) {
th.printStackTrace();
}
}
if (rs.has("jxFrom")) {
if(!isAdded())return;
requireActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
String mixParseUrl = DefaultConfig.checkReplaceProxy(rs.optString("url", ""));
stopParse();
setTip("正在嗅探播放地址", true, false);
mHandler.removeMessages(100);
mHandler.sendEmptyMessageDelayed(100, 20 * 1000);
loadWebView(mixParseUrl);
Toast.makeText(mContext, "解析来自:" + rs.optString("jxFrom"), Toast.LENGTH_SHORT).show();
}
});
} else {
HashMap<String, String> headers = null;
if (rs.has("header")) {
try {
JSONObject hds = rs.getJSONObject("header");
Iterator<String> keys = hds.keys();
while (keys.hasNext()) {
String key = keys.next();
if (headers == null) {
headers = new HashMap<>();
}
headers.put(key, hds.getString(key));
}
} catch (Throwable th) {
th.printStackTrace();
}
}
if (rs.has("jxFrom")) {
if(!isAdded())return;
requireActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(mContext, "解析来自:" + rs.optString("jxFrom"), Toast.LENGTH_SHORT).show();
}
});
}
playUrl(rs.optString("url", ""), headers);
}
playUrl(rs.optString("url", ""), headers);
}
}
});
}
}
});
}
public MyVideoView getPlayer() {
return mVideoView;
}

@ -1,6 +1,7 @@
package com.github.tvbox.osc.util;
import com.github.catvod.crawler.SpiderDebug;
import com.github.tvbox.osc.server.ControlManager;
import com.github.tvbox.osc.util.parser.SuperParse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@ -29,6 +30,9 @@ public class Proxy {
//TODO
return null;
}
else if (what.equals("MixWeb")) {
return SuperParse.loadHtml(params.get("flag"), params.get("url"));
}
} catch (Throwable ignored) {

Loading…
Cancel
Save