From a9b5b36f3e7321cd7fd00fcaf9c43a5e12e5592c Mon Sep 17 00:00:00 2001 From: jun <215613905@qq.com> Date: Mon, 24 Mar 2025 00:11:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E7=BD=AE=E8=B6=85=E7=BA=A7=E8=A7=A3?= =?UTF-8?q?=E6=9E=90;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/github/tvbox/osc/api/ApiConfig.java | 11 ++ .../tvbox/osc/ui/activity/HomeActivity.java | 34 +++-- .../tvbox/osc/ui/activity/PlayActivity.java | 127 +++++++++-------- .../tvbox/osc/ui/fragment/PlayFragment.java | 130 ++++++++++-------- .../java/com/github/tvbox/osc/util/Proxy.java | 4 + 5 files changed, 170 insertions(+), 136 deletions(-) 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 967214ed..6b8e3fe4 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 @@ -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); + } } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java index ede0441b..9dab5050 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java @@ -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() { 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 7716213e..31623413 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 @@ -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> jxs = new LinkedHashMap<>(); - String extendName = ""; - for (ParseBean p : ApiConfig.get().getParseBeanList()) { - HashMap data = new HashMap(); - 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> jxs = new LinkedHashMap<>(); + String extendName = ""; + for (ParseBean p : ApiConfig.get().getParseBeanList()) { + HashMap data = new HashMap(); + 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 headers = null; + if (rs.has("header")) { + try { + JSONObject hds = rs.getJSONObject("header"); + Iterator 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 headers = null; - if (rs.has("header")) { - try { - JSONObject hds = rs.getJSONObject("header"); - Iterator 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; 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 18c2792b..b9f22985 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 @@ -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> jxs = new LinkedHashMap<>(); - String extendName = ""; - for (ParseBean p : ApiConfig.get().getParseBeanList()) { - HashMap data = new HashMap(); - 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> jxs = new LinkedHashMap<>(); + String extendName = ""; + for (ParseBean p : ApiConfig.get().getParseBeanList()) { + HashMap data = new HashMap(); + 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 headers = null; + if (rs.has("header")) { + try { + JSONObject hds = rs.getJSONObject("header"); + Iterator 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 headers = null; - if (rs.has("header")) { - try { - JSONObject hds = rs.getJSONObject("header"); - Iterator 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; } diff --git a/app/src/main/java/com/github/tvbox/osc/util/Proxy.java b/app/src/main/java/com/github/tvbox/osc/util/Proxy.java index f94cb6f0..ec0ecead 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/Proxy.java +++ b/app/src/main/java/com/github/tvbox/osc/util/Proxy.java @@ -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) {