keys = headerJson.keys();
+ while (keys.hasNext()) {
+ String key = keys.next();
+ reqHeaders.put(key, headerJson.optString(key, ""));
+ }
+ }
+ reqHeaders.put("url", newUrl);
+ } catch (Throwable th) {
+
+ }
+ }
+ return reqHeaders;
+ }
+}
diff --git a/app/src/main/java/com/github/catvod/parser/JsonParallel.java b/app/src/main/java/com/github/catvod/parser/JsonParallel.java
new file mode 100644
index 0000000..c8efa1c
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/parser/JsonParallel.java
@@ -0,0 +1,94 @@
+package com.github.catvod.parser;
+
+import com.github.catvod.crawler.SpiderDebug;
+import com.github.catvod.utils.Misc;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CompletionService;
+import java.util.concurrent.ExecutorCompletionService;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+/**
+ * 并发解析,直到获得第一个结果
+ *
+ * 默认解析超时时间为15秒,如果需要请自定义SpiderReq的HttpClient
+ *
+ * Author: CatVod
+ */
+public class JsonParallel {
+ private static final String ParseOKTag = "p_json_parse";
+
+ public static JSONObject parse(LinkedHashMap jx, String url) {
+ try {
+ if (jx.size() > 0) {
+ ExecutorService executorService = Executors.newFixedThreadPool(3);
+ CompletionService completionService = new ExecutorCompletionService(executorService);
+ List> futures = new ArrayList<>();
+ Set jxNames = jx.keySet();
+ for (String jxName : jxNames) {
+ String parseUrl = jx.get(jxName);
+ futures.add(completionService.submit(new Callable() {
+ @Override
+ public JSONObject call() throws Exception {
+ try {
+ HashMap reqHeaders = JsonBasic.getReqHeader(parseUrl);
+ String realUrl = reqHeaders.get("url");
+ reqHeaders.remove("url");
+ SpiderDebug.log(realUrl + url);
+ String json = OkHttpUtil.string(realUrl + url, ParseOKTag, reqHeaders);
+ JSONObject taskResult = Misc.jsonParse(url, json);
+ taskResult.put("jxFrom", jxName);
+ SpiderDebug.log(taskResult.toString());
+ return taskResult;
+ } catch (Throwable th) {
+ SpiderDebug.log(th);
+ return null;
+ }
+ }
+ }));
+ }
+ JSONObject pTaskResult = null;
+ for (int i = 0; i < futures.size(); ++i) {
+ Future completed = completionService.take();
+ try {
+ pTaskResult = completed.get();
+ if (pTaskResult != null) {
+ OkHttpUtil.cancel(ParseOKTag);
+ for (int j = 0; j < futures.size(); j++) {
+ try {
+ futures.get(j).cancel(true);
+ } catch (Throwable th) {
+ SpiderDebug.log(th);
+ }
+ }
+ futures.clear();
+ break;
+ }
+ } catch (Throwable th) {
+ SpiderDebug.log(th);
+ }
+ }
+ try {
+ executorService.shutdownNow();
+ } catch (Throwable th) {
+ SpiderDebug.log(th);
+ }
+ if (pTaskResult != null)
+ return pTaskResult;
+ }
+ } catch (Throwable th) {
+ SpiderDebug.log(th);
+ }
+ return new JSONObject();
+ }
+}
diff --git a/app/src/main/java/com/github/catvod/parser/JsonSequence.java b/app/src/main/java/com/github/catvod/parser/JsonSequence.java
new file mode 100644
index 0000000..e850558
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/parser/JsonSequence.java
@@ -0,0 +1,48 @@
+package com.github.catvod.parser;
+
+import com.github.catvod.crawler.SpiderDebug;
+import com.github.catvod.utils.Misc;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import org.json.JSONObject;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Set;
+
+/**
+ * 依次解析,失败尝试下一个
+ *
+ * 默认解析超时时间为15秒,如果需要请自定义SpiderReq的HttpClient
+ *
+ * Author: CatVod
+ */
+public class JsonSequence {
+ public static JSONObject parse(LinkedHashMap jx, String url) {
+ try {
+ if (jx.size() > 0) {
+ Set jxNames = jx.keySet();
+ for (String jxName : jxNames) {
+ String parseUrl = jx.get(jxName);
+ try {
+ HashMap reqHeaders = JsonBasic.getReqHeader(parseUrl);
+ String realUrl = reqHeaders.get("url");
+ reqHeaders.remove("url");
+ SpiderDebug.log(realUrl + url);
+ String json = OkHttpUtil.string(realUrl + url, reqHeaders);
+ JSONObject taskResult = Misc.jsonParse(url, json);
+ if (taskResult == null)
+ continue;
+ taskResult.put("jxFrom", jxName);
+ return taskResult;
+ } catch (Throwable th) {
+ SpiderDebug.log(th);
+ }
+ }
+ }
+ } catch (Throwable th) {
+ SpiderDebug.log(th);
+ }
+ return new JSONObject();
+ }
+}
diff --git a/app/src/main/java/com/github/catvod/parser/MixDemo.java b/app/src/main/java/com/github/catvod/parser/MixDemo.java
new file mode 100644
index 0000000..4db3f25
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/parser/MixDemo.java
@@ -0,0 +1,189 @@
+package com.github.catvod.parser;
+
+import android.util.Base64;
+
+import com.github.catvod.crawler.SpiderDebug;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+
+public class MixDemo {
+
+ /*
+ "parses": [
+ {
+ "name": "聚合",
+ "type": 3,
+ "url": "Demo"
+ },
+ {
+ "name": "解析",
+ "type": 1,
+ "url": "https://192.168.10.88/jx.php?url=",
+ "ext": {
+ "flag": [
+ "qq",
+ "iqiyi",
+ "qiyi",
+ "爱奇艺",
+ "腾讯",
+ "letv",
+ "sohu",
+ "tudou",
+ "pptv",
+ "mgtv",
+ "wasu",
+ "bilibili"
+ ]
+ }
+ }]
+ */
+
+ public static HashMap> flagWebJx = new HashMap<>();
+
+ static HashMap> configs = null;
+
+ public static JSONObject parse(LinkedHashMap> jx, String nameMe, String flag, String url) {
+ try {
+ if (configs == null) {
+ configs = new HashMap<>();
+ Iterator keys = jx.keySet().iterator();
+ while (keys.hasNext()) {
+ String key = keys.next();
+ HashMap parseBean = jx.get(key);
+ String type = parseBean.get("type");
+ if (type.equals("1") || type.equals("0")) {
+ try {
+ JSONArray flags = new JSONObject(parseBean.get("ext")).getJSONArray("flag");
+ for (int j = 0; j < flags.length(); j++) {
+ String flagKey = flags.getString(j);
+ ArrayList flagJx = configs.get(flagKey);
+ if (flagJx == null) {
+ flagJx = new ArrayList<>();
+ configs.put(flagKey, flagJx);
+ }
+ flagJx.add(key);
+ }
+ } catch (Throwable th) {
+
+ }
+ }
+ }
+ }
+ // 通过上面的配置获得解析列表
+ LinkedHashMap jsonJx = new LinkedHashMap<>();
+ ArrayList webJx = new ArrayList<>();
+ ArrayList flagJx = configs.get(flag);
+ if (flagJx != null && !flagJx.isEmpty()) {
+ for (int i = 0; i < flagJx.size(); i++) {
+ String key = flagJx.get(i);
+ HashMap parseBean = jx.get(key);
+ String type = parseBean.get("type");
+ if (type.equals("1")) {
+ jsonJx.put(key, mixUrl(parseBean.get("url"), parseBean.get("ext")));
+ } else if (type.equals("0")) {
+ webJx.add(parseBean.get("url"));
+ }
+ }
+ } else {
+ Iterator keys = jx.keySet().iterator();
+ while (keys.hasNext()) {
+ String key = keys.next();
+ HashMap parseBean = jx.get(key);
+ String type = parseBean.get("type");
+ if (type.equals("1")) {
+ jsonJx.put(key, mixUrl(parseBean.get("url"), parseBean.get("ext")));
+ } else if (type.equals("0")) {
+ webJx.add(parseBean.get("url"));
+ }
+ }
+ }
+ if (!webJx.isEmpty()) {
+ flagWebJx.put(flag, webJx);
+ }
+ // 优先使用json并发解析
+ JSONObject jsonResult = JsonParallel.parse(jsonJx, url);
+ if (jsonResult != null && jsonResult.has("url")) {
+ return jsonResult;
+ }
+ // json解析没有得到结果 用webview解析
+ if (!webJx.isEmpty()) {
+ JSONObject webResult = new JSONObject();
+ webResult.put("url", "proxy://do=MixDemo&flag=" + flag + "&url=" + Base64.encodeToString(url.getBytes(), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP));
+ webResult.put("parse", 1);
+ return webResult;
+ }
+ } catch (Throwable th) {
+ SpiderDebug.log(th);
+ }
+ return new JSONObject();
+ }
+
+ private static String mixUrl(String url, String ext) {
+ if (ext.trim().length() > 0) {
+ 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;
+ }
+
+ public static Object[] loadHtml(String flag, String url) {
+ try {
+ url = new String(Base64.decode(url, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8");
+ String html = "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "解析\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "";
+
+ StringBuilder jxs = new StringBuilder();
+ if (flagWebJx.containsKey(flag)) {
+ ArrayList jxUrls = flagWebJx.get(flag);
+ for (int i = 0; i < jxUrls.size(); i++) {
+ jxs.append("\"");
+ jxs.append(jxUrls.get(i));
+ jxs.append("\"");
+ if (i < jxUrls.size() - 1) {
+ jxs.append(",");
+ }
+ }
+ }
+ html = html.replace("#url#", url).replace("#jxs#", jxs.toString());
+ Object[] result = new Object[3];
+ result[0] = 200;
+ result[1] = "text/html; charset=\"UTF-8\"";
+ ByteArrayInputStream baos = new ByteArrayInputStream(html.toString().getBytes("UTF-8"));
+ result[2] = baos;
+ return result;
+ } catch (Throwable th) {
+ th.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/app/src/main/java/com/github/catvod/spider/AliPS.java b/app/src/main/java/com/github/catvod/spider/AliPS.java
new file mode 100644
index 0000000..d7d2cf6
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/AliPS.java
@@ -0,0 +1,108 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+
+public class AliPS extends Spider {
+ private PushAgent pushAgent;
+ private static String b = "https://www.alipansou.com";
+ private static Pattern a = Pattern.compile("(https:\\/\\/www.aliyundrive.com\\/s\\/[^\\\"]+)");
+
+ @Override
+ public void init(Context context, String extend) {
+ super.init(context, extend);
+ pushAgent = new PushAgent();
+ pushAgent.init(context, extend);
+ }
+
+ @Override
+ public String detailContent(List list) {
+ try {
+ Pattern pattern = a;
+ if (pattern.matcher(list.get(0)).find()) {
+ return pushAgent.detailContent(list);
+ }
+ Matcher matcher = pattern.matcher(OkHttpUtil.string("https://www.alipansou.com" + list.get(0), null));
+ if (!matcher.find()) {
+ return "";
+ }
+ list.set(0, matcher.group(1).replaceAll("\\\\",""));
+ return pushAgent.detailContent(list);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "";
+ }
+ }
+
+ @Override
+ public String playerContent(String str, String str2, List list) {
+ return pushAgent.playerContent(str, str2, list);
+ }
+
+ protected static HashMap sHeaders() {
+ HashMap headers = new HashMap<>();
+ headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36");
+ return headers;
+ }
+
+ @Override
+ public String searchContent(String key, boolean z) {
+ try {
+ HashMap hashMap = new HashMap();
+ hashMap.put("7", "文件夹");
+ hashMap.put("1", "视频");
+ JSONArray jSONArray = new JSONArray();
+ Iterator entries = hashMap.entrySet().iterator();
+ while (entries.hasNext()) {
+ Map.Entry entry = (Map.Entry) entries.next();
+ String str2 = (String) entry.getValue();
+ String sb2 = b + "/search?k=" + URLEncoder.encode(key) + "&t=" + (String) entry.getKey();
+ Document doc = Jsoup.parse(OkHttpUtil.string(sb2, sHeaders()));
+ Elements Data = doc.select("van-row a");
+ for (int i = 0; i < Data.size(); i++) {
+ Element next = Data.get(i);
+ String filename = next.select("template div").text();
+ Pattern pattern = Pattern.compile("(时间: \\S+)");
+ Matcher matcher = pattern.matcher(filename);
+ if (!matcher.find())
+ continue;
+ String remark = matcher.group(1);
+ if (filename.contains(key)) {
+ JSONObject v = new JSONObject();
+ String id = next.attr("href");
+ String title = "[" + str2 + "]" + filename;
+ v.put("vod_id", id);
+ v.put("vod_name", title);
+ v.put("remark", remark);
+ v.put("vod_pic", "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000");
+ jSONArray.put(v);
+ }
+ }
+ }
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("list", jSONArray);
+ return jSONObject2.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/catvod/spider/AppYs.java b/app/src/main/java/com/github/catvod/spider/AppYs.java
new file mode 100644
index 0000000..051eaef
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/AppYs.java
@@ -0,0 +1,1124 @@
+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.utils.Misc;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * M浏览器中的App影视
+ *
+ * Author: 群友 不负此生
+ */
+public class AppYs extends Spider {
+
+ private String extString = "";
+
+ @Override
+ public void init(Context context, String extend) {
+ super.init(context, extend);
+ this.extString = extend;
+ }
+
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ String url = getCateUrl(extString);
+ JSONArray jsonArray = null;
+ if (!url.isEmpty()) {
+ SpiderDebug.log(url);
+ String json = OkHttpUtil.string(url, getHeaders(url));
+ 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("筛选", "");
+ if (type.equals("class"))
+ typeN = "类型";
+ else if (type.equals("area"))
+ typeN = "地区";
+ else if (type.equals("lang"))
+ typeN = "语言";
+ else if (type.equals("year"))
+ typeN = "年份";
+ }
+ 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 = extString;
+ 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 = OkHttpUtil.string(url, getHeaders(url));
+ 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 = extString;
+ 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 = OkHttpUtil.string(url, getHeaders(url));
+ 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 = extString;
+ String url = getPlayUrlPrefix(apiUrl) + ids.get(0);
+ SpiderDebug.log(url);
+ String json = OkHttpUtil.string(url, getHeaders(url));
+ 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 = extString;
+ String url = getSearchUrl(apiUrl, URLEncoder.encode(key));
+ String json = OkHttpUtil.string(url, getHeaders(url));
+ 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 {
+ String apiUrl = extString;
+ String parseUrl = getParseUrl(apiUrl, flag);
+ String playerUrl = getPlayerUrl(apiUrl, parseUrl, id);
+ JSONObject result = new JSONObject();
+ getFinalVideo(playerUrl, result);
+ 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 static HashMap fakeVips = null;
+ private static final Object lock = new Object();
+
+ private static String stopVipFlag(String flag) {
+ synchronized (lock) {
+ if (fakeVips == null) {
+ fakeVips = new HashMap<>();
+ fakeVips.put("youku", "优酷M");
+ fakeVips.put("qq", "腾讯M");
+ fakeVips.put("iqiyi", "爱奇艺M");
+ fakeVips.put("qiyi", "奇艺M");
+ fakeVips.put("letv", "乐视M");
+ fakeVips.put("sohu", "搜狐M");
+ fakeVips.put("tudou", "土豆M");
+ fakeVips.put("pptv", "PPTVM");
+ fakeVips.put("mgtv", "芒果TVM");
+ fakeVips.put("wasu", "华数M");
+ fakeVips.put("bilibili", "哔哩M");
+ }
+ if (fakeVips.containsKey(flag)) {
+ return fakeVips.get(flag);
+ }
+ return flag;
+ }
+ }
+
+ 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?://[^/]*");
+ private static final Pattern[] parseMatchForDotVod = new Pattern[]{
+ Pattern.compile("jx\\.+huimaojia\\.+com/player"),
+ Pattern.compile("py\\.+789pan\\.+cn/player/tm\\.php\\?url="),
+ Pattern.compile("ztys\\.+waruanzy\\.+com/player/\\?url="),
+ Pattern.compile("yingshi\\.+waruanzy\\.+com/789pan/\\?url="),
+ Pattern.compile("vip\\.+parwix\\.+com:4433/player/\\?url="),
+ Pattern.compile("api\\.+cxitco\\.+cn"),
+ Pattern.compile("/vip\\.+renrenmi.cc"),
+ Pattern.compile("yanbing\\.+parwix\\.+com:4433/player"),
+ Pattern.compile("json\\.+cantin\\.+cc/apijson\\.php"),
+ Pattern.compile("ffdm\\.+miaoletv\\.+com/\\?url="),
+ Pattern.compile("vip\\.+sylwl\\.+cn/api/\\?key="),
+ Pattern.compile("jx\\.+dikotv\\.+com/\\?url="),
+ Pattern.compile("zly\\.+xjqxz\\.+top/player/\\?url="),
+ Pattern.compile("5znn\\.+xyz/m3u8\\.+php"),
+ Pattern.compile("uid=1735&my="),
+ Pattern.compile("api\\.+xkvideo\\.+design/m3u8\\.+php\\?url="),
+ Pattern.compile("play\\.+szbodankyy\\.+com/xxoocnmb"),
+ Pattern.compile("vip\\.+fj6080\\.+xyz/player/\\?url="),
+ Pattern.compile("a\\.+dxzj88\\.+com/jiexi"),
+ Pattern.compile("host\\.+q-q\\.+wang/api"),
+ Pattern.compile("保佑")
+ };
+
+ private 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+全部=+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 "";
+ }
+ }
+
+ // ######选集
+ private 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 = stopVipFlag(from.getString("name"));
+ playFlags.add(flag);
+ playUrls.add(from.getString("url"));
+ String purl = from.optString("parse_api");
+ if (purl.contains("jpg.hou.lu/jm/za/index.php")) {
+ purl = "http://vip.mengx.vip/home/api?type=ys&uid=3249696&key=aefqrtuwxyEFHKNOQY&url=";
+ }
+ parseUrlMap.put(flag, 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 = stopVipFlag(from.getString("name"));
+ playFlags.add(flag);
+ playUrls.add(from.getString("url"));
+ String purl = from.optString("parse_api");
+ if (purl.contains("jpg.hou.lu/jm/za/index.php")) {
+ purl = "http://vip.mengx.vip/home/api?type=ys&uid=3249696&key=aefqrtuwxyEFHKNOQY&url=";
+ }
+ parseUrlMap.put(flag, 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 = stopVipFlag(from.getJSONObject("player_info").getString("show"));
+ 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(",");
+ for (String p : parse1) {
+ if (parsePattern.matcher(p).find()) {
+ boolean add = true;
+ for (Pattern pt : parseMatchForDotVod) {
+ if (pt.matcher(p).find()) {
+ add = false;
+ break;
+ }
+ }
+ if (add) {
+ parses.add(p);
+ }
+ }
+ }
+ for (String p : parse2) {
+ if (parsePattern.matcher(p).find()) {
+ boolean add = true;
+ for (Pattern pt : parseMatchForDotVod) {
+ if (pt.matcher(p).find()) {
+ add = false;
+ break;
+ }
+ }
+ if (add) {
+ parses.add(p);
+ }
+ }
+ }
+ if (parses.size() > 0 && parses.get(0).contains("=")) {
+ String purl = parses.get(0);
+ if (purl.contains("http")) {
+ Matcher matcher = parsePattern1.matcher(purl);
+ if (matcher.find()) {
+ purl = matcher.group(0).replace("..", ".").replace("vip.aotian.love", "vip.gaotian.love");
+ }
+ } else if (purl.contains("//")) {
+ Matcher matcher = parsePattern1.matcher(purl);
+ if (matcher.find()) {
+ purl = "http:" + matcher.group(0).replace("..", ".");
+ }
+ } else {
+ Matcher matcher = parsePattern2.matcher(URL);
+ if (matcher.find()) {
+ Matcher matcher1 = parsePattern1.matcher(URL);
+ if (matcher1.find()) {
+ purl = matcher.group(0) + matcher1.group(0).replace("..", ".");
+ }
+ }
+ }
+ parseUrlMap.put(flag, purl);
+ } else {
+ parseUrlMap.put(flag, "http://1.117.152.239:39000/?url=");
+ }
+ } 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 from = playListKeys.next();
+ JSONArray playListUrls = playList.getJSONArray(from);
+ ArrayList urls = new ArrayList<>();
+ for (int j = 0; j < playListUrls.length(); j++) {
+ JSONObject urlObj = playListUrls.getJSONObject(j);
+ urls.add(urlObj.getString("title") + "$" + urlObj.getString("url"));
+ }
+ playFlags.add(stopVipFlag(from));
+ playUrls.add(TextUtils.join("#", urls));
+ }
+ }
+// for (int i = 0; i < playFlags.size(); i++) {
+// String pu = playUrls.get(i).split("#")[0].split("\\$")[1];
+// System.out.println(pu + " is video?" + isVideoFormat(pu));
+// playerContent(playFlags.get(i), pu, new ArrayList<>());
+// }
+ vod.put("vod_play_from", TextUtils.join("$$$", playFlags));
+ vod.put("vod_play_url", TextUtils.join("$$$", playUrls));
+ }
+
+ private String getParseUrl(String URL, String flag) {
+ String parseUrl = "";
+ if (urlPattern2.matcher(URL).find()) {
+ if (parseUrlMap.containsKey(flag))
+ parseUrl = parseUrlMap.get(flag);
+ } else if (URL.contains("api.php/app/") || URL.contains("xgapp")) {
+ if (parseUrlMap.containsKey(flag))
+ parseUrl = parseUrlMap.get(flag);
+ } else {
+ parseUrl = URL;
+ }
+ if (parseUrl.contains("svip.jhyun.jx.cn") || parseUrl.contains("svip.jhdyw.vip")) {
+ if (flag.contains("人人迷")) {
+ parseUrl = "http://www.1080kan.cc/jiexi/rrmi.php?url=";
+ } else if (flag.contains("人人")) {
+ parseUrl = "http://www.1080kan.cc/jiexi/rr.php?url=";
+ } else if (flag.contains("番茄")) {
+ parseUrl = "http://www.1080kan.cc/jiexi/fq.php?url=";
+ } else {
+ parseUrl = "https://jx.parwix.com:4433/player/?url=";
+ }
+ } else if (parseUrl.contains("jhsj.manduhu.com") || parseUrl.contains("v.jhdyw.vip/nhdz666")) {
+ parseUrl = "https://jx.parwix.com:4433/player/?url=";
+ } else if (parseUrl.contains("x-n.cc")) {
+ parseUrl = "https://jx.parwix.com:4433/player/?url=";
+ }
+ return parseUrl;
+ }
+
+ private String getPlayerUrl(String URL, String parseUrl, String playUrl) {
+ if (URL.contains("xgapp") || URL.contains("api.php/app/") || /*urlPattern2.matcher(URL).find()*/URL.contains(".vod")) {
+ if (playUrl.indexOf(".m3u8") > 15 || playUrl.indexOf(".mp4") > 15 || playUrl.contains("/obj/tos")) {
+ if (playUrl.contains("url=")) {
+ return "https://www.baidu.com/s?wd=" + playUrl.split("url=")[1];
+ } else {
+ return "https://www.baidu.com/s?wd=" + playUrl;
+ }
+ } else if (!parseUrl.contains("url=") && playUrl.contains("RongXingVR")) {
+ return "https://www.baidu.com/s?wd=https://fast.rongxingvr.cn:8866/api/?key=nShWumGdMIbTwngTbI&url=" + playUrl;
+ } else if (!parseUrl.contains("url=") && playUrl.contains("LT")) {
+ return "https://www.baidu.com/s?wd=https://f7.pyxddc.com/bcjx/4k.php?url=" + playUrl;
+ } else if (!parseUrl.contains("url=") && playUrl.contains("renrenmi")) {
+ return "https://www.baidu.com/s?wd=https://kuba.renrenmi.cc:2266/api/?key=Y6UYLYtjImTCKe98JD&url=" + playUrl;
+ } else if (!parseUrl.contains("url=") && playUrl.contains(".html")) {
+ return "https://www.baidu.com/s?wd=http://1.117.152.239:39000/?url=" + playUrl;
+ } else if (playUrl.contains("xfy")) {
+ return "https://www.baidu.com/s?wd=http://jiexi.yunl.cc/api/?key=xYNESYSvHp1DV2ckKs&url=" + playUrl;
+ } else {
+ return "https://www.baidu.com/s?wd=" + parseUrl + playUrl;
+ }
+ } else if (urlPattern1.matcher(URL).find()) {
+ if (playUrl.indexOf(".m3u8") > 15 || playUrl.indexOf(".mp4") > 15 || playUrl.contains("/obj/tos")) {
+ if (playUrl.contains("url=")) {
+ return "https://www.baidu.com/s?wd=" + playUrl.split("url=")[1];
+ } else {
+ return "https://www.baidu.com/s?wd=" + playUrl;
+ }
+ } else if (playUrl.contains("xfy")) {
+ if (playUrl.contains("url=")) {
+ return "https://www.baidu.com/s?wd=http://cache.dmtt.xyz/xfyjx/xfyjx.php?url=" + playUrl.split("url=")[1];
+ } else {
+ return "https://www.baidu.com/s?wd=https://json.hfyrw.com/mao.go?url=" + playUrl;
+ }
+ } else if (playUrl.contains("www.bilibili.com")) {
+ String spUrl = playUrl.split("url=")[1];
+ return "https://www.baidu.com/s?wd=https://jx.parwix.com:4433/player/?url=" + spUrl;
+ } else if (URL.contains("zhenfy") || URL.contains("cztv") || URL.contains("1.14.63.101") || URL.contains("fit:8") || URL.contains("diliktv.xyz") || URL.contains("ppzhu.vip") || URL.contains("api.8d8q.com") || URL.contains("haokanju1.cc") || URL.contains("cztv")) {
+ return "https://www.baidu.com/s?wd=" + playUrl + "&app=10000&account=272775028&password=qq272775028";
+ } else if (URL.contains("lxyyy") || URL.contains("j.zjj.life") || URL.contains("lktv") || URL.contains("0818tv") || URL.contains("ruoxinew")) {
+ return "https://www.baidu.com/s?wd=https://play.tkys.tv/?url=" + playUrl.split("url=")[1];
+ } else {
+ return "https://www.baidu.com/s?wd=" + playUrl;
+ }
+ } else {
+ return "https://www.baidu.com/s?wd=" + playUrl;
+ }
+ }
+
+ // ######视频地址
+ private void getFinalVideo(String uu, JSONObject result) throws JSONException {
+ if (uu.contains("baidu.com")) {
+ String playurl = uu.split("wd=")[1];
+ if (playurl.contains("duoduozy.com") || playurl.contains("suoyo.cc")) {
+ String uuu = "https://www.6080kan.cc/app.php?url=" + playurl;
+ String content = OkHttpUtil.string(uuu, null);
+ JSONObject obj = new JSONObject(content);
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", obj.getString("url"));
+ result.put("header", "{\"User-Agent\":\" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0\",\"referer\":\" https://player.duoduozy.com\",\"origin\":\" https://dp.duoduozy.com\",\"Host\":\" cache.m3u8.suoyo.cc\"}");
+ } else if (playurl.contains("xfy")) {
+ String content = OkHttpUtil.string(playurl, null);
+ JSONObject obj = new JSONObject(content);
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", obj.getString("url"));
+ result.put("header", "{\"referer\":\" appguapi.lihaoyun.top:11543\",\"User-Agent\":\" Dart/2.14 (dart:io)\"}}");
+ } else if (playurl.contains("api.iopenyun.com:88")) {
+ if (playurl.contains("html")) {
+ String content = OkHttpUtil.string("https://api.m3u8.tv:5678/home/api?type=ys&uid=233711&key=dgilouvFKNRSWX2467&url=" + playurl.split("=")[1], null);
+ JSONObject obj = new JSONObject(content);
+ String ppurl = obj.getString("url");
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", ppurl);
+ } else {
+ result.put("parse", 1);
+ result.put("playUrl", "");
+ result.put("url", playurl);
+ result.put("ua", "Mozilla/5.0 Windows10");
+ result.put("header", "{\"Referer\":\"https://user.iopenyun.com:520/user/video/\"}");
+ }
+ } else if (playurl.contains("cat.wkfile.com")) {
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", playurl);
+ result.put("header", "{\"User-Agent\":\" Lavf/58.12.100\",\"Referer\":\" wkfile.com\"}");
+ } else if (!playurl.contains("=") && playurl.indexOf(".m3u8") > 15 || playurl.indexOf(".mp4") > 15 || playurl.contains("/obj/tos")) {
+ if (playurl.contains("hsl.ysgc.xyz")) {
+ String content = OkHttpUtil.string("https://jx.ysgc.xyz/?url=" + playurl, null);
+ JSONObject obj = new JSONObject(content);
+ String ppurl = obj.getString("url");
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", ppurl);
+ result.put("header", "{\"Referer\":\" https://ysgc.cc\"}");
+ } else if (playurl.contains("1.ruifenglb.com")) {
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", playurl);
+ result.put("header", "{\"Referer\":\" https://1.ruifenglb.com\"}");
+ } else {
+ Matcher matcher = Pattern.compile(".*(http.*)").matcher(playurl);
+ if (matcher.find()) {
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", matcher.group(1));
+ } else {
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", playurl);
+ }
+ }
+ } else if (playurl.contains("=")) {
+ HashMap headers = new HashMap();
+ headers.put("User-Agent", "Mozilla/5.0 Android");
+ Map> respHeaders = new TreeMap<>();
+ String content = OkHttpUtil.stringNoRedirect(playurl, headers, respHeaders);
+ String redLoc = OkHttpUtil.getRedirectLocation(respHeaders);
+ if (redLoc != null) {
+ String finalurl = "";
+ while (redLoc != null) {
+ finalurl = redLoc;
+ if (redLoc.indexOf(".mp4") > 30) {
+ break;
+ } else {
+ headers.put("User-Agent", "Mozilla/5.0 Android");
+ content = OkHttpUtil.stringNoRedirect(finalurl, headers, respHeaders);
+ redLoc = OkHttpUtil.getRedirectLocation(respHeaders);
+ }
+ }
+ String realurl = finalurl;
+ if (realurl.contains("=http") || realurl.contains("url=")) {
+ if (content.contains(" 1) {
+ String realurl = jsonUrl;
+ if (playurl.contains("mgtv.com")) {
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", realurl);
+ result.put("header", "{\"User-Agent\":\" Mozilla/5.0\", \"Referer\":\" \"}");
+ } else if (playurl.contains("bilibili.com")) {
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", realurl);
+ } else {
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", realurl);
+ }
+ } else if (playurl.split("url=")[1].contains("http")) {
+ result.put("parse", 1);
+ result.put("playUrl", "");
+ result.put("url", "http://1.117.152.239:39000/?url=" + playurl.split("url=")[1]);
+ } else if (playurl.split("url=")[1].contains("renrenmi")) {
+ result.put("parse", 1);
+ result.put("playUrl", "");
+ result.put("url", "http://www.1080kan.cc/jiexi/rrmi.php?url=" + playurl.split("url=")[1]);
+ result.put("header", "{\"Referer\":\"http://www.1080kan.cc/\"}");
+ } else {
+ String id = playurl.split("url=")[1];
+ /*
+ String uuu = "https://vip.gaotian.love/api/?key=sRy0QAq8hqXRlrEtrq&url=" + id;
+ content = OkHttpUtil.string(uuu, null);
+ JSONObject obj = new JSONObject(content);
+ String realurl = obj.optString("url", "");
+ if (realurl.isEmpty())
+ realurl = obj.optString("msg", "");
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", realurl);
+ */
+ result.put("parse", 1);
+ result.put("playUrl", "");
+ result.put("url", "https://jx.banyung.xyz:7799/player/?url=" + playurl.split("url=")[1]);
+ }
+ }
+ }
+ } else {
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", playurl);
+ }
+ } else {
+ result.put("parse", 1);
+ result.put("playUrl", "");
+ result.put("url", uu);
+ }
+ }
+
+ @Override
+ public boolean manualVideoCheck() {
+ return true;
+ }
+
+ @Override
+ public boolean isVideoFormat(String url) {
+ return Misc.isVideoFormat(url);
+ }
+}
\ No newline at end of file
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 0000000..08fb0a5
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/AppYsV2.java
@@ -0,0 +1,845 @@
+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.utils.Misc;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+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) {
+ 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(OkHttpUtil.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("筛选", "");
+ if (type.equals("class"))
+ typeN = "类型";
+ else if (type.equals("area"))
+ typeN = "地区";
+ else if (type.equals("lang"))
+ typeN = "语言";
+ else if (type.equals("year"))
+ typeN = "年份";
+ }
+ 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(OkHttpUtil.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(OkHttpUtil.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(OkHttpUtil.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));
+ //System.out.println(url);
+ String json = desc(OkHttpUtil.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 {
+ 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 (Misc.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+全部=+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(OkHttpUtil.string(playUrl, null), (byte) 4);
+ if (parseUrl.contains("49.233.47.42:9898")) {
+
+ HashMap hashMap = new HashMap();
+ OkHttpUtil.stringNoRedirect(playUrl,null, hashMap);
+ String d = OkHttpUtil.getRedirectLocation(hashMap);
+ JSONObject result = new JSONObject();
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", d);
+ return result;
+ }
+ JSONObject tryJson = null;
+ try {
+ tryJson = Misc.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];
+ if (descFlag.equals("nftv")) {
+
+ }
+ }
+ return src;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/catvod/spider/Auete.java b/app/src/main/java/com/github/catvod/spider/Auete.java
new file mode 100644
index 0000000..2f96e71
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Auete.java
@@ -0,0 +1,540 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.Base64;
+
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.crawler.SpiderDebug;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class Auete extends Spider {
+ private static final String siteUrl = "https://auete.com";
+ private static final String siteHost = "auete.com";
+
+ /**
+ * 播放源配置
+ */
+ private JSONObject playerConfig;
+ /**
+ * 筛选配置
+ */
+ private JSONObject filterConfig;
+ //分类页URL规则
+ private Pattern regexCategory = Pattern.compile("/(\\w+)/index.html");
+ //详情页URL规则
+ private Pattern regexVid = Pattern.compile("/(\\w+/\\w+/\\w+)/");
+ //播放页URL规则
+ private Pattern regexPlay = Pattern.compile("(/\\w+/\\w+/\\w+/play-\\d+-\\d+.html)");
+ //筛选页URL规则
+ //private Pattern regexPage = Pattern.compile("/\\w+/\\w+/index(\\d+).html");
+ private Pattern regexPage = Pattern.compile("/index(\\d+).html");
+
+ @Override
+ public void init(Context context) {
+ super.init(context);
+ try {
+ playerConfig = new JSONObject("{\"byun\":{\"sh\":\"云播B线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dphd\":{\"sh\":\"云播A线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"cyun\":{\"sh\":\"云播C线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dbm3u8\":{\"sh\":\"云播D线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"i8i\":{\"sh\":\"云播E线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"m3u8hd\":{\"sh\":\"云播F线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"languang\":{\"sh\":\"云播G线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"hyun\":{\"sh\":\"云播H线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"kyun\":{\"sh\":\"云播K线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"bpyueyu\":{\"sh\":\"云播粤语\",\"pu\":\"\",\"sn\":0,\"or\":999},\"bpguoyu\":{\"sh\":\"云播国语\",\"pu\":\"\",\"sn\":0,\"or\":999},\"lyun\":{\"sh\":\"云播L线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"myun\":{\"sh\":\"云播M线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dp\":{\"sh\":\"Dplayer\",\"pu\":\"\",\"sn\":0,\"or\":999}}");
+ filterConfig = new JSONObject("{\"Movie\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧片\",\"v\":\"xjp\"},{\"n\":\"动作片\",\"v\":\"dzp\"},{\"n\":\"爱情片\",\"v\":\"aqp\"},{\"n\":\"科幻片\",\"v\":\"khp\"},{\"n\":\"恐怖片\",\"v\":\"kbp\"},{\"n\":\"惊悚片\",\"v\":\"jsp\"},{\"n\":\"战争片\",\"v\":\"zzp\"},{\"n\":\"剧情片\",\"v\":\"jqp\"}]}],\"Tv\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"美剧\",\"v\":\"oumei\"},{\"n\":\"韩剧\",\"v\":\"hanju\"},{\"n\":\"日剧\",\"v\":\"riju\"},{\"n\":\"泰剧\",\"v\":\"yataiju\"},{\"n\":\"网剧\",\"v\":\"wangju\"},{\"n\":\"台剧\",\"v\":\"taiju\"},{\"n\":\"国产\",\"v\":\"neidi\"},{\"n\":\"港剧\",\"v\":\"tvbgj\"}]}],\"Zy\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国综\",\"v\":\"guozong\"},{\"n\":\"韩综\",\"v\":\"hanzong\"},{\"n\":\"美综\",\"v\":\"meizong\"}]}],\"Dm\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"动画\",\"v\":\"donghua\"},{\"n\":\"日漫\",\"v\":\"riman\"},{\"n\":\"国漫\",\"v\":\"guoman\"},{\"n\":\"美漫\",\"v\":\"meiman\"}]}],\"qita\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"纪录片\",\"v\":\"Jlp\"},{\"n\":\"经典片\",\"v\":\"Jdp\"},{\"n\":\"经典剧\",\"v\":\"Jdj\"},{\"n\":\"网大电影\",\"v\":\"wlp\"},{\"n\":\"国产老电影\",\"v\":\"laodianying\"}]}]}");
+ } catch (JSONException e) {
+ SpiderDebug.log(e);
+ }
+ }
+
+ /**
+ * 爬虫headers
+ *
+ * @param url
+ * @return
+ */
+ protected HashMap getHeaders(String url) {
+ HashMap headers = new HashMap<>();
+ headers.put("method", "GET");
+ headers.put("Host", siteHost);
+ headers.put("Upgrade-Insecure-Requests", "1");
+ headers.put("DNT", "1");
+ headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
+ headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
+ headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
+ return headers;
+ }
+
+ /**
+ * 获取分类数据 + 首页最近更新视频列表数据
+ *
+ * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
+ * @return
+ */
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
+ // 分类节点
+ Elements elements = doc.select("ul[class='navbar-nav mr-auto']> li a");
+ JSONArray classes = new JSONArray();
+ for (Element ele : elements) {
+ //分类名
+ String name = ele.text();
+ boolean show = name.equals("电影") ||
+ name.equals("电视剧") ||
+ name.equals("综艺") ||
+ name.equals("动漫") ||
+ name.equals("其他");
+ if (show) {
+ Matcher mather = regexCategory.matcher(ele.attr("href"));
+ if (!mather.find())
+ continue;
+ // 把分类的id和名称取出来加到列表里
+ String id = mather.group(1).trim();
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("type_id", id);
+ jsonObject.put("type_name", name);
+ classes.put(jsonObject);
+ }
+ }
+ JSONObject result = new JSONObject();
+ if (filter) {
+ result.put("filters", filterConfig);
+ }
+ result.put("class", classes);
+ try {
+ // 取首页推荐视频列表
+ Element homeList = doc.select("ul.threadlist").get(0);
+ Elements list = homeList.select("li");
+ JSONArray videos = new JSONArray();
+ for (int i = 0; i < list.size(); i++) {
+ Element vod = list.get(i);
+ String title = vod.selectFirst("h2 a").attr("title");
+ String cover = vod.selectFirst("a img").attr("src");
+ String remark = vod.selectFirst("a button").text();
+ Matcher matcher = regexVid.matcher(vod.selectFirst("a").attr("href"));
+ if (!matcher.find())
+ continue;
+ String id = matcher.group(1);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", id);
+ v.put("vod_name", title);
+ v.put("vod_pic", cover);
+ v.put("vod_remarks", remark);
+ videos.put(v);
+ }
+ result.put("list", videos);
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ /**
+ * 获取分类信息数据
+ *
+ * @param tid 分类id
+ * @param pg 页数
+ * @param filter 同homeContent方法中的filter
+ * @param extend 筛选参数{k:v, k1:v1}
+ * @return
+ */
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) {
+ // 获取分类数据的url
+ String url = "";
+ try {
+ if (extend != null && extend.size() > 0) {
+ for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) {
+ String key = it.next();
+ String value = extend.get(key);
+ if (value != null && value.length() != 0 && value != " ") {
+ url = siteUrl + "/" + tid + "/" + value;
+ } else {
+ url = siteUrl + "/" + tid;
+ }
+ ;
+ }
+ } else {
+ url = siteUrl + "/" + tid;
+ }
+ ;
+ if (pg.equals("1")) {
+ url = url + "/index.html";
+ } else {
+ url = url + "/index" + pg + ".html";
+ }
+ //System.out.println(url);
+ String html = OkHttpUtil.string(url, getHeaders(url));
+ Document doc = Jsoup.parse(html);
+ JSONObject result = new JSONObject();
+ int pageCount = 0;
+ int page = -1;
+
+ // 取页码相关信息
+ Elements pageInfo = doc.select("ul.pagination li");
+ if (pageInfo.size() == 0) {
+ page = Integer.parseInt(pg);
+ pageCount = page;
+ } else {
+ for (int i = 0; i < pageInfo.size(); i++) {
+ Element li = pageInfo.get(i);
+ Element a = li.selectFirst("a");
+ if (a == null)
+ continue;
+ String name = a.text();
+ //System.out.println("名称"+name);
+ if (page == -1 && li.hasClass("active")) {
+ Matcher matcher = regexPage.matcher(a.attr("href"));
+ if (matcher.find()) {
+ //System.out.println("哈哈"+matcher.group(1));
+ page = Integer.parseInt(matcher.group(1));
+ } else {
+ Elements list = doc.select("ul.threadlist li");
+ if (list.size() > 0) {
+ page = 1;
+ } else {
+ page = 0;
+ }
+ }
+ }
+ if (name.equals("尾页")) {
+ Matcher matcher = regexPage.matcher(a.attr("href"));
+ if (matcher.find()) {
+ //System.out.println("尾页" + matcher.group(1));
+ pageCount = Integer.parseInt(matcher.group(1));
+ } else {
+ pageCount = 0;
+ }
+ break;
+ }
+ }
+ }
+
+ JSONArray videos = new JSONArray();
+ if (!html.contains("没有找到您想要的结果哦")) {
+ // 取当前分类页的视频列表
+ Elements list = doc.select("ul.threadlist li");
+ for (int i = 0; i < list.size(); i++) {
+ Element vod = list.get(i);
+ String title = vod.selectFirst("h2 a").attr("title");
+ String cover = vod.selectFirst("a img").attr("src");
+ String remark = vod.selectFirst("a button").text();
+ Matcher matcher = regexVid.matcher(vod.selectFirst("a").attr("href"));
+ if (!matcher.find())
+ continue;
+ String id = matcher.group(1);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", id);
+ v.put("vod_name", title);
+ v.put("vod_pic", cover);
+ v.put("vod_remarks", remark);
+ videos.put(v);
+ }
+ }
+ result.put("page", page);
+ result.put("pagecount", pageCount);
+ result.put("limit", 20);
+ result.put("total", pageCount <= 1 ? videos.length() : pageCount * 20);
+
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ /**
+ * 视频详情信息
+ *
+ * @param ids 视频id
+ * @return
+ */
+ @Override
+ public String detailContent(List ids) {
+ try {
+ // 视频详情url
+ String url = siteUrl + "/" + ids.get(0) + "/";
+ //System.out.println(url);
+ Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
+ JSONObject result = new JSONObject();
+ JSONObject vodList = new JSONObject();
+
+ // 取基本数据
+ String cover = doc.selectFirst("div.cover a").attr("href");
+ String title = doc.selectFirst("div.cover a").attr("title");
+ Elements list1 = doc.select("div.message>p");
+ String desc = doc.select("div.message>p").get(list1.size() - 1).text();
+ String category = "", area = "", year = "", remark = "", director = "", actor = "";
+ Elements span_text_muted = doc.select("div.message>p");
+ for (int i = 0; i < span_text_muted.size() - 2; i++) {
+ Element text = span_text_muted.get(i);
+ String info = text.text();
+ if (info.contains("分类")) {
+ try {
+ category = text.text().split(": ")[1];
+ } catch (Exception e) {
+ category = "";
+ }
+ } else if (info.contains("年份")) {
+ try {
+ year = text.text().split(": ")[1];
+ } catch (Exception e) {
+ year = "";
+ }
+ } else if (info.contains("地区")) {
+ try {
+ area = text.text().split(": ")[1];
+ } catch (Exception e) {
+ area = "";
+ }
+ } else if (info.contains("影片备注")) {
+ try {
+ remark = text.text().split(": ")[1];
+ } catch (Exception e) {
+ remark = "";
+ }
+ } else if (info.contains("导演")) {
+ try {
+ director = text.text().split(": ")[1];
+ } catch (Exception e) {
+ director = "";
+ }
+ } else if (info.contains("主演")) {
+ try {
+ actor = text.text().split(": ")[1];
+ } catch (Exception e) {
+ actor = "";
+ }
+ }
+ }
+
+ vodList.put("vod_id", ids.get(0));
+ vodList.put("vod_name", title);
+ vodList.put("vod_pic", cover);
+ vodList.put("type_name", category);
+ vodList.put("vod_year", year);
+ vodList.put("vod_area", area);
+ vodList.put("vod_remarks", remark);
+ vodList.put("vod_actor", actor);
+ vodList.put("vod_director", director);
+ vodList.put("vod_content", desc);
+ //System.out.println(vodList.toString());
+ Map vod_play = new TreeMap<>(new Comparator() {
+ @Override
+ public int compare(String o1, String o2) {
+ try {
+ int sort1 = playerConfig.getJSONObject(o1).getInt("or");
+ int sort2 = playerConfig.getJSONObject(o2).getInt("or");
+
+ if (sort1 == sort2) {
+ return 1;
+ }
+ return sort1 - sort2 > 0 ? 1 : -1;
+ } catch (JSONException e) {
+ SpiderDebug.log(e);
+ }
+ return 1;
+ }
+ });
+
+ // 取播放列表数据
+ Elements sources = doc.select("div#player_list>h2");
+ //System.out.println(sources.size());
+ Elements sourceList = doc.select("div#player_list>ul");
+ //System.out.println(sourceList.size());
+ for (int i = 0; i < sources.size(); i++) {
+ Element source = sources.get(i);
+ //System.out.println(sources.text().split(":")[0].split("』")[1]);
+ String sourceName = source.text().split("』")[1].split(":")[0];
+ boolean found = false;
+ for (Iterator it = playerConfig.keys(); it.hasNext(); ) {
+ String flag = it.next();
+ if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
+ sourceName = flag;
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ continue;
+ String playList = "";
+ Elements playListA = sourceList.get(i).select("li > a");
+ //System.out.println(playListA.size());
+ List vodItems = new ArrayList<>();
+
+ for (int j = 0; j < playListA.size(); j++) {
+ Element vod = playListA.get(j);
+ Matcher matcher = regexPlay.matcher(vod.attr("href"));
+ if (!matcher.find())
+ continue;
+ String playURL = matcher.group(1);
+ vodItems.add(vod.text() + "$" + playURL);
+ }
+ if (vodItems.size() > 0)
+ playList = TextUtils.join("#", vodItems);
+
+ if (playList.length() == 0)
+ continue;
+
+ vod_play.put(sourceName, playList);
+ }
+
+ if (vod_play.size() > 0) {
+ String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
+ String vod_play_url = TextUtils.join("$$$", vod_play.values());
+ vodList.put("vod_play_from", vod_play_from);
+ vodList.put("vod_play_url", vod_play_url);
+ }
+ JSONArray list = new JSONArray();
+ list.put(vodList);
+ result.put("list", list);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ /**
+ * 获取视频播放信息
+ *
+ * @param flag 播放源
+ * @param id 视频id
+ * @param vipFlags 所有可能需要vip解析的源
+ * @return
+ */
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) {
+ try {
+ // 播放页 url
+ String url = siteUrl + id;
+ Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
+ /*取得script下面的JS变量*/
+ Elements e = doc.select("div>script");
+ /*循环遍历script下面的JS变量*/
+ String player = "";
+ String pn = "";
+ JSONObject result = new JSONObject();
+ for (Element element : e) {
+ /*取得JS变量数组*/
+ String[] data = element.data().toString().split("var");
+ /*取得单个JS变量*/
+ for (String variable : data) {
+ /*过滤variable为空的数据*/
+ if (variable.contains("=")) {
+ /*取到满足条件的JS变量*/
+ if (variable.contains("now")) {
+ String[] kvp = variable.split("=");
+ player = kvp[1].replaceAll("\"", "").replaceAll(";", "");
+ if (player.startsWith("base64")) {
+ String[] plist1 = player.split("\\(");
+ String[] plist2 = plist1[1].split("\\)");
+ // 解码
+ player = new String(Base64.decode(plist2[0].getBytes(), Base64.DEFAULT));
+ //byte[] base64Data = Base64.getDecoder().decode(plist2[0]);
+ //player = new String(base64Data, "utf-8");
+ }
+ if (player.startsWith("http")) {
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", player);
+ result.put("header", "");
+ } else if (player.contains("m3u8")) {
+ String finalvideo = "https://datas-s8pwfqdu9yystn90fb----------------cache.haozhansou.com/" + player;
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", finalvideo);
+ result.put("header", "");
+
+ }
+ }
+ if (variable.contains("pn")) {
+ String[] kvp = variable.split("=");
+ pn = kvp[1].replaceAll("\"", "").replaceAll(";", "");
+ }
+ }
+ }
+ if (playerConfig.has(pn)) {
+ JSONObject pCfg = playerConfig.getJSONObject(pn);
+ String videoUrl = player;
+ String playUrl = pCfg.getString("pu");
+ result.put("parse", pCfg.getInt("sn"));
+ result.put("playUrl", playUrl);
+ result.put("url", videoUrl);
+ result.put("header", "");
+ }
+ }
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ /**
+ * 搜索
+ *
+ * @param key
+ * @param quick 是否播放页的快捷搜索
+ * @return
+ */
+ @Override
+ public String searchContent(String key, boolean quick) {
+ try {
+ String url = siteUrl + "/search.php?searchword=" + key;
+ Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
+ JSONObject result = new JSONObject();
+
+ JSONArray videos = new JSONArray();
+ Elements list = doc.select("div.card-body>ul>li.media");
+ for (int i = 0; i < list.size(); i++) {
+ Element vod = list.get(i);
+ String title = vod.select("div.media-body>div.subject>a>span").text();
+ String cover = "";
+ String remark = vod.selectFirst("div.media-body>div.d-flex>div.text-muted>span").text();
+ Matcher matcher = regexVid.matcher(vod.select("div.media-body>div.subject>a").attr("href"));
+ if (!matcher.find())
+ continue;
+ String id = matcher.group(1);
+ JSONObject v = new JSONObject();
+
+ // 视频封面
+ String vodurl = siteUrl + "/" + id + "/";
+ Document voddoc = Jsoup.parse(OkHttpUtil.string(vodurl, getHeaders(vodurl)));
+ cover = voddoc.selectFirst("div.cover a").attr("href");
+
+ v.put("vod_id", id);
+ v.put("vod_name", title);
+ v.put("vod_pic", cover);
+ v.put("vod_remarks", remark);
+ videos.put(v);
+ }
+
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+}
diff --git a/app/src/main/java/com/github/catvod/spider/Bili.java b/app/src/main/java/com/github/catvod/spider/Bili.java
new file mode 100644
index 0000000..0accb46
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Bili.java
@@ -0,0 +1,273 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.Base64;
+
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.crawler.SpiderDebug;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class Bili extends Spider {
+
+ protected JSONObject ext = null;
+
+ @Override
+ public void init(Context context, String extend) {
+ super.init(context, extend);
+ try {
+ String content = OkHttpUtil.string(extend, null);
+ ext = new JSONObject(content);
+ } catch (JSONException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ @Override
+ public String homeContent(boolean filter) {
+ JSONObject results = new JSONObject();
+ try {
+ results.put("class", ext.getJSONArray("classes"));
+ if (filter) {
+ results.put("filters", ext.getJSONObject("filter"));
+ }
+ } catch (JSONException e) {
+ SpiderDebug.log(e);
+ }
+ return results.toString();
+ }
+
+ @Override
+ public String homeVideoContent() {
+ try {
+ JSONArray videos = new JSONArray();
+ try {
+ String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=窗 白噪音";
+ String content = OkHttpUtil.string(url, null);
+ JSONObject data = new JSONObject(content).getJSONObject("data");
+ JSONArray RArray = data.getJSONArray("result");
+ for (int i = 0; i < RArray.length(); i++) {
+ JSONObject info = RArray.getJSONObject(i);
+ JSONObject result = new JSONObject();
+ String pic = info.getString("pic");
+ if (pic.startsWith("//")) {
+ pic = "https:" + pic;
+ }
+ result.put("vod_id", info.getString("bvid"));
+ String title = info.getString("title");
+ Document KS = Jsoup.parse(title);
+ String name = KS.text();
+ result.put("vod_name", name);
+ result.put("vod_pic", pic);
+ String duration = info.getString("duration");
+ String words = duration.split(":")[0];
+ String remark = words + "分钟";
+ result.put("vod_remarks", remark);
+ videos.put(result);
+ }
+ } catch (Exception e) {
+
+ }
+ JSONObject result = new JSONObject();
+ result.put("list", videos);
+ return result.toString();
+ } catch (Throwable th) {
+
+ }
+ return "";
+ }
+
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) {
+ try {
+ String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=";
+ if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) {
+ url += extend.get("tid");
+ } else {
+ url += tid;
+ }
+ if (extend != null && extend.size() > 0) {
+ for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) {
+ String key = it.next();
+ String value = extend.get(key);
+ if (value.length() > 0) {
+ url += "&" + key + "=" + URLEncoder.encode(value);
+ }
+ }
+ }
+ url += "&page=" + pg;
+ String content = OkHttpUtil.string(url, null);
+ JSONObject data = new JSONObject(content).getJSONObject("data");
+ JSONArray list = new JSONArray();
+ JSONArray RSArray = data.getJSONArray("result");
+ for (int i = 0; i < RSArray.length(); i++) {
+ JSONObject info = RSArray.getJSONObject(i);
+ JSONObject result = new JSONObject();
+ String pic = info.getString("pic");
+ if (pic.startsWith("//")) {
+ pic = "https:" + pic;
+ }
+ result.put("vod_id", info.getString("bvid"));
+ String title = info.getString("title");
+ Document doc = Jsoup.parse(title);
+ String name = doc.text();
+ result.put("vod_name", name);
+ result.put("vod_pic", pic);
+ String duration = info.getString("duration");
+ String Split = duration.split(":")[0];
+ String remark = Split + "分钟";
+ result.put("vod_remarks", remark);
+ list.put(result);
+ }
+ JSONObject result = new JSONObject();
+ int limit = 20;
+ int page = Integer.parseInt(pg);
+ result.put("page", page);
+ int pageCount = list.length() == limit ? page + 1 : page;
+ result.put("pagecount", pageCount);
+ result.put("limit", limit);
+ result.put("total", Integer.MAX_VALUE);
+ result.put("list", list);
+ return result.toString();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ @Override
+ public String detailContent(List ids) {
+ int i = 0;
+ try {
+ String str = ids.get(0);
+ String sb2 = "https://api.bilibili.com/x/web-interface/archive/stat?bvid=" + str;
+ JSONObject jSONObject = new JSONObject(OkHttpUtil.string(sb2, null));
+ JSONObject jSONObject2 = jSONObject.getJSONObject("data");
+ long j = jSONObject2.getLong("aid");
+ String sb4 = j + "";
+ String sb6 = "https://api.bilibili.com/x/web-interface/view?aid=" + sb4;
+ JSONObject jSONObject3 = new JSONObject(OkHttpUtil.string(sb6, null));
+ JSONObject jSONObject4 = jSONObject3.getJSONObject("data");
+ JSONObject v = new JSONObject();
+ v.put("vod_id", str);
+ String string = jSONObject4.getString("title");
+ v.put("vod_name", string);
+ String string2 = jSONObject4.getString("pic");
+ v.put("vod_pic", string2);
+ String string3 = jSONObject4.getString("tname");
+ v.put("type_name", string3);
+ v.put("vod_year", "");
+ v.put("vod_area", "");
+ String sb7 = jSONObject4.getLong("duration") / 60 + "分钟";
+ v.put("vod_remarks", sb7);
+ v.put("vod_actor", "");
+ v.put("vod_director", "");
+ String string4 = jSONObject4.getString("desc");
+ v.put("vod_content", string4);
+ v.put("vod_play_from", "B站");
+ ArrayList arrayList = new ArrayList();
+ JSONArray jSONArray = jSONObject4.getJSONArray("pages");
+ while (true) {
+ int length = jSONArray.length();
+ if (i < length) {
+ JSONObject jSONObject6 = jSONArray.getJSONObject(i);
+ String string5 = jSONObject6.getString("part");
+ String replace = string5.replace("$", "_").replace("#", "_");
+ StringBuilder sb8 = new StringBuilder();
+ sb8.append(replace);
+ sb8.append("$");
+ sb8.append(sb4);
+ sb8.append("+ ");
+ long j2 = jSONObject6.getLong("cid");
+ sb8.append(j2);
+ String sb9 = sb8.toString();
+ arrayList.add(sb9);
+ i++;
+ } else {
+ v.put("vod_play_url", TextUtils.join("#", arrayList));
+ JSONArray jSONArray2 = new JSONArray();
+ jSONArray2.put(v);
+ JSONObject jSONObject7 = new JSONObject();
+ jSONObject7.put("list", jSONArray2);
+ return jSONObject7.toString();
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ @Override
+ public String playerContent(String str, String str2, List list) {
+ try {
+ String[] split = str2.split("\\+");
+ String str3 = split[0];
+ String str4 = split[1];
+ String sb2 = "https://api.bilibili.com/x/player/playurl?avid=" + str3 + "&cid= " + str4 + "&qn=120&fourk=1";
+ JSONObject jSONObject = new JSONObject(OkHttpUtil.string(sb2, null));
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("parse", "0");
+ jSONObject2.put("playUrl", "");
+ JSONObject jSONObject3 = jSONObject.getJSONObject("data");
+ JSONObject jSONObject4 = jSONObject3.getJSONArray("durl").getJSONObject(0);
+ String string = jSONObject4.getString("url");
+ jSONObject2.put("url", string);
+ jSONObject2.put("header", "{\"Referer\":\"https://www.bilibili.com\",\"User-Agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36\"}");
+ jSONObject2.put("contentType", "video/x-flv");
+ return jSONObject2.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) {
+ try {
+ JSONObject result = new JSONObject();
+ String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=" + URLEncoder.encode(key);
+ String content = OkHttpUtil.string(url, null);
+ JSONObject data = new JSONObject(content).getJSONObject("data");
+ JSONArray videos = new JSONArray();
+ JSONArray RSArray = data.getJSONArray("result");
+ for (int i = 0; i < RSArray.length(); i++) {
+ JSONObject info = RSArray.getJSONObject(i);
+ JSONObject v = new JSONObject();
+ String pic = info.getString("pic");
+ if (pic.startsWith("//")) {
+ pic = "https:" + pic;
+ }
+ v.put("vod_id", info.getString("bvid"));
+ String title = info.getString("title");
+ Document doc = Jsoup.parse(title);
+ String name = doc.text();
+ v.put("vod_name", name);
+ v.put("vod_pic", pic);
+ String duration = info.getString("duration");
+ String Split = duration.split(":")[0];
+ String remark = Split + "分钟";
+ v.put("vod_remarks", remark);
+ videos.put(v);
+ }
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/catvod/spider/Cokemv.java b/app/src/main/java/com/github/catvod/spider/Cokemv.java
new file mode 100644
index 0000000..fc82c81
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Cokemv.java
@@ -0,0 +1,467 @@
+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.utils.okhttp.OkHttpUtil;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import okhttp3.Headers;
+
+public class Cokemv extends Spider {
+ private static final String siteUrl = "https://cokemv.me";
+ private static final String siteHost = "cokemv.me";
+
+ /**
+ * 播放源配置
+ */
+ private JSONObject playerConfig;
+ /**
+ * 筛选配置
+ */
+ private JSONObject filterConfig;
+ private Pattern regexCategory = Pattern.compile("/vodtype/(\\d+).html");
+ private Pattern regexVid = Pattern.compile("/voddetail/(\\d+).html");
+ private Pattern regexPlay = Pattern.compile("/vodplay/(\\d+)-(\\d+)-(\\d+).html");
+ private Pattern regexPage = Pattern.compile("/vodshow/(\\S+).html");
+
+ @Override
+ public void init(Context context) {
+ super.init(context);
+ try {
+ playerConfig = new JSONObject("{\"cokemv0555\":{\"sh\":\"COKEMV\",\"pu\":\"\",\"sn\":0,\"or\":999},\"cokeqie01\":{\"sh\":\"極速路線\",\"pu\":\"\",\"sn\":0,\"or\":999},\"xin\":{\"sh\":\"高速路線\",\"pu\":\"\",\"sn\":0,\"or\":999},\"90mm\":{\"sh\":\"藍光號路\",\"pu\":\"\",\"sn\":0,\"or\":999},\"age01\":{\"sh\":\"動漫一線\",\"pu\":\"\",\"sn\":0,\"or\":999},\"age02\":{\"sh\":\"動漫二線\",\"pu\":\"\",\"sn\":0,\"or\":999},\"mahua\":{\"sh\":\"海外(禁國內)\",\"pu\":\"\",\"sn\":0,\"or\":999},\"toutiao\":{\"sh\":\"蓝光不卡\",\"pu\":\"\",\"sn\":0,\"or\":999}}");
+ filterConfig = new JSONObject("{\"5\":[{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜劇\"},{\"n\":\"爱情\",\"v\":\"愛情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"動作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"劇情\"},{\"n\":\"战争\",\"v\":\"戰爭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"動畫\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"悬疑\",\"v\":\"懸疑\"},{\"n\":\"微电影\",\"v\":\"微電影\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"國語\"},{\"n\":\"英语\",\"v\":\"英語\"},{\"n\":\"粤语\",\"v\":\"粵語\"},{\"n\":\"闽南语\",\"v\":\"閩南語\"},{\"n\":\"韩语\",\"v\":\"韓語\"},{\"n\":\"日语\",\"v\":\"日語\"},{\"n\":\"法语\",\"v\":\"法語\"},{\"n\":\"德语\",\"v\":\"德語\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"2\"},{\"n\":\"大陆剧\",\"v\":\"13\"},{\"n\":\"香港剧\",\"v\":\"14\"},{\"n\":\"韩国剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"日本剧\",\"v\":\"20\"},{\"n\":\"台湾剧\",\"v\":\"21\"},{\"n\":\"泰国剧\",\"v\":\"22\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"1\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"1\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧片\",\"v\":\"7\"},{\"n\":\"爱情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"剧情片\",\"v\":\"11\"},{\"n\":\"战争片\",\"v\":\"12\"},{\"n\":\"犯罪片\",\"v\":\"23\"},{\"n\":\"奇幻片\",\"v\":\"24\"},{\"n\":\"悬疑片\",\"v\":\"25\"},{\"n\":\"记录片\",\"v\":\"27\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"4\"},{\"n\":\"动画电影\",\"v\":\"41\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
+ } catch (JSONException e) {
+ SpiderDebug.log(e);
+ }
+ }
+
+ protected static HashMap Headers() {
+ HashMap headers = new HashMap<>();
+ headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36");
+ headers.put("Referer", siteUrl);
+ return headers;
+ }
+
+ /**
+ * 爬虫headers
+ *
+ * @param url
+ * @return
+ */
+ protected HashMap getHeaders(String url) {
+ HashMap headers = new HashMap<>();
+ headers.put("method", "GET");
+ headers.put("Host", siteHost);
+ headers.put("Upgrade-Insecure-Requests", "1");
+ headers.put("DNT", "1");
+ headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
+ headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
+ headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
+ return headers;
+ }
+
+ /**
+ * 获取分类数据 + 首页最近更新视频列表数据
+ *
+ * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
+ * @return
+ */
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
+ // 分类节点
+ Elements elements = doc.select("ul.navbar-items>li.navbar-item>a");
+ JSONArray classes = new JSONArray();
+ for (Element ele : elements) {
+ String name = ele.text();
+ boolean show = name.equals("抖音电影") ||
+ name.equals("电视剧") ||
+ name.equals("电影") ||
+ name.equals("动漫") ||
+ name.equals("综艺");
+ if (show) {
+ Matcher mather = regexCategory.matcher(ele.attr("href"));
+ if (!mather.find())
+ continue;
+ // 把分类的id和名称取出来加到列表里
+ String id = mather.group(1).trim();
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("type_id", id);
+ jsonObject.put("type_name", name);
+ classes.put(jsonObject);
+ }
+ }
+ JSONObject result = new JSONObject();
+ if (filter) {
+ result.put("filters", filterConfig);
+ }
+ result.put("class", classes);
+ try {
+ // 取首页推荐视频列表
+ Element homeList = doc.select("div.module-main").get(0);
+ Elements list = homeList.select("div.module-items>a");
+ JSONArray videos = new JSONArray();
+ for (int i = 0; i < list.size(); i++) {
+ Element vod = list.get(i);
+ String title = vod.attr("title");
+ String cover = vod.selectFirst("img.lazyload").attr("data-original");
+ String remark = vod.selectFirst("div.module-item-note").text();
+ Matcher matcher = regexVid.matcher(vod.attr("href"));
+ if (!matcher.find())
+ continue;
+ String id = matcher.group(1);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", id);
+ v.put("vod_name", title);
+ v.put("vod_pic", cover);
+ v.put("vod_remarks", remark);
+ videos.put(v);
+ }
+ result.put("list", videos);
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ /**
+ * 获取分类信息数据
+ *
+ * @param tid 分类id
+ * @param pg 页数
+ * @param filter 同homeContent方法中的filter
+ * @param extend 筛选参数{k:v, k1:v1}
+ * @return
+ */
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) {
+ try {
+ String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
+ urlParams[0] = tid;
+ urlParams[8] = pg;
+ if (extend != null && extend.size() > 0) {
+ for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) {
+ String key = it.next();
+ String value = extend.get(key);
+ urlParams[Integer.parseInt(key)] = URLEncoder.encode(value);
+ }
+ }
+ // 获取分类数据的url
+ String url = siteUrl + "/vodshow/" + TextUtils.join("-", urlParams) + ".html";
+ String html = OkHttpUtil.string(url, getHeaders(url));
+ Document doc = Jsoup.parse(html);
+ JSONObject result = new JSONObject();
+ int pageCount = 0;
+ int page = -1;
+
+ // 取页码相关信息
+ Elements pageInfo = doc.select("div[id=page]");
+ if (pageInfo.size() == 0) {
+ page = Integer.parseInt(pg);
+ pageCount = page;
+ } else {
+ for (int i = 0; i < pageInfo.size(); i++) {
+ Element li = pageInfo.get(i);
+ Element a = li.selectFirst("a");
+ if (a == null)
+ continue;
+ String span = doc.select("span.page-current").text();
+ String wy = doc.select("div[id=page] a").last().attr("href");
+ if (page == -1) {
+ page = Integer.parseInt(span);
+ } else {
+ page = 0;
+ }
+ Matcher matcher = regexPage.matcher(wy);
+ if (matcher.find()) {
+ pageCount = Integer.parseInt(matcher.group(1).split("-")[8]);
+ } else {
+ pageCount = 0;
+ }
+ break;
+
+ }
+ }
+ JSONArray videos = new JSONArray();
+ if (!html.contains("没有找到您想要的结果哦")) {
+ // 取当前分类页的视频列表
+ Elements list = doc.select("div.module-main>div.module-items>a");
+ for (int i = 0; i < list.size(); i++) {
+ Element vod = list.get(i);
+ String title = vod.attr("title");
+ String cover = vod.selectFirst("img.lazyload").attr("data-original");
+ String remark = vod.selectFirst("div.module-item-note").text();
+ Matcher matcher = regexVid.matcher(vod.attr("href"));
+ if (!matcher.find())
+ continue;
+ String id = matcher.group(1);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", id);
+ v.put("vod_name", title);
+ v.put("vod_pic", cover);
+ v.put("vod_remarks", remark);
+ videos.put(v);
+ }
+ }
+ result.put("page", page);
+ result.put("pagecount", pageCount);
+ result.put("limit", 48);
+ result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48);
+
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ /**
+ * 视频详情信息
+ *
+ * @param ids 视频id
+ * @return
+ */
+ @Override
+ public String detailContent(List ids) {
+ try {
+ // 视频详情url
+ String url = siteUrl + "/voddetail/" + ids.get(0) + ".html";
+ Document doc = Jsoup.parse(OkHttpUtil.string(url, Headers()));
+ JSONObject result = new JSONObject();
+ JSONObject vodList = new JSONObject();
+
+ // 取基本数据
+ Elements sourcediv = doc.select("div.module-item-cover>div");
+ String cover = sourcediv.get(0).select("div.module-item-pic>img").attr("data-original");
+ String title = sourcediv.get(0).select("div.module-item-pic>img").attr("alt");
+ String category = "", area = "", year = "", remark = "", director = "", actor = "", desc = "";
+ Elements data = doc.select("div.module-info-tag-link");
+ category = data.get(2).select("a").text();
+ area = data.get(1).select("a").text();
+ year = data.get(0).select("a").text();
+ remark = doc.select("div.module-info-item-content").get(4).text();
+ List actors = new ArrayList<>();
+ Elements aa = doc.select("div.module-info-item-content").get(2).select("a");
+ for (int j = 0; j < aa.size(); j++) {
+ actors.add(aa.get(j).text());
+ }
+ actor = TextUtils.join(",", actors);
+ List directors = new ArrayList<>();
+ Elements bb = doc.select("div.module-info-item-content").get(0).select("a");
+ for (int j = 0; j < bb.size(); j++) {
+ directors.add(bb.get(j).text());
+ }
+ director = TextUtils.join(",", directors);
+ desc = doc.selectFirst("div.module-info-introduction-content>p").text().trim();
+
+ vodList.put("vod_id", ids.get(0));
+ vodList.put("vod_name", title);
+ vodList.put("vod_pic", cover);
+ vodList.put("type_name", category);
+ vodList.put("vod_year", year);
+ vodList.put("vod_area", area);
+ vodList.put("vod_remarks", remark);
+ vodList.put("vod_actor", actor);
+ vodList.put("vod_director", director);
+ vodList.put("vod_content", desc);
+
+ Map vod_play = new TreeMap<>(new Comparator() {
+ @Override
+ public int compare(String o1, String o2) {
+ try {
+ int sort1 = playerConfig.getJSONObject(o1).getInt("or");
+ int sort2 = playerConfig.getJSONObject(o2).getInt("or");
+
+ if (sort1 == sort2) {
+ return 1;
+ }
+ return sort1 - sort2 > 0 ? 1 : -1;
+ } catch (JSONException e) {
+ SpiderDebug.log(e);
+ }
+ return 1;
+ }
+ });
+
+ // 取播放列表数据
+ Elements sources = doc.select("div.module-tab-items-box>div>span");
+ Elements sourceList = doc.select("div.module-list>div.module-play-list");
+
+ for (int i = 0; i < sources.size(); i++) {
+ Element source = sources.get(i);
+ String sourceName = source.text();
+ boolean found = false;
+ for (Iterator it = playerConfig.keys(); it.hasNext(); ) {
+ String flag = it.next();
+ if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
+ sourceName = playerConfig.getJSONObject(flag).getString("sh");
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ continue;
+ String playList = "";
+ Elements playListA = sourceList.get(i).select("div.module-play-list-content>a");
+ List vodItems = new ArrayList<>();
+
+ for (int j = 0; j < playListA.size(); j++) {
+ Element vod = playListA.get(j);
+ Matcher matcher = regexPlay.matcher(vod.attr("href"));
+ if (!matcher.find())
+ continue;
+ String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3);
+ vodItems.add(vod.text() + "$" + playURL);
+ }
+ if (vodItems.size() > 0)
+ playList = TextUtils.join("#", vodItems);
+
+ if (playList.length() == 0)
+ continue;
+
+ vod_play.put(sourceName, playList);
+ }
+
+ if (vod_play.size() > 0) {
+ String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
+ String vod_play_url = TextUtils.join("$$$", vod_play.values());
+ vodList.put("vod_play_from", vod_play_from);
+ vodList.put("vod_play_url", vod_play_url);
+ }
+ JSONArray list = new JSONArray();
+ list.put(vodList);
+ result.put("list", list);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ /**
+ * 获取视频播放信息
+ *
+ * @param flag 播放源
+ * @param id 视频id
+ * @param vipFlags 所有可能需要vip解析的源
+ * @return
+ */
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) {
+ try {
+ //定义播放用的headers
+ JSONObject headers = new JSONObject();
+ //headers.put("Host", " cokemv.co");
+ headers.put("origin", " https://cokemv.me");
+ headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
+ headers.put("Accept", " */*");
+ headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7");
+ headers.put("Accept-Encoding", " gzip, deflate");
+
+
+ // 播放页 url
+ String url = siteUrl + "/vodplay/" + id + ".html";
+ Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
+ Elements allScript = doc.select("script");
+ JSONObject result = new JSONObject();
+ for (int i = 0; i < allScript.size(); i++) {
+ String scContent = allScript.get(i).html().trim();
+ if (scContent.startsWith("var player_")) { // 取直链
+ int start = scContent.indexOf('{');
+ int end = scContent.lastIndexOf('}') + 1;
+ String json = scContent.substring(start, end);
+ JSONObject player = new JSONObject(json);
+ if (playerConfig.has(player.getString("from"))) {
+ JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
+ String videoUrl = player.getString("url");
+ String playUrl = pCfg.getString("pu");
+ result.put("parse", pCfg.getInt("sn"));
+ result.put("playUrl", playUrl);
+ result.put("url", videoUrl);
+ result.put("header", headers.toString());
+ }
+ break;
+ }
+ }
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ protected static HashMap sHeaders() {
+ HashMap headers = new HashMap<>();
+ headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36");
+ headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
+ headers.put("Accept-encoding", "gzip, deflate, br");
+ headers.put("Accept-language", "zh-SG,zh;q=0.9,en-GB;q=0.8,en;q=0.7,zh-CN;q=0.6");
+ return headers;
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) {
+ try {
+ String url = "https://shitu.paodekuaiweixinqun.com/search?q=site%3Acokemv.me%2Fvoddetail+" + URLEncoder.encode(key);
+ Document docs = Jsoup.parse(OkHttpUtil.string(url, sHeaders()));
+ JSONObject result = new JSONObject();
+ JSONArray videos = new JSONArray();
+ JSONObject v = new JSONObject();
+ Elements list = docs.select("div.NJo7tc div.yuRUbf");
+ for (int i = 0; i < list.size(); i++) {
+ Element doc = list.get(i);
+ String sourceName = doc.select("div.yuRUbf a h3").text();
+ if (sourceName.contains(key)) {
+ String list1 = doc.select("div.yuRUbf a").attr("href");
+ Document link = Jsoup.parse(OkHttpUtil.string(list1, getHeaders(url)));
+ Matcher matcher = regexVid.matcher(list1);
+ if (matcher.find()) {
+
+ String group = matcher.group(1);
+ String cover = link.select("div.module-item-pic>img").attr("data-original");
+ String title = link.select("div.module-item-pic>img").attr("alt");
+ String remark = link.select("div.module-info-item-content").get(4).text();
+
+ v.put("vod_name", title);
+ v.put("vod_remarks", remark);
+ v.put("vod_id", group);
+ v.put("vod_pic", cover);
+ videos.put(v);
+ }
+ }
+ }
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+}
diff --git a/app/src/main/java/com/github/catvod/spider/Czsapp.java b/app/src/main/java/com/github/catvod/spider/Czsapp.java
new file mode 100644
index 0000000..60f0e5a
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Czsapp.java
@@ -0,0 +1,435 @@
+package com.github.catvod.spider;
+
+import android.text.TextUtils;
+import android.util.Base64;
+
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.crawler.SpiderDebug;
+import com.github.catvod.utils.AES;
+import com.github.catvod.utils.CBC;
+import com.github.catvod.utils.gZip;
+import com.github.catvod.utils.okhttp.OKCallBack;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.StringReader;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import okhttp3.Call;
+import okhttp3.OkHttpClient;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+public class Czsapp extends Spider {
+ private static final Pattern Y = Pattern.compile("\"([^\"]+)\";var [\\d\\w]+=function dncry.*md5.enc.Utf8.parse\\(\"([\\d\\w]+)\".*md5.enc.Utf8.parse\\(([\\d]+)\\)");
+ private static final Pattern pY = Pattern.compile("video: \\{url: \"([^\"]+)\"");
+ private static final Pattern m = Pattern.compile("subtitle: \\{url:\"([^\"]+\\.vtt)\"");
+ private static final Pattern Q = Pattern.compile("src: '([^']+\\.css)',");
+ private static final Pattern Db = Pattern.compile("/movie/(\\d+).html");
+ private static final Pattern I = Pattern.compile("/page/(\\d+)");
+ private static final Pattern d = Pattern.compile("/v_play/(.*)\\.html");
+ private static final Pattern K = Pattern.compile("var vkey = ['\"]([^'\"]+)['\"]");
+ private static final Pattern Oe = Pattern.compile("var fvkey = ['\"]([^'\"]+)['\"]");
+ private static final Pattern fi = Pattern.compile("var ua = ['\"]([^'\"]+)['\"]");
+ private static final Pattern M = Pattern.compile("var cip = ['\"]([^'\"]+)['\"]");
+ private static final Pattern X = Pattern.compile("var time = ['\"]([^'\"]+)['\"]");
+ private static final Pattern a = Pattern.compile("var url = ['\"]([^'\"]+)['\"]");
+
+
+ private String mmd5(String str) {
+ try {
+ MessageDigest messageDigest = MessageDigest.getInstance("MD5");
+ messageDigest.update(str.getBytes());
+ byte[] digest = messageDigest.digest();
+ StringBuilder sb = new StringBuilder();
+ for (byte b : digest) {
+ String hexString = Integer.toHexString(b & 255);
+ while (hexString.length() < 2) {
+ hexString = "0" + hexString;
+ }
+ sb.append(hexString);
+ }
+ return sb.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "";
+ }
+ }
+
+ public static Object[] loadsub(String sub) {
+ try {
+ OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() {
+ @Override
+ protected void onFailure(Call call, Exception e) {
+
+ }
+
+ @Override
+ protected void onResponse(Response response) {
+
+ }
+ };
+ OkHttpClient YM = OkHttpUtil.defaultClient();
+ OkHttpUtil.get(YM, sub, null, Headers(), callBack);
+ Response result = callBack.getResult();
+ int code = result.code();
+ if (code == 404) {
+ return new Object[]{200, "application/octet-stream", new ByteArrayInputStream("WEBVTT".getBytes())};
+ }
+ ResponseBody body = result.body();
+ byte[] bytes = body.bytes();
+ byte[] tokenkey = Arrays.copyOfRange(bytes, 0, 16);
+ byte[] data = Arrays.copyOfRange(bytes, 16, bytes.length);
+ byte[] KS = CBC.CBC(data, tokenkey, tokenkey);
+ String vtt = gZip.KS(KS);
+
+
+ vtt = vtt.replaceAll("(\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}).*", "$1");
+ vtt = vtt.replaceAll("(\\d{2}:\\d{2}.\\d{3}).*?( --> )(\\d{2}:\\d{2}.\\d{3}).*", "00:$1$200:$3");
+ vtt = vtt.replaceAll("<.*><.*>(.*)<.*><.*>", "$1");
+ vtt = vtt.replaceAll("&(.*);", "");
+ vtt = vtt.replaceAll(".*NOTE.*", "");
+ BufferedReader br = new BufferedReader(new StringReader(vtt));
+ ArrayList lines = new ArrayList<>();
+ int captionNumber = 1;
+ String line = br.readLine();
+ while (line != null) {
+ if (line.matches("\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}")) {
+ if (lines.get(lines.size() - 1).trim().isEmpty()) {
+ lines.add(captionNumber + "");
+ captionNumber++;
+ }
+ }
+ lines.add(line);
+ line = br.readLine();
+ }
+ String join = TextUtils.join("\n", lines);
+
+ return new Object[]{200, "application/octet-stream", new ByteArrayInputStream(join.getBytes())};
+ } catch (Exception e) {
+ e.printStackTrace();
+ SpiderDebug.log(e);
+ return null;
+ }
+ }
+
+ public String categoryContent(String str, String str2, boolean z, HashMap hashMap) {
+ try {
+ JSONObject jSONObject = new JSONObject();
+ Document doc = Jsoup.parse(OkHttpUtil.string("https://czspp.com/" + str + "/page/" + str2, Headers()));
+ int parseInt = Integer.parseInt(str2);
+ int parseInt2 = Integer.parseInt(str2);
+ Matcher matcher = I.matcher(doc.select("div.pagenavi_txt > a.extend").last().attr("href"));
+ if (matcher.find()) {
+ parseInt2 = Integer.parseInt(matcher.group(1));
+ }
+ Elements jS = doc.select("div.mi_ne_kd > ul > li");
+ JSONArray jSONArray = new JSONArray();
+ for (Element next : jS) {
+ Matcher matcher2 = Db.matcher(next.select("a").attr("href"));
+ if (matcher2.find()) {
+ String group = matcher2.group(1);
+ String trim = next.select("img").attr("alt").trim();
+ String trim2 = next.select("img").attr("data-original").trim();
+ String trim3 = next.select("div.hdinfo > span").text().trim();
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("vod_id", group);
+ jSONObject2.put("vod_name", trim);
+ jSONObject2.put("vod_pic", trim2);
+ jSONObject2.put("vod_remarks", trim3);
+ jSONArray.put(jSONObject2);
+ }
+ }
+ jSONObject.put("list", jSONArray);
+ jSONObject.put("page", parseInt);
+ jSONObject.put("pagecount", parseInt2);
+ jSONObject.put("limit", 24);
+ jSONObject.put("total", parseInt2 <= 1 ? jSONArray.length() : parseInt2 * 24);
+ return jSONObject.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+
+ public String detailContent(List list) {
+ String str2 = "";
+ try {
+
+ JSONObject jSONObject = new JSONObject();
+ JSONArray jSONArray = new JSONArray();
+ JSONObject jSONObject2 = new JSONObject();
+ Document doc = Jsoup.parse(OkHttpUtil.string("https://czspp.com/movie/" + list.get(0) + ".html", Headers()));
+ String trim = doc.select("div.moviedteail_tt > h1").text().trim();
+ String pY2 = doc.select("div.dyimg > img").attr("src");
+ Iterator it = doc.select("ul.moviedteail_list > li").iterator();
+ String str3 = str2;
+ String str4 = str3;
+ String str5 = str4;
+ String str6 = str5;
+ String str7 = str6;
+ String str8 = str7;
+ while (it.hasNext()) {
+ String trim2 = it.next().text().trim();
+ if (trim2.length() >= 4) {
+ try {
+ String substring = trim2.substring(0, 2);
+ String substring2 = trim2.substring(3);
+ if (substring.equals("类型")) {
+ str3 = substring2;
+ } else if (substring.equals("地区")) {
+ str5 = substring2;
+ } else if (substring.equals("年份")) {
+ str4 = substring2;
+ } else if (substring.equals("导演")) {
+ str8 = substring2;
+ } else if (substring.equals("主演")) {
+ str7 = substring2;
+ } else if (substring.equals("豆瓣")) {
+ str6 = substring2;
+ }
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ }
+ }
+ jSONObject2.put("vod_id", list.get(0));
+ jSONObject2.put("vod_name", trim);
+ jSONObject2.put("vod_pic", pY2);
+ jSONObject2.put("type_name", str3);
+ jSONObject2.put("vod_year", str4);
+ jSONObject2.put("vod_area", str5);
+ jSONObject2.put("vod_remarks", str6);
+ jSONObject2.put("vod_actor", str7);
+ jSONObject2.put("vod_director", str8);
+ jSONObject2.put("vod_content", doc.select("div.yp_context").text().trim());
+ jSONObject2.put("vod_play_from", "厂长资源");
+ ArrayList arrayList = new ArrayList();
+ for (Element next : doc.select("div.paly_list_btn > a")) {
+ Matcher matcher = d.matcher(next.attr("href"));
+ if (matcher.find()) {
+ arrayList.add(next.text() + "$" + matcher.group(1));
+ }
+ }
+ jSONObject2.put("vod_play_url", TextUtils.join("#", arrayList));
+ jSONArray.put(jSONObject2);
+ jSONObject.put("list", jSONArray);
+ return jSONObject.toString();
+ } catch (Exception e3) {
+ }return "";
+ }
+
+ public String homeContent(boolean z) {
+ try {
+
+ JSONObject jSONObject = new JSONObject();
+ Document doc = Jsoup.parse(OkHttpUtil.string("https://czspp.com", Headers()));
+ Elements jS = doc.select(".navlist > li > a");
+ JSONArray jSONArray = new JSONArray();
+ for (Element next : jS) {
+ String pY2 = next.attr("href");
+ if (pY2.length() > 1) {
+ String substring = pY2.substring(1);
+ String trim = next.text().trim();
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("type_id", substring);
+ jSONObject2.put("type_name", trim);
+ jSONArray.put(jSONObject2);
+ }
+ }
+ jSONObject.put("class", jSONArray);
+ Elements jS2 = doc.select("div.mi_ne_kd > ul > li");
+ JSONArray jSONArray2 = new JSONArray();
+ for (Element next2 : jS2) {
+ Matcher matcher = Db.matcher(next2.select("a").attr("href"));
+ if (matcher.find()) {
+ String group = matcher.group(1);
+ String trim2 = next2.select("img").attr("alt").trim();
+ String trim3 = next2.select("img").attr("data-original").trim();
+ String trim4 = next2.select("div.hdinfo > span").text().trim();
+ JSONObject jSONObject3 = new JSONObject();
+ jSONObject3.put("vod_id", group);
+ jSONObject3.put("vod_name", trim2);
+ jSONObject3.put("vod_pic", trim3);
+ jSONObject3.put("vod_remarks", trim4);
+ jSONArray2.put(jSONObject3);
+ }
+ }
+ jSONObject.put("list", jSONArray2);
+ return jSONObject.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+
+ protected static HashMap Headers() {
+ HashMap hashMap = new HashMap<>();
+ hashMap.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36");
+ return hashMap;
+ }
+
+
+ public String playerContent(String str, String str2, List list) {
+ String str3;
+ String str4;
+ Elements G8;
+ try {
+ String K2 = OkHttpUtil.string("https://czspp.com/v_play/" + str2 + ".html", Headers());
+ Document UR = Jsoup.parse(K2);
+ Matcher matcher = Y.matcher(K2);
+ if (matcher.find()) {
+ String group = matcher.group(1);
+ String KEY = matcher.group(2);
+ String IV = matcher.group(3);
+ String str5 = AES.CBC(group, KEY, IV);
+ Matcher matcher2 = pY.matcher(str5);
+ str3 = matcher2.find() ? matcher2.group(1) : "";
+ Matcher matcher3 = m.matcher(str5);
+ str4 = matcher3.find() ? matcher3.group(1) : "";
+ } else {
+ str4 = "";
+ str3 = str4;
+ }
+ if (TextUtils.isEmpty(str3) && (G8 = UR.select("iframe.viframe")) != null) {
+ String pY2 = G8.attr("src");
+ if (pY2.contains("jx.xmflv.com")) {
+ String K3 = OkHttpUtil.string(pY2, Headers());
+ Matcher matcher4 = X.matcher(K3);
+ if (!matcher4.find()) {
+ return "";
+ }
+ String group2 = matcher4.group(1);
+ Matcher matcher5 = a.matcher(K3);
+ if (!matcher5.find()) {
+ return "";
+ }
+ String group3 = matcher5.group(1);
+ String K4 = OkHttpUtil.string("https://jx.xmflv.com/player.php?time=" + group2 + "&url=" + group3, Headers());
+ Matcher matcher6 = K.matcher(K4);
+ if (!matcher6.find()) {
+ return "";
+ }
+ String group4 = matcher6.group(1);
+ Matcher matcher7 = Oe.matcher(K4);
+ if (!matcher7.find()) {
+ return "";
+ }
+ String group5 = matcher7.group(1);
+ Matcher matcher8 = fi.matcher(K4);
+ if (!matcher8.find()) {
+ return "";
+ }
+ String group6 = matcher8.group(1);
+ Matcher matcher9 = M.matcher(K4);
+ if (!matcher9.find()) {
+ return "";
+ }
+ String group7 = matcher9.group(1);
+ Matcher matcher10 = X.matcher(K4);
+ if (!matcher10.find()) {
+ return "";
+ }
+ String group8 = matcher10.group(1);
+ byte[] bytes3 = mmd5(group5).getBytes();
+ byte[] bytes4 = "UVE1NTY4MDY2NQ==".getBytes();
+ Cipher cipher2 = Cipher.getInstance("AES/CBC/NoPadding");
+ cipher2.init(1, new SecretKeySpec(bytes3, "AES"), new IvParameterSpec(bytes4));
+ String encodeToString = Base64.encodeToString(cipher2.doFinal(group5.getBytes()), 0);
+ OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() {
+
+ public void onResponse(Response response) {
+ }
+
+ @Override
+ protected void onFailure(Call call, Exception exc) {
+ }
+ };
+ HashMap hashMap = new HashMap();
+ hashMap.put("url", group3);
+ hashMap.put("time", group8);
+ hashMap.put("ua", group6);
+ hashMap.put("cip", group7);
+ hashMap.put("vkey", group4);
+ hashMap.put("fvkey", encodeToString);
+ OkHttpUtil.post(OkHttpUtil.defaultClient(), "https://jx.xmflv.com/xmflv-1.SVG", hashMap, Headers(), callBack);
+ str3 = new JSONObject(callBack.getResult().body().string()).getString("url");
+ } else {
+ Matcher matcher11 = Q.matcher(OkHttpUtil.string(pY2, Headers()));
+ if (matcher11.find()) {
+ str3 = matcher11.group(1);
+ }
+ }
+ }
+ JSONObject jSONObject = new JSONObject();
+ jSONObject.put("parse", "0");
+ jSONObject.put("playUrl", "");
+ jSONObject.put("url", str3);
+ jSONObject.put("header", "");
+ if (!TextUtils.isEmpty(str4)) {
+ jSONObject.put("subf", "/vtt/utf-8");
+ jSONObject.put("subt", Proxy.localProxyUrl() + "?do=czspp&url=" + URLEncoder.encode(str4));
+ }
+ return jSONObject.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+
+ public String searchContent(String str, boolean z) {
+ try {
+ JSONObject jSONObject = new JSONObject();
+ Elements jS = Jsoup.parse(OkHttpUtil.string("https://czspp.com/xssearch?q=" + URLEncoder.encode(str), Headers())).select("div.mi_ne_kd > ul > li");
+ JSONArray jSONArray = new JSONArray();
+ for (Element next : jS) {
+ Matcher matcher = Db.matcher(next.select("a").attr("href"));
+ JSONObject jSONObject2 = new JSONObject();
+ if (matcher.find()) {
+ String group = matcher.group(1);
+ String trim = next.select("img").attr("alt").trim();
+ if (trim.contains(str)) {
+ String trim2 = next.select("img").attr("src").trim();
+ if (next.hasClass(".jidi")) {
+ String remark = next.select(".jidi span").text();
+ jSONObject2.put("vod_remarks", remark);
+ } else {
+ String id = next.select("a").attr("href");
+ Document doc = Jsoup.parse(OkHttpUtil.string(id, Headers()));
+ String remark = doc.select("ul.moviedteail_list li span").get(0).text();
+ jSONObject2.put("vod_id", group);
+ jSONObject2.put("vod_name", trim);
+ jSONObject2.put("vod_pic", trim2);
+ jSONObject2.put("vod_remarks", remark);
+ jSONArray.put(jSONObject2);
+ }
+ }
+ }
+ }
+ jSONObject.put("list", jSONArray);
+ return jSONObject.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/catvod/spider/Gitcafe.java b/app/src/main/java/com/github/catvod/spider/Gitcafe.java
new file mode 100644
index 0000000..71c97ec
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Gitcafe.java
@@ -0,0 +1,309 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+import android.util.TimeUtils;
+
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+public class Gitcafe extends Spider {
+ private Map a;
+ private List b;
+ private PushAgent pushAgent;
+ private JSONObject d;
+ private JSONObject Home;
+
+
+ @Override
+ public void init(Context context, String extend) {
+ super.init(context, extend);
+ pushAgent = new PushAgent();
+ pushAgent.init(context, extend);
+ try {
+ d = new JSONObject("{\"hyds\":\"华语电视\",\"rhds\":\"日韩电视\",\"omds\":\"欧美电视\",\"qtds\":\"其他电视\",\"hydy\":\"华语电影\",\"rhdy\":\"日韩电影\",\"omdy\":\"欧美电影\",\"qtdy\":\"其他电影\",\"hydm\":\"华语动漫\",\"rhdm\":\"日韩动漫\",\"omdm\":\"欧美动漫\",\"jlp\":\"纪录片\",\"zyp\":\"综艺片\",\"jypx\":\"教育培训\",\"qtsp\":\"其他视频\",\"hyyy\":\"华语音乐\",\"rhyy\":\"日韩音乐\",\"omyy\":\"欧美音乐\",\"qtyy\":\"其他音乐\",\"kfrj\":\"娱乐软件\",\"xtrj\":\"系统软件\",\"wlrj\":\"网络软件\",\"bgrj\":\"办公软件\",\"qtrj\":\"其他软件\",\"mh\":\"漫画\",\"xs\":\"小说\",\"cbs\":\"出版书\",\"zspx\":\"知识培训\",\"qtwd\":\"其他文档\",\"bz\":\"壁纸\",\"rw\":\"人物\",\"fj\":\"风景\",\"qttp\":\"其他图片\",\"qt\":\"其他\"}");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ ArrayList arrayList = new ArrayList();
+ this.b = arrayList;
+ arrayList.add("hydm");
+ List list = this.b;
+ list.add("hyds");
+ List list2 = this.b;
+ list2.add("hydy");
+ List list3 = this.b;
+ list3.add("omdm");
+ List list4 = this.b;
+ list4.add("omds");
+ List list5 = this.b;
+ list5.add("omdy");
+ List list6 = this.b;
+ list6.add("rhdm");
+ List list7 = this.b;
+ list7.add("rhds");
+ List list8 = this.b;
+ list8.add("rhdy");
+ List list9 = this.b;
+ list9.add("qtds");
+ List list10 = this.b;
+ list10.add("qtdy");
+ List list11 = this.b;
+ list11.add("qtsp");
+ List list12 = this.b;
+ list12.add("jlp");
+ List list13 = this.b;
+ list13.add("zyp");
+ }
+
+ protected HashMap LT() {
+ HashMap hashMap = new HashMap<>();
+ hashMap.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36");
+ return hashMap;
+ }
+
+ @Override
+ public String categoryContent(String str, String str2, boolean z, HashMap hashMap) {
+ try {
+ Map allData = getAllData(this, this, this);
+ JSONArray jSONArray = new JSONArray();
+ Set keySet = allData.keySet();
+ for (String str3 : keySet) {
+ JSONObject jSONObject = (JSONObject) allData.get(str3);
+ if (jSONObject.has("cat")) {
+ String string = jSONObject.getString("cat");
+ if (string.equals(str)) {
+ JSONObject jSONObject2 = new JSONObject();
+ String sb2 = "https://www.aliyundrive.com/s/" + jSONObject.getString("key");
+ jSONObject2.put("vod_id", sb2);
+ String string2 = jSONObject.getString("title");
+ jSONObject2.put("vod_name", string2);
+ jSONObject2.put("vod_pic", "https://www.lgstatic.com/i/image2/M01/15/7E/CgoB5lysLXCADg6ZAABapAHUnQM321.jpg");
+ jSONArray.put(jSONObject2);
+ }
+ }
+ }
+ JSONObject jSONObject3 = new JSONObject();
+ jSONObject3.put("page", 1);
+ jSONObject3.put("pagecount", 1);
+ int length = jSONArray.length();
+ jSONObject3.put("limit", length);
+ TimeUtils.getTimeZoneDatabaseVersion();
+ int length2 = jSONArray.length();
+ jSONObject3.put("total", length2);
+ jSONObject3.put("list", jSONArray);
+ return jSONObject3.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "";
+ }
+ }
+
+ @Override
+ public String detailContent(List list) {
+ try {
+ Map allData = getAllData(this, this, this);
+ JSONObject jSONObject = new JSONObject(pushAgent.detailContent(list));
+ JSONArray jSONArray = jSONObject.getJSONArray("list");
+ int i = 0;
+ while (true) {
+ if (i >= list.size()) {
+ break;
+ }
+ if (i >= jSONArray.length()) {
+ break;
+ }
+ JSONObject jSONObject2 = jSONArray.getJSONObject(i);
+ Pattern pattern = PushAgent.Folder;
+ Matcher matcher = pattern.matcher(list.get(i));
+ if (matcher.find()) {
+ String group = matcher.group(1);
+ if (allData.containsKey(group)) {
+ JSONObject jSONObject3 = (JSONObject) allData.get(group);
+ jSONObject2.put("vod_pic", "https://www.lgstatic.com/i/image2/M01/15/7E/CgoB5lysLXCADg6ZAABapAHUnQM321.jpg");
+
+ }
+ }
+ i++;
+ }
+ return jSONObject.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public synchronized Map getAllData(Object obj, Object obj2, Object obj3) {
+ Map map;
+ obj.getClass();
+ obj2.getClass();
+ obj3.getClass();
+ synchronized (this) {
+ try {
+ if (a == null) {
+ HashMap hashMap = new HashMap();
+ HashMap LT = LT();
+ for (Iterator iter = b.iterator(); iter.hasNext(); ) {
+ String element = iter.next();
+ String content = OkHttpUtil.string("https://gitcafe.net/alipaper/data/" + element + ".json", LT);
+ JSONObject data = new JSONObject(content);
+ JSONArray jSONArray = data.getJSONArray("data");
+ for (int i = 0; i < jSONArray.length(); i++) {
+ JSONObject jSONObject = jSONArray.getJSONObject(i);
+ hashMap.put(jSONObject.getString("key"), jSONObject);
+ }
+ }
+ a = hashMap;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ map = a;
+ }
+ return map;
+ }
+
+ public JSONObject getHomeData(Object obj) {
+ obj.getClass();
+ try {
+ if (Home == null) {
+ HashMap LT = LT();
+ Home = new JSONObject(OkHttpUtil.string("https://gitcafe.net/alipaper/home.json", LT));
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return Home;
+ }
+
+ @Override
+ public String homeContent(boolean z) {
+ String str = "https://www.lgstatic.com/i/image2/M01/15/7E/CgoB5lysLXCADg6ZAABapAHUnQM321.jpg";
+
+ try {
+ JSONObject homeData = getHomeData(this);
+ JSONObject jSONObject = homeData.getJSONObject("info");
+ JSONArray jSONArray = jSONObject.getJSONArray("new");
+ JSONArray jSONArray2 = new JSONArray();
+ List list = b;
+ Iterator it = list.iterator();
+ while (true) {
+ if (!it.hasNext()) {
+ break;
+ }
+ String next = it.next();
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("type_id", next);
+ JSONObject jSONObject3 = d;
+ String string = jSONObject3.getString(next);
+ jSONObject2.put("type_name", string);
+ jSONArray2.put(jSONObject2);
+ }
+ Map allData = getAllData(this, this, this);
+ JSONArray jSONArray3 = new JSONArray();
+ for (int i = 0; i < jSONArray.length(); i++) {
+ JSONObject jSONObject4 = jSONArray.getJSONObject(i);
+ String string2 = jSONObject4.getString("cat");
+ List list2 = b;
+ if (list2.contains(string2)) {
+ String string3 = jSONObject4.getString("key");
+ if (allData.containsKey(string3)) {
+ JSONObject jSONObject5 = (JSONObject) allData.get(string3);
+ JSONObject jSONObject6 = new JSONObject();
+ StringBuilder sb = new StringBuilder();
+ sb.append("https://www.aliyundrive.com/s/");
+ String string4 = jSONObject4.getString("key");
+ sb.append(string4);
+ String sb2 = sb.toString();
+ jSONObject6.put("vod_id", sb2);
+ String string5 = jSONObject4.getString("title");
+ jSONObject6.put("vod_name", string5);
+ jSONObject6.put("vod_pic", str);
+ String string6 = jSONObject4.getString("date");
+ jSONObject6.put("vod_remarks", string6);
+ jSONArray3.put(jSONObject6);
+
+ }
+ JSONObject jSONObject62 = new JSONObject();
+ StringBuilder sb3 = new StringBuilder();
+ sb3.append("https://www.aliyundrive.com/s/");
+ String string42 = jSONObject4.getString("key");
+ sb3.append(string42);
+ String sb22 = sb3.toString();
+ jSONObject62.put("vod_id", sb22);
+ String string52 = jSONObject4.getString("title");
+ jSONObject62.put("vod_name", string52);
+ jSONObject62.put("vod_pic", str);
+ String string62 = jSONObject4.getString("date");
+ jSONObject62.put("vod_remarks", string62);
+ jSONArray3.put(jSONObject62);
+ }
+ }
+ JSONObject jSONObject7 = new JSONObject();
+ jSONObject7.put("class", jSONArray2);
+ jSONObject7.put("list", jSONArray3);
+ return jSONObject7.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "";
+ }
+ }
+
+ @Override
+ public String playerContent(String str, String str2, List list) {
+ return pushAgent.playerContent(str, str2, list);
+ }
+
+ @Override
+ public String searchContent(String str, boolean z) {
+ try {
+ Map allData = getAllData(this, this, this);
+ JSONArray jSONArray = new JSONArray();
+ Set keySet = allData.keySet();
+ Iterator it = keySet.iterator();
+ while (true) {
+ if (it.hasNext()) {
+ Object next = it.next();
+ JSONObject jSONObject = (JSONObject) allData.get(next);
+ if (jSONObject.has("cat")) {
+ String string = jSONObject.getString("cat");
+ List list = b;
+ if (list.contains(string)) {
+ String string2 = jSONObject.getString("title");
+ if (string2.contains(str)) {
+ JSONObject jSONObject2 = new JSONObject();
+ StringBuilder sb = new StringBuilder();
+ sb.append("https://www.aliyundrive.com/s/");
+ String string3 = jSONObject.getString("key");
+ sb.append(string3);
+ String sb2 = sb.toString();
+ jSONObject2.put("vod_id", sb2);
+ jSONObject2.put("vod_name", string2);
+ jSONArray.put(jSONObject2);
+ }
+ }
+ }
+ } else {
+ JSONObject jSONObject3 = new JSONObject();
+ jSONObject3.put("list", jSONArray);
+ return jSONObject3.toString();
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "";
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/catvod/spider/IKan.java b/app/src/main/java/com/github/catvod/spider/IKan.java
new file mode 100644
index 0000000..6a43855
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/IKan.java
@@ -0,0 +1,234 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.util.Base64;
+
+import com.github.catvod.crawler.SpiderDebug;
+import com.github.catvod.utils.Misc;
+import com.github.catvod.utils.okhttp.OKCallBack;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.select.Elements;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.TreeMap;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import okhttp3.Call;
+import okhttp3.Cookie;
+import okhttp3.CookieJar;
+import okhttp3.HttpUrl;
+import okhttp3.OkHttpClient;
+
+public class IKan extends AppYsV2 {
+ private final OkHttpClient y;
+ private boolean K = false;
+ private Context cccc = null;
+
+ public IKan() {
+ OkHttpClient.Builder builder = new OkHttpClient.Builder();
+ TimeUnit timeUnit = TimeUnit.SECONDS;
+ y = builder.readTimeout(15L, timeUnit).writeTimeout(15L, timeUnit).connectTimeout(15L, timeUnit).cookieJar(new CookieJar() {
+ final List Mf = new ArrayList();
+
+ public List loadForRequest(HttpUrl httpUrl) {
+ ArrayList arrayList = new ArrayList();
+ ArrayList arrayList2 = new ArrayList();
+ for (Cookie cookie : Mf) {
+ if (cookie.expiresAt() < System.currentTimeMillis()) {
+ arrayList.add(cookie);
+ } else if (cookie.matches(httpUrl)) {
+ arrayList2.add(cookie);
+ }
+ }
+ Mf.removeAll(arrayList);
+ return arrayList2;
+ }
+
+ public void saveFromResponse(HttpUrl httpUrl, List list) {
+ Mf.addAll(list);
+ }
+ }).retryOnConnectionFailure(true).build();
+ }
+
+ private void S(final String str, final String str2) {
+ HashMap hashMap = new HashMap();
+ hashMap.put("user_name", str);
+ hashMap.put("user_pwd", str2);
+ hashMap.put("user_pwd2", str2);
+ try {
+ HashMap hashMap2 = new HashMap();
+ hashMap2.put("Host", "tvcms.ikan6.vip");
+ hashMap2.put("User-Agent", "okhttp/3.11.0");
+ OkHttpUtil.post(this.y, "http://tvcms.ikan6.vip/api.php/gctvapi.auth/register", hashMap, hashMap2, new OKCallBack.OKCallBackString() {
+ @Override
+ public void onFailure(Call call, Exception exc) {
+ }
+
+ public void onResponse(String str3) {
+ try {
+ if (new JSONObject(str3).optInt("code", 0) == 200) {
+ cccc.getSharedPreferences("spider_IKan", 0).edit().putString("user", str).putString("pwd", str2).commit();
+ login(str, str2);
+ }
+ } catch (JSONException unused) {
+ }
+ }
+ });
+ } catch (Throwable unused) {
+ }
+ }
+
+ private void iq() {
+ SharedPreferences sharedPreferences = cccc.getSharedPreferences("spider_IKan", 0);
+ try {
+ String string = sharedPreferences.getString("user", null);
+ String string2 = sharedPreferences.getString("pwd", null);
+ if (!(string == null || string2 == null)) {
+ login(string, string2);
+ return;
+ }
+ } catch (Throwable unused) {
+ }
+ S(random(18), random(8));
+ }
+
+ public static String random(int i) {
+ Random random = new Random();
+ StringBuffer stringBuffer = new StringBuffer();
+ for (int i2 = 0; i2 < i; i2++) {
+ stringBuffer.append("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456".charAt(random.nextInt(59)));
+ }
+ return stringBuffer.toString();
+ }
+
+
+ public void init(Context context) {
+ cccc = context;
+ }
+
+ public void login(String str, String str2) {
+ HashMap headers = new HashMap();
+ headers.put("user_name", str);
+ headers.put("user_pwd", str2);
+ try {
+ HashMap hashMap2 = new HashMap();
+ hashMap2.put("Host", "tvcms.ikan6.vip");
+ hashMap2.put("User-Agent", "okhttp/3.11.0");
+ OkHttpUtil.post(y, "http://tvcms.ikan6.vip/api.php/gctvapi.auth/login", headers, hashMap2, new OKCallBack.OKCallBackString() {
+ @Override
+ public void onFailure(Call call, Exception exc) {
+ }
+
+ public void onResponse(String str3) {
+ try {
+ if (new JSONObject(str3).optInt("code", 0) == 200) {
+ K = true;
+ }
+ } catch (JSONException unused) {
+ }
+ }
+ });
+ } catch (Throwable unused) {
+ }
+ }
+
+ private HashMap getHeaders(String URL) {
+ HashMap headers = new HashMap<>();
+ headers.put("User-Agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36");
+ return headers;
+ }
+
+ @Override
+ public String homeVideoContent() {
+ try {
+ String url = "http://tvcms.ikan6.vip/api.php/gctvapi.vod";
+ String json = OkHttpUtil.string(url, getHeaders(url));
+ JSONObject obj = new JSONObject(json);
+ JSONArray videos = new JSONArray();
+ JSONArray jsonArray = obj.getJSONObject("data").getJSONArray("list");
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject vObj = jsonArray.getJSONObject(i);
+ String vid = vObj.getString("vod_id");
+ 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 playerContent(String str, String str2, List list) {
+ try {
+ if (str.equals("lekanzyw")) {
+ if (!K) {
+ iq();
+ }
+
+ JSONObject headers = new JSONObject();
+ headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
+ headers.put("Accept", " */*");
+ headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7");
+ headers.put("Accept-Encoding", " gzip, deflate");
+ headers.put("Connection", " Keep-Alive");
+
+ String parseUrl = "https://player.4kan.top/?url=" + str2;
+ Document doc = Jsoup.parse(OkHttpUtil.string(parseUrl, null));
+ Pattern pattern = Pattern.compile("(?<=getrandom\\S\").*?(?=\")");
+ Elements allScripts = doc.select("body script");
+ for (int j = 0; j < allScripts.size(); j++) {
+ String scContents = allScripts.get(j).html().trim();
+ Matcher matcher = pattern.matcher(scContents);
+ if (!matcher.find())
+ continue;
+ String players = new String(Base64.decode(matcher.group(0), Base64.DEFAULT));
+ int start = players.indexOf("http");
+ int end = players.lastIndexOf("key=") + 36;
+ String url = players.substring(start, end);
+ Map> respHeaders = new TreeMap<>();
+ OkHttpUtil.stringNoRedirect(url, null, respHeaders);
+ String redLoc = OkHttpUtil.getRedirectLocation(respHeaders);
+
+
+ JSONObject result = new JSONObject();
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", redLoc);
+ result.put("header", headers.toString());
+ return result.toString();
+
+ }
+ }
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ @Override
+ public void init(Context context, String str) {
+ super.init(context, "http://tvcms.ikan6.vip/api.php/gctvapi.vod");
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/catvod/spider/If101.java b/app/src/main/java/com/github/catvod/spider/If101.java
new file mode 100644
index 0000000..4430c40
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/If101.java
@@ -0,0 +1,482 @@
+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.utils.okhttp.OkHttpUtil;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class If101 extends Spider {
+ private static final String siteUrl = "https://oulevod.tv";
+ private static final String siteHost = "oulevod.tv";
+
+ /**
+ * 播放源配置
+ */
+ private JSONObject playerConfig;
+ /**
+ * 筛选配置
+ */
+ private JSONObject filterConfig;
+ private Pattern regexCategory = Pattern.compile("/index.php/vod/type/id/(\\d+).html");
+ private Pattern regexVid = Pattern.compile("/index.php/vod/detail/id/(\\d+).html");
+ private Pattern regexPlay = Pattern.compile("/index.php/vod/play/id/(\\d+)/sid/(\\d+)/nid/(\\d+).html");
+ private Pattern regexPage = Pattern.compile("\\S+/page/(\\d+)\\S+");
+
+
+ @Override
+ public void init(Context context) {
+ super.init(context);
+ try {
+ playerConfig = new JSONObject("{\"if101\":{\"sh\":\"高清蓝光\",\"sn\":0,\"pu\":\"\",\"or\":999}}");
+ filterConfig = new JSONObject("{\"1\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"冒险\",\"v\":\"6\"},{\"n\":\"剧情\",\"v\":\"7\"},{\"n\":\"动作\",\"v\":\"8\"},{\"n\":\"动画电影\",\"v\":\"9\"},{\"n\":\"同性\",\"v\":\"10\"},{\"n\":\"喜剧\",\"v\":\"11\"},{\"n\":\"奇幻\",\"v\":\"12\"},{\"n\":\"恐怖\",\"v\":\"20\"},{\"n\":\"悬疑\",\"v\":\"21\"},{\"n\":\"惊悚\",\"v\":\"22\"},{\"n\":\"战争\",\"v\":\"23\"},{\"n\":\"歌舞\",\"v\":\"24\"},{\"n\":\"灾难\",\"v\":\"25\"},{\"n\":\"爱情\",\"v\":\"26\"},{\"n\":\"犯罪\",\"v\":\"27\"},{\"n\":\"科幻\",\"v\":\"28\"},{\"n\":\"经典\",\"v\":\"29\"},{\"n\":\"网络电影\",\"v\":\"30\"}]},{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"version\",\"name\":\"版本\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"高清版\",\"v\":\"高清版\"},{\"n\":\"剧场版\",\"v\":\"剧场版\"},{\"n\":\"抢先版\",\"v\":\"抢先版\"},{\"n\":\"OVA\",\"v\":\"OVA\"},{\"n\":\"TV\",\"v\":\"TV\"},{\"n\":\"影院版\",\"v\":\"影院版\"}]},{\"key\":\"state\",\"name\":\"资源\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"正片\",\"v\":\"正片\"},{\"n\":\"预告片\",\"v\":\"预告片\"},{\"n\":\"花絮\",\"v\":\"花絮\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"欧美剧\",\"v\":\"13\"},{\"n\":\"日剧\",\"v\":\"14\"},{\"n\":\"韩剧\",\"v\":\"15\"},{\"n\":\"国产剧\",\"v\":\"16\"},{\"n\":\"泰剧\",\"v\":\"31\"},{\"n\":\"港剧\",\"v\":\"32\"},{\"n\":\"台剧\",\"v\":\"33\"},{\"n\":\"新马剧\",\"v\":\"34\"},{\"n\":\"其它剧\",\"v\":\"35\"}]},{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"version\",\"name\":\"版本\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"高清版\",\"v\":\"高清版\"},{\"n\":\"剧场版\",\"v\":\"剧场版\"},{\"n\":\"抢先版\",\"v\":\"抢先版\"},{\"n\":\"OVA\",\"v\":\"OVA\"},{\"n\":\"TV\",\"v\":\"TV\"},{\"n\":\"影院版\",\"v\":\"影院版\"}]},{\"key\":\"state\",\"name\":\"资源\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"正片\",\"v\":\"正片\"},{\"n\":\"预告片\",\"v\":\"预告片\"},{\"n\":\"花絮\",\"v\":\"花絮\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"欧美动漫\",\"v\":\"36\"},{\"n\":\"日本动漫\",\"v\":\"37\"},{\"n\":\"韩国动漫\",\"v\":\"38\"},{\"n\":\"国产动漫\",\"v\":\"39\"},{\"n\":\"新马泰动漫\",\"v\":\"40\"},{\"n\":\"港台动漫\",\"v\":\"41\"},{\"n\":\"其他动漫\",\"v\":\"42\"}]},{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"旅游\",\"v\":\"旅游\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"游戏互动\",\"v\":\"游戏互动\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"求职\",\"v\":\"求职\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"欧美综艺\",\"v\":\"43\"},{\"n\":\"日本综艺\",\"v\":\"44\"},{\"n\":\"韩国综艺\",\"v\":\"45\"},{\"n\":\"国产综艺\",\"v\":\"46\"},{\"n\":\"新马泰综艺\",\"v\":\"47\"},{\"n\":\"港台综艺\",\"v\":\"48\"},{\"n\":\"其他综艺\",\"v\":\"49\"}]},{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"version\",\"name\":\"版本\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"TV版\",\"v\":\"TV版\"},{\"n\":\"电影版\",\"v\":\"电影版\"},{\"n\":\"OVA版\",\"v\":\"OVA版\"},{\"n\":\"真人版\",\"v\":\"真人版\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"50\":[{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"51\":[{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}]}");
+ } catch (JSONException e) {
+ SpiderDebug.log(e);
+ }
+ }
+
+ /**
+ * 爬虫headers
+ *
+ * @param url
+ * @return
+ */
+ protected HashMap getHeaders(String url) {
+ HashMap headers = new HashMap<>();
+ headers.put("method", "GET");
+ headers.put("Host", siteHost);
+ headers.put("Upgrade-Insecure-Requests", "1");
+ headers.put("DNT", "1");
+ headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
+ headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
+ headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
+ return headers;
+ }
+
+ /**
+ * 获取分类数据 + 首页最近更新视频列表数据
+ *
+ * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
+ * @return
+ */
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
+ // 分类节点
+ Elements elements = doc.select("div.conch-nav div ul li a");
+ JSONArray classes = new JSONArray();
+ for (Element ele : elements) {
+ String name = ele.text();
+ boolean show = name.equals("电影") ||
+ name.equals("电视剧") ||
+ name.equals("动漫") ||
+ name.equals("综艺") ||
+ name.equals("纪录片") ||
+ name.equals("体育");
+ if (show) {
+ Matcher mather = regexCategory.matcher(ele.attr("href"));
+ if (!mather.find())
+ continue;
+ // 把分类的id和名称取出来加到列表里
+ String id = mather.group(1).trim();
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("type_id", id);
+ jsonObject.put("type_name", name);
+ classes.put(jsonObject);
+ }
+ }
+ JSONObject result = new JSONObject();
+ if (filter) {
+ result.put("filters", filterConfig);
+ }
+ result.put("class", classes);
+ try {
+ // 取首页推荐视频列表
+ Element homeList = doc.select("ul.hl-vod-list").get(0);
+ Elements list = homeList.select("li.hl-list-item");
+ JSONArray videos = new JSONArray();
+ for (int i = 0; i < list.size(); i++) {
+ Element vod = list.get(i);
+ String title = vod.selectFirst("div.hl-item-title a").text();
+ String cover = vod.selectFirst(".hl-item-thumb").attr("data-original");
+ String remark = vod.selectFirst(".hl-pic-text span").text();
+ Matcher matcher = regexVid.matcher(vod.selectFirst("div.hl-item-title a").attr("href"));
+ if (!matcher.find())
+ continue;
+ String id = matcher.group(1);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", id);
+ v.put("vod_name", title);
+ v.put("vod_pic", cover);
+ v.put("vod_remarks", remark);
+ videos.put(v);
+ }
+ result.put("list", videos);
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ /**
+ * 获取分类信息数据
+ *
+ * @param tid 分类id
+ * @param pg 页数
+ * @param filter 同homeContent方法中的filter
+ * @param extend 筛选参数{k:v, k1:v1}
+ * @return
+ */
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) {
+ try {
+ String url = siteUrl + "/index.php/vod/show/id/";
+ if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) {
+ url += extend.get("tid");
+ } else {
+ url += tid;
+ }
+ if (extend != null && extend.size() > 0) {
+ for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) {
+ String key = it.next();
+ String value = extend.get(key);
+ if (value.length() > 0) {
+ url += "/" + key + "/" + URLEncoder.encode(value);
+ }
+ }
+ }
+ url += "/page/" + pg + ".html";
+ String html = OkHttpUtil.string(url, getHeaders(url));
+ Document doc = Jsoup.parse(html);
+ JSONObject result = new JSONObject();
+ int pageCount = 0;
+ int page = -1;
+
+ // 取页码相关信息
+ Elements pageInfo = doc.select("ul.hl-page-wrap");
+ if (pageInfo.size() == 0) {
+ page = Integer.parseInt(pg);
+ pageCount = page;
+ } else {
+ for (int i = 0; i < pageInfo.size(); i++) {
+ Element li = pageInfo.get(i);
+ Element a = li.selectFirst("li a");
+ if (a == null)
+ continue;
+ String span = pageInfo.select("li a.active").text();
+ String wy = doc.select("ul.hl-page-wrap li a").last().attr("href");
+ if (page == -1) {
+ page = Integer.parseInt(span);
+ } else {
+ page = 0;
+ }
+ Matcher matcher = regexPage.matcher(wy);
+ if (matcher.find()) {
+ pageCount = Integer.parseInt(matcher.group(1).trim());
+ } else {
+ pageCount = 0;
+ }
+ break;
+
+ }
+ }
+
+ JSONArray videos = new JSONArray();
+ if (!html.contains("没有找到您想要的结果哦")) {
+ // 取当前分类页的视频列表
+ Elements list = doc.select("li.hl-list-item");
+ for (int i = 0; i < list.size(); i++) {
+ Element vod = list.get(i);
+ String title = vod.selectFirst("div.hl-item-title a").text();
+ String cover = vod.selectFirst(".hl-item-thumb").attr("data-original");
+ String remark = vod.selectFirst(".hl-pic-text span").text();
+ Matcher matcher = regexVid.matcher(vod.selectFirst("div.hl-item-title a").attr("href"));
+ if (!matcher.find())
+ continue;
+ String id = matcher.group(1);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", id);
+ v.put("vod_name", title);
+ v.put("vod_pic", cover);
+ v.put("vod_remarks", remark);
+ videos.put(v);
+ }
+ }
+ result.put("page", page);
+ result.put("pagecount", pageCount);
+ result.put("limit", 24);
+ result.put("total", pageCount <= 1 ? videos.length() : pageCount * 24);
+
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+
+ /**
+ * 视频详情信息
+ *
+ * @param ids 视频id
+ * @return
+ */
+ @Override
+ public String detailContent(List ids) {
+ try {
+ // 视频详情url
+ String url = siteUrl + "/index.php/vod/detail/id/" + ids.get(0) + ".html";
+ Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
+ JSONObject result = new JSONObject();
+ JSONObject vodList = new JSONObject();
+
+ // 取基本数据
+ String vid = doc.selectFirst("a.digg_link").attr("data-id");
+
+ String cover = doc.selectFirst("div.hl-dc-pic span").attr("data-original");
+ String title = doc.selectFirst("h2.hl-dc-title").text();
+ String desc = doc.selectFirst("span.hl-content-text em").text();
+ String category = "", area = "", year = "", director = "", actor = "", remark = "";
+ Elements span_text_muted = doc.select("li.hl-col-xs-12 em");
+ for (int i = 0; i < span_text_muted.size() - 2; i++) {
+ Element text = span_text_muted.get(i);
+ String info = text.text();
+ if (info.contains("类型")) {
+ try {
+ category = text.parent().select("a").text();
+ } catch (Exception e) {
+ category = "";
+ }
+ } else if (info.contains("年份")) {
+ try {
+ year = text.parent().text().split(":")[1];
+ } catch (Exception e) {
+ year = "";
+ }
+ } else if (info.contains("地区")) {
+ try {
+ area = text.parent().text().split(":")[1];
+ } catch (Exception e) {
+ area = "";
+ }
+ } else if (info.contains("上映")) {
+ try {
+ remark = text.text();
+ } catch (Exception e) {
+ remark = "";
+ }
+ } else if (info.contains("导演")) {
+ try {
+ director = text.parent().select("a").text();
+ } catch (Exception e) {
+ director = "";
+ }
+ } else if (info.contains("主演")) {
+ try {
+ actor = text.parent().select("a").text();
+ } catch (Exception e) {
+ actor = "";
+ }
+ }
+ }
+
+ vodList.put("vod_id", vid);
+ vodList.put("vod_name", title);
+ vodList.put("vod_pic", cover);
+ vodList.put("type_name", category);
+ vodList.put("vod_year", year);
+ vodList.put("vod_area", area);
+ vodList.put("vod_remarks", remark);
+ vodList.put("vod_actor", actor);
+ vodList.put("vod_director", director);
+ vodList.put("vod_content", desc);
+
+ Map vod_play = new TreeMap<>(new Comparator() {
+ @Override
+ public int compare(String o1, String o2) {
+ try {
+ int sort1 = playerConfig.getJSONObject(o1).getInt("or");
+ int sort2 = playerConfig.getJSONObject(o2).getInt("or");
+
+ if (sort1 == sort2) {
+ return 1;
+ }
+ return sort1 - sort2 > 0 ? 1 : -1;
+ } catch (JSONException e) {
+ SpiderDebug.log(e);
+ }
+ return 1;
+ }
+ });
+
+ // 取播放列表数据
+ Elements sources = doc.select("div.hl-plays-from a");
+ Elements sourceList = doc.select("div.hl-list-wrap");
+
+ for (int i = 0; i < sources.size(); i++) {
+ Element source = sources.get(i);
+ String sourceName = source.text();
+ sourceName = sourceName.replaceAll("[^\u4E00-\u9FA5]", "");
+ boolean found = false;
+ for (Iterator it = playerConfig.keys(); it.hasNext(); ) {
+ String flag = it.next();
+ if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
+ sourceName = flag;
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ continue;
+ String playList = "";
+ Elements playListA = sourceList.get(i).select("ul>li>a");
+ List vodItems = new ArrayList<>();
+
+ for (int j = 0; j < playListA.size(); j++) {
+ Element vod = playListA.get(j);
+ Matcher matcher = regexPlay.matcher(vod.attr("href"));
+ if (!matcher.find())
+ continue;
+ String playURL = matcher.group(1) + "/sid/" + matcher.group(2) + "/nid/" + matcher.group(3);
+ vodItems.add(vod.text() + "$" + playURL);
+ }
+ if (vodItems.size() > 0)
+ playList = TextUtils.join("#", vodItems);
+
+ if (playList.length() == 0)
+ continue;
+
+ vod_play.put(sourceName, playList);
+ }
+
+ if (vod_play.size() > 0) {
+ String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
+ String vod_play_url = TextUtils.join("$$$", vod_play.values());
+ vodList.put("vod_play_from", vod_play_from);
+ vodList.put("vod_play_url", vod_play_url);
+ }
+ JSONArray list = new JSONArray();
+ list.put(vodList);
+ result.put("list", list);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ /**
+ * 获取视频播放信息
+ *
+ * @param flag 播放源
+ * @param id 视频id
+ * @param vipFlags 所有可能需要vip解析的源
+ * @return
+ */
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) {
+ try {
+ // 播放页 url
+ String url = siteUrl + "/index.php/vod/play/id/" + id + ".html";
+ Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
+ Elements allScript = doc.select("script");
+ JSONObject result = new JSONObject();
+ for (int i = 0; i < allScript.size(); i++) {
+ String scContent = allScript.get(i).html().trim();
+ if (scContent.startsWith("var player_")) { // 取直链
+ int start = scContent.indexOf('{');
+ int end = scContent.lastIndexOf('}') + 1;
+ String json = scContent.substring(start, end);
+ JSONObject player = new JSONObject(json);
+ if (playerConfig.has(player.getString("from"))) {
+ JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
+ String videoUrl = player.getString("url");
+ String playUrl = pCfg.getString("pu");
+ result.put("parse", pCfg.getInt("sn"));
+ result.put("playUrl", playUrl);
+ result.put("url", videoUrl);
+ result.put("header", "");
+ }
+ break;
+ }
+ }
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) {
+ try {
+ long currentTime = System.currentTimeMillis();
+ String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime;
+ JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
+ JSONObject result = new JSONObject();
+ JSONArray videos = new JSONArray();
+ if (searchResult.getInt("total") > 0) {
+ JSONArray lists = new JSONArray(searchResult.getString("list"));
+ for (int i = 0; i < lists.length(); i++) {
+ JSONObject vod = lists.getJSONObject(i);
+ String id = vod.getString("id");
+ String title = vod.getString("name");
+ String cover = vod.getString("pic");
+ if (title.contains(key)) {
+ JSONObject v = new JSONObject();
+ v.put("vod_id", id);
+ v.put("vod_name", title);
+ v.put("vod_pic", cover);
+ v.put("vod_remarks", "");
+ videos.put(v);
+ }
+ }
+ }
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ private static String doReplaceRegex(Pattern pattern, String src) {
+ if (pattern == null)
+ return src;
+ try {
+ Matcher matcher = pattern.matcher(src);
+ if (matcher.find()) {
+ return matcher.group(1).trim();
+ }
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return src;
+ }
+}
diff --git a/app/src/main/java/com/github/catvod/spider/Init.java b/app/src/main/java/com/github/catvod/spider/Init.java
new file mode 100644
index 0000000..3337ace
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Init.java
@@ -0,0 +1,17 @@
+package com.github.catvod.spider;
+
+
+
+
+import android.content.Context;
+
+import com.github.catvod.crawler.SpiderDebug;
+import com.github.catvod.demo.MainActivity;
+
+public class Init {
+
+
+ public static void init(Context context) {
+ SpiderDebug.log("自定义爬虫代码加载成功!");
+ }
+}
diff --git a/app/src/main/java/com/github/catvod/spider/Kuaikan.java b/app/src/main/java/com/github/catvod/spider/Kuaikan.java
new file mode 100644
index 0000000..2f47a15
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Kuaikan.java
@@ -0,0 +1,681 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.text.TextUtils;
+import android.util.Base64;
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.crawler.SpiderDebug;
+import com.github.catvod.utils.Misc;
+import com.github.catvod.utils.okhttp.OKCallBack;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import java.io.ByteArrayOutputStream;
+import java.security.KeyFactory;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.UUID;
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import okhttp3.Call;
+import okhttp3.OkHttpClient;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class Kuaikan extends Spider {
+ private static String Cb;
+ private static long QH;
+ private static String dW;
+ private HashMap> Ji = new HashMap<>();
+
+ private void Q() {
+ if (System.currentTimeMillis() > QH) {
+ try {
+ JSONObject jSONObject = new JSONObject();
+ long currentTimeMillis = System.currentTimeMillis() / 1000;
+ String f = f("bf70a456195ae394184b2e0b1b471cae1000300001dc431681b806089dac1153fb13960f87" + currentTimeMillis + "notice");
+ jSONObject.put("appId", "1000300001");
+ jSONObject.put("sign", f);
+ jSONObject.put("timestamp", currentTimeMillis);
+ String O = Decrypt("bf70a456195ae394", "184b2e0b1b471cae", jSONObject.toString());
+ String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", "bf70a456195ae394184b2e0b1b471cae");
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("body", O);
+ jSONObject2.put("ticket", tg);
+ OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/user/login.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() {
+ @Override
+ public void onFailure(Call call, Exception exc) {
+ }
+
+ public void onResponse(String str) {
+ try {
+ JSONObject jSONObject3 = new JSONObject(str);
+ String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject3.getString("ticket"));
+ JSONObject jSONObject4 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject3.getString("body")));
+ long unused = Kuaikan.QH = jSONObject4.getLong("duration") * 1000;
+ String unused2 = Kuaikan.Cb = jSONObject4.getString("data");
+ Kuaikan.this.Uf();
+ } catch (JSONException e) {
+ }
+ }
+ });
+ } catch (Throwable th) {
+ th.printStackTrace();
+ }
+ }
+ }
+
+ public void Uf() {
+ try {
+ JSONObject jSONObject = new JSONObject();
+ long currentTimeMillis = System.currentTimeMillis() / 1000;
+ String f = f("1000300001dc431681b806089dac1153fb13960f8700" + dW + currentTimeMillis + "notice");
+ jSONObject.put("adv", 0);
+ jSONObject.put("appId", "1000300001");
+ jSONObject.put("nav", 0);
+ jSONObject.put("sign", f);
+ jSONObject.put("timestamp", currentTimeMillis);
+ jSONObject.put("umId", dW);
+ String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString());
+ String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("body", O);
+ jSONObject2.put("ticket", tg);
+ OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/user/config.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.1
+ @Override
+ public void onFailure(Call call, Exception exc) {
+ }
+
+ public void onResponse(String str) {
+ try {
+ JSONObject jSONObject3 = new JSONObject(str);
+ String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject3.getString("ticket"));
+ JSONArray jSONArray = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject3.getString("body"))).getJSONObject("data").getJSONArray("newAnalysis");
+ Kuaikan.this.Ji.clear();
+ for (int i = 0; i < jSONArray.length(); i++) {
+ JSONObject jSONObject4 = jSONArray.getJSONObject(i);
+ ArrayList arrayList = new ArrayList();
+ Kuaikan.this.Ji.put(jSONObject4.getString("id"), arrayList);
+ JSONArray jSONArray2 = jSONObject4.getJSONArray("analyses");
+ for (int i2 = 0; i2 < jSONArray2.length(); i2++) {
+ arrayList.add(jSONArray2.getJSONObject(i2).getString("url"));
+ }
+ }
+ } catch (JSONException e) {
+ }
+ }
+ });
+ } catch (Throwable th) {
+ th.printStackTrace();
+ }
+ }
+
+ public HashMap j(long j) {
+ HashMap hashMap = new HashMap<>();
+ hashMap.put("appId", "1000300001");
+ hashMap.put("version", "4");
+ hashMap.put("timestamp", j + "");
+ hashMap.put("token", f("1000300001dc431681b806089dac1153fb13960f874" + j + "notice"));
+ hashMap.put("User-Agent", "okhttp/5.0.0-alpha.2");
+ return hashMap;
+ }
+
+ String Decrypt(String str, String str2, String str3) {
+ try {
+ SecretKeySpec secretKeySpec = new SecretKeySpec(str.getBytes(), "AES");
+ Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+ cipher.init(1, secretKeySpec, new IvParameterSpec(str2.getBytes()));
+ return Base64.encodeToString(cipher.doFinal(str3.getBytes()), 2);
+ } catch (Throwable th) {
+ th.printStackTrace();
+ return "";
+ }
+ }
+
+ String UO(String str, String str2, String str3) {
+ try {
+ SecretKeySpec secretKeySpec = new SecretKeySpec(str.getBytes(), "AES");
+ Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+ cipher.init(2, secretKeySpec, new IvParameterSpec(str2.getBytes()));
+ return new String(cipher.doFinal(Base64.decode(str3, 0)), "UTF-8");
+ } catch (Throwable th) {
+ th.printStackTrace();
+ return "";
+ }
+ }
+
+ public String categoryContent(String str, final String str2, boolean z, HashMap hashMap) {
+ try {
+ Q();
+ int parseInt = hashMap.containsKey("areaId") ? Integer.parseInt(hashMap.get("areaId")) : 0;
+ int parseInt2 = hashMap.containsKey("tagId") ? Integer.parseInt(hashMap.get("tagId")) : 0;
+ int parseInt3 = hashMap.containsKey("yearId") ? Integer.parseInt(hashMap.get("yearId")) : 0;
+ JSONObject jSONObject = new JSONObject();
+ long currentTimeMillis = System.currentTimeMillis() / 1000;
+ String f = f("1000300001dc431681b806089dac1153fb13960f87" + str2 + 18 + str + parseInt2 + parseInt + parseInt3 + currentTimeMillis + "notice");
+ jSONObject.put("appId", "1000300001");
+ jSONObject.put("typeId", str);
+ jSONObject.put("areaId", parseInt);
+ jSONObject.put("tagId", parseInt2);
+ jSONObject.put("yearId", parseInt3);
+ jSONObject.put("page", Integer.parseInt(str2));
+ jSONObject.put("pageSize", 18);
+ jSONObject.put("sign", f);
+ jSONObject.put("timestamp", currentTimeMillis);
+ String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString());
+ String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("body", O);
+ jSONObject2.put("ticket", tg);
+ final JSONObject jSONObject3 = new JSONObject();
+ OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/search/video.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.5
+ @Override
+ public void onFailure(Call call, Exception exc) {
+ }
+
+ public void onResponse(String str3) {
+ try {
+ JSONObject jSONObject4 = new JSONObject(str3);
+ String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket"));
+ JSONObject jSONObject5 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body")));
+ JSONArray jSONArray = new JSONArray();
+ JSONArray jSONArray2 = jSONObject5.getJSONArray("results");
+ for (int i = 0; i < jSONArray2.length(); i++) {
+ JSONObject jSONObject6 = jSONArray2.getJSONObject(i);
+ JSONObject jSONObject7 = new JSONObject();
+ jSONObject7.put("vod_id", jSONObject6.getString("id"));
+ jSONObject7.put("vod_name", jSONObject6.getString("name"));
+ jSONObject7.put("vod_pic", jSONObject6.getString("pic"));
+ jSONObject7.put("vod_remarks", jSONObject6.getString("progress"));
+ jSONArray.put(jSONObject7);
+ }
+ jSONObject3.put("page", Integer.parseInt(str2));
+ int i2 = jSONObject5.getInt("count");
+ int i3 = 20;
+ jSONObject3.put("pagecount", i2 % i3 == 0 ? i2 / i3 : (i2 / i3) + 1);
+ jSONObject3.put("limit", i3);
+ jSONObject3.put("total", i2);
+ jSONObject3.put("list", jSONArray);
+ } catch (JSONException e) {
+ }
+ }
+ });
+ return jSONObject3.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+
+ public String detailContent(final List list) {
+ try {
+ Q();
+ JSONObject jSONObject = new JSONObject();
+ long currentTimeMillis = System.currentTimeMillis() / 1000;
+ String f = f("1000300001dc431681b806089dac1153fb13960f87" + list.get(0) + currentTimeMillis + "notice");
+ jSONObject.put("appId", "1000300001");
+ jSONObject.put("id", list.get(0));
+ jSONObject.put("sign", f);
+ jSONObject.put("timestamp", currentTimeMillis);
+ String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString());
+ String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("body", O);
+ jSONObject2.put("ticket", tg);
+ final JSONObject jSONObject3 = new JSONObject();
+ OkHttpClient QH2 = OkHttpUtil.defaultClient();
+ OkHttpUtil.postJson(QH2, "http://ctlook.facaishiyi.com/api/v1/video/play/" + list.get(0) + ".do ", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.6
+ @Override
+ public void onFailure(Call call, Exception exc) {
+ }
+
+ public void onResponse(String str) {
+ try {
+ JSONObject jSONObject4 = new JSONObject(str);
+ String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket"));
+ JSONObject jSONObject5 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body"))).getJSONObject("data");
+ JSONArray jSONArray = new JSONArray();
+ JSONObject jSONObject6 = new JSONObject();
+ jSONObject6.put("vod_id", jSONObject5.getString("id"));
+ jSONObject6.put("vod_name", jSONObject5.getString("name"));
+ jSONObject6.put("vod_pic", jSONObject5.getString("pic"));
+ jSONObject6.put("vod_year", jSONObject5.getString("year"));
+ jSONObject6.put("vod_remarks", jSONObject5.getString("progress"));
+ jSONObject6.put("vod_actor", jSONObject5.getString("actor"));
+ jSONObject6.put("vod_director", jSONObject5.getString("director"));
+ jSONObject6.put("vod_content", jSONObject5.getString("content").trim());
+ JSONArray jSONArray2 = new JSONArray(Kuaikan.this.UO("5551e2a82a21a9a1", "a586c5236206a2cb", jSONObject5.getString("newPlayback")));
+ LinkedHashMap linkedHashMap = new LinkedHashMap();
+ for (int i = 0; i < jSONArray2.length(); i++) {
+ JSONObject jSONObject7 = jSONArray2.getJSONObject(i);
+ String string = jSONObject7.getString("name");
+ String string2 = jSONObject7.getString("id");
+ JSONArray jSONArray3 = jSONObject7.getJSONArray("episodes");
+ ArrayList arrayList = new ArrayList();
+ for (int i2 = 0; i2 < jSONArray3.length(); i2++) {
+ JSONObject jSONObject8 = jSONArray3.getJSONObject(i2);
+ String string3 = jSONObject8.getString("title");
+ StringBuilder sb = new StringBuilder();
+ sb.append(string3);
+ sb.append("|");
+ sb.append((String) list.get(0));
+ sb.append("|");
+ sb.append(string2);
+ sb.append("|");
+ sb.append(jSONObject8.getString("url"));
+ String encodeToString = Base64.encodeToString(sb.toString().getBytes("UTF-8"), 10);
+ arrayList.add(string3 + "$" + encodeToString);
+ }
+ linkedHashMap.put(string, TextUtils.join("#", arrayList));
+ }
+ String join = TextUtils.join("$$$", linkedHashMap.keySet());
+ String join2 = TextUtils.join("$$$", linkedHashMap.values());
+ jSONObject6.put("vod_play_from", join);
+ jSONObject6.put("vod_play_url", join2);
+ jSONArray.put(jSONObject6);
+ jSONObject3.put("list", jSONArray);
+ } catch (Throwable th) {
+ }
+ }
+ });
+ return jSONObject3.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+
+ String f(String str) {
+ try {
+ byte[] digest = MessageDigest.getInstance("MD5").digest(str.getBytes());
+ StringBuilder sb = new StringBuilder();
+ for (byte b : digest) {
+ String hexString = Integer.toHexString(b & 255);
+ if (hexString.length() < 2) {
+ sb.append(0);
+ }
+ sb.append(hexString);
+ }
+ return sb.toString().toLowerCase();
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ return "";
+ }
+ }
+
+ public String homeContent(boolean z) {
+ try {
+ Q();
+ JSONObject jSONObject = new JSONObject();
+ long currentTimeMillis = System.currentTimeMillis() / 1000;
+ String f = f("1000300001dc431681b806089dac1153fb13960f87" + currentTimeMillis + "notice");
+ jSONObject.put("appId", "1000300001");
+ jSONObject.put("sign", f);
+ jSONObject.put("timestamp", currentTimeMillis);
+ String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString());
+ String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("body", O);
+ jSONObject2.put("ticket", tg);
+ final JSONObject jSONObject3 = new JSONObject();
+ final JSONArray jSONArray = new JSONArray();
+ OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/user/genres.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.3
+ @Override
+ public void onFailure(Call call, Exception exc) {
+ }
+
+ public void onResponse(String str) {
+ try {
+ JSONObject jSONObject4 = new JSONObject(str);
+ String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket"));
+ JSONArray jSONArray2 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body"))).getJSONArray("genres");
+ for (int i = 0; i < jSONArray2.length(); i++) {
+ JSONObject jSONObject5 = jSONArray2.getJSONObject(i);
+ String string = jSONObject5.getString("name");
+ final int i2 = jSONObject5.getInt("typeId");
+ if (i2 > 0) {
+ JSONObject jSONObject6 = new JSONObject();
+ jSONObject6.put("type_id", i2 + "");
+ jSONObject6.put("type_name", string);
+ jSONArray.put(jSONObject6);
+ JSONObject jSONObject7 = new JSONObject();
+ long currentTimeMillis2 = System.currentTimeMillis() / 1000;
+ Kuaikan kuaikan = Kuaikan.this;
+ String f2 = kuaikan.f("1000300001dc431681b806089dac1153fb13960f87" + i2 + currentTimeMillis2 + "notice");
+ jSONObject7.put("appId", "1000300001");
+ jSONObject7.put("tid", i2);
+ jSONObject7.put("sign", f2);
+ jSONObject7.put("timestamp", currentTimeMillis2);
+ String O2 = Kuaikan.this.Decrypt(Kuaikan.Cb.substring(0, 16), Kuaikan.Cb.substring(16, 32), jSONObject7.toString());
+ String tg2 = Kuaikan.this.tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Kuaikan.Cb);
+ JSONObject jSONObject8 = new JSONObject();
+ jSONObject8.put("body", O2);
+ jSONObject8.put("ticket", tg2);
+ new JSONArray();
+ OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/search/category.do", jSONObject8.toString(), Kuaikan.this.j(currentTimeMillis2), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.3.1
+ @Override
+ public void onFailure(Call call, Exception exc) {
+ }
+
+ public void onResponse(String str2) {
+ try {
+ JSONObject jSONObject9 = new JSONObject(str2);
+ String lX2 = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject9.getString("ticket"));
+ JSONObject jSONObject10 = new JSONObject(Kuaikan.this.UO(lX2.substring(0, 16), lX2.substring(16, 32), jSONObject9.getString("body")));
+ JSONArray jSONArray3 = jSONObject10.getJSONArray("areas");
+ JSONArray jSONArray4 = jSONObject10.getJSONArray("years");
+ JSONArray jSONArray5 = jSONObject10.getJSONArray("tags");
+ JSONArray jSONArray6 = new JSONArray();
+ JSONObject jSONObject11 = new JSONObject();
+ jSONObject11.put("key", "tagId");
+ jSONObject11.put("name", "类型");
+ JSONArray jSONArray7 = new JSONArray();
+ for (int i3 = 0; i3 < jSONArray5.length(); i3++) {
+ JSONObject jSONObject12 = jSONArray5.getJSONObject(i3);
+ JSONObject jSONObject13 = new JSONObject();
+ jSONObject13.put("n", jSONObject12.getString("name"));
+ jSONObject13.put("v", jSONObject12.getString("id"));
+ jSONArray7.put(jSONObject13);
+ }
+ jSONObject11.put("value", jSONArray7);
+ jSONArray6.put(jSONObject11);
+ JSONObject jSONObject14 = new JSONObject();
+ jSONObject14.put("key", "areaId");
+ jSONObject14.put("name", "地区");
+ JSONArray jSONArray8 = new JSONArray();
+ for (int i4 = 0; i4 < jSONArray3.length(); i4++) {
+ JSONObject jSONObject15 = jSONArray3.getJSONObject(i4);
+ JSONObject jSONObject16 = new JSONObject();
+ jSONObject16.put("n", jSONObject15.getString("name"));
+ jSONObject16.put("v", jSONObject15.getString("id"));
+ jSONArray8.put(jSONObject16);
+ }
+ jSONObject14.put("value", jSONArray8);
+ jSONArray6.put(jSONObject14);
+ JSONObject jSONObject17 = new JSONObject();
+ jSONObject17.put("key", "yearId");
+ jSONObject17.put("name", "年份");
+ JSONArray jSONArray9 = new JSONArray();
+ for (int i5 = 0; i5 < jSONArray4.length(); i5++) {
+ JSONObject jSONObject18 = jSONArray4.getJSONObject(i5);
+ JSONObject jSONObject19 = new JSONObject();
+ jSONObject19.put("n", jSONObject18.getString("name"));
+ jSONObject19.put("v", jSONObject18.getString("id"));
+ jSONArray9.put(jSONObject19);
+ }
+ jSONObject17.put("value", jSONArray9);
+ jSONArray6.put(jSONObject17);
+ jSONObject3.put(i2 + "", jSONArray6);
+ } catch (JSONException e) {
+ }
+ }
+ });
+ }
+ }
+ } catch (JSONException e) {
+ }
+ }
+ });
+ JSONObject jSONObject4 = new JSONObject();
+ jSONObject4.put("class", jSONArray);
+ if (z) {
+ jSONObject4.put("filters", jSONObject3);
+ }
+ return jSONObject4.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+
+ public String homeVideoContent() {
+ try {
+ Q();
+ JSONObject jSONObject = new JSONObject();
+ long currentTimeMillis = System.currentTimeMillis() / 1000;
+ String f = f("1000300001dc431681b806089dac1153fb13960f87115" + currentTimeMillis + "notice");
+ jSONObject.put("appId", "1000300001");
+ jSONObject.put("id", 115);
+ jSONObject.put("sign", f);
+ jSONObject.put("timestamp", currentTimeMillis);
+ String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString());
+ String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("body", O);
+ jSONObject2.put("ticket", tg);
+ final JSONArray jSONArray = new JSONArray();
+ OkHttpClient QH2 = OkHttpUtil.defaultClient();
+ OkHttpUtil.postJson(QH2, "http://ctlook.facaishiyi.com/api/v1/user/genre/115.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.4
+ @Override
+ public void onFailure(Call call, Exception exc) {
+ }
+
+ public void onResponse(String str) {
+ try {
+ JSONObject jSONObject3 = new JSONObject(str);
+ String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject3.getString("ticket"));
+ JSONArray jSONArray2 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject3.getString("body"))).getJSONArray("subGenres");
+ for (int i = 0; i < jSONArray2.length(); i++) {
+ if (jSONArray2.getJSONObject(i).getInt("template") == 1) {
+ JSONArray jSONArray3 = jSONArray2.getJSONObject(i).getJSONArray("video");
+ for (int i2 = 0; i2 < jSONArray3.length(); i2++) {
+ JSONObject jSONObject4 = jSONArray3.getJSONObject(i2);
+ JSONObject jSONObject5 = new JSONObject();
+ jSONObject5.put("vod_id", jSONObject4.getString("id"));
+ jSONObject5.put("vod_name", jSONObject4.getString("name"));
+ jSONObject5.put("vod_pic", jSONObject4.getString("pic"));
+ jSONObject5.put("vod_remarks", jSONObject4.getString("progress"));
+ jSONArray.put(jSONObject5);
+ }
+ }
+ }
+ } catch (JSONException e) {
+ }
+ }
+ });
+ JSONObject jSONObject3 = new JSONObject();
+ jSONObject3.put("list", jSONArray);
+ return jSONObject3.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+
+ public void init(Context context, String str) {
+ Kuaikan.super.init(context, str);
+ SharedPreferences sharedPreferences = context.getSharedPreferences("spider_Kuaikan", 0);
+ try {
+ String string = sharedPreferences.getString("umId", null);
+ dW = string;
+ if (string != null) {
+ return;
+ }
+ } catch (Throwable th) {
+ if (dW != null) {
+ return;
+ }
+ }
+ dW = f(UUID.randomUUID().toString()).toLowerCase();
+ sharedPreferences.edit().putString("umId", dW).commit();
+ }
+
+ String lX(String str, String str2) {
+ int i = 0;
+ try {
+ Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+ cipher.init(2, (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode(str, 0))));
+ byte[] decode = Base64.decode(str2, 0);
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ if (decode.length <= 256) {
+ byteArrayOutputStream.write(cipher.doFinal(decode));
+ } else {
+ int length = decode.length;
+ while (i < length) {
+ int i2 = i + 256;
+ byteArrayOutputStream.write(cipher.doFinal(decode, i, i2 > length ? length - i : 256));
+ i = i2;
+ }
+ }
+ byteArrayOutputStream.flush();
+ byteArrayOutputStream.close();
+ return new String(byteArrayOutputStream.toByteArray(), "UTF-8");
+ } catch (Exception e) {
+ return "";
+ }
+ }
+
+ public String playerContent(String str, String str2, List list) {
+ try {
+ Q();
+ String[] split = new String(Base64.decode(str2, 10), "UTF-8").split("\\|");
+ ArrayList arrayList = this.Ji.get(split[2]);
+ final JSONObject jSONObject = new JSONObject();
+ if (arrayList != null && arrayList.size() > 0) {
+ Iterator it = arrayList.iterator();
+ while (it.hasNext()) {
+ String next = it.next();
+ if (jSONObject.has("url")) {
+ break;
+ }
+ JSONObject jSONObject2 = new JSONObject();
+ long currentTimeMillis = System.currentTimeMillis() / 1000;
+ String f = f("1000300001dc431681b806089dac1153fb13960f87" + split[1] + split[0] + split[3] + currentTimeMillis + "notice");
+ jSONObject2.put("appId", "1000300001");
+ jSONObject2.put("id", split[1]);
+ jSONObject2.put("title", split[0]);
+ jSONObject2.put("url", split[3]);
+ jSONObject2.put("sign", f);
+ jSONObject2.put("timestamp", currentTimeMillis);
+ String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject2.toString());
+ String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
+ JSONObject jSONObject3 = new JSONObject();
+ jSONObject3.put("body", O);
+ jSONObject3.put("ticket", tg);
+ OkHttpUtil.postJson(OkHttpUtil.defaultClient(), next, jSONObject3.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.7
+ @Override // com.github.catvod.spider.merge.OKCallBack
+ public void onFailure(Call call, Exception exc) {
+ }
+
+ public void onResponse(String str3) {
+ try {
+ JSONObject jSONObject4 = new JSONObject(str3);
+ String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket"));
+ JSONObject jSONObject5 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body")));
+ if (jSONObject5.optString("msg", "").equals("success") && jSONObject5.optInt("code", -1) == 0) {
+ jSONObject.put("parse", 0);
+ jSONObject.put("header", "");
+ jSONObject.put("playUrl", "");
+ jSONObject.put("url", jSONObject5.getString("url"));
+ }
+ } catch (JSONException e) {
+ }
+ }
+ });
+ }
+ }
+ if (jSONObject.has("url")) {
+ return jSONObject.toString();
+ }
+ if (!Misc.isVideoFormat(split[3])) {
+ return "";
+ }
+ jSONObject.put("parse", 0);
+ jSONObject.put("header", "");
+ jSONObject.put("playUrl", "");
+ jSONObject.put("url", split[3]);
+ return jSONObject.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+
+ public String searchContent(String str, boolean z) {
+ try {
+ Q();
+ JSONObject jSONObject = new JSONObject();
+ long currentTimeMillis = System.currentTimeMillis() / 1000;
+ String f = f("1000300001dc431681b806089dac1153fb13960f87112" + str + currentTimeMillis + "notice");
+ jSONObject.put("appId", "1000300001");
+ jSONObject.put("keyword", str);
+ jSONObject.put("page", 1);
+ jSONObject.put("pageSize", 12);
+ jSONObject.put("sign", f);
+ jSONObject.put("timestamp", currentTimeMillis);
+ String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString());
+ String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("body", O);
+ jSONObject2.put("ticket", tg);
+ final JSONObject jSONObject3 = new JSONObject();
+ OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/search/page.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.8
+ @Override
+ public void onFailure(Call call, Exception exc) {
+ }
+
+ public void onResponse(String str2) {
+ try {
+ JSONObject jSONObject4 = new JSONObject(str2);
+ String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket"));
+ JSONObject jSONObject5 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body")));
+ JSONArray jSONArray = new JSONArray();
+ JSONArray jSONArray2 = jSONObject5.getJSONArray("results");
+ for (int i = 0; i < jSONArray2.length(); i++) {
+ JSONObject jSONObject6 = jSONArray2.getJSONObject(i);
+ JSONObject jSONObject7 = new JSONObject();
+ jSONObject7.put("vod_id", jSONObject6.getString("id"));
+ jSONObject7.put("vod_name", jSONObject6.getString("name"));
+ jSONObject7.put("vod_pic", jSONObject6.getString("pic"));
+ jSONArray.put(jSONObject7);
+ }
+ jSONObject3.put("list", jSONArray);
+ } catch (JSONException e) {
+ }
+ }
+ });
+ return jSONObject3.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+
+ String tg(String str, String str2) {
+ int i = 0;
+ try {
+ PrivateKey generatePrivate = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(Base64.decode(str, 0)));
+ Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+ cipher.init(1, generatePrivate);
+ byte[] bytes = str2.getBytes();
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ if (bytes.length <= 256) {
+ byteArrayOutputStream.write(cipher.doFinal(bytes));
+ } else {
+ int length = bytes.length;
+ while (i < bytes.length) {
+ int i2 = i + 256;
+ byteArrayOutputStream.write(cipher.doFinal(bytes, i, i2 > length ? length - i : 256));
+ i = i2;
+ }
+ }
+ byteArrayOutputStream.flush();
+ byteArrayOutputStream.close();
+ return Base64.encodeToString(byteArrayOutputStream.toByteArray(), 2);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "";
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/catvod/spider/Kunyu77.java b/app/src/main/java/com/github/catvod/spider/Kunyu77.java
new file mode 100644
index 0000000..ef6d1ff
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Kunyu77.java
@@ -0,0 +1,370 @@
+package com.github.catvod.spider;
+
+import android.os.Build;
+import android.text.TextUtils;
+
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.crawler.SpiderDebug;
+import com.github.catvod.utils.Misc;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Set;
+
+
+/**
+ * Author: @SDL
+ */
+public class Kunyu77 extends Spider {
+ private static final String siteUrl = "http://api.kunyu77.com";
+
+ private String uAgent = "Dalvik/2.1.0 (Linux; U; Android " + Build.VERSION.RELEASE + "; " + Build.MODEL + " Build/" + Build.ID + ")";
+
+ private HashMap getHeaders(String url) {
+ HashMap headers = new HashMap<>();
+ headers.put("user-agent", uAgent);
+ return headers;
+ }
+
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ String url = siteUrl + "/api.php/provide/filter";
+ String content = OkHttpUtil.string(url, getHeaders(url));
+ JSONObject jsonObject = new JSONObject(decryptResponse(content)).getJSONObject("data");
+ Iterator keys = jsonObject.keys();
+ JSONArray classes = new JSONArray();
+ JSONObject filterConfig = new JSONObject();
+ JSONArray extendsAll = null;
+ while (keys.hasNext()) {
+ String typeId = keys.next();
+ String typeName = jsonObject.getJSONArray(typeId).getJSONObject(0).getString("cat");
+ JSONObject newCls = new JSONObject();
+ newCls.put("type_id", typeId);
+ newCls.put("type_name", typeName);
+ classes.put(newCls);
+ try {
+ if (extendsAll == null) {
+ String filterUrl = siteUrl + "/api.php/provide/searchFilter?type_id=0&pagenum=1&pagesize=1";
+ String filterContent = OkHttpUtil.string(filterUrl, getHeaders(filterUrl));
+ JSONObject filterObj = new JSONObject(filterContent).getJSONObject("data").getJSONObject("conditions");
+ extendsAll = new JSONArray();
+ // 年份
+ JSONObject newTypeExtend = new JSONObject();
+ newTypeExtend.put("key", "year");
+ newTypeExtend.put("name", "年份");
+ JSONArray newTypeExtendKV = new JSONArray();
+ JSONObject kv = new JSONObject();
+ kv.put("n", "全部");
+ kv.put("v", "");
+ newTypeExtendKV.put(kv);
+ kv = new JSONObject();
+ kv.put("n", "2022");
+ kv.put("v", "2022");
+ newTypeExtendKV.put(kv);
+ kv = new JSONObject();
+ kv.put("n", "2021");
+ kv.put("v", "2021");
+ newTypeExtendKV.put(kv);
+ JSONArray years = filterObj.getJSONArray("y");
+ for (int j = 0; j < years.length(); j++) {
+ JSONObject child = years.getJSONObject(j);
+ kv = new JSONObject();
+ kv.put("n", child.getString("name"));
+ kv.put("v", child.getString("value"));
+ newTypeExtendKV.put(kv);
+ }
+ newTypeExtend.put("value", newTypeExtendKV);
+ extendsAll.put(newTypeExtend);
+ // 地区
+ newTypeExtend = new JSONObject();
+ newTypeExtend.put("key", "area");
+ newTypeExtend.put("name", "地区");
+ newTypeExtendKV = new JSONArray();
+ kv = new JSONObject();
+ kv.put("n", "全部");
+ kv.put("v", "");
+ newTypeExtendKV.put(kv);
+ JSONArray areas = filterObj.getJSONArray("a");
+ for (int j = 0; j < areas.length(); j++) {
+ JSONObject child = areas.getJSONObject(j);
+ kv = new JSONObject();
+ kv.put("n", child.getString("name"));
+ kv.put("v", child.getString("value"));
+ newTypeExtendKV.put(kv);
+ }
+ newTypeExtend.put("value", newTypeExtendKV);
+ extendsAll.put(newTypeExtend);
+ // 类型
+ newTypeExtend = new JSONObject();
+ newTypeExtend.put("key", "category");
+ newTypeExtend.put("name", "类型");
+ newTypeExtendKV = new JSONArray();
+ kv = new JSONObject();
+ kv.put("n", "全部");
+ kv.put("v", "");
+ newTypeExtendKV.put(kv);
+ JSONArray scat = filterObj.getJSONArray("scat");
+ for (int j = 0; j < scat.length(); j++) {
+ JSONObject child = scat.getJSONObject(j);
+ kv = new JSONObject();
+ kv.put("n", child.getString("name"));
+ kv.put("v", child.getString("value"));
+ newTypeExtendKV.put(kv);
+ }
+ newTypeExtend.put("value", newTypeExtendKV);
+ extendsAll.put(newTypeExtend);
+ }
+ if (extendsAll != null && extendsAll.length() > 0) {
+ filterConfig.put(typeId, extendsAll);
+ }
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ }
+ JSONObject result = new JSONObject();
+ result.put("class", classes);
+ if (filter) {
+ result.put("filters", filterConfig);
+ }
+ return result.toString();
+ } catch (Throwable th) {
+
+ }
+ return "";
+ }
+
+ @Override
+ public String homeVideoContent() {
+ try {
+ JSONArray videos = new JSONArray();
+ try {
+ String url = siteUrl + "/api.php/provide/homeBlock?type_id=0";
+ String content = OkHttpUtil.string(url, getHeaders(url));
+ JSONObject jsonObject = new JSONObject(decryptResponse(content));
+ JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("blocks");
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject blockObj = jsonArray.getJSONObject(i);
+ String blockName = blockObj.getString("block_name");
+ if (!blockName.startsWith("热播")) {
+ continue;
+ }
+ JSONArray contents = blockObj.getJSONArray("contents");
+ for (int j = 0; j < contents.length() && j < 3; j++) {
+ JSONObject vObj = contents.getJSONObject(j);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vObj.getString("id"));
+ v.put("vod_name", vObj.getString("title"));
+ v.put("vod_pic", vObj.getString("videoCover"));
+ v.put("vod_remarks", vObj.getString("msg"));
+ videos.put(v);
+ }
+ }
+ } catch (Exception e) {
+
+ }
+ JSONObject result = new JSONObject();
+ result.put("list", videos);
+ return result.toString();
+ } catch (Throwable th) {
+
+ }
+ return "";
+ }
+
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) {
+ try {
+ String url = siteUrl + "/api.php/provide/searchFilter?type_id=" + tid + "&pagenum=" + pg + "&pagesize=24";
+ Set keys = extend.keySet();
+ for (String key : keys) {
+ String val = extend.get(key).trim();
+ if (val.length() == 0)
+ continue;
+ url += "&" + key + "=" + URLEncoder.encode(val);
+ }
+ String content = OkHttpUtil.string(url, getHeaders(url));
+ JSONObject dataObject = new JSONObject(decryptResponse(content)).getJSONObject("data");
+ JSONArray jsonArray = dataObject.getJSONArray("result");
+ JSONArray videos = new JSONArray();
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject vObj = jsonArray.getJSONObject(i);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vObj.getString("id"));
+ v.put("vod_name", vObj.getString("title"));
+ v.put("vod_pic", vObj.getString("videoCover"));
+ v.put("vod_remarks", vObj.getString("msg"));
+ videos.put(v);
+ }
+ JSONObject result = new JSONObject();
+ int limit = 24;
+ int page = Integer.parseInt(dataObject.getString("page"));
+ int total = dataObject.getInt("total");
+ int pageCount = dataObject.getInt("pagesize");
+ result.put("page", page);
+ result.put("pagecount", pageCount);
+ result.put("limit", limit);
+ result.put("total", total);
+ result.put("list", videos);
+ return result.toString();
+ } catch (Throwable th) {
+
+ }
+ return "";
+ }
+
+ @Override
+ public String detailContent(List ids) {
+ try {
+ String url = siteUrl + "/api.php/provide/videoDetail?ids=" + ids.get(0);
+ String content = OkHttpUtil.string(url, getHeaders(url));
+ JSONObject dataObject = new JSONObject(decryptResponse(content));
+ JSONObject vObj = dataObject.getJSONObject("data");
+ JSONObject result = new JSONObject();
+ JSONArray list = new JSONArray();
+ JSONObject vodAtom = new JSONObject();
+ String title = vObj.getString("videoName");
+ vodAtom.put("vod_id", vObj.getString("id"));
+ vodAtom.put("vod_name", title);
+ vodAtom.put("vod_pic", vObj.getString("videoCover"));
+ vodAtom.put("type_name", vObj.getString("subCategory"));
+ vodAtom.put("vod_year", vObj.getString("year"));
+ vodAtom.put("vod_area", vObj.getString("area"));
+ vodAtom.put("vod_remarks", vObj.getString("msg"));
+ vodAtom.put("vod_actor", vObj.getString("actor"));
+ vodAtom.put("vod_director", vObj.getString("director"));
+ vodAtom.put("vod_content", vObj.getString("brief").trim());
+
+ url = siteUrl + "/api.php/provide/videoPlaylist?ids=" + ids.get(0);
+ content = OkHttpUtil.string(url, getHeaders(url));
+ JSONArray episodes = new JSONObject(content).getJSONObject("data").getJSONArray("episodes");
+ LinkedHashMap> playlist = new LinkedHashMap<>();
+ for (int i = 0; i < episodes.length(); i++) {
+ JSONArray playurls = episodes.getJSONObject(i).getJSONArray("playurls");
+ for (int j = 0; j < playurls.length(); j++) {
+ JSONObject purl = playurls.getJSONObject(j);
+ String from = purl.getString("playfrom");
+ ArrayList urls = playlist.get(from);
+ if (urls == null) {
+ urls = new ArrayList<>();
+ playlist.put(from, urls);
+ }
+ String name = purl.getString("title").replace(title, "").trim();
+ if (name.isEmpty()) {
+ name = (i + 1) + "";
+ }
+ String pid = purl.getString("playurl");
+ urls.add(name + "$" + pid);
+ }
+ }
+ String vod_play_from = TextUtils.join("$$$", playlist.keySet());
+ StringBuilder sb = new StringBuilder();
+ Iterator> iter = playlist.values().iterator();
+ short fromSize = (short) playlist.size();
+ while (iter.hasNext()) {
+ fromSize--;
+ ArrayList urls = iter.next();
+ sb.append(TextUtils.join("#", urls));
+ if (fromSize > 0)
+ sb.append("$$$");
+ }
+ vodAtom.put("vod_play_from", vod_play_from);
+ vodAtom.put("vod_play_url", sb.toString());
+ list.put(vodAtom);
+ result.put("list", list);
+ return result.toString();
+ } catch (Throwable th) {
+
+ }
+ return "";
+ }
+
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) {
+ try {
+ String videoUrl = id;
+ try {
+ String url = siteUrl + "/api.php/provide/parserUrl?url=" + id;
+ String content = OkHttpUtil.string(url, getHeaders(url));
+ JSONObject dataObj = new JSONObject(decryptResponse(content)).getJSONObject("data");
+ JSONObject playHeader = dataObj.optJSONObject("playHeader");
+ String jxUrl = dataObj.getString("url");
+ content = OkHttpUtil.string(jxUrl, getHeaders(jxUrl));
+ JSONObject result = Misc.jsonParse(jxUrl, content);
+ if (result != null) {
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ if (playHeader != null) {
+ JSONObject header = result.getJSONObject("header");
+ Iterator iter = playHeader.keys();
+ while (iter.hasNext()) {
+ String key = iter.next();
+ header.put(key, " " + playHeader.getString(key));
+ }
+ result.put("header", header.toString());
+ }
+ return result.toString();
+ }
+ } catch (Throwable th) {
+
+ }
+ if (Misc.isVip(videoUrl)) {
+ JSONObject result = new JSONObject();
+ result.put("parse", 1);
+ result.put("jx", "1");
+ result.put("url", videoUrl);
+ return result.toString();
+ }
+ JSONObject result = new JSONObject();
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", id);
+ return result.toString();
+ } catch (Throwable th) {
+
+ }
+ return "";
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) {
+ try {
+ String url = siteUrl + "/api.php/provide/searchVideo?searchName=" + URLEncoder.encode(key);
+ String content = OkHttpUtil.string(url, getHeaders(url));
+ JSONObject dataObject = new JSONObject(decryptResponse(content));
+ JSONArray jsonArray = dataObject.getJSONArray("data");
+ JSONArray videos = new JSONArray();
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject vObj = jsonArray.getJSONObject(i);
+ JSONObject v = new JSONObject();
+ String title = vObj.getString("videoName");
+ if (!title.contains(key))
+ continue;
+ v.put("vod_id", vObj.getString("id"));
+ v.put("vod_name", title);
+ v.put("vod_pic", vObj.getString("videoCover"));
+ v.put("vod_remarks", vObj.getString("msg"));
+ videos.put(v);
+ }
+ JSONObject result = new JSONObject();
+ result.put("list", videos);
+ return result.toString();
+ } catch (Throwable th) {
+
+ }
+ return "";
+ }
+
+ protected String decryptResponse(String src) {
+ return src;
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/catvod/spider/Lib.java b/app/src/main/java/com/github/catvod/spider/Lib.java
new file mode 100644
index 0000000..9eb5235
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Lib.java
@@ -0,0 +1,504 @@
+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.utils.okhttp.OkHttpUtil;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class Lib extends Spider {
+ private static final String siteUrl = "https://www.libvio.me/";
+ private static final String siteHost = "www.libvio.me";
+
+ /**
+ * 播放源配置
+ */
+ private JSONObject playerConfig;
+ /**
+ * 筛选配置
+ */
+ private JSONObject filterConfig;
+ private Pattern regexCategory = Pattern.compile("/type/(\\d+).html");
+ private Pattern regexVid = Pattern.compile("/detail/(\\d+).html");
+ private Pattern regexPlay = Pattern.compile("/play/(\\d+)-(\\d+)-(\\d+).html");
+ private Pattern regexPage = Pattern.compile("/show/(\\S+).html");
+
+ protected String ext = null;
+
+ @Override
+ public void init(Context context) {
+ super.init(context);
+ try {
+ playerConfig = new JSONObject("{\"LINE405\":{\"sh\":\"LINE405\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/lb.php?url=\",\"sn\":1,\"or\":999},\"LINE406\":{\"sh\":\"LINE406\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/zm.php?url=\",\"sn\":1,\"or\":999},\"LINE407\":{\"sh\":\"LINE407\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/lb.php?url=\",\"sn\":1,\"or\":999},\"LINE408\":{\"sh\":\"LINE408\",\"pu\":\"\",\"sn\":0,\"or\":999},\"p300\":{\"sh\":\"LINE300\",\"pu\":\"\",\"sn\":0,\"or\":999},\"p301\":{\"sh\":\"LINE301\",\"pu\":\"\",\"sn\":0,\"or\":999},\"line402-日语\":{\"sh\":\"LINE402\",\"pu\":\"\",\"sn\":0,\"or\":999},\"LINE400\":{\"sh\":\"LINE400\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/lb.php?url=\",\"sn\":1,\"or\":999},\"line401\":{\"sh\":\"LINE401\",\"pu\":\"\",\"sn\":0,\"or\":999}}");
+ filterConfig = new JSONObject("{\"1\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"泰语\",\"v\":\"泰语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印度语\",\"v\":\"印度语\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"西班牙语\",\"v\":\"西班牙语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"泰语\",\"v\":\"泰语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印度语\",\"v\":\"印度语\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"西班牙语\",\"v\":\"西班牙语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国\",\"v\":\"中国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"15\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"16\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
+ } catch (JSONException e) {
+ SpiderDebug.log(e);
+ }
+ }
+
+
+ protected static HashMap Headers() {
+ HashMap headers = new HashMap<>();
+ headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36");
+ headers.put("Referer", siteUrl);
+ return headers;
+ }
+
+ /**
+ * 爬虫headers
+ *
+ * @param url
+ * @return
+ */
+ protected HashMap getHeaders(String url) {
+ HashMap headers = new HashMap<>();
+ headers.put("method", "GET");
+ headers.put("Upgrade-Insecure-Requests", "1");
+ headers.put("DNT", "1");
+ headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
+ headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
+ headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
+ return headers;
+ }
+
+ /**
+ * 获取分类数据 + 首页最近更新视频列表数据
+ *
+ * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
+ * @return
+ */
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
+ // 分类节点
+ Elements elements = doc.select("ul.stui-header__menu li a");
+ JSONArray classes = new JSONArray();
+ for (Element ele : elements) {
+ String name = ele.text();
+ boolean show = name.equals("电影") ||
+ name.equals("剧集") ||
+ name.equals("动漫") ||
+ name.equals("日韩剧") ||
+ name.equals("欧美剧");
+ if (show) {
+ Matcher mather = regexCategory.matcher(ele.attr("href"));
+ if (!mather.find())
+ continue;
+ // 把分类的id和名称取出来加到列表里
+ String id = mather.group(1).trim();
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("type_id", id);
+ jsonObject.put("type_name", name);
+ classes.put(jsonObject);
+ }
+ }
+ JSONObject result = new JSONObject();
+ if (filter) {
+ result.put("filters", filterConfig);
+ }
+ result.put("class", classes);
+ try {
+ // 取首页推荐视频列表
+ Element homeList = doc.select("ul.stui-vodlist").get(0);
+ Elements list = homeList.select("div.stui-vodlist__box");
+ JSONArray videos = new JSONArray();
+ for (int i = 0; i < list.size(); i++) {
+ Element vod = list.get(i);
+ String title = vod.select("a").attr("title");
+ String cover = vod.select("a").attr("data-original");
+ String remark = vod.select("a .pic-text").text();
+ Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
+ if (!matcher.find())
+ continue;
+ String id = matcher.group(1);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", id);
+ v.put("vod_name", title);
+ v.put("vod_pic", cover);
+ v.put("vod_remarks", remark);
+ videos.put(v);
+ }
+ result.put("list", videos);
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ /**
+ * 获取分类信息数据
+ *
+ * @param tid 分类id
+ * @param pg 页数
+ * @param filter 同homeContent方法中的filter
+ * @param extend 筛选参数{k:v, k1:v1}
+ * @return
+ */
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) {
+ try {
+ String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
+ urlParams[0] = tid;
+ urlParams[8] = pg;
+ if (extend != null && extend.size() > 0) {
+ for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) {
+ String key = it.next();
+ String value = extend.get(key);
+ urlParams[Integer.parseInt(key)] = URLEncoder.encode(value);
+ }
+ }
+ // 获取分类数据的url
+ String url = siteUrl + "show/" + TextUtils.join("-", urlParams) + ".html";
+ String html = OkHttpUtil.string(url, getHeaders(url));
+ Document doc = Jsoup.parse(html);
+ JSONObject result = new JSONObject();
+ int pageCount = 0;
+ int page = -1;
+
+ // 取页码相关信息
+ Elements pageInfo = doc.select("ul.stui-page__item li");
+ if (pageInfo.size() == 0) {
+ page = Integer.parseInt(pg);
+ pageCount = page;
+ } else {
+ for (int i = 0; i < pageInfo.size(); i++) {
+ Element li = pageInfo.get(i);
+ Element a = li.selectFirst("a");
+ if (a == null)
+ continue;
+ String name = a.text();
+ if (page == -1 && li.hasClass("active")) {
+ Matcher matcher = regexPage.matcher(a.attr("href"));
+ if (matcher.find()) {
+ //System.out.println("哈哈"+matcher.group(1));
+ page = Integer.parseInt(matcher.group(1).split("-")[8]);
+ } else {
+ page = 0;
+ }
+ }
+ if (name.equals("尾页")) {
+ Matcher matcher = regexPage.matcher(a.attr("href"));
+ if (matcher.find()) {
+ //System.out.println("尾页" + matcher.group(1));
+ pageCount = Integer.parseInt(matcher.group(1).split("-")[8]);
+ } else {
+ pageCount = 0;
+ }
+ break;
+ }
+ }
+ }
+
+ JSONArray videos = new JSONArray();
+ if (!html.contains("没有找到您想要的结果哦")) {
+ // 取当前分类页的视频列表
+ Elements list = doc.select("div.stui-vodlist__box");
+ for (int i = 0; i < list.size(); i++) {
+ Element vod = list.get(i);
+ String title = vod.select("a").attr("title");
+ String cover = vod.select("a").attr("data-original");
+ String remark = vod.select("a .pic-text").text();
+ Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
+ if (!matcher.find())
+ continue;
+ String id = matcher.group(1);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", id);
+ v.put("vod_name", title);
+ v.put("vod_pic", cover);
+ v.put("vod_remarks", remark);
+ videos.put(v);
+ }
+ }
+ result.put("page", page);
+ result.put("pagecount", pageCount);
+ result.put("limit", 48);
+ result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48);
+
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ /**
+ * 视频详情信息
+ *
+ * @param ids 视频id
+ * @return
+ */
+ @Override
+ public String detailContent(List ids) {
+ try {
+ // 视频详情url
+ String url = siteUrl + "/detail/" + ids.get(0) + ".html";
+ Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
+ JSONObject result = new JSONObject();
+ JSONObject vodList = new JSONObject();
+
+ // 取基本数据
+ String cover = doc.select("div.stui-content__thumb a img").attr("data-original");
+ String title = doc.select("div.stui-content__detail h1").text();
+ String category = "", area = "", year = "", remark = "", director = "", actor = "", desc = "";
+ Elements data = doc.select("p.data");
+ Pattern cate = Pattern.compile("类型:(\\S+)");
+ category = doReplaceRegex(cate, data.get(0).text());
+ Pattern areas = Pattern.compile("地区:(\\S+)");
+ area = doReplaceRegex(areas, data.get(0).text());
+ Pattern years = Pattern.compile("年份:(\\S+)");
+ year = doReplaceRegex(years, data.get(0).text());
+ Pattern rms = Pattern.compile("更新:(\\S+)");
+ remark = doReplaceRegex(rms, data.get(3).text());
+ Pattern acs = Pattern.compile("主演:(\\S+)");
+ actor = doReplaceRegex(acs, data.get(1).text());
+ Pattern dis = Pattern.compile("导演:(\\S+)");
+ director = doReplaceRegex(dis, data.get(1).text());
+
+ desc = doc.selectFirst("span.detail-content").text().trim();
+
+ vodList.put("vod_id", ids.get(0));
+ vodList.put("vod_name", title);
+ vodList.put("vod_pic", cover);
+ vodList.put("type_name", category);
+ vodList.put("vod_year", year);
+ vodList.put("vod_area", area);
+ vodList.put("vod_remarks", remark);
+ vodList.put("vod_actor", actor);
+ vodList.put("vod_director", director);
+ vodList.put("vod_content", desc);
+
+ Map vod_play = new TreeMap<>(new Comparator() {
+ @Override
+ public int compare(String o1, String o2) {
+ try {
+ int sort1 = playerConfig.getJSONObject(o1).getInt("or");
+ int sort2 = playerConfig.getJSONObject(o2).getInt("or");
+
+ if (sort1 == sort2) {
+ return 1;
+ }
+ return sort1 - sort2 > 0 ? 1 : -1;
+ } catch (JSONException e) {
+ SpiderDebug.log(e);
+ }
+ return 1;
+ }
+ });
+
+ // 取播放列表数据
+ Elements sources = doc.select("div.stui-vodlist__head h3");
+ Elements sourceList = doc.select("ul.stui-content__playlist");
+
+ for (int i = 0; i < sources.size(); i++) {
+ Element source = sources.get(i);
+ String sourceName = source.text();
+ boolean found = false;
+ for (Iterator it = playerConfig.keys(); it.hasNext(); ) {
+ String flag = it.next();
+ if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
+ sourceName = flag;
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ continue;
+ String playList = "";
+ Elements playListA = sourceList.get(i).select("li a");
+ List vodItems = new ArrayList<>();
+
+ for (int j = 0; j < playListA.size(); j++) {
+ Element vod = playListA.get(j);
+ Matcher matcher = regexPlay.matcher(vod.attr("href"));
+ if (!matcher.find())
+ continue;
+ String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3);
+ vodItems.add(vod.text() + "$" + playURL);
+ }
+ if (vodItems.size() > 0)
+ playList = TextUtils.join("#", vodItems);
+
+ if (playList.length() == 0)
+ continue;
+
+ vod_play.put(sourceName, playList);
+ }
+
+ if (vod_play.size() > 0) {
+ String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
+ String vod_play_url = TextUtils.join("$$$", vod_play.values());
+ vodList.put("vod_play_from", vod_play_from);
+ vodList.put("vod_play_url", vod_play_url);
+ }
+ JSONArray list = new JSONArray();
+ list.put(vodList);
+ result.put("list", list);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+
+ /**
+ * 获取视频播放信息
+ *
+ * @param flag 播放源
+ * @param id 视频id
+ * @param vipFlags 所有可能需要vip解析的源
+ * @return
+ */
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) {
+ try {
+ //定义播放用的headers
+ JSONObject headers = new JSONObject();
+ headers.put("origin", " https://www.libvio.me/");
+ headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
+ headers.put("Accept", " */*");
+ headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7");
+ headers.put("Accept-Encoding", " gzip, deflate");
+ headers.put("referer", " https://www.libvio.me/");
+ // 播放页 url
+ String url = siteUrl + "/play/" + id + ".html";
+ Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
+
+ Elements allScript = doc.select("script");
+ for (int i = 0; i < allScript.size(); i++) {
+ String scContent = allScript.get(i).html().trim();
+ if (scContent.startsWith("var player_")) { // 取直链
+ int start = scContent.indexOf('{');
+ int end = scContent.lastIndexOf('}') + 1;
+ String json = scContent.substring(start, end);
+ JSONObject player = new JSONObject(json);
+ if (playerConfig.has(player.getString("from"))) {
+ JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
+ if (player.getString("from").contains("LINE")) {
+ String videoUrl = pCfg.getString("pu") + player.getString("url");
+ Document docs = Jsoup.parse(OkHttpUtil.string(videoUrl, Headers()));
+ Pattern pattern = Pattern.compile("(?<=urls\\s=\\s').*?(?=')");
+ Elements allScripts = docs.select("body script");
+ for (int j = 0; j < allScripts.size(); j++) {
+ String scContents = allScripts.get(j).html().trim();
+ Matcher matcher = pattern.matcher(scContents);
+ if (matcher.find()) {
+ JSONObject result = new JSONObject();
+ String players = matcher.group(0);
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ result.put("url", players);
+ return result.toString();
+ }
+ }
+ }
+ else {
+ SpiderDebug.log(url);
+ JSONObject result = new JSONObject();
+ result.put("parse", 1);
+ result.put("playUrl", "");
+ result.put("url", url);
+ // result.put("header", "{\"Referer\", \"https://www.libvio.me/\"}");
+ return result.toString();
+ }
+ break;
+ }
+ }
+ }
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ protected static HashMap sHeaders() {
+ HashMap headers = new HashMap<>();
+ headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36");
+ headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
+ headers.put("Accept-encoding", "gzip, deflate, br");
+ headers.put("Accept-language", "zh-SG,zh;q=0.9,en-GB;q=0.8,en;q=0.7,zh-CN;q=0.6");
+ return headers;
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) {
+ try {
+ String url = "https://shitu.paodekuaiweixinqun.com/search?q=site%3Alibvio.me%2Fdetail+" + URLEncoder.encode(key);
+ Document docs = Jsoup.parse(OkHttpUtil.string(url, sHeaders()));
+ JSONObject result = new JSONObject();
+ JSONArray videos = new JSONArray();
+ JSONObject v = new JSONObject();
+ Elements list = docs.select("div.NJo7tc div.yuRUbf");
+ for (int i = 0; i < list.size(); i++) {
+ Element doc = list.get(i);
+ String sourceName = doc.select("div.yuRUbf a h3").text();
+ if (sourceName.contains(key)) {
+ String list1 = doc.select("div.yuRUbf a").attr("href");
+ Document link = Jsoup.parse(OkHttpUtil.string(list1, getHeaders(url)));
+ Matcher matcher = regexVid.matcher(list1);
+ Elements data = link.select("p.data");
+ if (matcher.find()) {
+
+ String group = matcher.group(1);
+ String cover = link.select("div.stui-content__thumb a img").attr("data-original");
+ String title = link.select("div.stui-content__detail h1").text();
+ Pattern rms = Pattern.compile("更新:(\\S+)");
+ String remark = doReplaceRegex(rms, data.get(3).text());
+
+ v.put("vod_name", title);
+ v.put("vod_remarks", remark);
+ v.put("vod_id", group);
+ v.put("vod_pic", cover);
+ videos.put(v);
+ }
+ }
+ }
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ private static String doReplaceRegex(Pattern pattern, String src) {
+ if (pattern == null)
+ return src;
+ try {
+ Matcher matcher = pattern.matcher(src);
+ if (matcher.find()) {
+ return matcher.group(1).trim();
+ }
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return src;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/catvod/spider/LiteApple.java b/app/src/main/java/com/github/catvod/spider/LiteApple.java
new file mode 100644
index 0000000..452b824
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/LiteApple.java
@@ -0,0 +1,466 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Build;
+import android.text.TextUtils;
+import android.util.Base64;
+
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.crawler.SpiderDebug;
+import com.github.catvod.utils.Misc;
+import com.github.catvod.utils.okhttp.OKCallBack;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+import okhttp3.Call;
+
+public class LiteApple extends Spider {
+ private static final String siteUrl = "http://ht.grelighting.cn/api.php";
+
+ private HashMap getHeaders(String url, String data) {
+ HashMap headers = new HashMap<>();
+ if (data != null) {
+ String token = "";
+ try {
+ token = Base64.encodeToString(b(fakeDevice.getBytes("UTF-8"), tokenKey == null ? "XPINGGUO" : tokenKey), 2);
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ int currentTimeMillis = (int) (System.currentTimeMillis() / ((long) 1000));
+ String hash = md5(fakeDevice + data + currentTimeMillis).substring(8, 12);
+ headers.put("token", token);
+ headers.put("hash", hash);
+ headers.put("timestamp", currentTimeMillis + "");
+ if (tokenKey == null) {
+ headers.put("version", "ANDROID cn.grelighting.xpg1.1.5");
+ }
+ }
+ headers.put("User-Agent", "okhttp/4.9.1");
+ return headers;
+ }
+
+ private String fakeDevice = null;
+ private String tokenKey = null;
+
+ @Override
+ public void init(Context context, String extend) {
+ super.init(context, extend);
+ SharedPreferences sharedPreferences = context.getSharedPreferences("spider_LiteApple", Context.MODE_PRIVATE);
+ try {
+ fakeDevice = sharedPreferences.getString("didd", null);
+ } catch (Throwable th) {
+ } finally {
+ if (fakeDevice == null) {
+ fakeDevice = fakeDid();
+ sharedPreferences.edit().putString("didd", fakeDevice).commit();
+ }
+ }
+ }
+
+ void getTokenKey() {
+ if (tokenKey != null)
+ return;
+ String url = siteUrl + "/v2.user/tokenlogin";
+ OkHttpUtil.post(OkHttpUtil.defaultClient(), url, null, getHeaders(url, "ANDROID cn.grelighting.xpg1.1.5"), new OKCallBack.OKCallBackString() {
+ @Override
+ protected void onFailure(Call call, Exception e) {
+
+ }
+
+ @Override
+ protected void onResponse(String response) {
+ try {
+ tokenKey = new JSONObject(response).getJSONObject("data").getString("user_title");
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ }
+
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ getTokenKey();
+ String url = siteUrl + "/v2.vod/androidtypes";
+ String content = OkHttpUtil.string(url, getHeaders(url, null));
+ JSONObject jsonObject = new JSONObject(decryptResponse(content));
+ JSONArray jsonArray = jsonObject.getJSONArray("data");
+
+ JSONObject filterConfig = new JSONObject();
+ JSONArray classes = new JSONArray();
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject jObj = jsonArray.getJSONObject(i);
+ String typeName = jObj.getString("type_name");
+ String typeId = jObj.getString("type_id");
+ JSONObject newCls = new JSONObject();
+ newCls.put("type_id", typeId);
+ newCls.put("type_name", typeName);
+ classes.put(newCls);
+
+ JSONArray clses = jObj.getJSONArray("classes");
+ JSONArray areas = jObj.getJSONArray("areas");
+ JSONArray years = jObj.getJSONArray("years");
+
+ JSONArray extendsAll = new JSONArray();
+ // 类型
+ JSONObject newTypeExtend;
+ JSONArray newTypeExtendKV;
+ JSONObject kv;
+ newTypeExtend = new JSONObject();
+ newTypeExtend.put("key", "class");
+ newTypeExtend.put("name", "类型");
+ newTypeExtendKV = new JSONArray();
+ for (int j = 0; j < clses.length(); j++) {
+ String v = clses.getString(j);
+ kv = new JSONObject();
+ kv.put("n", v);
+ kv.put("v", v);
+ newTypeExtendKV.put(kv);
+ }
+ newTypeExtend.put("value", newTypeExtendKV);
+ extendsAll.put(newTypeExtend);
+ // 地区
+ newTypeExtend = new JSONObject();
+ newTypeExtend.put("key", "area");
+ newTypeExtend.put("name", "地区");
+ newTypeExtendKV = new JSONArray();
+ kv = new JSONObject();
+ kv.put("n", "全部");
+ kv.put("v", "");
+ newTypeExtendKV.put(kv);
+ for (int j = 0; j < areas.length(); j++) {
+ String area = areas.getString(j);
+ kv = new JSONObject();
+ kv.put("n", area);
+ kv.put("v", area);
+ newTypeExtendKV.put(kv);
+ }
+ newTypeExtend.put("value", newTypeExtendKV);
+ extendsAll.put(newTypeExtend);
+ // 年份
+ newTypeExtend = new JSONObject();
+ newTypeExtend.put("key", "year");
+ newTypeExtend.put("name", "年份");
+ newTypeExtendKV = new JSONArray();
+ kv = new JSONObject();
+ kv.put("n", "全部");
+ kv.put("v", "");
+ newTypeExtendKV.put(kv);
+ for (int j = 0; j < years.length(); j++) {
+ String year = years.getString(j);
+ kv = new JSONObject();
+ kv.put("n", year);
+ kv.put("v", year);
+ newTypeExtendKV.put(kv);
+ }
+ newTypeExtend.put("value", newTypeExtendKV);
+ extendsAll.put(newTypeExtend);
+ filterConfig.put(typeId, extendsAll);
+ // 排序
+ newTypeExtend = new JSONObject();
+ newTypeExtend.put("key", "sortby");
+ newTypeExtend.put("name", "排序");
+ newTypeExtendKV = new JSONArray();
+ kv = new JSONObject();
+ kv.put("n", "时间");
+ kv.put("v", "updatetime");
+ newTypeExtendKV.put(kv);
+ kv = new JSONObject();
+ kv.put("n", "人气");
+ kv.put("v", "hits");
+ newTypeExtendKV.put(kv);
+ kv = new JSONObject();
+ kv.put("n", "评分");
+ kv.put("v", "score");
+ newTypeExtendKV.put(kv);
+ newTypeExtend.put("value", newTypeExtendKV);
+ extendsAll.put(newTypeExtend);
+ }
+
+ JSONObject result = new JSONObject();
+ result.put("class", classes);
+ if (filter) {
+ result.put("filters", filterConfig);
+ }
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ @Override
+ public String homeVideoContent() {
+ try {
+ JSONArray videos = new JSONArray();
+ for (int id = 1; id < 5; id++) {
+ if (videos.length() > 30)
+ break;
+ try {
+ String url = siteUrl + "/v2.main/androidhome";
+ String content = OkHttpUtil.string(url, getHeaders(url, null));
+ JSONObject jsonObject = new JSONObject(decryptResponse(content));
+ JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("list");
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONArray jsonArraySub = jsonArray.getJSONObject(i).getJSONArray("list");
+ for (int j = 0; j < jsonArraySub.length() && j < 4; j++) {
+ JSONObject vObj = jsonArraySub.getJSONObject(j);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vObj.getString("id"));
+ v.put("vod_name", vObj.getString("name"));
+ v.put("vod_pic", vObj.getString("pic"));
+ v.put("vod_remarks", vObj.getString("updateInfo"));
+ videos.put(v);
+ }
+ }
+ } catch (Exception e) {
+
+ }
+ }
+ 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 {
+ getTokenKey();
+ String area = extend.containsKey("area") ? extend.get("area") : "";
+ String year = extend.containsKey("year") ? extend.get("year") : "";
+ String url = siteUrl + "/v2.vod/androidfilter?page=" + pg + "&type=" + tid;
+ Set keys = extend.keySet();
+ for (String key : keys) {
+ String val = extend.get(key).trim();
+ if (val.length() == 0)
+ continue;
+ url += "&" + key + "=" + URLEncoder.encode(val);
+ }
+ String content = OkHttpUtil.string(url, getHeaders(url, area + year));
+ JSONObject dataObject = new JSONObject(decryptResponse(content));
+ JSONArray jsonArray = dataObject.getJSONArray("data");
+ JSONArray videos = new JSONArray();
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject vObj = jsonArray.getJSONObject(i);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vObj.getString("id"));
+ v.put("vod_name", vObj.getString("name"));
+ v.put("vod_pic", vObj.getString("pic"));
+ v.put("vod_remarks", vObj.getString("updateInfo"));
+ videos.put(v);
+ }
+ JSONObject result = new JSONObject();
+ int limit = 20;
+ int page = Integer.parseInt(pg);
+ result.put("page", page);
+ int pageCount = videos.length() == limit ? page + 1 : page;
+ result.put("pagecount", pageCount);
+ result.put("limit", limit);
+ 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 url = siteUrl + "/v2.vod/androiddetail?vod_id=" + ids.get(0);
+ String content = OkHttpUtil.string(url, getHeaders(url, ids.get(0)));
+ JSONObject dataObject = new JSONObject(decryptResponse(content));
+ JSONObject vObj = dataObject.getJSONObject("data");
+ JSONObject result = new JSONObject();
+ JSONArray list = new JSONArray();
+ JSONObject vodAtom = new JSONObject();
+ vodAtom.put("vod_id", vObj.getString("id"));
+ vodAtom.put("vod_name", vObj.getString("name"));
+ vodAtom.put("vod_pic", vObj.getString("pic"));
+ vodAtom.put("type_name", vObj.getString("className"));
+ vodAtom.put("vod_year", vObj.getString("year"));
+ vodAtom.put("vod_area", vObj.getString("area"));
+ vodAtom.put("vod_remarks", vObj.getString("updateInfo"));
+ vodAtom.put("vod_actor", vObj.getString("actor"));
+ vodAtom.put("vod_content", vObj.getString("content").trim());
+
+ ArrayList playUrls = new ArrayList<>();
+
+ JSONArray urls = vObj.getJSONArray("urls");
+ for (int i = 0; i < urls.length(); i++) {
+ JSONObject u = urls.getJSONObject(i);
+ playUrls.add(u.getString("key") + "$" + u.getString("url"));
+ }
+
+ vodAtom.put("vod_play_from", "LiteApple");
+ vodAtom.put("vod_play_url", TextUtils.join("#", playUrls));
+ list.put(vodAtom);
+ result.put("list", list);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) {
+ try {
+ if (Misc.isVideoFormat(id)) {
+ JSONObject result = new JSONObject();
+ result.put("parse", 0);
+ result.put("header", "");
+ result.put("playUrl", "");
+ result.put("url", id);
+ return result.toString();
+ }
+ return "";
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) {
+ try {
+ getTokenKey();
+ String url = siteUrl + "/v2.vod/androidsearch?page=1&wd=" + URLEncoder.encode(key);
+ String content = OkHttpUtil.string(url, getHeaders(url, key));
+ JSONObject dataObject = new JSONObject(decryptResponse(content));
+ JSONArray jsonArray = dataObject.getJSONArray("data");
+ JSONArray videos = new JSONArray();
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject vObj = jsonArray.getJSONObject(i);
+ String title = vObj.getString("name");
+ if (!title.contains(key))
+ continue;
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vObj.getString("id"));
+ v.put("vod_name", title);
+ v.put("vod_pic", vObj.getString("pic"));
+ v.put("vod_remarks", vObj.getString("updateInfo"));
+ videos.put(v);
+ }
+ JSONObject result = new JSONObject();
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ protected String decryptResponse(String src) {
+ return src;
+ }
+
+ byte[] a(String str) {
+ byte[] bytes = str.getBytes();
+ byte[] bArr = new byte[333];
+ for (int i9 = 0; i9 < 333; i9++) {
+ bArr[i9] = (byte) i9;
+ }
+ if (bytes.length == 0) {
+ return null;
+ }
+ int i10 = 0;
+ int i11 = 0;
+ for (int i12 = 0; i12 < 333; i12++) {
+ i11 = (((bytes[i10] & 255) + (bArr[i12] & 255)) + i11) % 333;
+ byte b = bArr[i12];
+ bArr[i12] = bArr[i11];
+ bArr[i11] = b;
+ i10 = (i10 + 1) % bytes.length;
+ }
+ return bArr;
+ }
+
+ byte[] b(byte[] bArr, String str) {
+ byte[] a = a(str);
+ byte[] bArr2 = new byte[bArr.length];
+ int i9 = 0;
+ int i10 = 0;
+ for (int i11 = 0; i11 < bArr.length; i11++) {
+ i9 = (i9 + 1) % 333;
+ i10 = ((a[i9] & 255) + i10) % 333;
+ byte b = a[i9];
+ a[i9] = a[i10];
+ a[i10] = b;
+ bArr2[i11] = (byte) (a[((a[i9] & 255) + (a[i10] & 255)) % 333] ^ bArr[i11]);
+ }
+ return bArr2;
+ }
+
+ String randomString(int length) {
+ String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456";
+ Random random = new Random();
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < length; i++) {
+ int number = random.nextInt(str.length());
+ sb.append(str.charAt(number));
+ }
+ return sb.toString();
+ }
+
+ String randomMACAddress() {
+ Random rand = new Random();
+ byte[] macAddr = new byte[6];
+ rand.nextBytes(macAddr);
+ macAddr[0] = (byte) (macAddr[0] & (byte) 254); //zeroing last 2 bytes to make it unicast and locally adminstrated
+ StringBuilder sb = new StringBuilder(18);
+ for (byte b : macAddr) {
+ sb.append(String.format("%02X", b));
+ }
+ return sb.toString();
+ }
+
+ String fakeDid() {
+ String i = "";
+ String f = "";
+ String d = "N/A";
+ try {
+ d = Build.class.getField("SERIAL").get((Object) null).toString();
+ } catch (Exception unused) {
+ }
+ String e = "";
+ try {
+ e = (String) Class.forName("android.os.SystemProperties").getDeclaredMethod("get", new Class[]{String.class}).invoke((Object) null, new Object[]{"ro.build.fingerprint"});
+ } catch (Exception unused) {
+ return "";
+ }
+ return (((((((((("" + i) + "||") + f) + "||") + randomMACAddress()) + "||") + randomString(16)) + "||") + d) + "||") + e;
+ }
+
+ String md5(String str) {
+ try {
+ MessageDigest instance = MessageDigest.getInstance("MD5");
+ instance.update(str.getBytes());
+ return new BigInteger(1, instance.digest()).toString(16);
+ } catch (Exception e9) {
+ e9.printStackTrace();
+ return str;
+ }
+ }
+
+}
diff --git a/app/src/main/java/com/github/catvod/spider/Nfyun.java b/app/src/main/java/com/github/catvod/spider/Nfyun.java
new file mode 100644
index 0000000..857644f
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Nfyun.java
@@ -0,0 +1,503 @@
+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.utils.okhttp.OkHttpUtil;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class Nfyun extends Spider {
+ private static final String siteUrl = "https://yanaifei.cn";
+ private static final String siteHost = "yanaifei.cn";
+ private static Pattern pic = Pattern.compile("(?<=url=).*");
+
+ /**
+ * 播放源配置
+ */
+ private JSONObject playerConfig;
+ /**
+ * 筛选配置
+ */
+ private JSONObject filterConfig;
+ private Pattern regexCategory = Pattern.compile("/vod/type/(\\d+).html");
+ private Pattern regexVid = Pattern.compile("/vod/detail/(\\d+).html");
+ private Pattern regexPlay = Pattern.compile("/vod/play/(\\d+)-(\\d+)-(\\d+).html");
+ private Pattern regexPage = Pattern.compile("/vod/show/(\\S+).html");
+
+ protected String ext = null;
+
+ @Override
+ public void init(Context context) {
+ super.init(context);
+ try {
+ playerConfig = new JSONObject("{\"VIP\":{\"sh\":\"VIP\",\"pu\":\"https://yanaifei.cn/player/?url=\",\"sn\":0,\"or\":999}}");
+ filterConfig = new JSONObject("{\"1\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"1\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧片\",\"v\":\"7\"},{\"n\":\"爱情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"剧情片\",\"v\":\"11\"},{\"n\":\"战争片\",\"v\":\"12\"},{\"n\":\"动画片\",\"v\":\"32\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"2\"},{\"n\":\"国产剧\",\"v\":\"13\"},{\"n\":\"港台剧\",\"v\":\"14\"},{\"n\":\"日韩剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"泰国剧\",\"v\":\"20\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"3\"},{\"n\":\"大陆综艺\",\"v\":\"22\"},{\"n\":\"港台综艺\",\"v\":\"23\"},{\"n\":\"日韩综艺\",\"v\":\"24\"},{\"n\":\"欧美综艺\",\"v\":\"25\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"旅游\",\"v\":\"旅游\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"游戏互动\",\"v\":\"游戏互动\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"求职\",\"v\":\"求职\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"4\"},{\"n\":\"大陆动漫\",\"v\":\"26\"},{\"n\":\"港台动漫\",\"v\":\"27\"},{\"n\":\"日韩动漫\",\"v\":\"28\"},{\"n\":\"欧美动漫\",\"v\":\"29\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
+ } catch (JSONException e) {
+ SpiderDebug.log(e);
+ }
+ }
+
+
+ protected static HashMap Headers() {
+ HashMap headers = new HashMap<>();
+ headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36");
+ headers.put("Referer", siteUrl);
+ return headers;
+ }
+
+ /**
+ * 爬虫headers
+ *
+ * @param url
+ * @return
+ */
+ protected HashMap getHeaders(String url) {
+ HashMap headers = new HashMap<>();
+ headers.put("method", "GET");
+ headers.put("Upgrade-Insecure-Requests", "1");
+ headers.put("DNT", "1");
+ headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
+ headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
+ headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
+ return headers;
+ }
+
+ /**
+ * 获取分类数据 + 首页最近更新视频列表数据
+ *
+ * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
+ * @return
+ */
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ JSONObject result = new JSONObject();
+ Pattern redL = Pattern.compile("(?<=location.href =\").*?(?=\")");
+ Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
+ /* Elements X = A.select("script");
+ String url = "";
+ for (int i = 0; i < X.size(); i++) {
+ String finalUrl = X.get(i).html().trim();
+ Matcher matcher3 = redL.matcher(finalUrl);
+ if (matcher3.find()) {
+ url = siteUrl + matcher3.group(0);
+ } else {
+ url = siteUrl;
+ }
+ Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); */
+ // 分类节点
+ Elements elements = doc.select("ul.navbar-items li a");
+ JSONArray classes = new JSONArray();
+ for (Element ele : elements) {
+ String name = ele.attr("title");
+ boolean show = name.equals("电影") ||
+ name.equals("连续剧") ||
+ name.equals("综艺") ||
+ name.equals("动漫");
+ if (show) {
+ Matcher mather = regexCategory.matcher(ele.attr("href"));
+ if (!mather.find())
+ continue;
+ // 把分类的id和名称取出来加到列表里
+ String id = mather.group(1).trim();
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("type_id", id);
+ jsonObject.put("type_name", name);
+ classes.put(jsonObject);
+ }
+ }
+
+
+ if (filter) {
+ result.put("filters", filterConfig);
+ }
+ result.put("class", classes);
+ try {
+ // 取首页推荐视频列表
+ Element homeList = doc.select("div.module").get(0);
+ Elements list = homeList.select("div.module-main div.module-items a");
+ JSONArray videos = new JSONArray();
+ for (int j = 0; j < list.size(); j++) {
+ Element vod = list.get(j);
+ String title = vod.attr("title");
+ String cover = FixUrl(pic, vod.select("div.module-item-pic img").attr("data-original"));
+ String remark = vod.select("div.module-item-note").text();
+ Matcher matcher = regexVid.matcher(vod.attr("href"));
+ if (!matcher.find())
+ continue;
+ String id = matcher.group(1);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", id);
+ v.put("vod_name", title);
+ v.put("vod_pic", cover);
+ v.put("vod_remarks", remark);
+ videos.put(v);
+ }
+ result.put("list", videos);
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ // }
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+
+ return "";
+ }
+
+ /**
+ * 获取分类信息数据
+ *
+ * @param tid 分类id
+ * @param pg 页数
+ * @param filter 同homeContent方法中的filter
+ * @param extend 筛选参数{k:v, k1:v1}
+ * @return
+ */
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap