From 7b358e607d139faae39e5bfe69ed194fad383786 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=94=90=E4=B8=89?=
<89683694+Tangsan99999@users.noreply.github.com>
Date: Sun, 17 Sep 2023 19:23:42 +0800
Subject: [PATCH] copy AppYsV2 from catvod
---
.../com/github/catvod/spider/AppYsV2.java | 918 ++++++++++++++++++
.../java/com/github/catvod/utils/Utils.java | 6 +
jar/custom_spider.jar | Bin 369856 -> 377660 bytes
jar/custom_spider.jar.md5 | 2 +-
4 files changed, 925 insertions(+), 1 deletion(-)
create mode 100644 app/src/main/java/com/github/catvod/spider/AppYsV2.java
diff --git a/app/src/main/java/com/github/catvod/spider/AppYsV2.java b/app/src/main/java/com/github/catvod/spider/AppYsV2.java
new file mode 100644
index 00000000..95ccc337
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/AppYsV2.java
@@ -0,0 +1,918 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+import android.text.TextUtils;
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.crawler.SpiderDebug;
+import com.github.catvod.net.OkHttp;
+import com.github.catvod.utils.Utils;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.net.URLEncoder;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * M浏览器中的App影视
+ *
+ * Author: 群友 不负此生
+ */
+public class AppYsV2 extends Spider {
+
+ @Override
+ public void init(Context context, String extend) throws Exception {
+ super.init(context, extend);
+ try {
+ extInfos = extend.split("###");
+ } catch (Throwable th) {
+ }
+ }
+
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ String url = getCateUrl(getApiUrl());
+ JSONArray jsonArray = null;
+ if (!url.isEmpty()) {
+ SpiderDebug.log(url);
+ String json = desc(OkHttp.string(url, getHeaders(url)), (byte) 0);
+ JSONObject obj = new JSONObject(json);
+ if (obj.has("list") && obj.get("list") instanceof JSONArray) {
+ jsonArray = obj.getJSONArray("list");
+ } else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
+ jsonArray = obj.getJSONObject("data").getJSONArray("list");
+ } else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
+ jsonArray = obj.getJSONArray("data");
+ }
+ } else { // 通过filter列表读分类
+ String filterStr = getFilterTypes(url, null);
+ String[] classes = filterStr.split("\n")[0].split("\\+");
+ jsonArray = new JSONArray();
+ for (int i = 1; i < classes.length; i++) {
+ String[] kv = classes[i].trim().split("=");
+ if (kv.length < 2)
+ continue;
+ JSONObject newCls = new JSONObject();
+ newCls.put("type_name", kv[0].trim());
+ newCls.put("type_id", kv[1].trim());
+ jsonArray.put(newCls);
+ }
+ }
+ JSONObject result = new JSONObject();
+ JSONArray classes = new JSONArray();
+ if (jsonArray != null) {
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject jObj = jsonArray.getJSONObject(i);
+ String typeName = jObj.getString("type_name");
+ if (isBan(typeName))
+ continue;
+ String typeId = jObj.getString("type_id");
+ JSONObject newCls = new JSONObject();
+ newCls.put("type_id", typeId);
+ newCls.put("type_name", typeName);
+ JSONObject typeExtend = jObj.optJSONObject("type_extend");
+ if (filter) {
+ String filterStr = getFilterTypes(url, typeExtend);
+ String[] filters = filterStr.split("\n");
+ JSONArray filterArr = new JSONArray();
+ for (int k = url.isEmpty() ? 1 : 0; k < filters.length; k++) {
+ String l = filters[k].trim();
+ if (l.isEmpty())
+ continue;
+ String[] oneLine = l.split("\\+");
+ String type = oneLine[0].trim();
+ String typeN = type;
+ if (type.contains("筛选")) {
+ type = type.replace("筛选", "");
+ switch (type) {
+ case "class":
+ typeN = "类型";
+ break;
+ case "area":
+ typeN = "地区";
+ break;
+ case "lang":
+ typeN = "语言";
+ break;
+ case "year":
+ typeN = "年份";
+ break;
+ }
+ }
+ JSONObject jOne = new JSONObject();
+ jOne.put("key", type);
+ jOne.put("name", typeN);
+ JSONArray valueArr = new JSONArray();
+ for (int j = 1; j < oneLine.length; j++) {
+ JSONObject kvo = new JSONObject();
+ String kv = oneLine[j].trim();
+ int sp = kv.indexOf("=");
+ if (sp == -1) {
+ if (isBan(kv))
+ continue;
+ kvo.put("n", kv);
+ kvo.put("v", kv);
+ } else {
+ String n = kv.substring(0, sp);
+ if (isBan(n))
+ continue;
+ kvo.put("n", n.trim());
+ kvo.put("v", kv.substring(sp + 1).trim());
+ }
+ valueArr.put(kvo);
+ }
+ jOne.put("value", valueArr);
+ filterArr.put(jOne);
+ }
+ if (!result.has("filters")) {
+ result.put("filters", new JSONObject());
+ }
+ result.getJSONObject("filters").put(typeId, filterArr);
+ }
+ classes.put(newCls);
+ }
+ }
+ result.put("class", classes);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ @Override
+ public String homeVideoContent() {
+ try {
+ String apiUrl = getApiUrl();
+ String url = getRecommendUrl(apiUrl);
+ boolean isTV = false;
+ if (url.isEmpty()) {
+ url = getCateFilterUrlPrefix(apiUrl) + "movie&page=1&area=&type=&start=";
+ isTV = true;
+ }
+ SpiderDebug.log(url);
+ String json = desc(OkHttp.string(url, getHeaders(url)), (byte) 1);
+ JSONObject obj = new JSONObject(json);
+ JSONArray videos = new JSONArray();
+ if (isTV) {
+ JSONArray jsonArray = obj.getJSONArray("data");
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject vObj = jsonArray.getJSONObject(i);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vObj.getString("nextlink"));
+ v.put("vod_name", vObj.getString("title"));
+ v.put("vod_pic", vObj.getString("pic"));
+ v.put("vod_remarks", vObj.getString("state"));
+ videos.put(v);
+ }
+ } else {
+ ArrayList arrays = new ArrayList<>();
+ findJsonArray(obj, "vlist", arrays);
+ if (arrays.isEmpty()) {
+ findJsonArray(obj, "vod_list", arrays);
+ }
+ List ids = new ArrayList<>();
+ for (JSONArray jsonArray : arrays) {
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject vObj = jsonArray.getJSONObject(i);
+ String vid = vObj.getString("vod_id");
+ if (ids.contains(vid))
+ continue;
+ ids.add(vid);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vid);
+ v.put("vod_name", vObj.getString("vod_name"));
+ v.put("vod_pic", vObj.getString("vod_pic"));
+ v.put("vod_remarks", vObj.getString("vod_remarks"));
+ videos.put(v);
+ }
+ }
+ }
+ JSONObject result = new JSONObject();
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) {
+ try {
+ String apiUrl = getApiUrl();
+ String url = getCateFilterUrlPrefix(apiUrl) + tid + getCateFilterUrlSuffix(apiUrl);
+ url = url.replace("#PN#", pg);
+ url = url.replace("筛选class", (extend != null && extend.containsKey("class")) ? extend.get("class") : "");
+ url = url.replace("筛选area", (extend != null && extend.containsKey("area")) ? extend.get("area") : "");
+ url = url.replace("筛选lang", (extend != null && extend.containsKey("lang")) ? extend.get("lang") : "");
+ url = url.replace("筛选year", (extend != null && extend.containsKey("year")) ? extend.get("year") : "");
+ url = url.replace("排序", (extend != null && extend.containsKey("排序")) ? extend.get("排序") : "");
+ SpiderDebug.log(url);
+ String json = desc(OkHttp.string(url, getHeaders(url)), (byte) 2);
+ JSONObject obj = new JSONObject(json);
+ int totalPg = Integer.MAX_VALUE;
+ try {
+ if (obj.has("totalpage") && obj.get("totalpage") instanceof Integer) {
+ totalPg = obj.getInt("totalpage");
+ } else if (obj.has("pagecount") && obj.get("pagecount") instanceof Integer) {
+ totalPg = obj.getInt("pagecount");
+ } else if (obj.has("data") && obj.get("data") instanceof JSONObject &&
+ (obj.getJSONObject("data").has("total") && obj.getJSONObject("data").get("total") instanceof Integer &&
+ obj.getJSONObject("data").has("limit") && obj.getJSONObject("data").get("limit") instanceof Integer)) {
+ int limit = obj.getJSONObject("data").getInt("limit");
+ int total = obj.getJSONObject("data").getInt("total");
+ totalPg = total % limit == 0 ? (total / limit) : (total / limit + 1);
+ }
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+
+ JSONArray jsonArray = null;
+ JSONArray videos = new JSONArray();
+ if (obj.has("list") && obj.get("list") instanceof JSONArray) {
+ jsonArray = obj.getJSONArray("list");
+ } else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
+ jsonArray = obj.getJSONObject("data").getJSONArray("list");
+ } else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
+ jsonArray = obj.getJSONArray("data");
+ }
+ if (jsonArray != null) {
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject vObj = jsonArray.getJSONObject(i);
+ if (vObj.has("vod_id")) {
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vObj.getString("vod_id"));
+ v.put("vod_name", vObj.getString("vod_name"));
+ v.put("vod_pic", vObj.getString("vod_pic"));
+ v.put("vod_remarks", vObj.getString("vod_remarks"));
+ videos.put(v);
+ } else {
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vObj.getString("nextlink"));
+ v.put("vod_name", vObj.getString("title"));
+ v.put("vod_pic", vObj.getString("pic"));
+ v.put("vod_remarks", vObj.getString("state"));
+ videos.put(v);
+ }
+ }
+ }
+ JSONObject result = new JSONObject();
+ result.put("page", pg);
+ result.put("pagecount", totalPg);
+ result.put("limit", 90);
+ result.put("total", Integer.MAX_VALUE);
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ @Override
+ public String detailContent(List ids) {
+ try {
+ String apiUrl = getApiUrl();
+ String url = getPlayUrlPrefix(apiUrl) + ids.get(0);
+ SpiderDebug.log(url);
+ String json = desc(OkHttp.string(url, getHeaders(url)), (byte) 3);
+ JSONObject obj = new JSONObject(json);
+ JSONObject result = new JSONObject();
+ JSONObject vod = new JSONObject();
+ genPlayList(apiUrl, obj, json, vod, ids.get(0));
+ JSONArray list = new JSONArray();
+ list.put(vod);
+ result.put("list", list);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) {
+ try {
+ String apiUrl = getApiUrl();
+ String url = getSearchUrl(apiUrl, URLEncoder.encode(key));
+ String json = desc(OkHttp.string(url, getHeaders(url)), (byte) 5);
+ JSONObject obj = new JSONObject(json);
+ JSONArray jsonArray = null;
+ JSONArray videos = new JSONArray();
+ if (obj.has("list") && obj.get("list") instanceof JSONArray) {
+ jsonArray = obj.getJSONArray("list");
+ } else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
+ jsonArray = obj.getJSONObject("data").getJSONArray("list");
+ } else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
+ jsonArray = obj.getJSONArray("data");
+ }
+ if (jsonArray != null) {
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject vObj = jsonArray.getJSONObject(i);
+ if (vObj.has("vod_id")) {
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vObj.getString("vod_id"));
+ v.put("vod_name", vObj.getString("vod_name"));
+ v.put("vod_pic", vObj.getString("vod_pic"));
+ v.put("vod_remarks", vObj.getString("vod_remarks"));
+ videos.put(v);
+ } else {
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vObj.getString("nextlink"));
+ v.put("vod_name", vObj.getString("title"));
+ v.put("vod_pic", vObj.getString("pic"));
+ v.put("vod_remarks", vObj.getString("state"));
+ videos.put(v);
+ }
+ }
+ }
+ JSONObject result = new JSONObject();
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) {
+ try {
+ if (flag.contains("fanqie") && Utils.isVideoFormat(id)) {
+ JSONObject result = new JSONObject();
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", id);
+ return result.toString();
+ }
+ ArrayList parseUrls = parseUrlMap.get(flag);
+ if (parseUrls == null)
+ parseUrls = new ArrayList<>();
+ if (!parseUrls.isEmpty()) {
+ JSONObject result = getFinalVideo(flag, parseUrls, id);
+ if (result != null)
+ return result.toString();
+ }
+ if (Utils.isVideoFormat(id)) {
+ JSONObject result = new JSONObject();
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", id);
+ return result.toString();
+ } else {
+ JSONObject result = new JSONObject();
+ result.put("parse", 1);
+ result.put("jx", "1");
+ result.put("url", id);
+ return result.toString();
+ }
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ private void findJsonArray(JSONObject obj, String match, ArrayList result) {
+ Iterator keys = obj.keys();
+ while (keys.hasNext()) {
+ String k = keys.next();
+ try {
+ Object o = obj.get(k);
+ if (k.equals(match) && o instanceof JSONArray)
+ result.add((JSONArray) o);
+ if (o instanceof JSONObject) {
+ findJsonArray((JSONObject) o, match, result);
+ } else if (o instanceof JSONArray) {
+ JSONArray array = (JSONArray) o;
+ for (int i = 0; i < array.length(); i++) {
+ findJsonArray(array.getJSONObject(i), match, result);
+ }
+ }
+ } catch (JSONException e) {
+ SpiderDebug.log(e);
+ }
+ }
+ }
+
+ private String jsonArr2Str(JSONArray array) {
+ try {
+ ArrayList strings = new ArrayList<>();
+ for (int i = 0; i < array.length(); i++) {
+ strings.add(array.getString(i));
+ }
+ return TextUtils.join(",", strings);
+ } catch (JSONException e) {
+ }
+ return "";
+ }
+
+ private HashMap getHeaders(String URL) {
+ HashMap headers = new HashMap<>();
+ headers.put("User-Agent", UA(URL));
+ return headers;
+ }
+
+ private boolean isBan(String key) {
+ return key.equals("伦理") || key.equals("情色") || key.equals("福利");
+ }
+
+ // M 扩展方法
+
+ // ######重组搜索
+ private String getSearchUrl(String URL, String KEY) {
+ if (URL.contains(".vod")) {
+ if (URL.contains("iopenyun.com")) {
+ return URL + "/list?wd=" + KEY + "&page=";
+ } else {
+ return URL + "?wd=" + KEY + "&page=";
+ }
+ } else if (URL.contains("api.php/app") || URL.contains("xgapp")) {
+ return URL + "search?text=" + KEY + "&pg=";
+ } else if (urlPattern1.matcher(URL).find()) {
+ if (URL.contains("esellauto")
+ || URL.contains("1.14.63.101")
+ || URL.contains("zjys")
+ || URL.contains("dcd")
+ || URL.contains("lxue")
+ || URL.contains("weetai.cn")
+ || URL.contains("haokanju1")
+ || URL.contains("fit:8")
+ || URL.contains("zjj.life")
+ || URL.contains("love9989")
+ || URL.contains("8d8q")
+ || URL.contains("lk.pxun")
+ || URL.contains("hgyx")
+ || URL.contains("521x5")
+ || URL.contains("lxyyy")
+ || URL.contains("0818tv")
+ || URL.contains("diyoui")
+ || URL.contains("diliktv")
+ || URL.contains("ppzhu")
+ || URL.contains("aitesucai")
+ || URL.contains("zz.ci")
+ || URL.contains("chxjon")
+ || URL.contains("watchmi")
+ || URL.contains("vipbp")
+ || URL.contains("bhtv")
+ || URL.contains("xfykl")) {
+ return URL + "?ac=list&" + "wd=" + KEY + "&page=";
+ } else {
+ return URL + "?ac=list&" + "zm=" + KEY + "&page=";
+ }
+ }
+ return "";
+ }
+
+ // ######UA
+ private static final Pattern urlPattern1 = Pattern.compile("api\\.php/.*?/vod");
+ private static final Pattern urlPattern2 = Pattern.compile("api\\.php/.+?\\.vod");
+ private static final Pattern parsePattern = Pattern.compile("/.+\\?.+=");
+ private static final Pattern parsePattern1 = Pattern.compile(".*(url|v|vid|php\\?id)=");
+ private static final Pattern parsePattern2 = Pattern.compile("https?://[^/]*");
+
+ protected static final Pattern[] htmlVideoKeyMatch = new Pattern[]{
+ Pattern.compile("player=new"),
+ Pattern.compile(" typeExtendKeys = typeExtend.keys();
+ while (typeExtendKeys.hasNext()) {
+ String key = typeExtendKeys.next();
+ if (key.equals("class") || key.equals("area") || key.equals("lang") || key.equals("year")) {
+ try {
+ str = str + "筛选" + key + "+全部=+" + typeExtend.getString(key).replace(",", "+") + "\n";
+ } catch (JSONException e) {
+ }
+ }
+ }
+ }
+ if (URL.contains(".vod")) {
+ str += "\n" + "排序+全部=+最新=time+最热=hits+评分=score";
+ } else if (URL.contains("api.php/app") || URL.contains("xgapp")) {
+ } else {
+ str = "分类+全部=+电影=movie+连续剧=tvplay+综艺=tvshow+动漫=comic+4K=movie_4k+体育=tiyu\n筛选class+全部=+喜剧+爱情+恐怖+动作+科幻+剧情+战争+警匪+犯罪+动画+奇幻+武侠+冒险+枪战+恐怖+悬疑+惊悚+经典+青春+文艺+微电影+古装+历史+运动+农村+惊悚+惊悚+伦理+情色+福利+三级+儿童+网络电影\n筛选area+全部=+大陆+香港+台湾+美国+英国+法国+日本+韩国+德国+泰国+印度+西班牙+加拿大+其他\n筛选year+全部=+2023+2022+2021+2020+2019+2018+2017+2016+2015+2014+2013+2012+2011+2010+2009+2008+2007+2006+2005+2004+2003+2002+2001+2000";
+ }
+ return str;
+ }
+
+ // ######推荐地址
+ String getRecommendUrl(String URL) {
+ if (URL.contains("api.php/app") || URL.contains("xgapp")) {
+ return URL + "index_video?token=";
+ } else if (URL.contains(".vod")) {
+ return URL + "/vodPhbAll";
+ } else {
+ return "";
+ }
+ }
+
+ // ######播放器前缀地址
+ String getPlayUrlPrefix(String URL) {
+ if (URL.contains("api.php/app") || URL.contains("xgapp")) {
+ if (URL.contains("dijiaxia")) {
+ URL = "https://www.dijiaxia.com/api.php/app/";
+ return URL + "video_detail?id=";
+ } else if (URL.contains("1010dy")) {
+ URL = "http://www.1010dy.cc/api.php/app/";
+ return URL + "video_detail?id=";
+ } else {
+ return URL + "video_detail?id=";
+ }
+ } else if (URL.contains(".vod")) {
+ if (URL.contains("iopenyun")) {
+ return URL + "/detailID?vod_id=";
+ } else {
+ return URL + "/detail?vod_id=";
+ }
+ } else {
+ return "";
+ }
+ }
+
+ // ######选集
+ protected final HashMap
> parseUrlMap = new HashMap<>();
+
+ private void genPlayList(String URL, JSONObject object, String json, JSONObject vod, String vid) throws JSONException {
+ ArrayList playUrls = new ArrayList<>();
+ ArrayList playFlags = new ArrayList<>();
+ if (URL.contains("api.php/app/")) {
+ JSONObject data = object.getJSONObject("data");
+ vod.put("vod_id", data.optString("vod_id", vid));
+ vod.put("vod_name", data.getString("vod_name"));
+ vod.put("vod_pic", data.getString("vod_pic"));
+ vod.put("type_name", data.optString("vod_class"));
+ vod.put("vod_year", data.optString("vod_year"));
+ vod.put("vod_area", data.optString("vod_area"));
+ vod.put("vod_remarks", data.optString("vod_remarks"));
+ vod.put("vod_actor", data.optString("vod_actor"));
+ vod.put("vod_director", data.optString("vod_director"));
+ vod.put("vod_content", data.optString("vod_content"));
+ JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player");
+ for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
+ JSONObject from = vodUrlWithPlayer.getJSONObject(i);
+ String flag = from.optString("code").trim();
+ if (flag.isEmpty())
+ flag = from.getString("name").trim();
+ playFlags.add(flag);
+ playUrls.add(from.getString("url"));
+ String purl = from.optString("parse_api").trim();
+ ArrayList parseUrls = parseUrlMap.get(flag);
+ if (parseUrls == null) {
+ parseUrls = new ArrayList<>();
+ parseUrlMap.put(flag, parseUrls);
+ }
+ if (!purl.isEmpty() && !parseUrls.contains(purl))
+ parseUrls.add(purl);
+ }
+ } else if (URL.contains("xgapp")) {
+ JSONObject data = object.getJSONObject("data").getJSONObject("vod_info");
+ vod.put("vod_id", data.optString("vod_id", vid));
+ vod.put("vod_name", data.getString("vod_name"));
+ vod.put("vod_pic", data.getString("vod_pic"));
+ vod.put("type_name", data.optString("vod_class"));
+ vod.put("vod_year", data.optString("vod_year"));
+ vod.put("vod_area", data.optString("vod_area"));
+ vod.put("vod_remarks", data.optString("vod_remarks"));
+ vod.put("vod_actor", data.optString("vod_actor"));
+ vod.put("vod_director", data.optString("vod_director"));
+ vod.put("vod_content", data.optString("vod_content"));
+ JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player");
+ for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
+ JSONObject from = vodUrlWithPlayer.getJSONObject(i);
+ String flag = from.optString("code").trim();
+ if (flag.isEmpty())
+ flag = from.getString("name").trim();
+ playFlags.add(flag);
+ playUrls.add(from.getString("url"));
+ String purl = from.optString("parse_api").trim();
+ ArrayList parseUrls = parseUrlMap.get(flag);
+ if (parseUrls == null) {
+ parseUrls = new ArrayList<>();
+ parseUrlMap.put(flag, parseUrls);
+ }
+ if (!purl.isEmpty() && !parseUrls.contains(purl))
+ parseUrls.add(purl);
+ }
+ } else if (/*urlPattern2.matcher(URL).find()*/URL.contains(".vod")) {
+ JSONObject data = object.getJSONObject("data");
+ vod.put("vod_id", data.optString("vod_id", vid));
+ vod.put("vod_name", data.getString("vod_name"));
+ vod.put("vod_pic", data.getString("vod_pic"));
+ vod.put("type_name", data.optString("vod_class"));
+ vod.put("vod_year", data.optString("vod_year"));
+ vod.put("vod_area", data.optString("vod_area"));
+ vod.put("vod_remarks", data.optString("vod_remarks"));
+ vod.put("vod_actor", data.optString("vod_actor"));
+ vod.put("vod_director", data.optString("vod_director"));
+ vod.put("vod_content", data.optString("vod_content"));
+ JSONArray vodUrlWithPlayer = data.getJSONArray("vod_play_list");
+ for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
+ JSONObject from = vodUrlWithPlayer.getJSONObject(i);
+ String flag = from.getJSONObject("player_info").optString("from").trim();
+ if (flag.isEmpty())
+ flag = from.getJSONObject("player_info").optString("show").trim();
+ playFlags.add(flag);
+ playUrls.add(from.getString("url"));
+ try {
+ ArrayList parses = new ArrayList<>();
+ String[] parse1 = from.getJSONObject("player_info").optString("parse").split(",");
+ String[] parse2 = from.getJSONObject("player_info").optString("parse2").split(",");
+ parses.addAll(Arrays.asList(parse1));
+ parses.addAll(Arrays.asList(parse2));
+ ArrayList parseUrls = parseUrlMap.get(flag);
+ if (parseUrls == null) {
+ parseUrls = new ArrayList<>();
+ parseUrlMap.put(flag, parseUrls);
+ }
+ for (String purl : parses) {
+ if (purl.contains("http")) {
+ Matcher matcher = parsePattern1.matcher(purl);
+ if (matcher.find()) {
+ purl = matcher.group(0);
+ }
+ } else if (purl.contains("//")) {
+ Matcher matcher = parsePattern1.matcher(purl);
+ if (matcher.find()) {
+ purl = "http:" + matcher.group(0);
+ }
+ } else {
+ Matcher matcher = parsePattern2.matcher(URL);
+ if (matcher.find()) {
+ Matcher matcher1 = parsePattern1.matcher(URL);
+ if (matcher1.find()) {
+ purl = matcher.group(0) + matcher1.group(0);
+ }
+ }
+ }
+ purl = purl.replace("..", ".").trim();
+ if (!purl.isEmpty() && !parseUrls.contains(purl))
+ parseUrls.add(purl);
+ }
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ }
+ } else if (urlPattern1.matcher(URL).find()) {
+ JSONObject data = object;
+ vod.put("vod_id", data.optString("vod_id", vid));
+ vod.put("vod_name", data.getString("title"));
+ vod.put("vod_pic", data.getString("img_url"));
+ vod.put("type_name", jsonArr2Str(data.optJSONArray("type")));
+ vod.put("vod_year", data.optString("pubtime"));
+ vod.put("vod_area", jsonArr2Str(data.optJSONArray("area")));
+ vod.put("vod_remarks", data.optString("trunk"));
+ vod.put("vod_actor", jsonArr2Str(data.optJSONArray("actor")));
+ vod.put("vod_director", jsonArr2Str(data.optJSONArray("director")));
+ vod.put("vod_content", data.optString("intro"));
+ JSONObject playList = data.getJSONObject("videolist");
+ Iterator playListKeys = playList.keys();
+ while (playListKeys.hasNext()) {
+ String flag = playListKeys.next();
+ ArrayList parseUrls = parseUrlMap.get(flag);
+ if (parseUrls == null) {
+ parseUrls = new ArrayList<>();
+ parseUrlMap.put(flag, parseUrls);
+ }
+ JSONArray playListUrls = playList.getJSONArray(flag);
+ ArrayList urls = new ArrayList<>();
+ for (int j = 0; j < playListUrls.length(); j++) {
+ JSONObject urlObj = playListUrls.getJSONObject(j);
+ String url = urlObj.getString("url");
+ if (url.contains("url=")) {
+ int spIdx = url.indexOf("url=") + 4;
+ String pUrl = url.substring(0, spIdx).trim();
+ if (!pUrl.isEmpty() && !parseUrls.contains(pUrl))
+ parseUrls.add(pUrl);
+ urls.add(urlObj.getString("title") + "$" + url.substring(spIdx).trim());
+ } else {
+ urls.add(urlObj.getString("title") + "$" + url);
+ }
+ }
+ playFlags.add(flag);
+ playUrls.add(TextUtils.join("#", urls));
+ }
+ }
+ vod.put("vod_play_from", TextUtils.join("$$$", playFlags));
+ vod.put("vod_play_url", TextUtils.join("$$$", playUrls));
+ }
+
+ // ######视频地址
+ protected JSONObject getFinalVideo(String flag, ArrayList parseUrls, String url) throws JSONException {
+ String htmlPlayUrl = "";
+ for (String parseUrl : parseUrls) {
+ if (parseUrl.isEmpty() || parseUrl.equals("null"))
+ continue;
+ String playUrl = parseUrl + url;
+ String content = desc(OkHttp.string(playUrl, null), (byte) 4);
+ JSONObject tryJson = null;
+ try {
+ tryJson = jsonParse(url, content);
+ } catch (Throwable th) {
+
+ }
+ if (tryJson != null && tryJson.has("url") && tryJson.has("header")) {
+ tryJson.put("header", tryJson.getJSONObject("header").toString());
+ return tryJson;
+ }
+ if (content.contains(" 1) {
+ String descFlag = extInfos[1];
+ }
+ return src;
+ }
+
+ public static JSONObject jsonParse(String input, String json) throws JSONException {
+ //处理解析接口返回的报文,如果返回的报文中包含header信息,就加到返回值中
+ JSONObject jsonPlayData = new JSONObject(json);
+ if (jsonPlayData.has("data") && jsonPlayData.get("data") instanceof JSONObject && !jsonPlayData.has("url")) {
+ jsonPlayData = jsonPlayData.getJSONObject("data");
+ }
+ String url = jsonPlayData.getString("url");
+ if (url.startsWith("//")) {
+ url = "https:" + url;
+ }
+ if (!url.trim().startsWith("http")) {
+ return null;
+ }
+ if (url.equals(input)) {
+ if (Utils.isVip(url) || !Utils.isVideoFormat(url)) {
+ return null;
+ }
+ }
+ if (Utils.isBlackVodUrl(url)) {
+ return null;
+ }
+ JSONObject headers = new JSONObject();
+ if (jsonPlayData.has("header")) {
+ headers = jsonPlayData.optJSONObject("header");
+ }
+ else if (jsonPlayData.has("Header")) {
+ headers = jsonPlayData.optJSONObject("Header");
+ }
+ else if (jsonPlayData.has("headers")) {
+ headers = jsonPlayData.optJSONObject("headers");
+ }
+ else if (jsonPlayData.has("Headers")) {
+ headers = jsonPlayData.optJSONObject("Headers");
+ }
+ String ua = "";
+ if (jsonPlayData.has("user-agent")) {
+ ua = jsonPlayData.optString("user-agent", "");
+ }
+ else if (jsonPlayData.has("User-Agent")) {
+ ua = jsonPlayData.optString("User-Agent", "");
+ }
+ if (ua.trim().length() > 0) {
+ headers.put("User-Agent", " " + ua);
+ }
+ String referer = "";
+ if (jsonPlayData.has("referer")) {
+ referer = jsonPlayData.optString("referer", "");
+ }
+ else if (jsonPlayData.has("Referer")) {
+ referer = jsonPlayData.optString("Referer", "");
+ }
+ if (referer.trim().length() > 0) {
+ headers.put("Referer", " " + referer);
+ }
+
+ headers = fixJsonVodHeader(headers, input, url);
+ JSONObject taskResult = new JSONObject();
+ taskResult.put("header", headers);
+ taskResult.put("url", url);
+ taskResult.put("parse", "0");
+ return taskResult;
+ }
+
+ public static JSONObject fixJsonVodHeader(JSONObject headers, String input, String url) throws JSONException {
+ if (headers == null)
+ headers = new JSONObject();
+ if (input.contains("www.mgtv.com")) {
+ headers.put("Referer", " ");
+ headers.put("User-Agent", " Mozilla/5.0");
+ } else if (url.contains("titan.mgtv")) {
+ headers.put("Referer", " ");
+ headers.put("User-Agent", " Mozilla/5.0");
+ } else if (input.contains("bilibili")) {
+ headers.put("Referer", " https://www.bilibili.com/");
+ headers.put("User-Agent", " " + Utils.CHROME);
+ }
+ return headers;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/catvod/utils/Utils.java b/app/src/main/java/com/github/catvod/utils/Utils.java
index 8b9f18d5..11b84725 100644
--- a/app/src/main/java/com/github/catvod/utils/Utils.java
+++ b/app/src/main/java/com/github/catvod/utils/Utils.java
@@ -37,6 +37,12 @@ public class Utils {
return false;
}
+ public static boolean isBlackVodUrl(String url) {
+ List hosts = Arrays.asList("973973.xyz", ".fit:");
+ for (String host : hosts) if (url.contains(host)) return true;
+ return false;
+ }
+
public static boolean isVideoFormat(String url) {
if (url.contains("url=http") || url.contains(".js") || url.contains(".css") || url.contains(".html")) return false;
return RULE.matcher(url).find();
diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar
index 20e1681298227555cb31f2ae8b9ff1a5b4f2ae29..00364143675e2fafa695c353d95a63a99e2ee743 100644
GIT binary patch
literal 377660
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