From 049f1a987cc085796b44ebcdd4139f65d7d01748 Mon Sep 17 00:00:00 2001 From: SDL <> Date: Thu, 23 Jun 2022 23:34:51 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90Json=E8=81=9A=E5=90=88?= =?UTF-8?q?=E5=92=8CJson=E6=89=A9=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/github/catvod/crawler/JarLoader.java | 30 +++++++ .../com/github/tvbox/osc/api/ApiConfig.java | 20 ++++- .../com/github/tvbox/osc/bean/ParseBean.java | 22 ++++- .../tvbox/osc/ui/activity/HomeActivity.java | 18 +++- .../osc/ui/activity/LivePlayActivity.java | 2 + .../tvbox/osc/ui/activity/PlayActivity.java | 23 +++-- .../osc/ui/activity/SettingActivity.java | 5 +- .../tvbox/osc/ui/dialog/ParseDialog.java | 90 ++++++++++++++++++- .../osc/ui/fragment/ModelSettingFragment.java | 37 ++++++++ .../github/tvbox/osc/util/DefaultConfig.java | 18 ++-- .../com/github/tvbox/osc/util/HawkConfig.java | 1 + .../tvbox/osc/viewmodel/SourceViewModel.java | 4 + app/src/main/res/layout/fragment_model.xml | 46 ++++++++++ 13 files changed, 289 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/github/catvod/crawler/JarLoader.java b/app/src/main/java/com/github/catvod/crawler/JarLoader.java index c94e2f00..2b25ac1b 100644 --- a/app/src/main/java/com/github/catvod/crawler/JarLoader.java +++ b/app/src/main/java/com/github/catvod/crawler/JarLoader.java @@ -4,9 +4,13 @@ import android.content.Context; import com.github.tvbox.osc.base.App; +import org.json.JSONObject; + import java.io.File; import java.io.FileOutputStream; import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -86,6 +90,32 @@ public class JarLoader { return new SpiderNull(); } + public JSONObject jsonExt(String key, LinkedHashMap jxs, String url) { + try { + String clsKey = "Json" + key; + String hotClass = "com.github.catvod.parser." + clsKey; + Class jsonParserCls = classLoader.loadClass(hotClass); + Method mth = jsonParserCls.getMethod("parse", LinkedHashMap.class, String.class); + return (JSONObject) mth.invoke(null, jxs, url); + } catch (Throwable th) { + th.printStackTrace(); + } + return null; + } + + public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap> jxs, String url) { + try { + String clsKey = "Mix" + key; + String hotClass = "com.github.catvod.parser." + clsKey; + Class jsonParserCls = classLoader.loadClass(hotClass); + Method mth = jsonParserCls.getMethod("parse", LinkedHashMap.class, String.class, String.class, String.class); + return (JSONObject) mth.invoke(null, jxs, name, flag, url); + } catch (Throwable th) { + th.printStackTrace(); + } + return null; + } + public Object[] proxyInvoke(Map params) { try { if (proxyFun != null) { 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 5e10e0fc..3eefbb4b 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 @@ -22,6 +22,8 @@ import com.lzy.okgo.callback.AbsCallback; import com.lzy.okgo.model.Response; import com.orhanobut.hawk.Hawk; +import org.json.JSONObject; + import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; @@ -47,6 +49,8 @@ public class ApiConfig { private List ijkCodes; private String spider = null; + private SourceBean emptyHome = new SourceBean(); + private JarLoader jarLoader = new JarLoader(); @@ -120,11 +124,10 @@ public class ApiConfig { e.printStackTrace(); callback.error("加载配置失败"); } - } private void loadConfigServer(LoadConfigCallback callback, Activity activity) { - OkGo.get("http://10.80.8.70:8890/baddychen/baddychen.json") + OkGo.get(Hawk.get(HawkConfig.API_URL, "")) .execute(new AbsCallback() { @Override public void onSuccess(Response response) { @@ -159,6 +162,7 @@ public class ApiConfig { JsonObject infoJson = new Gson().fromJson(jsonStr, JsonObject.class); // spider spider = DefaultConfig.safeJsonString(infoJson, "spider", ""); + spider = spider.split(";md5;")[0]; // 远端站点源 for (JsonElement opt : infoJson.get("sites").getAsJsonArray()) { JsonObject obj = (JsonObject) opt; @@ -195,6 +199,8 @@ public class ApiConfig { ParseBean pb = new ParseBean(); pb.setName(obj.get("name").getAsString().trim()); pb.setUrl(obj.get("url").getAsString().trim()); + String ext = obj.has("ext") ? obj.get("ext").getAsJsonObject().toString() : ""; + pb.setExt(ext); pb.setType(DefaultConfig.safeJsonInt(obj, "type", 0)); parseBeanList.add(pb); } @@ -273,6 +279,14 @@ public class ApiConfig { return jarLoader.proxyInvoke(param); } + public JSONObject jsonExt(String key, LinkedHashMap jxs, String url) { + return jarLoader.jsonExt(key, jxs, url); + } + + public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap> jxs, String url) { + return jarLoader.jsonExtMix(flag, key, name, jxs, url); + } + public interface LoadConfigCallback { void success(); @@ -327,7 +341,7 @@ public class ApiConfig { } public SourceBean getHomeSourceBean() { - return mHomeSource; + return mHomeSource == null ? emptyHome : mHomeSource; } public List getChannelList() { diff --git a/app/src/main/java/com/github/tvbox/osc/bean/ParseBean.java b/app/src/main/java/com/github/tvbox/osc/bean/ParseBean.java index 9c2a987c..06e807c8 100644 --- a/app/src/main/java/com/github/tvbox/osc/bean/ParseBean.java +++ b/app/src/main/java/com/github/tvbox/osc/bean/ParseBean.java @@ -1,5 +1,7 @@ package com.github.tvbox.osc.bean; +import android.util.Base64; + /** * @author pj567 * @date :2021/3/8 @@ -9,6 +11,7 @@ public class ParseBean { private String name; private String url; + private String ext; private int type; // 0 普通嗅探 1 json 2 Json扩展 3 聚合 private boolean isDefault = false; @@ -37,7 +40,6 @@ public class ParseBean { isDefault = b; } - public int getType() { return type; } @@ -45,4 +47,22 @@ public class ParseBean { public void setType(int type) { this.type = type; } + + public String getExt() { + return ext; + } + + public void setExt(String ext) { + this.ext = ext; + } + + public String mixUrl() { + if (!ext.isEmpty()) { + int idx = url.indexOf("?"); + if (idx > 0) { + return url.substring(0, idx + 1) + "cat_ext=" + Base64.encodeToString(ext.getBytes(), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP) + "&" + url.substring(idx + 1); + } + } + return url; + } } \ No newline at end of file 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 2acf4081..05e98f87 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 @@ -287,7 +287,8 @@ public class HomeActivity extends BaseActivity { public void run() { if (dialog == null) dialog = new AlertDialog.Builder(HomeActivity.this).setTitle("提示") - .setMessage(msg + "\n\n请重试!").setPositiveButton("确定", new DialogInterface.OnClickListener() { + .setMessage(msg + "\n\n请重试!") + .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { mHandler.post(new Runnable() { @@ -297,6 +298,21 @@ public class HomeActivity extends BaseActivity { } }); } + }) + .setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dataInitOk = true; + jarInitOk = true; + initData(); + } + }) + .setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialog) { + dataInitOk = true; + jarInitOk = true; + } }).create(); if (!dialog.isShowing()) dialog.show(); diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/LivePlayActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/LivePlayActivity.java index f5d87e2b..c452d139 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/LivePlayActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/LivePlayActivity.java @@ -211,6 +211,8 @@ public class LivePlayActivity extends BaseActivity { } }); List list = ApiConfig.get().getChannelList(); + if (list.isEmpty()) + return; if (list.size() > 0 && list.get(0).getUrls().startsWith("proxy://")) { showLoading(); String url = DefaultConfig.checkReplaceProxy(list.get(0).getUrls()); 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 93ca76ca..7650cf10 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 @@ -114,16 +114,21 @@ public class PlayActivity extends BaseActivity { parseDialog.parse(sourceKey, object, new ParseDialog.ParseCallback() { @Override public void success(String playUrl, Map headers) { - if (mVideoView != null) { - mVideoView.release(); - if (headers != null) { - mVideoView.setUrl(playUrl, headers); - } else { - mVideoView.setUrl(playUrl); + runOnUiThread(new Runnable() { + @Override + public void run() { + if (mVideoView != null) { + mVideoView.release(); + if (headers != null) { + mVideoView.setUrl(playUrl, headers); + } else { + mVideoView.setUrl(playUrl); + } + mVideoView.start(); + } + tryDismissParse(); } - mVideoView.start(); - } - tryDismissParse(); + }); } @Override diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/SettingActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/SettingActivity.java index 7e422706..64749cf7 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/SettingActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/SettingActivity.java @@ -43,6 +43,7 @@ public class SettingActivity extends BaseActivity { private int sortFocused = 0; private Handler mHandler = new Handler(); private String homeSourceKey; + private String currentApi; private String homeSourceSort; private boolean sourceMode; @@ -105,6 +106,7 @@ public class SettingActivity extends BaseActivity { } private void initData() { + currentApi = Hawk.get(HawkConfig.API_URL, ""); homeSourceKey = ApiConfig.get().getHomeSourceBean().getKey(); homeSourceSort = ApiConfig.get().getHomeSourceBean().getState().tidSort; if (homeSourceSort == null) @@ -183,7 +185,8 @@ public class SettingActivity extends BaseActivity { if (newHomeSourceSort == null) newHomeSourceSort = ""; - if (!homeSourceKey.equals(ApiConfig.get().getHomeSourceBean().getKey()) || + if ((homeSourceKey != null && !homeSourceKey.equals(ApiConfig.get().getHomeSourceBean().getKey())) || + !currentApi.equals(Hawk.get(HawkConfig.API_URL, "")) || !homeSourceSort.equals(newHomeSourceSort) || sourceMode != Hawk.get(HawkConfig.SOURCE_MODE_LOCAL, true)) { AppManager.getInstance().finishAllActivity(); diff --git a/app/src/main/java/com/github/tvbox/osc/ui/dialog/ParseDialog.java b/app/src/main/java/com/github/tvbox/osc/ui/dialog/ParseDialog.java index 3b9be7b8..7dd491ec 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/dialog/ParseDialog.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/dialog/ParseDialog.java @@ -58,6 +58,7 @@ import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -313,7 +314,7 @@ public class ParseDialog { }); } - private void loadUrl(ParseBean pb, String url, ParseCallback callback) { + private void loadUrl(ParseBean pb, String flag, String url, ParseCallback callback) { if (pb == null || pb.getType() == 0) { if (mSysWebClient != null) { mSysWebClient.setCallback(callback); @@ -333,6 +334,87 @@ public class ParseDialog { } } else if (pb.getType() == 1) { // json 解析 doJsonJx(pb.getUrl(), url, callback); + } else if (pb.getType() == 2) { // json 扩展 + LinkedHashMap jxs = new LinkedHashMap<>(); + for (ParseBean p : ApiConfig.get().getParseBeanList()) { + if (p.getType() == 1) { + jxs.put(p.getName(), p.mixUrl()); + } + } + new Thread(new Runnable() { + @Override + public void run() { + JSONObject rs = ApiConfig.get().jsonExt(pb.getUrl(), jxs, url); + if (rs == null || !rs.has("url")) { + callback.fail(); + } 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) { + + } + } + boolean parseWV = rs.optInt("parse", 0) == 1; + if (parseWV) { + String wvUrl = DefaultConfig.checkReplaceProxy(rs.optString("url", "")); + loadUrl(null, flag, wvUrl, callback); + } else { + callback.success(rs.optString("url", ""), headers); + } + } + } + }).start(); + } else if (pb.getType() == 3) { // json 聚合 + 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; + new Thread(new Runnable() { + @Override + public void run() { + JSONObject rs = ApiConfig.get().jsonExtMix(flag, pb.getUrl(), finalExtendName, jxs, url); + if (rs == null || !rs.has("url")) { + callback.fail(); + } 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) { + + } + } + callback.success(rs.optString("url", ""), headers); + } + } + }).start(); } mHandler.removeCallbacks(mParseTimeOut); mHandler.postDelayed(mGridFocus, 200); @@ -356,7 +438,7 @@ public class ParseDialog { ApiConfig.get().setDefaultParse(parseBean); parseAdapter.notifyItemChanged(position); loadFound = false; - loadUrl(parseBean, url, callback); + loadUrl(parseBean, flag, url, callback); } }); mGridView.setOnInBorderKeyEventListener(new TvRecyclerView.OnInBorderKeyEventListener() { @@ -386,11 +468,11 @@ public class ParseDialog { mHandler.postDelayed(new Runnable() { @Override public void run() { - loadUrl(finalParseBean, url, callback); + loadUrl(finalParseBean, flag, url, callback); } }, 3000); } else { - loadUrl(null, parseUrl + url, callback); + loadUrl(null, flag, parseUrl + url, callback); } } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java b/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java index 49d0fea1..2a5360a0 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java @@ -1,11 +1,16 @@ package com.github.tvbox.osc.ui.fragment; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.view.View; +import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.github.tvbox.osc.R; +import com.github.tvbox.osc.api.ApiConfig; import com.github.tvbox.osc.base.BaseLazyFragment; +import com.github.tvbox.osc.bean.IJKCode; import com.github.tvbox.osc.ui.activity.SettingActivity; import com.github.tvbox.osc.ui.dialog.AboutDialog; import com.github.tvbox.osc.ui.dialog.ChangeIJKCodeDialog; @@ -18,6 +23,8 @@ import com.github.tvbox.osc.util.PlayerHelper; import com.github.tvbox.osc.util.XWalkUtils; import com.orhanobut.hawk.Hawk; +import java.util.List; + /** * @author pj567 * @date :2020/12/23 @@ -32,6 +39,7 @@ public class ModelSettingFragment extends BaseLazyFragment { private TextView tvPlay; private TextView tvRender; private TextView tvXWalkDown; + private TextView tvApi; public static ModelSettingFragment newInstance() { return new ModelSettingFragment().setArguments(); @@ -56,12 +64,14 @@ public class ModelSettingFragment extends BaseLazyFragment { tvPlay = findViewById(R.id.tvPlay); tvRender = findViewById(R.id.tvRenderType); tvXWalkDown = findViewById(R.id.tvXWalkDown); + tvApi = findViewById(R.id.tvApi); tvMediaCodec.setText(Hawk.get(HawkConfig.IJK_CODEC, "")); tvDebugOpen.setText(Hawk.get(HawkConfig.DEBUG_OPEN, false) ? "已打开" : "已关闭"); tvSourceMode.setText(Hawk.get(HawkConfig.SOURCE_MODE_LOCAL, true) ? "本地" : "云端"); tvTestChannel.setText(Hawk.get(HawkConfig.TEST_CHANNEL, false) ? "已打开" : "已关闭"); tvParseWebView.setText(Hawk.get(HawkConfig.PARSE_WEBVIEW, true) ? "系统自带" : "XWalkView"); tvXWalkDown.setText(XWalkUtils.xWalkLibExist(mContext) ? "已下载" : "未下载"); + tvApi.setText(Hawk.get(HawkConfig.API_URL, "")); findViewById(R.id.llXWalkCore).setVisibility(Hawk.get(HawkConfig.PARSE_WEBVIEW, true) ? View.GONE : View.VISIBLE); changePlay(); changeRender(); @@ -132,9 +142,36 @@ public class ModelSettingFragment extends BaseLazyFragment { dialog.show(); } }); + findViewById(R.id.llApi).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); + builder.setTitle("请输入配置地址"); + final EditText edit = new EditText(mActivity); + edit.setText(tvApi.getText()); + builder.setView(edit); + builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String url = edit.getText().toString().trim(); + Hawk.put(HawkConfig.API_URL, url); + tvApi.setText(url); + } + }); + builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + builder.create().show(); + } + }); findViewById(R.id.llMediaCodec).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + List ijkCodes = ApiConfig.get().getIjkCodes(); + if (ijkCodes == null || ijkCodes.size() == 0) + return; FastClickCheckUtil.check(v); ChangeIJKCodeDialog dialog = new ChangeIJKCodeDialog().build(mActivity, new ChangeIJKCodeDialog.Callback() { @Override 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 dfe06c45..9281d462 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 @@ -28,14 +28,16 @@ public class DefaultConfig { public static List adjustSort(String sourceKey, List list, boolean withMy) { List data = new ArrayList<>(); - SourceBean sb = ApiConfig.get().getSource(sourceKey); - HashMap tidSort = sb.getTidSort(); - for (MovieSort.SortData sortData : list) { - // 默认排序 1000 - sortData.sort = 1000; - if (tidSort != null && tidSort.containsKey(sortData.id)) - sortData.sort = tidSort.get(sortData.id); - data.add(sortData); + if (sourceKey != null) { + SourceBean sb = ApiConfig.get().getSource(sourceKey); + HashMap tidSort = sb.getTidSort(); + for (MovieSort.SortData sortData : list) { + // 默认排序 1000 + sortData.sort = 1000; + if (tidSort != null && tidSort.containsKey(sortData.id)) + sortData.sort = tidSort.get(sortData.id); + data.add(sortData); + } } if (withMy) data.add(0, new MovieSort.SortData("my0", "我的")); diff --git a/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java b/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java index 5079977c..58ac7aa0 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java @@ -6,6 +6,7 @@ package com.github.tvbox.osc.util; * @description: */ public class HawkConfig { + public static final String API_URL = "api_url"; public static final String DEFAULT_PARSE = "parse_default"; public static final String DEBUG_OPEN = "debug_open"; public static final String PARSE_WEBVIEW = "parse_webview"; // true 系统 false xwalk diff --git a/app/src/main/java/com/github/tvbox/osc/viewmodel/SourceViewModel.java b/app/src/main/java/com/github/tvbox/osc/viewmodel/SourceViewModel.java index 1cb69876..e49568cf 100644 --- a/app/src/main/java/com/github/tvbox/osc/viewmodel/SourceViewModel.java +++ b/app/src/main/java/com/github/tvbox/osc/viewmodel/SourceViewModel.java @@ -55,6 +55,10 @@ public class SourceViewModel extends ViewModel { public static final ExecutorService spThreadPool = Executors.newFixedThreadPool(3); public void getSort(String sourceKey) { + if (sourceKey == null) { + sortResult.postValue(null); + return; + } SourceBean sourceBean = ApiConfig.get().getSource(sourceKey); int type = sourceBean.getType(); if (type == 3) { diff --git a/app/src/main/res/layout/fragment_model.xml b/app/src/main/res/layout/fragment_model.xml index 15aef207..ba75df54 100644 --- a/app/src/main/res/layout/fragment_model.xml +++ b/app/src/main/res/layout/fragment_model.xml @@ -159,6 +159,52 @@ android:textSize="30pt" /> + + + + + + + + + + +