diff --git a/app/src/main/java/com/github/catvod/spider/AppYsV2.java b/app/src/main/java/com/github/catvod/spider/AppYsV2.java
new file mode 100644
index 00000000..63f75dff
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/AppYsV2.java
@@ -0,0 +1,852 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+import android.text.TextUtils;
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.net.OkHttp;
+import com.github.catvod.utils.Misc;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.net.URLEncoder;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * M浏览器中的App影视
+ *
+ * Author: 群友 不负此生
+ */
+public class AppYsV2 extends Spider {
+
+ private String[] extInfos = null;
+
+ @Override
+ public void init(Context context, String extend) {
+ super.init(context, extend);
+ try {
+ extInfos = extend.split("###");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private Map getHeader(String url) {
+ String userAgent = getUserAgent(url);
+ Map header = new HashMap<>();
+ header.put("User-Agent", userAgent);
+ return header;
+ }
+
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ String url = getCateUrl(getApiUrl());
+ JSONArray jsonArray = null;
+ if (!url.isEmpty()) {
+ String json = desc(OkHttp.string(url, getHeader(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.optString("type_name");
+ if (isBan(typeName))
+ continue;
+ String typeId = jObj.optString("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) {
+ e.printStackTrace();
+ }
+ 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;
+ }
+ String json = desc(OkHttp.string(url, getHeader(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.optString("nextlink"));
+ v.put("vod_name", vObj.optString("title"));
+ v.put("vod_pic", vObj.optString("pic"));
+ v.put("vod_remarks", vObj.optString("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.optString("vod_id");
+ if (ids.contains(vid))
+ continue;
+ ids.add(vid);
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vid);
+ v.put("vod_name", vObj.optString("vod_name"));
+ v.put("vod_pic", vObj.optString("vod_pic"));
+ v.put("vod_remarks", vObj.optString("vod_remarks"));
+ videos.put(v);
+ }
+ }
+ }
+ JSONObject result = new JSONObject();
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ 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("排序") : "");
+ String json = desc(OkHttp.string(url, getHeader(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) {
+ e.printStackTrace();
+ }
+
+ 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.optString("vod_id"));
+ v.put("vod_name", vObj.optString("vod_name"));
+ v.put("vod_pic", vObj.optString("vod_pic"));
+ v.put("vod_remarks", vObj.optString("vod_remarks"));
+ videos.put(v);
+ } else {
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vObj.optString("nextlink"));
+ v.put("vod_name", vObj.optString("title"));
+ v.put("vod_pic", vObj.optString("pic"));
+ v.put("vod_remarks", vObj.optString("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) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String detailContent(List ids) {
+ try {
+ String apiUrl = getApiUrl();
+ String url = getPlayUrlPrefix(apiUrl) + ids.get(0);
+ String json = desc(OkHttp.string(url, getHeader(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) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) {
+ try {
+ String apiUrl = getApiUrl();
+ String url = getSearchUrl(apiUrl, URLEncoder.encode(key));
+ String json = desc(OkHttp.string(url, getHeader(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.optString("vod_id"));
+ v.put("vod_name", vObj.optString("vod_name"));
+ v.put("vod_pic", vObj.optString("vod_pic"));
+ v.put("vod_remarks", vObj.optString("vod_remarks"));
+ videos.put(v);
+ } else {
+ JSONObject v = new JSONObject();
+ v.put("vod_id", vObj.optString("nextlink"));
+ v.put("vod_name", vObj.optString("title"));
+ v.put("vod_pic", vObj.optString("pic"));
+ v.put("vod_remarks", vObj.optString("state"));
+ videos.put(v);
+ }
+ }
+ }
+ JSONObject result = new JSONObject();
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ 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) {
+ e.printStackTrace();
+ }
+ 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 (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private String jsonArr2Str(JSONArray array) {
+ try {
+ ArrayList strings = new ArrayList<>();
+ for (int i = 0; i < array.length(); i++) {
+ strings.add(array.optString(i));
+ }
+ return TextUtils.join(",", strings);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ 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 "";
+ }
+
+ // ######
+ 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.optString(key).replace(",", "+") + "\n";
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ 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.optString("vod_name"));
+ vod.put("vod_pic", data.optString("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.optString("name").trim();
+ playFlags.add(flag);
+ playUrls.add(from.optString("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.optString("vod_name"));
+ vod.put("vod_pic", data.optString("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.optString("name").trim();
+ playFlags.add(flag);
+ playUrls.add(from.optString("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.optString("vod_name"));
+ vod.put("vod_pic", data.optString("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.optString("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) {
+ e.printStackTrace();
+ }
+ }
+ } else if (urlPattern1.matcher(URL).find()) {
+ JSONObject data = object;
+ vod.put("vod_id", data.optString("vod_id", vid));
+ vod.put("vod_name", data.optString("title"));
+ vod.put("vod_pic", data.optString("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.optString("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.optString("title") + "$" + url.substring(spIdx).trim());
+ } else {
+ urls.add(urlObj.optString("title") + "$" + url);
+ }
+ }
+ playFlags.add(flag);
+ playUrls.add(TextUtils.join("#", urls));
+ }
+ }
+ vod.put("vod_play_from", TextUtils.join("$$$", playFlags));
+ vod.put("vod_play_url", TextUtils.join("$$$", playUrls));
+ }
+
+ // ######视频地址
+ protected JSONObject getFinalVideo(String flag, ArrayList parseUrls, String url) throws JSONException {
+ String htmlPlayUrl = "";
+ for (String parseUrl : parseUrls) {
+ if (parseUrl.isEmpty() || parseUrl.equals("null"))
+ continue;
+ String playUrl = parseUrl + url;
+ String content = desc(OkHttp.string(playUrl, null), (byte) 4);
+ if (parseUrl.contains("49.233.47.42:9898")) {
+ HashMap hashMap = new HashMap();
+ OkHttp.stringNoRedirect(playUrl, null, hashMap);
+ String d = OkHttp.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/Bilituys.java b/app/src/main/java/com/github/catvod/spider/Bilituys.java
new file mode 100644
index 00000000..33e9bdcd
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Bilituys.java
@@ -0,0 +1,299 @@
+package com.github.catvod.spider;
+
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.net.SSLSocketFactoryCompat;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+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;
+
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author zhixc
+ * 哔哩兔
+ */
+public class Bilituys extends Spider {
+
+ private final String siteUrl = "https://www.bilituys.com";
+
+ private final String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36";
+
+ /**
+ * 首页内容
+ */
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ JSONObject movieType = new JSONObject()
+ .put("type_id", "1")
+ .put("type_name", "电影");
+
+ JSONObject teleplayType = new JSONObject()
+ .put("type_id", "2")
+ .put("type_name", "连续剧");
+
+ JSONObject varietyType = new JSONObject()
+ .put("type_id", "3")
+ .put("type_name", "综艺");
+
+ JSONObject anime = new JSONObject()
+ .put("type_id", "4")
+ .put("type_name", "动漫");
+
+ JSONArray classes = new JSONArray()
+ .put(movieType)
+ .put(teleplayType)
+ .put(varietyType)
+ .put(anime);
+ // filter 二级筛选 start
+ String f = "{\"1\": [{\"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\": \"2023\", \"v\": \"2023\"}, {\"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\": \"by\", \"name\": \"排序\", \"value\": [{\"n\": \"时间\", \"v\": \"time\"}, {\"n\": \"人气\", \"v\": \"hits\"}, {\"n\": \"评分\", \"v\": \"score\"}]}], \"2\": [{\"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\": \"2023\", \"v\": \"2023\"}, {\"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\": \"by\", \"name\": \"排序\", \"value\": [{\"n\": \"时间\", \"v\": \"time\"}, {\"n\": \"人气\", \"v\": \"hits\"}, {\"n\": \"评分\", \"v\": \"score\"}]}], \"3\": [{\"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\": \"台湾\"}, {\"n\": \"日本\", \"v\": \"日本\"}, {\"n\": \"美国\", \"v\": \"美国\"}, {\"n\": \"泰国\", \"v\": \"泰国\"}, {\"n\": \"英国\", \"v\": \"英国\"}, {\"n\": \"新加坡\", \"v\": \"新加坡\"}, {\"n\": \"其他\", \"v\": \"其他\"}]}, {\"key\": \"year\", \"name\": \"年份\", \"value\": [{\"n\": \"全部\", \"v\": \"\"}, {\"n\": \"2023\", \"v\": \"2023\"}, {\"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\": \"by\", \"name\": \"排序\", \"value\": [{\"n\": \"时间\", \"v\": \"time\"}, {\"n\": \"人气\", \"v\": \"hits\"}, {\"n\": \"评分\", \"v\": \"score\"}]}], \"4\": [{\"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\": \"韩国\"}, {\"n\": \"香港\", \"v\": \"香港\"}, {\"n\": \"台湾\", \"v\": \"台湾\"}, {\"n\": \"泰国\", \"v\": \"泰国\"}, {\"n\": \"英国\", \"v\": \"英国\"}, {\"n\": \"新加坡\", \"v\": \"新加坡\"}, {\"n\": \"其他\", \"v\": \"其他\"}]}, {\"key\": \"year\", \"name\": \"年份\", \"value\": [{\"n\": \"全部\", \"v\": \"\"}, {\"n\": \"2023\", \"v\": \"2023\"}, {\"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\": \"by\", \"name\": \"排序\", \"value\": [{\"n\": \"时间\", \"v\": \"time\"}, {\"n\": \"人气\", \"v\": \"hits\"}, {\"n\": \"评分\", \"v\": \"score\"}]}]}";
+ JSONObject filterConfig = new JSONObject(f);
+ // filter 二级筛选 end
+ JSONObject result = new JSONObject()
+ .put("class", classes)
+ .put("filters", filterConfig);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ /**
+ * 分类页面
+ *
+ * @param tid 影片分类id值
+ * @param pg 第几页
+ * @param extend 筛选
+ * @return 返回 json 字符串
+ */
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) {
+ try {
+ HashMap ext = new HashMap<>();
+ if (extend != null && extend.size() > 0) {
+ ext.putAll(extend);
+ }
+ String area = ext.get("area") == null ? "" : ext.get("area");
+ String year = ext.get("year") == null ? "" : ext.get("year");
+ String by = ext.get("by") == null ? "" : ext.get("by");
+ String classType = ext.get("class") == null ? "" : ext.get("class");
+ String lang = ext.get("lang") == null ? "" : ext.get("lang");
+
+ String cateUrl = siteUrl + String.format("/bilishow/%s-%s-%s-%s-%s----%s---%s.html", tid, area, by, classType, lang, pg, year);
+ // 分类页链接拼接后应该是类似这样的:
+ // cateUrl = "https://www.bilituys.com/bilishow/1-大陆-time-喜剧-国语----2---2020.html";
+ String content = getWebContent(cateUrl);
+ Elements lis = Jsoup.parse(content)
+ .select("[class=stui-vodlist clearfix]")
+ .select("li");
+ JSONArray videos = new JSONArray();
+ for (Element li : lis) {
+ Element item = li.select("[class=stui-vodlist__thumb lazyload]").get(0);
+ String vid = siteUrl + item.attr("href");
+ String name = item.attr("title");
+ String pic = item.attr("data-original");
+ String remark = item.select(".pic-text").select("b").text();
+
+ JSONObject vod = new JSONObject()
+ .put("vod_id", vid)
+ .put("vod_name", name)
+ .put("vod_pic", pic)
+ .put("vod_remarks", remark);
+ videos.put(vod);
+ }
+ JSONObject result = new JSONObject()
+ .put("pagecount", 999)
+ .put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ private String getWebContent(String targetUrl) throws IOException {
+ Request request = new Request.Builder()
+ .url(targetUrl)
+ .get()
+ .addHeader("User-Agent", userAgent)
+ .build();
+ OkHttpClient okHttpClient = new OkHttpClient()
+ .newBuilder()
+ .sslSocketFactory(new SSLSocketFactoryCompat(), SSLSocketFactoryCompat.trustAllCert)
+ .build();
+ Response response = okHttpClient.newCall(request).execute();
+ if (response.body() == null) return "";
+ String content = response.body().string();
+ response.close();
+ return content;
+ }
+
+ /**
+ * 详情页
+ */
+ @Override
+ public String detailContent(List ids) {
+ try {
+ String detailUrl = ids.get(0);
+ String html = getWebContent(detailUrl);
+ Document doc = Jsoup.parse(html);
+ Elements sourceList = doc.select("[class=stui-content__playlist sort-list maxheight clearfix]");
+ Elements sourceHeader = doc.select("h3[class=title]");
+ StringBuilder vodPlayUrl = new StringBuilder(); // 线路/播放源 里面的各集的播放页面链接
+ StringBuilder vodPlayFrom = new StringBuilder(); // 线路 / 播放源标题
+ for (int i = 0; i < sourceList.size(); i++) {
+ String playFrom = sourceHeader.get(i).text();
+ vodPlayFrom.append(playFrom).append("$$$");
+ Elements aList = sourceList.get(i).select("a");
+ for (int j = 0; j < aList.size(); j++) {
+ String text = aList.get(j).text();
+ String href = siteUrl + aList.get(j).attr("href");
+ vodPlayUrl.append(text).append("$").append(href);
+ boolean notLastEpisode = j < aList.size() - 1;
+ vodPlayUrl.append(notLastEpisode ? "#" : "$$$");
+ }
+ }
+
+ String name = doc.select("[class=title wdetail]").text();
+ String pic = doc.select("a[class=pic] > img").attr("data-original");
+ String typeName = getStrByRegex("类型:(.*?)/", html);
+ String year = getStrByRegex("年份:(.*?)", html);
+ String area = getStrByRegex("地区:(.*?)/", html);
+ String remark = getStrByRegex("状态:.*?>(.*?)", html);
+ String actor = getStrByRegex("主演:(.*?)", html);
+ String director = getStrByRegex("导演:(.*?)", html);
+ String description = doc.select(".detail-content").text();
+
+ // 影片名称、图片等赋值
+ JSONObject vodObj = new JSONObject()
+ .put("vod_id", ids.get(0))
+ .put("vod_name", name)
+ .put("vod_pic", pic)
+ .put("type_name", typeName) // 影片类型
+ .put("vod_year", year) // 影片年份
+ .put("vod_area", area) // 影片地区
+ .put("vod_remarks", remark) // 备注
+ .put("vod_actor", actor) // 主演
+ .put("vod_director", director) // 导演
+ .put("vod_content", description); // 简介
+ if (vodPlayUrl.length() > 0) {
+ vodObj.put("vod_play_from", vodPlayFrom.toString())
+ .put("vod_play_url", vodPlayUrl.toString());
+ }
+
+ JSONArray jsonArray = new JSONArray()
+ .put(vodObj);
+ JSONObject result = new JSONObject()
+ .put("list", jsonArray);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ private String getStrByRegex(String regexStr, String htmlStr) {
+ if (regexStr == null) {
+ return "";
+ }
+ try {
+ Pattern pattern = Pattern.compile(regexStr, Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
+ Matcher matcher = pattern.matcher(htmlStr);
+ if (matcher.find()) {
+ return matcher.group(1)
+ .trim()
+ .replaceAll("?[^>]+>", "")
+ .replaceAll(" ", " ")
+ .trim();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ /**
+ * 搜索
+ *
+ * @param key 关键字/词
+ */
+ @Override
+ public String searchContent(String key, boolean quick) {
+ try {
+ String searchUrl = siteUrl + "/bilisch/wd/" + URLEncoder.encode(key) + ".html";
+ String searchResult = getWebContent(searchUrl);
+ JSONArray videos = new JSONArray();
+ Elements lis = Jsoup.parse(searchResult)
+ .select("[class=stui-vodlist clearfix]")
+ .select("li");
+ for (Element li : lis) {
+ Elements a = li.select("[class=stui-vodlist__thumb lazyload]");
+ String vid = siteUrl + a.attr("href");
+ String name = a.attr("title");
+ String pic = a.attr("data-original");
+ String remark = a.select(".pic-text").text();
+ JSONObject vod = new JSONObject()
+ .put("vod_id", vid)
+ .put("vod_name", name)
+ .put("vod_pic", pic)
+ .put("vod_remarks", remark);
+ videos.put(vod);
+ }
+ JSONObject result = new JSONObject()
+ .put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) {
+ try {
+ String lastURL = id;
+ int parseFlag = 1;
+ String content = getWebContent(id);
+ Pattern pattern = Pattern.compile("player_aaaa=(.*?)");
+ Matcher matcher = pattern.matcher(content);
+ if (matcher.find()) {
+ String url = new JSONObject(matcher.group(1).trim())
+ .optString("url");
+ if (url.contains(".m3u8") || url.contains(".mp4")) {
+ lastURL = url;
+ parseFlag = 0;
+ }
+ }
+ HashMap header = new HashMap<>();
+ header.put("User-Agent", userAgent);
+ header.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.7");
+ header.put("Accept-encoding", "gzip, deflate, br");
+ header.put("Accept-language", "zh-CN,zh;q=0.9");
+ header.put("Referer", siteUrl + "/");
+ header.put("Upgrade-insecure-requests", "1");
+
+ JSONObject result = new JSONObject()
+ .put("parse", parseFlag)
+ .put("header", header.toString())
+ .put("playUrl", "")
+ .put("url", lastURL);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+}
\ No newline at end of file
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 00000000..092f2696
--- /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 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;
+
+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;
+
+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();
+ }
+ 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://czzy.pro/" + 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://czzy.pro/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://czzy.pro", 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://czzy.pro/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();
+ }
+ return "";
+ }
+
+ public String searchContent(String str, boolean z) {
+ try {
+ JSONObject jSONObject = new JSONObject();
+ Elements jS = Jsoup.parse(OkHttpUtil.string("https://czzy.pro/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/Douban.java b/app/src/main/java/com/github/catvod/spider/Douban.java
new file mode 100644
index 00000000..90862a00
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Douban.java
@@ -0,0 +1,216 @@
+package com.github.catvod.spider;
+
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.net.OkHttp;
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Douban extends Spider {
+ private final String hostURL = "https://frodo.douban.com/api/v2";
+ private final String apikey = "0ac44ae016490db2204ce0a042db2916";
+
+ private Map getHeader() {
+ Map header = new HashMap<>();
+ header.put("Host", "frodo.douban.com");
+ header.put("Connection", "Keep-Alive");
+ header.put("Referer", "https://servicewechat.com/wx2f9b06c1de1ccfca/84/page-frame.html");
+ header.put("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat");
+ return header;
+ }
+
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ JSONObject hotMovie = new JSONObject()
+ .put("type_id", "hot_gaia")
+ .put("type_name", "热门电影");
+
+ JSONObject hotTV = new JSONObject()
+ .put("type_id", "tv_hot")
+ .put("type_name", "热播剧集");
+
+ JSONObject hotShow = new JSONObject()
+ .put("type_id", "show_hot")
+ .put("type_name", "热播综艺");
+
+ JSONObject movie = new JSONObject()
+ .put("type_id", "movie")
+ .put("type_name", "电影筛选");
+
+ JSONObject tv = new JSONObject()
+ .put("type_id", "tv")
+ .put("type_name", "电视筛选");
+
+ JSONObject rankListMovie = new JSONObject()
+ .put("type_id", "rank_list_movie")
+ .put("type_name", "电影榜单");
+
+ JSONObject rankListTV = new JSONObject()
+ .put("type_id", "rank_list_tv")
+ .put("type_name", "电视剧榜单");
+
+ JSONArray classes = new JSONArray()
+ .put(hotMovie)
+ .put(hotTV)
+ .put(hotShow)
+ .put(movie)
+ .put(tv)
+ .put(rankListMovie)
+ .put(rankListTV);
+ // filter 二级筛选 start
+ String f = "{\"hot_gaia\": [{\"key\": \"sort\", \"name\": \"排序\", \"value\": [{\"n\": \"热度\", \"v\": \"recommend\"}, {\"n\": \"最新\", \"v\": \"time\"}, {\"n\": \"评分\", \"v\": \"rank\"}]}, {\"key\": \"area\", \"name\": \"地区\", \"value\": [{\"n\": \"全部\", \"v\": \"全部\"}, {\"n\": \"华语\", \"v\": \"华语\"}, {\"n\": \"欧美\", \"v\": \"欧美\"}, {\"n\": \"韩国\", \"v\": \"韩国\"}, {\"n\": \"日本\", \"v\": \"日本\"}]}], \"tv_hot\": [{\"key\": \"type\", \"name\": \"分类\", \"value\": [{\"n\": \"综合\", \"v\": \"tv_hot\"}, {\"n\": \"国产剧\", \"v\": \"tv_domestic\"}, {\"n\": \"欧美剧\", \"v\": \"tv_american\"}, {\"n\": \"日剧\", \"v\": \"tv_japanese\"}, {\"n\": \"韩剧\", \"v\": \"tv_korean\"}, {\"n\": \"动画\", \"v\": \"tv_animation\"}]}], \"show_hot\": [{\"key\": \"type\", \"name\": \"分类\", \"value\": [{\"n\": \"综合\", \"v\": \"show_hot\"}, {\"n\": \"国内\", \"v\": \"show_domestic\"}, {\"n\": \"国外\", \"v\": \"show_foreign\"}]}], \"movie\": [{\"key\": \"类型\", \"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\": \"短片\"}]}, {\"key\": \"地区\", \"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\": \"丹麦\"}]}, {\"key\": \"sort\", \"name\": \"排序\", \"value\": [{\"n\": \"近期热度\", \"v\": \"T\"}, {\"n\": \"首映时间\", \"v\": \"R\"}, {\"n\": \"高分优先\", \"v\": \"S\"}]}, {\"key\": \"年代\", \"name\": \"年代\", \"value\": [{\"n\": \"全部年代\", \"v\": \"\"}, {\"n\": \"2023\", \"v\": \"2023\"}, {\"n\": \"2022\", \"v\": \"2022\"}, {\"n\": \"2021\", \"v\": \"2021\"}, {\"n\": \"2020\", \"v\": \"2020\"}, {\"n\": \"2019\", \"v\": \"2019\"}, {\"n\": \"2010年代\", \"v\": \"2010年代\"}, {\"n\": \"2000年代\", \"v\": \"2000年代\"}, {\"n\": \"90年代\", \"v\": \"90年代\"}, {\"n\": \"80年代\", \"v\": \"80年代\"}, {\"n\": \"70年代\", \"v\": \"70年代\"}, {\"n\": \"60年代\", \"v\": \"60年代\"}, {\"n\": \"更早\", \"v\": \"更早\"}]}], \"tv\": [{\"key\": \"类型\", \"name\": \"类型\", \"value\": [{\"n\": \"不限\", \"v\": \"\"}, {\"n\": \"电视剧\", \"v\": \"电视剧\"}, {\"n\": \"综艺\", \"v\": \"综艺\"}]}, {\"key\": \"电视剧形式\", \"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\": \"音乐\"}]}, {\"key\": \"综艺形式\", \"name\": \"综艺形式\", \"value\": [{\"n\": \"不限\", \"v\": \"\"}, {\"n\": \"真人秀\", \"v\": \"真人秀\"}, {\"n\": \"脱口秀\", \"v\": \"脱口秀\"}, {\"n\": \"音乐\", \"v\": \"音乐\"}, {\"n\": \"歌舞\", \"v\": \"歌舞\"}]}, {\"key\": \"地区\", \"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\": \"澳大利亚\"}]}, {\"key\": \"sort\", \"name\": \"排序\", \"value\": [{\"n\": \"近期热度\", \"v\": \"T\"}, {\"n\": \"首播时间\", \"v\": \"R\"}, {\"n\": \"高分优先\", \"v\": \"S\"}]}, {\"key\": \"年代\", \"name\": \"年代\", \"value\": [{\"n\": \"全部\", \"v\": \"\"}, {\"n\": \"2023\", \"v\": \"2023\"}, {\"n\": \"2022\", \"v\": \"2022\"}, {\"n\": \"2021\", \"v\": \"2021\"}, {\"n\": \"2020\", \"v\": \"2020\"}, {\"n\": \"2019\", \"v\": \"2019\"}, {\"n\": \"2010年代\", \"v\": \"2010年代\"}, {\"n\": \"2000年代\", \"v\": \"2000年代\"}, {\"n\": \"90年代\", \"v\": \"90年代\"}, {\"n\": \"80年代\", \"v\": \"80年代\"}, {\"n\": \"70年代\", \"v\": \"70年代\"}, {\"n\": \"60年代\", \"v\": \"60年代\"}, {\"n\": \"更早\", \"v\": \"更早\"}]}, {\"key\": \"平台\", \"name\": \"平台\", \"value\": [{\"n\": \"全部\", \"v\": \"\"}, {\"n\": \"腾讯视频\", \"v\": \"腾讯视频\"}, {\"n\": \"爱奇艺\", \"v\": \"爱奇艺\"}, {\"n\": \"优酷\", \"v\": \"优酷\"}, {\"n\": \"湖南卫视\", \"v\": \"湖南卫视\"}, {\"n\": \"Netflix\", \"v\": \"Netflix\"}, {\"n\": \"HBO\", \"v\": \"HBO\"}, {\"n\": \"BBC\", \"v\": \"BBC\"}, {\"n\": \"NHK\", \"v\": \"NHK\"}, {\"n\": \"CBS\", \"v\": \"CBS\"}, {\"n\": \"NBC\", \"v\": \"NBC\"}, {\"n\": \"tvN\", \"v\": \"tvN\"}]}], \"rank_list_movie\": [{\"key\": \"榜单\", \"name\": \"榜单\", \"value\": [{\"n\": \"实时热门电影\", \"v\": \"movie_real_time_hotest\"}, {\"n\": \"一周口碑电影榜\", \"v\": \"movie_weekly_best\"}, {\"n\": \"豆瓣电影Top250\", \"v\": \"movie_top250\"}]}], \"rank_list_tv\": [{\"key\": \"榜单\", \"name\": \"榜单\", \"value\": [{\"n\": \"实时热门电视\", \"v\": \"tv_real_time_hotest\"}, {\"n\": \"华语口碑剧集榜\", \"v\": \"tv_chinese_best_weekly\"}, {\"n\": \"全球口碑剧集榜\", \"v\": \"tv_global_best_weekly\"}, {\"n\": \"国内口碑综艺榜\", \"v\": \"show_chinese_best_weekly\"}, {\"n\": \"国外口碑综艺榜\", \"v\": \"show_global_best_weekly\"}]}]}";
+ JSONObject filterConfig = new JSONObject(f);
+ // filter 二级筛选 end
+ JSONObject result = new JSONObject()
+ .put("class", classes)
+ .put("filters", filterConfig);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) {
+ try {
+ HashMap ext = new HashMap<>();
+ if (extend != null && extend.size() > 0) {
+ ext.putAll(extend);
+ }
+ String sort = ext.get("sort") == null ? "T" : ext.get("sort");
+ String tags = URLEncoder.encode(getTags(ext));
+ int start = (Integer.parseInt(pg) - 1) * 20;
+ String cateURL = "";
+ String itemKey = "items";
+ switch (tid) {
+ case "hot_gaia": // 热播电影
+ sort = ext.get("sort") == null ? "recommend" : ext.get("sort");
+ String area = ext.get("area") == null ? "全部" : ext.get("area");
+ sort = sort + "&area=" + URLEncoder.encode(area);
+ cateURL = hostURL + "/movie/hot_gaia" + "?apikey=" + apikey + "&sort=" + sort + "&start=" + start + "&count=20";
+ break;
+ case "tv_hot": // 热播电视剧
+ String type = ext.get("type") == null ? "tv_hot" : ext.get("type");
+ cateURL = hostURL + "/subject_collection/" + type + "/items" + "?apikey=" + apikey + "&start=" + start + "&count=20";
+ itemKey = "subject_collection_items";
+ break;
+ case "show_hot": // 热播综艺
+ String showType = ext.get("type") == null ? "show_hot" : ext.get("type");
+ cateURL = hostURL + "/subject_collection/" + showType + "/items" + "?apikey=" + apikey + "&start=" + start + "&count=20";
+ itemKey = "subject_collection_items";
+ break;
+ case "tv": // 电视 / 综艺 筛选
+ cateURL = hostURL + "/tv/recommend" + "?apikey=" + apikey + "&sort=" + sort + "&tags=" + tags + "&start=" + start + "&count=20";
+ break;
+ case "rank_list_movie": // 电影榜单
+ String rankMovieType = ext.get("榜单") == null ? "movie_real_time_hotest" : ext.get("榜单");
+ cateURL = hostURL + "/subject_collection/" + rankMovieType + "/items" + "?apikey=" + apikey + "&start=" + start + "&count=20";
+ itemKey = "subject_collection_items";
+ break;
+ case "rank_list_tv": // 电视剧榜单
+ String rankTVType = ext.get("榜单") == null ? "tv_real_time_hotest" : ext.get("榜单");
+ cateURL = hostURL + "/subject_collection/" + rankTVType + "/items" + "?apikey=" + apikey + "&start=" + start + "&count=20";
+ itemKey = "subject_collection_items";
+ break;
+ default: // 电影筛选
+ cateURL = hostURL + "/movie/recommend" + "?apikey=" + apikey + "&sort=" + sort + "&tags=" + tags + "&start=" + start + "&count=20";
+ }
+ String jsonStr = OkHttp.string(cateURL, getHeader());
+ JSONObject jsonObject = new JSONObject(jsonStr);
+ JSONArray items = jsonObject.getJSONArray(itemKey);
+ JSONArray videos = new JSONArray();
+ for (int i = 0; i < items.length(); i++) {
+ JSONObject item = items.getJSONObject(i);
+ String id = item.optString("id");
+ String name = item.optString("title");
+ String pic = getPic(item);
+ String remark = getRating(item);
+ String vid = id + "###" + name + "###" + pic;
+ JSONObject vod = new JSONObject()
+ .put("vod_id", vid)
+ .put("vod_name", name)
+ .put("vod_pic", pic)
+ .put("vod_remarks", remark);
+ videos.put(vod);
+ }
+ JSONObject result = new JSONObject()
+ .put("pagecount", 999)
+ .put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ private String getRating(JSONObject item) {
+ try {
+ return "评分:" + item.getJSONObject("rating").optString("value");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ private String getPic(JSONObject item) {
+ try {
+ return item.getJSONObject("pic").optString("normal") + "@Referer=https://api.douban.com/@User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36";
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ private String getTags(HashMap ext) {
+ try {
+ StringBuilder tags = new StringBuilder();
+ for (String key : ext.keySet()) {
+ if (key.equals("sort")) continue;
+ String value = ext.get(key);
+ tags.append(value).append(",");
+ }
+ return tags.substring(0, tags.lastIndexOf(","));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+
+ @Override
+ public String detailContent(List ids) {
+ try {
+ String[] split = ids.get(0).split("###");
+
+ String name = split[1];
+ String pic = split[2];
+ String tips = "如果15秒内不能播放,请看其他片或进行搜索";
+ JSONObject vodInfo = new JSONObject()
+ .put("vod_id", ids.get(0))
+ .put("vod_name", name)
+ .put("vod_pic", pic)
+ .put("type_name", "")
+ .put("vod_year", "")
+ .put("vod_area", "")
+ .put("vod_remarks", "")
+ .put("vod_actor", tips)
+ .put("vod_director", tips)
+ .put("vod_content", tips);
+
+ JSONArray jsonArray = new JSONArray()
+ .put(vodInfo);
+ JSONObject result = new JSONObject()
+ .put("list", jsonArray);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/catvod/spider/IQIYI.java b/app/src/main/java/com/github/catvod/spider/IQIYI.java
new file mode 100644
index 00000000..a69082a7
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/IQIYI.java
@@ -0,0 +1,324 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+import android.net.Uri;
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.crawler.SpiderDebug;
+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.Set;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import rxhttp.wrapper.annotations.NonNull;
+
+public class IQIYI extends Spider {
+ protected JSONObject a;
+ protected JSONArray xr;
+ protected JSONObject q = new JSONObject();
+ protected HashMap dn = new HashMap<>();
+
+ private String q(String str, String str2) {
+ String str3;
+ try {
+ if (str2.startsWith("//")) {
+ Uri parse = Uri.parse(str);
+ str3 = parse.getScheme() + ":" + str2;
+ } else if (str2.contains("://")) {
+ return str2;
+ } else {
+ Uri parse2 = Uri.parse(str);
+ str3 = parse2.getScheme() + "://" + parse2.getHost() + str2;
+ }
+ return str3;
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return str2;
+ }
+ }
+
+ public String categoryContent(String str, String str2, boolean z, HashMap hashMap) {
+ IQIYI iqiyi = this;
+ try {
+ String str3 = "https://pcw-api.iqiyi.com/search/video/videolists?channel_id=" + str + "&is_purchase=&mode=24&pageNum=" + str2 + "&pageSize=24";
+ if (hashMap != null) {
+ Set keySet = hashMap.keySet();
+ ArrayList arrayList = new ArrayList();
+ for (String str4 : keySet) {
+ String trim = hashMap.get(str4).trim();
+ if (str4.matches("\\d+")) {
+ arrayList.add(trim + ";must");
+ } else {
+ str3 = str3 + "&" + str4 + "=" + trim;
+ }
+ }
+ str3 = str3 + "&three_category_id=" + iqiyi.join(",", arrayList);
+ }
+ String h = OkHttpUtil.string(str3, getHeaders(str3));
+ JSONObject jSONObject = new JSONObject();
+ try {
+ JSONArray optJSONArray = new JSONObject(h).optJSONObject("data").optJSONArray("list");
+ JSONArray jSONArray = new JSONArray();
+ int i = 0;
+ while (i < optJSONArray.length()) {
+ JSONObject optJSONObject = optJSONArray.optJSONObject(i);
+ String optString = optJSONObject.optString("name");
+ String q = iqiyi.q(str3, optJSONObject.optString("imageUrl"));
+ String optString2 = optJSONObject.optString("score");
+ String optString3 = optJSONObject.optString("playUrl");
+ if (!optJSONObject.optString("albumId").equals("")) {
+ if (optJSONObject.optInt("sourceId") != 0) {
+ optString3 = "/video/video/baseinfo/" + optJSONObject.optString("tvId") + "?userInfo=verify&jsonpCbName=videoInfo39";
+ } else {
+ optString3 = "/albums/album/avlistinfo?aid=" + optJSONObject.optString("albumId") + "&size=5000&page=1&url=" + optString3;
+ }
+ } else if (optJSONObject.optLong("tvId") != 0) {
+ optString3 = "/video/video/baseinfo/" + optJSONObject.optString("tvId") + "?userInfo=verify&jsonpCbName=videoInfo39";
+ }
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("vod_id", optString3);
+ jSONObject2.put("vod_name", optString);
+ jSONObject2.put("vod_pic", q);
+ jSONObject2.put("vod_remarks", optString2);
+ jSONArray.put(jSONObject2);
+ i++;
+ iqiyi = this;
+ optJSONArray = optJSONArray;
+ str3 = str3;
+ }
+ jSONObject.put("page", str2);
+ jSONObject.put("pagecount", Integer.MAX_VALUE);
+ jSONObject.put("limit", 90);
+ jSONObject.put("total", Integer.MAX_VALUE);
+ jSONObject.put("list", jSONArray);
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return jSONObject.toString(4);
+ } catch (Exception e2) {
+ SpiderDebug.log(e2);
+ return "";
+ }
+ }
+
+ public String detailContent(List list) {
+ try {
+ String url = "https://pcw-api.iqiyi.com" + list.get(0);
+ JSONObject jSONObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url))).getJSONObject("data");
+ JSONObject jSONObject2 = new JSONObject();
+ JSONObject optJSONObject = jSONObject.optJSONArray("epsodelist") != null ? jSONObject.optJSONArray("epsodelist").optJSONObject(0) : jSONObject;
+ jSONObject2.put("vod_id", list.get(0));
+ jSONObject2.put("vod_name", optJSONObject.optString("name").replaceAll("第\\d+(?:集|期)", ""));
+ jSONObject2.put("vod_pic", q(url, optJSONObject.optString("imageUrl")));
+ JSONObject optJSONObject2 = optJSONObject.optJSONObject("people");
+ JSONArray optJSONArray = optJSONObject2.optJSONArray("main_charactor");
+ if (optJSONArray == null) {
+ optJSONArray = optJSONObject2.optJSONArray("producer");
+ }
+ if (optJSONArray == null) {
+ optJSONArray = optJSONObject2.optJSONArray("guest");
+ }
+ if (optJSONArray == null) {
+ optJSONArray = optJSONObject2.optJSONArray("singer");
+ }
+ ArrayList arrayList = new ArrayList();
+ if (optJSONArray != null) {
+ for (int i = 0; i < optJSONArray.length(); i++) {
+ arrayList.add(optJSONArray.optJSONObject(i).optString("name"));
+ }
+ }
+ JSONArray optJSONArray2 = optJSONObject2.optJSONArray("director");
+ if (optJSONArray2 == null) {
+ optJSONArray2 = optJSONObject2.optJSONArray("screen_writer");
+ }
+ if (optJSONArray2 == null) {
+ optJSONArray2 = optJSONObject2.optJSONArray("host");
+ }
+ ArrayList arrayList2 = new ArrayList();
+ if (optJSONArray2 != null) {
+ for (int i2 = 0; i2 < optJSONArray2.length(); i2++) {
+ arrayList2.add(optJSONArray2.optJSONObject(i2).optString("name"));
+ }
+ }
+ jSONObject2.put("vod_remarks", optJSONObject.optString("duration"));
+ jSONObject2.put("vod_actor", join(",", arrayList));
+ jSONObject2.put("vod_director", join(",", arrayList2));
+ jSONObject2.put("vod_content", optJSONObject.optString("description"));
+ JSONArray optJSONArray3 = jSONObject.optJSONArray("epsodelist");
+ if (optJSONArray3 == null) {
+ optJSONArray3 = new JSONArray();
+ optJSONArray3.put(jSONObject);
+ }
+ ArrayList arrayList3 = new ArrayList();
+ for (int i3 = 0; i3 < optJSONArray3.length(); i3++) {
+ JSONObject optJSONObject3 = optJSONArray3.optJSONObject(i3);
+ arrayList3.add(optJSONObject3.optString("order") + " " + optJSONObject3.optString("subtitle") + "$" + optJSONObject3.optString("playUrl"));
+ }
+ jSONObject2.put("vod_play_from", "iqiyi");
+ jSONObject2.put("vod_play_url", join("#", arrayList3));
+ JSONObject jSONObject3 = new JSONObject();
+ JSONArray jSONArray = new JSONArray();
+ jSONArray.put(jSONObject2);
+ jSONObject3.put("list", jSONArray);
+ return jSONObject3.toString(4);
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+
+ protected HashMap getHeaders(String str) {
+ 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/91.0.4472.114 Safari/537.36");
+ return hashMap;
+ }
+
+ public String homeContent(boolean z) {
+ IQIYI iqiyi = this;
+ try {
+ String str = "https://pcw-api.iqiyi.com/search/video/videolists?channel_id=2&is_purchase=&mode=24&pageNum=1&pageSize=24&data_type=1&site=iqiyi";
+ String h = OkHttpUtil.string(str, iqiyi.getHeaders(str));
+ JSONObject jSONObject = new JSONObject();
+ jSONObject.put("class", iqiyi.xr);
+ if (z) {
+ jSONObject.put("filters", iqiyi.a);
+ }
+ try {
+ JSONArray optJSONArray = new JSONObject(h).optJSONObject("data").optJSONArray("list");
+ JSONArray jSONArray = new JSONArray();
+ int i = 0;
+ while (i < optJSONArray.length()) {
+ JSONObject optJSONObject = optJSONArray.optJSONObject(i);
+ String optString = optJSONObject.optString("name");
+ String q = iqiyi.q(str, optJSONObject.optString("imageUrl"));
+ String optString2 = optJSONObject.optString("score");
+ String optString3 = optJSONObject.optString("playUrl");
+ if (!optJSONObject.optString("albumId").equals("")) {
+ if (optJSONObject.optInt("sourceId") != 0) {
+ optString3 = "/video/video/baseinfo/" + optJSONObject.optString("tvId") + "?userInfo=verify&jsonpCbName=videoInfo39";
+ } else {
+ optString3 = "/albums/album/avlistinfo?aid=" + optJSONObject.optString("albumId") + "&size=5000&page=1&url=" + optString3;
+ }
+ } else if (optJSONObject.optLong("tvId") != 0) {
+ optString3 = "/video/video/baseinfo/" + optJSONObject.optString("tvId") + "?userInfo=verify&jsonpCbName=videoInfo39";
+ }
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("vod_id", optString3);
+ jSONObject2.put("vod_name", optString);
+ jSONObject2.put("vod_pic", q);
+ jSONObject2.put("vod_remarks", optString2);
+ jSONArray.put(jSONObject2);
+ i++;
+ iqiyi = this;
+ str = str;
+ }
+ jSONObject.put("list", jSONArray);
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return jSONObject.toString(4);
+ } catch (Exception e2) {
+ SpiderDebug.log(e2);
+ return "";
+ }
+ }
+
+ public String homeVideoContent() {
+ try {
+ JSONArray jSONArray = new JSONObject(OkHttpUtil.string("https://pcw-api.iqiyi.com/api.php/app/index_video?token=", getHeaders("https://pcw-api.iqiyi.com/api.php/app/index_video?token="))).getJSONArray("list");
+ JSONArray jSONArray2 = new JSONArray();
+ for (int i = 0; i < jSONArray.length(); i++) {
+ JSONArray jSONArray3 = jSONArray.getJSONObject(i).getJSONArray("vlist");
+ int i2 = 0;
+ while (i2 < jSONArray3.length() && i2 < 6) {
+ JSONObject jSONObject = jSONArray3.getJSONObject(i2);
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("vod_id", jSONObject.optString("vod_id"));
+ jSONObject2.put("vod_name", jSONObject.optString("vod_name"));
+ jSONObject2.put("vod_pic", jSONObject.optString("vod_pic"));
+ jSONObject2.put("vod_remarks", jSONObject.optString("vod_remarks"));
+ jSONArray2.put(jSONObject2);
+ i2++;
+ }
+ }
+ JSONObject jSONObject3 = new JSONObject();
+ jSONObject3.put("list", jSONArray2);
+ return jSONObject3.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+
+ public void init(Context context) {
+ IQIYI.super.init(context);
+ try {
+ this.xr = new JSONArray("[{\"type_name\":\"电视\",\"type_id\":\"2\"},{\"type_name\":\"电影\",\"type_id\":\"1\"},{\"type_name\":\"综艺\",\"type_id\":\"6\"},{\"type_name\":\"动漫\",\"type_id\":\"4\"},{\"type_name\":\"纪录\",\"type_id\":\"3\"},{\"type_name\":\"教育\",\"type_id\":\"12\"},{\"type_name\":\"游戏\",\"type_id\":\"8\"},{\"type_name\":\"资讯\",\"type_id\":\"25\"},{\"type_name\":\"娱乐\",\"type_id\":\"7\"},{\"type_name\":\"财经\",\"type_id\":\"24\"},{\"type_name\":\"网络\",\"type_id\":\"1\"},{\"type_name\":\"片花\",\"type_id\":\"10\"},{\"type_name\":\"音乐\",\"type_id\":\"5\"},{\"type_name\":\"军事\",\"type_id\":\"28\"},{\"type_name\":\"体育\",\"type_id\":\"17\"},{\"type_name\":\"儿童\",\"type_id\":\"15\"},{\"type_name\":\"旅游\",\"type_id\":\"9\"},{\"type_name\":\"时尚\",\"type_id\":\"13\"},{\"type_name\":\"生活\",\"type_id\":\"21\"},{\"type_name\":\"汽车\",\"type_id\":\"26\"},{\"type_name\":\"搞笑\",\"type_id\":\"22\"},{\"type_name\":\"广告\",\"type_id\":\"20\"},{\"type_name\":\"原创\",\"type_id\":\"27\"},{\"type_name\":\"母婴\",\"type_id\":\"29\"},{\"type_name\":\"科技\",\"type_id\":\"30\"},{\"type_name\":\"健康\",\"type_id\":\"32\"}]");
+ this.a = new JSONObject("{\"22\":[{\"name\":\"分类\",\"value\":[{\"v\":\"22169\",\"n\":\"欢乐精选\"},{\"v\":\"29115\",\"n\":\"娱乐八卦\"},{\"v\":\"29116\",\"n\":\"搞笑短片\"},{\"v\":\"29139\",\"n\":\"影视剧吐槽\"},{\"v\":\"22172\",\"n\":\"雷人囧事\"},{\"v\":\"22171\",\"n\":\"爆笑节目\"},{\"v\":\"1905\",\"n\":\"萌宠\"},{\"v\":\"1909\",\"n\":\"童趣\"},{\"v\":\"1900\",\"n\":\"奇闻趣事\"},{\"v\":\"1902\",\"n\":\"恶搞配音\"},{\"v\":\"22170\",\"n\":\"猎奇\"}],\"key\":\"18074\"},{\"name\":\"地域\",\"value\":[{\"v\":\"1907\",\"n\":\"国内\"},{\"v\":\"1908\",\"n\":\"国外\"}],\"key\":\"18075\"}],\"24\":[{\"name\":\"分类\",\"value\":[{\"v\":\"2233\",\"n\":\"宏观\"},{\"v\":\"2234\",\"n\":\"民生\"},{\"v\":\"2235\",\"n\":\"产经\"},{\"v\":\"2236\",\"n\":\"市场\"},{\"v\":\"2237\",\"n\":\"理财\"},{\"v\":\"2238\",\"n\":\"访谈\"}],\"key\":\"18079\"}],\"25\":[{\"name\":\"类型\",\"value\":[{\"v\":\"20031\",\"n\":\"社会\"},{\"v\":\"20321\",\"n\":\"科技\"},{\"v\":\"21314\",\"n\":\"军事\"},{\"v\":\"21315\",\"n\":\"评论\"},{\"v\":\"21739\",\"n\":\"国内\"},{\"v\":\"21740\",\"n\":\"国际\"}],\"key\":\"20030\"}],\"26\":[{\"name\":\"内容\",\"value\":[{\"v\":\"20529\",\"n\":\"资讯\"},{\"v\":\"20530\",\"n\":\"专访\"},{\"v\":\"20531\",\"n\":\"新车\"},{\"v\":\"20532\",\"n\":\"试驾\"},{\"v\":\"20533\",\"n\":\"用车\"},{\"v\":\"20534\",\"n\":\"赛事\"},{\"v\":\"20535\",\"n\":\"交通\"},{\"v\":\"20536\",\"n\":\"娱乐\"},{\"v\":\"20537\",\"n\":\"车模\"},{\"v\":\"20538\",\"n\":\"改装\"},{\"v\":\"20539\",\"n\":\"车微剧\"},{\"v\":\"20540\",\"n\":\"爱汽车制造\"},{\"v\":\"28463\",\"n\":\"品牌\"},{\"v\":\"28464\",\"n\":\"车展\"},{\"v\":\"28534\",\"n\":\"航空\"},{\"v\":\"28535\",\"n\":\"游艇\"},{\"v\":\"28536\",\"n\":\"轨道\"}],\"key\":\"20528\"},{\"name\":\"车型\",\"value\":[{\"v\":\"20542\",\"n\":\"微型车\"},{\"v\":\"20543\",\"n\":\"小型车\"},{\"v\":\"20544\",\"n\":\"紧凑型车\"},{\"v\":\"20545\",\"n\":\"中型车\"},{\"v\":\"20546\",\"n\":\"中高型车\"},{\"v\":\"20547\",\"n\":\"豪华车\"},{\"v\":\"20548\",\"n\":\"MPV\"},{\"v\":\"20549\",\"n\":\"SUV\"},{\"v\":\"20550\",\"n\":\"跑车\"},{\"v\":\"20551\",\"n\":\"皮卡\"},{\"v\":\"20552\",\"n\":\"微客\"},{\"v\":\"22179\",\"n\":\"新概念\"},{\"v\":\"28465\",\"n\":\"电动车\"},{\"v\":\"28466\",\"n\":\"摩托车\"}],\"key\":\"20541\"},{\"name\":\"地区\",\"value\":[{\"v\":\"20554\",\"n\":\"自主品牌\"},{\"v\":\"20555\",\"n\":\"欧洲品牌\"},{\"v\":\"20556\",\"n\":\"亚洲品牌\"},{\"v\":\"20557\",\"n\":\"北美品牌\"}],\"key\":\"20553\"}],\"27\":[{\"name\":\"分类\",\"value\":[{\"v\":\"21317\",\"n\":\"动画\"},{\"v\":\"27986\",\"n\":\"短片\"},{\"v\":\"28034\",\"n\":\"网络剧\"},{\"v\":\"28053\",\"n\":\"创意广告\"},{\"v\":\"21318\",\"n\":\"微电影\"}],\"key\":\"21316\"}],\"28\":[{\"name\":\"分类\",\"value\":[{\"v\":\"21789\",\"n\":\"军情\"},{\"v\":\"21790\",\"n\":\"深度\"},{\"v\":\"21791\",\"n\":\"兵器\"},{\"v\":\"21792\",\"n\":\"战史\"},{\"v\":\"21793\",\"n\":\"人物\"},{\"v\":\"30090\",\"n\":\"航空航天\"}],\"key\":\"21788\"}],\"29\":[{\"name\":\"类型\",\"value\":[{\"v\":\"24083\",\"n\":\"萌宝乐园\"},{\"v\":\"24084\",\"n\":\"孕期\"},{\"v\":\"24085\",\"n\":\"分娩\"},{\"v\":\"24086\",\"n\":\"妈咪饮食\"},{\"v\":\"24087\",\"n\":\"宝宝饮食\"},{\"v\":\"24088\",\"n\":\"早教课堂\"},{\"v\":\"24089\",\"n\":\"婴幼儿常见疾病\"},{\"v\":\"27345\",\"n\":\"时尚辣妈圈\"},{\"v\":\"27350\",\"n\":\"亲子生活馆\"},{\"v\":\"29619\",\"n\":\"宝宝养育\"},{\"v\":\"29746\",\"n\":\"趣味玩具\"},{\"v\":\"30086\",\"n\":\"行业动态\"}],\"key\":\"24082\"},{\"name\":\"年龄段\",\"value\":[{\"v\":\"24121\",\"n\":\"0-1岁\"},{\"v\":\"24122\",\"n\":\"1-3岁\"},{\"v\":\"24123\",\"n\":\"3-6岁\"},{\"v\":\"24124\",\"n\":\"6岁以上\"}],\"key\":\"24120\"}],\"30\":[{\"name\":\"类型\",\"value\":[{\"v\":\"27936\",\"n\":\"评测\"},{\"v\":\"27937\",\"n\":\"教程\"},{\"v\":\"27938\",\"n\":\"活动\"},{\"v\":\"27939\",\"n\":\"广告\"},{\"v\":\"27974\",\"n\":\"资讯\"},{\"v\":\"28522\",\"n\":\"专访\"},{\"v\":\"27975\",\"n\":\"其他\"}],\"key\":\"24125\"},{\"name\":\"地区\",\"value\":[{\"v\":\"24132\",\"n\":\"国内\"},{\"v\":\"24133\",\"n\":\"国际\"}],\"key\":\"24131\"},{\"name\":\"内容\",\"value\":[{\"v\":\"27972\",\"n\":\"IT业界\"},{\"v\":\"27973\",\"n\":\"互联网\"},{\"v\":\"28521\",\"n\":\"APP\"},{\"v\":\"27942\",\"n\":\"手机\"},{\"v\":\"27943\",\"n\":\"笔记本\"},{\"v\":\"27944\",\"n\":\"智能硬件\"},{\"v\":\"27945\",\"n\":\"平板电脑\"},{\"v\":\"27946\",\"n\":\"数码相机\"},{\"v\":\"27948\",\"n\":\"PC\"},{\"v\":\"27949\",\"n\":\"家电\"},{\"v\":\"27950\",\"n\":\"游戏机\"},{\"v\":\"27951\",\"n\":\"前沿技术\"},{\"v\":\"27952\",\"n\":\"科学探索\"},{\"v\":\"27953\",\"n\":\"爱科技出品\"}],\"key\":\"27940\"}],\"31\":[{\"name\":\"语言\",\"value\":[{\"v\":\"27515\",\"n\":\"普通话\"},{\"v\":\"27516\",\"n\":\"英语\"},{\"v\":\"27517\",\"n\":\"韩语\"},{\"v\":\"27518\",\"n\":\"日语\"}],\"key\":\"27499\"},{\"name\":\"类型\",\"value\":[{\"v\":\"27507\",\"n\":\"文化\"},{\"v\":\"27508\",\"n\":\"娱乐\"},{\"v\":\"27509\",\"n\":\"访谈\"},{\"v\":\"27510\",\"n\":\"社会\"},{\"v\":\"27511\",\"n\":\"搞笑\"},{\"v\":\"27512\",\"n\":\"财经\"},{\"v\":\"27513\",\"n\":\"时尚\"},{\"v\":\"27514\",\"n\":\"历史\"},{\"v\":\"29117\",\"n\":\"电台\"},{\"v\":\"30290\",\"n\":\"科技\"},{\"v\":\"31318\",\"n\":\"相声评书\"},{\"v\":\"31319\",\"n\":\"演讲\"}],\"key\":\"27500\"},{\"name\":\"地区\",\"value\":[{\"v\":\"27502\",\"n\":\"内地\"},{\"v\":\"27503\",\"n\":\"台湾地区\"},{\"v\":\"27504\",\"n\":\"香港地区\"},{\"v\":\"27505\",\"n\":\"日本\"},{\"v\":\"27506\",\"n\":\"韩国\"},{\"v\":\"27824\",\"n\":\"美国\"}],\"key\":\"27501\"}],\"10\":[{\"name\":\"内容分类\",\"value\":[{\"v\":\"1007\",\"n\":\"电影\"},{\"v\":\"1006\",\"n\":\"电视剧\"}],\"key\":\"18031\"},{\"name\":\"电影地区\",\"value\":[{\"v\":\"29801\",\"n\":\"华语\"},{\"v\":\"29802\",\"n\":\"美国\"},{\"v\":\"29811\",\"n\":\"印度\"},{\"v\":\"29805\",\"n\":\"其它\"}],\"key\":\"18032\"},{\"name\":\"电视剧地区\",\"value\":[{\"v\":\"29927\",\"n\":\"内地\"},{\"v\":\"29929\",\"n\":\"韩剧\"},{\"v\":\"29930\",\"n\":\"美剧\"},{\"v\":\"29932\",\"n\":\"日剧\"},{\"v\":\"29934\",\"n\":\"台湾地区\"}],\"key\":\"21260\"},{\"name\":\"电视剧类型\",\"value\":[{\"v\":\"29973\",\"n\":\"网剧\"}],\"key\":\"21238\"}],\"32\":[{\"name\":\"类型\",\"value\":[{\"v\":\"28068\",\"n\":\"资讯\"},{\"v\":\"28069\",\"n\":\"医疗\"},{\"v\":\"28081\",\"n\":\"两性\"},{\"v\":\"28082\",\"n\":\"养生\"},{\"v\":\"28441\",\"n\":\"健身\"},{\"v\":\"28449\",\"n\":\"美容\"},{\"v\":\"28450\",\"n\":\"心理\"},{\"v\":\"28451\",\"n\":\"常识\"},{\"v\":\"28452\",\"n\":\"儿科\"},{\"v\":\"28456\",\"n\":\"老年\"},{\"v\":\"28459\",\"n\":\"宠物\"},{\"v\":\"28462\",\"n\":\"交流分享\"}],\"key\":\"28067\"}],\"11\":[{\"name\":\"类型\",\"value\":[{\"v\":\"990\",\"n\":\"经济\"},{\"v\":\"991\",\"n\":\"人文\"},{\"v\":\"992\",\"n\":\"艺术\"},{\"v\":\"994\",\"n\":\"科技\"},{\"v\":\"995\",\"n\":\"社会\"},{\"v\":\"996\",\"n\":\"哲学\"},{\"v\":\"997\",\"n\":\"心理\"},{\"v\":\"998\",\"n\":\"其它\"}],\"key\":\"18030\"}],\"33\":[{\"name\":\"类型\",\"value\":[{\"v\":\"28900\",\"n\":\"资讯\"},{\"v\":\"28541\",\"n\":\"娱乐\"},{\"v\":\"28542\",\"n\":\"体育\"},{\"v\":\"28543\",\"n\":\"电影\"},{\"v\":\"28544\",\"n\":\"微电影\"},{\"v\":\"28545\",\"n\":\"纪录片\"},{\"v\":\"28546\",\"n\":\"综艺\"},{\"v\":\"28547\",\"n\":\"脱口秀\"},{\"v\":\"28548\",\"n\":\"片花\"},{\"v\":\"28549\",\"n\":\"广告\"},{\"v\":\"28550\",\"n\":\"音乐\"},{\"v\":\"28551\",\"n\":\"动漫\"},{\"v\":\"28552\",\"n\":\"少儿\"},{\"v\":\"28553\",\"n\":\"游戏\"},{\"v\":\"28554\",\"n\":\"教育\"},{\"v\":\"28555\",\"n\":\"生活\"},{\"v\":\"28556\",\"n\":\"原创\"},{\"v\":\"28557\",\"n\":\"搞笑\"},{\"v\":\"28558\",\"n\":\"旅游\"},{\"v\":\"28559\",\"n\":\"时尚\"},{\"v\":\"28560\",\"n\":\"财经\"},{\"v\":\"28561\",\"n\":\"科技\"},{\"v\":\"28562\",\"n\":\"健康\"},{\"v\":\"28563\",\"n\":\"母婴\"},{\"v\":\"28564\",\"n\":\"汽车\"}],\"key\":\"28537\"},{\"name\":\"性质\",\"value\":[{\"v\":\"28895\",\"n\":\"其他\"},{\"v\":\"28565\",\"n\":\"环保\"},{\"v\":\"28566\",\"n\":\"捐款\"},{\"v\":\"28567\",\"n\":\"大病救助\"},{\"v\":\"28568\",\"n\":\"救灾\"},{\"v\":\"28569\",\"n\":\"动物保护\"},{\"v\":\"28570\",\"n\":\"社会关注\"}],\"key\":\"28538\"},{\"name\":\"分类\",\"value\":[{\"v\":\"28595\",\"n\":\"公益资讯\"},{\"v\":\"28596\",\"n\":\"公益人物\"},{\"v\":\"28597\",\"n\":\"公益活动\"},{\"v\":\"28598\",\"n\":\"公益作品\"},{\"v\":\"28599\",\"n\":\"公益影像\"},{\"v\":\"28600\",\"n\":\"公益组织\"}],\"key\":\"28539\"},{\"name\":\"国家/地区\",\"value\":[{\"v\":\"28601\",\"n\":\"国内\"},{\"v\":\"28602\",\"n\":\"国外\"}],\"key\":\"28540\"}],\"12\":[{\"name\":\"分类\",\"value\":[{\"v\":\"32641\",\"n\":\"中小学\"},{\"v\":\"32655\",\"n\":\"大学\"},{\"v\":\"32659\",\"n\":\"职业考证\"},{\"v\":\"32669\",\"n\":\"外语\"},{\"v\":\"32674\",\"n\":\"职场\"},{\"v\":\"32684\",\"n\":\"IT/互联网\"},{\"v\":\"32692\",\"n\":\"财经\"},{\"v\":\"32697\",\"n\":\"文史\"},{\"v\":\"32704\",\"n\":\"艺术\"},{\"v\":\"32712\",\"n\":\"运动健身\"},{\"v\":\"32718\",\"n\":\"健康\"},{\"v\":\"32722\",\"n\":\"心理\"},{\"v\":\"32725\",\"n\":\"亲子\"},{\"v\":\"32732\",\"n\":\"生活\"},{\"v\":\"32890\",\"n\":\"党政\"}],\"key\":\"32640\"}],\"13\":[{\"name\":\"行业\",\"value\":[{\"v\":\"1208\",\"n\":\"服饰\"},{\"v\":\"1209\",\"n\":\"美容\"},{\"v\":\"1210\",\"n\":\"生活\"},{\"v\":\"1211\",\"n\":\"其它\"}],\"key\":\"18051\"},{\"name\":\"季节\",\"value\":[{\"v\":\"1224\",\"n\":\"早春\"},{\"v\":\"1225\",\"n\":\"春夏\"},{\"v\":\"1226\",\"n\":\"早秋\"},{\"v\":\"1227\",\"n\":\"秋冬\"},{\"v\":\"1228\",\"n\":\"其它\"}],\"key\":\"18053\"},{\"name\":\"类型\",\"value\":[{\"v\":\"1229\",\"n\":\"公告牌\"},{\"v\":\"1230\",\"n\":\"奇艺自制\"},{\"v\":\"1231\",\"n\":\"热门综艺\"},{\"v\":\"1232\",\"n\":\"名利场\"},{\"v\":\"1233\",\"n\":\"趋势报道\"},{\"v\":\"1234\",\"n\":\"本季流行\"},{\"v\":\"1235\",\"n\":\"秀场\"},{\"v\":\"1236\",\"n\":\"广告大片\"},{\"v\":\"1237\",\"n\":\"街拍\"},{\"v\":\"1238\",\"n\":\"人物\"},{\"v\":\"1240\",\"n\":\"乐活\"},{\"v\":\"1241\",\"n\":\"其它\"}],\"key\":\"18054\"}],\"14\":[{\"name\":\"地区\",\"value\":[{\"v\":\"1278\",\"n\":\"内地\"},{\"v\":\"1279\",\"n\":\"港台\"},{\"v\":\"1280\",\"n\":\"日韩\"},{\"v\":\"1281\",\"n\":\"欧美\"},{\"v\":\"1282\",\"n\":\"其它\"}],\"key\":\"18055\"},{\"name\":\"类型\",\"value\":[{\"v\":\"1247\",\"n\":\"播报\"},{\"v\":\"1248\",\"n\":\"访谈\"},{\"v\":\"1249\",\"n\":\"搞笑\"},{\"v\":\"1250\",\"n\":\"游戏\"},{\"v\":\"1251\",\"n\":\"选秀\"},{\"v\":\"1252\",\"n\":\"时尚\"},{\"v\":\"1253\",\"n\":\"杂谈\"},{\"v\":\"1254\",\"n\":\"情感\"},{\"v\":\"1255\",\"n\":\"盛会\"},{\"v\":\"1256\",\"n\":\"曲艺\"},{\"v\":\"1257\",\"n\":\"美食\"},{\"v\":\"1258\",\"n\":\"粤语\"},{\"v\":\"1276\",\"n\":\"时尚综艺\"}],\"key\":\"18056\"}],\"15\":[{\"name\":\"地区\",\"value\":[{\"v\":\"1261\",\"n\":\"欧美\"},{\"v\":\"1259\",\"n\":\"大陆\"},{\"v\":\"1260\",\"n\":\"港台\"},{\"v\":\"28933\",\"n\":\"韩国\"},{\"v\":\"1263\",\"n\":\"其它\"}],\"key\":\"18057\"},{\"name\":\"年龄段\",\"value\":[{\"v\":\"4489\",\"n\":\"0-3岁\"},{\"v\":\"28929\",\"n\":\"4-6岁\"},{\"v\":\"4493\",\"n\":\"7-10岁\"},{\"v\":\"4494\",\"n\":\"11-13岁\"}],\"key\":\"20288\"},{\"name\":\"课程类型\",\"value\":[{\"v\":\"28983\",\"n\":\"儿歌\"},{\"v\":\"28984\",\"n\":\"故事\"},{\"v\":\"28985\",\"n\":\"学英语\"},{\"v\":\"28986\",\"n\":\"百科\"},{\"v\":\"28987\",\"n\":\"国学\"},{\"v\":\"28988\",\"n\":\"手工\"},{\"v\":\"28989\",\"n\":\"识字\"},{\"v\":\"28990\",\"n\":\"数学\"},{\"v\":\"28991\",\"n\":\"美术\"},{\"v\":\"28993\",\"n\":\"舞蹈\"},{\"v\":\"30918\",\"n\":\"音乐\"},{\"v\":\"30919\",\"n\":\"诗词\"},{\"v\":\"28994\",\"n\":\"其他\"}],\"key\":\"28982\"}],\"16\":[{\"name\":\"类型\",\"value\":[{\"v\":\"1296\",\"n\":\"喜剧\"},{\"v\":\"1297\",\"n\":\"爱情\"},{\"v\":\"1298\",\"n\":\"动作\"}],\"key\":\"18061\"}],\"17\":[{\"name\":\"大项\",\"value\":[{\"v\":\"1673\",\"n\":\"足球\"},{\"v\":\"1688\",\"n\":\"篮球\"},{\"v\":\"1700\",\"n\":\"网球\"},{\"v\":\"1707\",\"n\":\"高尔夫\"},{\"v\":\"1708\",\"n\":\"赛车\"},{\"v\":\"1712\",\"n\":\"台球\"},{\"v\":\"32632\",\"n\":\"街舞\"},{\"v\":\"22178\",\"n\":\"健身\"},{\"v\":\"1715\",\"n\":\"综合\"}],\"key\":\"18067\"},{\"name\":\"类型\",\"value\":[{\"v\":\"1724\",\"n\":\"集锦\"},{\"v\":\"1725\",\"n\":\"花絮\"},{\"v\":\"1727\",\"n\":\"整场\"},{\"v\":\"1728\",\"n\":\"节目\"},{\"v\":\"1729\",\"n\":\"纪录片\"},{\"v\":\"1730\",\"n\":\"教学\"},{\"v\":\"1837\",\"n\":\"资讯\"},{\"v\":\"22180\",\"n\":\"瞬间\"},{\"v\":\"22182\",\"n\":\"球星\"},{\"v\":\"1731\",\"n\":\"其它\"}],\"key\":\"18066\"}],\"18\":[{\"name\":\"大项\",\"value\":[{\"v\":\"1322\",\"n\":\"足球\"},{\"v\":\"1323\",\"n\":\"网球\"},{\"v\":\"1324\",\"n\":\"曲棍球\"},{\"v\":\"1325\",\"n\":\"羽毛球\"},{\"v\":\"1326\",\"n\":\"手球\"},{\"v\":\"1327\",\"n\":\"排球\"},{\"v\":\"1328\",\"n\":\"乒乓球\"},{\"v\":\"1329\",\"n\":\"篮球\"},{\"v\":\"1330\",\"n\":\"游泳\"},{\"v\":\"1331\",\"n\":\"花样游泳\"},{\"v\":\"1332\",\"n\":\"跳水\"},{\"v\":\"1333\",\"n\":\"水球\"},{\"v\":\"1334\",\"n\":\"田径\"},{\"v\":\"1335\",\"n\":\"自行车\"},{\"v\":\"1336\",\"n\":\"体操\"},{\"v\":\"1337\",\"n\":\"马术\"},{\"v\":\"1338\",\"n\":\"射箭\"},{\"v\":\"1339\",\"n\":\"射击\"},{\"v\":\"1340\",\"n\":\"击剑\"},{\"v\":\"1341\",\"n\":\"举重\"},{\"v\":\"1342\",\"n\":\"拳击\"},{\"v\":\"1343\",\"n\":\"柔道\"},{\"v\":\"1344\",\"n\":\"摔跤\"},{\"v\":\"1345\",\"n\":\"跆拳道\"},{\"v\":\"1346\",\"n\":\"皮划艇\"},{\"v\":\"1347\",\"n\":\"赛艇\"},{\"v\":\"1348\",\"n\":\"帆船\"},{\"v\":\"1349\",\"n\":\"现代五项\"},{\"v\":\"1350\",\"n\":\"铁人三项\"}],\"key\":\"18062\"},{\"name\":\"类型\",\"value\":[{\"v\":\"1316\",\"n\":\"比赛\"},{\"v\":\"1317\",\"n\":\"花絮\"},{\"v\":\"1318\",\"n\":\"节目\"},{\"v\":\"1319\",\"n\":\"访谈\"},{\"v\":\"1320\",\"n\":\"资讯\"},{\"v\":\"1321\",\"n\":\"历史\"}],\"key\":\"18064\"}],\"1\":[{\"name\":\"地区\",\"value\":[{\"v\":\"1\",\"n\":\"华语\"},{\"v\":\"2\",\"n\":\"美国\"},{\"v\":\"3\",\"n\":\"欧洲\"},{\"v\":\"4\",\"n\":\"韩国\"},{\"v\":\"308\",\"n\":\"日本\"},{\"v\":\"28999\",\"n\":\"印度\"},{\"v\":\"5\",\"n\":\"其它\"}],\"key\":\"18000\"},{\"name\":\"类型\",\"value\":[{\"v\":\"8\",\"n\":\"喜剧\"},{\"v\":\"6\",\"n\":\"爱情\"},{\"v\":\"11\",\"n\":\"动作\"},{\"v\":\"131\",\"n\":\"枪战\"},{\"v\":\"291\",\"n\":\"犯罪\"},{\"v\":\"128\",\"n\":\"惊悚\"},{\"v\":\"10\",\"n\":\"恐怖\"},{\"v\":\"289\",\"n\":\"悬疑\"},{\"v\":\"12\",\"n\":\"动画\"},{\"v\":\"27356\",\"n\":\"家庭\"},{\"v\":\"1284\",\"n\":\"奇幻\"},{\"v\":\"9\",\"n\":\"科幻\"},{\"v\":\"7\",\"n\":\"战争\"},{\"v\":\"130\",\"n\":\"青春\"}],\"key\":\"18001\"},{\"name\":\"规格\",\"value\":[{\"v\":\"27397\",\"n\":\"巨制\"},{\"v\":\"27815\",\"n\":\"院线\"},{\"v\":\"30149\",\"n\":\"独播\"},{\"v\":\"27401\",\"n\":\"网络电影\"}],\"key\":\"27396\"}],\"2\":[{\"name\":\"地区\",\"value\":[{\"v\":\"15\",\"n\":\"内地\"},{\"v\":\"17\",\"n\":\"韩剧\"},{\"v\":\"18\",\"n\":\"美剧\"},{\"v\":\"309\",\"n\":\"日剧\"},{\"v\":\"1117\",\"n\":\"台湾地区\"}],\"key\":\"18002\"},{\"name\":\"类型\",\"value\":[{\"v\":\"24\",\"n\":\"古装\"},{\"v\":\"20\",\"n\":\"言情\"},{\"v\":\"23\",\"n\":\"武侠\"},{\"v\":\"30\",\"n\":\"偶像\"},{\"v\":\"1654\",\"n\":\"家庭\"},{\"v\":\"1653\",\"n\":\"青春\"},{\"v\":\"24064\",\"n\":\"都市\"},{\"v\":\"135\",\"n\":\"喜剧\"},{\"v\":\"32\",\"n\":\"悬疑\"},{\"v\":\"149\",\"n\":\"罪案\"},{\"v\":\"148\",\"n\":\"穿越\"},{\"v\":\"139\",\"n\":\"宫廷\"},{\"v\":\"21\",\"n\":\"历史\"},{\"v\":\"145\",\"n\":\"神话\"},{\"v\":\"34\",\"n\":\"科幻\"},{\"v\":\"27\",\"n\":\"年代\"},{\"v\":\"140\",\"n\":\"商战\"},{\"v\":\"24063\",\"n\":\"剧情\"},{\"v\":\"24065\",\"n\":\"网剧\"}],\"key\":\"18003\"}],\"3\":[{\"name\":\"地区\",\"value\":[{\"v\":\"20323\",\"n\":\"国内\"},{\"v\":\"20324\",\"n\":\"国外\"}],\"key\":\"20322\"},{\"name\":\"类型\",\"value\":[{\"v\":\"70\",\"n\":\"人文\"},{\"v\":\"33908\",\"n\":\"美食\"},{\"v\":\"33924\",\"n\":\"医疗\"},{\"v\":\"33933\",\"n\":\"自然\"},{\"v\":\"33945\",\"n\":\"萌宠\"},{\"v\":\"33953\",\"n\":\"财经\"},{\"v\":\"33960\",\"n\":\"罪案\"},{\"v\":\"33967\",\"n\":\"竞技\"},{\"v\":\"33974\",\"n\":\"灾难\"},{\"v\":\"74\",\"n\":\"历史\"},{\"v\":\"73\",\"n\":\"探险\"},{\"v\":\"71\",\"n\":\"社会\"},{\"v\":\"28119\",\"n\":\"科技\"},{\"v\":\"310\",\"n\":\"旅游\"}],\"key\":\"18004\"},{\"name\":\"出品方\",\"value\":[{\"v\":\"31283\",\"n\":\"爱奇艺出品\"}],\"key\":\"28467\"},{\"name\":\"片种\",\"value\":[{\"v\":\"29077\",\"n\":\"纪录电影\"},{\"v\":\"29078\",\"n\":\"系列纪录片\"},{\"v\":\"29082\",\"n\":\"网络纪录片\"},{\"v\":\"29083\",\"n\":\"纪实栏目\"}],\"key\":\"29076\"}],\"4\":[{\"name\":\"地区\",\"value\":[{\"v\":\"37\",\"n\":\"中国大陆\"},{\"v\":\"38\",\"n\":\"日本\"},{\"v\":\"30218\",\"n\":\"欧美\"}],\"key\":\"18005\"},{\"name\":\"版本\",\"value\":[{\"v\":\"30220\",\"n\":\"动画\"},{\"v\":\"32784\",\"n\":\"动画电影\"},{\"v\":\"33482\",\"n\":\"轻动画\"},{\"v\":\"33483\",\"n\":\"短剧\"}],\"key\":\"30219\"},{\"name\":\"风格\",\"value\":[{\"v\":\"30230\",\"n\":\"搞笑\"},{\"v\":\"30232\",\"n\":\"热血\"},{\"v\":\"30233\",\"n\":\"催泪\"},{\"v\":\"30234\",\"n\":\"治愈\"},{\"v\":\"30237\",\"n\":\"励志\"},{\"v\":\"30241\",\"n\":\"机战\"},{\"v\":\"30243\",\"n\":\"恋爱\"},{\"v\":\"30245\",\"n\":\"科幻\"},{\"v\":\"30247\",\"n\":\"奇幻\"},{\"v\":\"30248\",\"n\":\"推理\"},{\"v\":\"30249\",\"n\":\"校园\"},{\"v\":\"30252\",\"n\":\"日常\"},{\"v\":\"30255\",\"n\":\"美食\"},{\"v\":\"30256\",\"n\":\"职场\"},{\"v\":\"30258\",\"n\":\"偶像\"},{\"v\":\"30265\",\"n\":\"泡面\"},{\"v\":\"30267\",\"n\":\"冒险\"},{\"v\":\"30268\",\"n\":\"竞技\"},{\"v\":\"30270\",\"n\":\"合家欢\"},{\"v\":\"32792\",\"n\":\"武侠\"},{\"v\":\"32793\",\"n\":\"玄幻\"}],\"key\":\"30225\"},{\"name\":\"新类型\",\"value\":[{\"v\":\"32796\",\"n\":\"轻小说改编\"},{\"v\":\"32797\",\"n\":\"漫画改编\"},{\"v\":\"32798\",\"n\":\"游戏改编\"},{\"v\":\"32799\",\"n\":\"原创\"}],\"key\":\"32795\"}],\"5\":[{\"name\":\"地区\",\"value\":[{\"v\":\"221\",\"n\":\"内地\"},{\"v\":\"220\",\"n\":\"港台\"},{\"v\":\"219\",\"n\":\"欧美\"},{\"v\":\"218\",\"n\":\"日韩\"},{\"v\":\"217\",\"n\":\"拉美\"},{\"v\":\"216\",\"n\":\"亚洲地区\"},{\"v\":\"215\",\"n\":\"非洲\"}],\"key\":\"18008\"},{\"name\":\"语种\",\"value\":[{\"v\":\"91\",\"n\":\"普通话\"},{\"v\":\"92\",\"n\":\"粤语\"},{\"v\":\"93\",\"n\":\"闽南语\"},{\"v\":\"94\",\"n\":\"英语\"},{\"v\":\"95\",\"n\":\"日语\"},{\"v\":\"96\",\"n\":\"韩语\"},{\"v\":\"97\",\"n\":\"其它\"}],\"key\":\"18009\"}],\"6\":[{\"name\":\"地区\",\"value\":[{\"v\":\"151\",\"n\":\"内地\"},{\"v\":\"152\",\"n\":\"港台\"},{\"v\":\"33306\",\"n\":\"韩国\"},{\"v\":\"154\",\"n\":\"欧美\"},{\"v\":\"1113\",\"n\":\"其它\"}],\"key\":\"18013\"},{\"name\":\"类型\",\"value\":[{\"v\":\"155\",\"n\":\"播报\"},{\"v\":\"156\",\"n\":\"访谈\"},{\"v\":\"158\",\"n\":\"游戏\"},{\"v\":\"292\",\"n\":\"晚会\"},{\"v\":\"2118\",\"n\":\"脱口秀\"},{\"v\":\"2224\",\"n\":\"真人秀\"},{\"v\":\"33860\",\"n\":\"竞演\"}],\"key\":\"18014\"}],\"7\":[{\"name\":\"内容类型\",\"value\":[{\"v\":\"169\",\"n\":\"独家\"},{\"v\":\"170\",\"n\":\"热点\"},{\"v\":\"171\",\"n\":\"原创\"},{\"v\":\"175\",\"n\":\"八卦\"},{\"v\":\"176\",\"n\":\"选秀\"},{\"v\":\"180\",\"n\":\"搞笑\"},{\"v\":\"182\",\"n\":\"颁奖\"},{\"v\":\"183\",\"n\":\"活动\"},{\"v\":\"349\",\"n\":\"结婚\"},{\"v\":\"350\",\"n\":\"去世\"},{\"v\":\"351\",\"n\":\"生子\"},{\"v\":\"352\",\"n\":\"探班\"},{\"v\":\"353\",\"n\":\"事故\"},{\"v\":\"637\",\"n\":\"票房\"},{\"v\":\"951\",\"n\":\"纠纷\"},{\"v\":\"1001\",\"n\":\"星座\"},{\"v\":\"1088\",\"n\":\"演唱会\"},{\"v\":\"1658\",\"n\":\"慈善\"},{\"v\":\"32512\",\"n\":\"话剧\"},{\"v\":\"32513\",\"n\":\"舞蹈\"},{\"v\":\"32514\",\"n\":\"戏曲\"},{\"v\":\"32515\",\"n\":\"儿童剧\"},{\"v\":\"32516\",\"n\":\"歌剧\"},{\"v\":\"32517\",\"n\":\"音乐剧\"},{\"v\":\"32518\",\"n\":\"音乐会\"},{\"v\":\"32519\",\"n\":\"相声\"},{\"v\":\"32520\",\"n\":\"马戏\"},{\"v\":\"32521\",\"n\":\"魔术\"},{\"v\":\"32522\",\"n\":\"展览\"},{\"v\":\"32523\",\"n\":\"其它\"}],\"key\":\"18016\"},{\"name\":\"地区\",\"value\":[{\"v\":\"184\",\"n\":\"内地\"},{\"v\":\"185\",\"n\":\"港台\"},{\"v\":\"186\",\"n\":\"韩国\"},{\"v\":\"187\",\"n\":\"海外\"},{\"v\":\"188\",\"n\":\"其它\"}],\"key\":\"18017\"},{\"name\":\"类型\",\"value\":[{\"v\":\"1077\",\"n\":\"电影\"},{\"v\":\"1078\",\"n\":\"电视\"},{\"v\":\"1079\",\"n\":\"音乐\"},{\"v\":\"1080\",\"n\":\"演出\"},{\"v\":\"1081\",\"n\":\"明星\"},{\"v\":\"1082\",\"n\":\"综艺\"},{\"v\":\"1656\",\"n\":\"公益\"},{\"v\":\"32507\",\"n\":\"展览\"},{\"v\":\"32508\",\"n\":\"艺术节\"},{\"v\":\"32538\",\"n\":\"韩娱演出\"},{\"v\":\"1083\",\"n\":\"其它\"}],\"key\":\"18042\"}],\"8\":[{\"name\":\"类型\",\"value\":[{\"v\":\"21276\",\"n\":\"电子竞技\"},{\"v\":\"21275\",\"n\":\"网络游戏\"},{\"v\":\"21277\",\"n\":\"单机游戏\"},{\"v\":\"21278\",\"n\":\"手机游戏\"},{\"v\":\"30902\",\"n\":\"少儿游戏\"},{\"v\":\"21279\",\"n\":\"游戏美女\"}],\"key\":\"18024\"}],\"9\":[{\"name\":\"类型\",\"value\":[{\"v\":\"354\",\"n\":\"风光\"},{\"v\":\"355\",\"n\":\"饮食\"},{\"v\":\"356\",\"n\":\"住宿\"},{\"v\":\"357\",\"n\":\"新闻\"},{\"v\":\"30150\",\"n\":\"钓鱼\"},{\"v\":\"638\",\"n\":\"出行方式\"},{\"v\":\"29134\",\"n\":\"户外\"},{\"v\":\"29135\",\"n\":\"文化\"},{\"v\":\"639\",\"n\":\"奇趣\"}],\"key\":\"18029\"}],\"20\":[{\"name\":\"分类\",\"value\":[{\"v\":\"1859\",\"n\":\"明星\"},{\"v\":\"1860\",\"n\":\"公益\"},{\"v\":\"1861\",\"n\":\"欧美\"},{\"v\":\"1862\",\"n\":\"形象\"},{\"v\":\"1863\",\"n\":\"搞笑\"},{\"v\":\"1864\",\"n\":\"时尚\"},{\"v\":\"1865\",\"n\":\"儿童\"},{\"v\":\"1866\",\"n\":\"生活\"},{\"v\":\"1868\",\"n\":\"热门\"}],\"key\":\"18070\"},{\"name\":\"行业\",\"value\":[{\"v\":\"1883\",\"n\":\"IT数码\"},{\"v\":\"1884\",\"n\":\"汽车\"},{\"v\":\"1885\",\"n\":\"金融\"},{\"v\":\"1886\",\"n\":\"房地产\"},{\"v\":\"1887\",\"n\":\"化妆品\"},{\"v\":\"1888\",\"n\":\"食品饮料\"},{\"v\":\"1889\",\"n\":\"烟酒\"},{\"v\":\"1890\",\"n\":\"运动户外\"},{\"v\":\"1891\",\"n\":\"服装\"},{\"v\":\"1892\",\"n\":\"鞋包配件\"},{\"v\":\"1893\",\"n\":\"家具电器\"},{\"v\":\"1894\",\"n\":\"医药\"},{\"v\":\"1895\",\"n\":\"珠宝手表\"},{\"v\":\"1896\",\"n\":\"日化用品\"},{\"v\":\"28481\",\"n\":\"游戏\"},{\"v\":\"2295\",\"n\":\"其他\"}],\"key\":\"18073\"},{\"name\":\"版块\",\"value\":[{\"v\":\"2291\",\"n\":\"大赏\"},{\"v\":\"2292\",\"n\":\"微短片\"},{\"v\":\"2293\",\"n\":\"创意\"},{\"v\":\"2294\",\"n\":\"经典\"},{\"v\":\"29114\",\"n\":\"特约播映\"}],\"key\":\"18081\"}],\"21\":[{\"name\":\"分类\",\"value\":[{\"v\":\"2218\",\"n\":\"美食\"},{\"v\":\"31322\",\"n\":\"窍门\"},{\"v\":\"1879\",\"n\":\"家居\"},{\"v\":\"2228\",\"n\":\"宠物\"},{\"v\":\"1878\",\"n\":\"健康\"},{\"v\":\"2226\",\"n\":\"舞蹈\"},{\"v\":\"2230\",\"n\":\"情感\"},{\"v\":\"1876\",\"n\":\"奇闻\"},{\"v\":\"2227\",\"n\":\"休闲\"}],\"key\":\"18071\"},{\"name\":\"地域\",\"value\":[{\"v\":\"1881\",\"n\":\"国内\"},{\"v\":\"1882\",\"n\":\"国外\"}],\"key\":\"18072\"}]}");
+ } catch (JSONException e) {
+ SpiderDebug.log(e);
+ }
+ }
+
+ public String join(@NonNull CharSequence charSequence, @NonNull Iterable iterable) {
+ Iterator it = iterable.iterator();
+ if (!it.hasNext()) {
+ return "";
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append(it.next());
+ while (it.hasNext()) {
+ sb.append(charSequence);
+ sb.append(it.next());
+ }
+ return sb.toString();
+ }
+
+ public String playerContent(String str, String str2, List list) {
+ try {
+ JSONObject jSONObject = new JSONObject();
+ try {
+ jSONObject.put("parse", 1);
+ jSONObject.put("jx", "1");
+ jSONObject.put("url", str2);
+ return jSONObject.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return jSONObject.toString();
+ }
+ } catch (Exception e2) {
+ SpiderDebug.log(e2);
+ return "";
+ }
+ }
+
+ public String searchContent(String str, boolean quick) {
+ try {
+ String url = "https://search.video.iqiyi.com/o?if=html5&key=" + str + "&pageNum=1&pos=1&pageSize=20";
+ String json = OkHttpUtil.string(url, getHeaders(url));
+ JSONArray optJSONArray = new JSONObject(json).optJSONObject("data").optJSONArray("docinfos");
+
+ JSONArray videos = new JSONArray();
+ for (int i = 0; i < optJSONArray.length(); i++) {
+ JSONObject optJSONObject = optJSONArray.getJSONObject(i).optJSONObject("albumDocInfo");
+ JSONObject video = new JSONObject();
+ String optString = optJSONObject.optString("albumLink");
+ video.put("vod_id", "/albums/album/avlistinfo?aid=" + optJSONObject.optString("qipu_id") + "&size=5000&page=1&url=" + optString);
+ video.put("vod_name", optJSONObject.optString("albumTitle"));
+ video.put("vod_pic", optJSONObject.optString("albumImg"));
+ video.put("vod_remarks", optJSONObject.optString("releaseDate"));
+ videos.put(video);
+ }
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("list", videos);
+ return jSONObject2.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+}
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 00000000..d6f6b930
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Kunyu77.java
@@ -0,0 +1,377 @@
+package com.github.catvod.spider;
+
+import android.text.TextUtils;
+
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.net.SSLSocketFactoryCompat;
+import com.github.catvod.utils.Misc;
+
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.*;
+
+
+/**
+ * Author: @SDL
+ */
+public class Kunyu77 extends Spider {
+ private final String siteUrl = "http://api.tyun77.cn";
+
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ String url = siteUrl + "/api.php/provide/filter";
+ String content = getWebContent(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 = getWebContent(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) {
+ e.printStackTrace();
+ }
+ }
+ JSONObject result = new JSONObject();
+ result.put("class", classes);
+ if (filter) {
+ result.put("filters", filterConfig);
+ }
+ return result.toString();
+ } catch (Throwable th) {
+
+ }
+ return "";
+ }
+
+ private String getWebContent(String targetUrl) throws IOException {
+ String userAgent = "okhttp/3.12.0";
+ Request request = new Request.Builder()
+ .url(targetUrl)
+ .get()
+ .addHeader("User-Agent", userAgent)
+ .build();
+ OkHttpClient okHttpClient = new OkHttpClient()
+ .newBuilder()
+ .sslSocketFactory(new SSLSocketFactoryCompat(), SSLSocketFactoryCompat.trustAllCert)
+ .build();
+ Response response = okHttpClient.newCall(request).execute();
+ if (response.body() == null) return "";
+ String content = response.body().string();
+ response.close();
+ return content;
+ }
+
+ @Override
+ public String homeVideoContent() {
+ try {
+ JSONArray videos = new JSONArray();
+ try {
+ String url = siteUrl + "/api.php/provide/homeBlock?type_id=0";
+ String content = getWebContent(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 = getWebContent(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 (Exception e) {
+ }
+ return "";
+ }
+
+ @Override
+ public String detailContent(List ids) {
+ try {
+ String url = siteUrl + "/api.php/provide/videoDetail?devid=453CA5D864457C7DB4D0EAA93DE96E66&package=com.sevenVideo.app.android&version=&ids=" + ids.get(0);
+ String content = getWebContent(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?devid=453CA5D864457C7DB4D0EAA93DE96E66&package=com.sevenVideo.app.android&version=&ids=" + ids.get(0);
+ content = getWebContent(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 = getWebContent(url);
+ JSONObject dataObj = new JSONObject(decryptResponse(content)).getJSONObject("data");
+ JSONObject playHeader = dataObj.optJSONObject("playHeader");
+ String jxUrl = dataObj.getString("url");
+ content = getWebContent(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 = getWebContent(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/MGTV.java b/app/src/main/java/com/github/catvod/spider/MGTV.java
new file mode 100644
index 00000000..8a5e85a1
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/MGTV.java
@@ -0,0 +1,314 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+import android.net.Uri;
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.crawler.SpiderDebug;
+import com.github.catvod.utils.okhttp.OkHttpUtil;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import rxhttp.wrapper.annotations.NonNull;
+
+public class MGTV extends Spider {
+ protected JSONObject a;
+ protected JSONObject q = new JSONObject();
+
+ private String q(String str, String str2) {
+ String str3;
+ try {
+ if (str2.startsWith("//")) {
+ Uri parse = Uri.parse(str);
+ str3 = parse.getScheme() + ":" + str2;
+ } else if (str2.contains("://")) {
+ return str2;
+ } else {
+ Uri parse2 = Uri.parse(str);
+ str3 = parse2.getScheme() + "://" + parse2.getHost() + str2;
+ }
+ return str3;
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return str2;
+ }
+ }
+
+ public String categoryContent(String str, String str2, boolean z, HashMap hashMap) {
+ try {
+ String str3 = "https://pianku.api.mgtv.com/rider/list/msite/v2?platform=msite&channelId=" + str + "&pn=" + str2 + "&chargeInfo=&sort=c2";
+ if (hashMap != null) {
+ for (String str4 : hashMap.keySet()) {
+ String trim = hashMap.get(str4).trim();
+ if (trim.length() != 0) {
+ str3 = str3 + "&" + str4 + "=" + URLEncoder.encode(trim);
+ }
+ }
+ }
+ String content = OkHttpUtil.string(str3, getHeaders(str3));
+ JSONObject jSONObject = new JSONObject();
+ try {
+ JSONArray optJSONArray = new JSONObject(content).optJSONObject("data").optJSONArray("hitDocs");
+ JSONArray jSONArray = new JSONArray();
+ for (int i = 0; i < optJSONArray.length(); i++) {
+ JSONObject optJSONObject = optJSONArray.optJSONObject(i);
+ String optString = optJSONObject.optString("title");
+ String q = q(str3, optJSONObject.optString("img"));
+ String optString2 = optJSONObject.optString("updateInfo");
+ if (optString2.equals("")) {
+ optString2 = optJSONObject.optString("subtitle");
+ }
+ String vodId = optJSONObject.optString("playPartId");
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("vod_id", vodId);
+ jSONObject2.put("vod_name", optString);
+ jSONObject2.put("vod_pic", q);
+ jSONObject2.put("vod_remarks", optString2);
+ jSONArray.put(jSONObject2);
+ }
+ jSONObject.put("list", jSONArray);
+ jSONObject.put("page", str2);
+ jSONObject.put("pagecount", Integer.MAX_VALUE);
+ jSONObject.put("limit", 90);
+ jSONObject.put("total", Integer.MAX_VALUE);
+ jSONObject.put("list", jSONArray);
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return jSONObject.toString(4);
+ } catch (Exception e2) {
+ SpiderDebug.log(e2);
+ return "";
+ }
+ }
+
+ public String detailContent(List list) {
+ try {
+ String vodId = list.get(0);
+ String infoUrl = "https://pcweb.api.mgtv.com/player/vinfo?video_id=" + vodId;
+ String infoJson = OkHttpUtil.string(infoUrl, getHeaders(infoUrl));
+ JSONObject info = new JSONObject(infoJson).getJSONObject("data");
+ String pic = info.getString("clip_imgurl2");
+
+ int pageSize = 30;
+ int page = 1;
+ String url = "https://pcweb.api.mgtv.com/episode/list?_support=10000000&version=5.5.35&video_id="+vodId+"&page="+page+"&size="+pageSize+"&allowedRC=1&_support=10000000";
+ String json = OkHttpUtil.string(url, getHeaders(url));
+ JSONObject jSONObject = new JSONObject(json).getJSONObject("data");
+ JSONObject jSONObject2 = new JSONObject();
+ JSONObject optJSONObject = jSONObject.optJSONObject("info");
+ jSONObject2.put("vod_id", vodId);
+ jSONObject2.put("vod_name", optJSONObject.optString("title"));
+ jSONObject2.put("vod_pic", pic);
+ jSONObject2.put("vod_content", optJSONObject.optString("desc"));
+ JSONArray optJSONArray = jSONObject.optJSONArray("list");
+ ArrayList arrayList = new ArrayList();
+
+ for (int i = 0; i < optJSONArray.length(); i++) {
+ JSONObject optJSONObject2 = optJSONArray.optJSONObject(i);
+ String viewName = optJSONObject2.optString("t1") + " " + optJSONObject2.optString("t2");
+ arrayList.add(viewName + "$" + optJSONObject2.optString("url"));
+ }
+
+ int totalPage = jSONObject.getInt("total_page");
+ int count = jSONObject.getInt("count");
+ int total = jSONObject.getInt("total");
+ ArrayList blocks = new ArrayList();
+ ArrayList blockList = new ArrayList();
+ if (totalPage == 1) {
+ blocks.add("mgtv");
+ } else if (totalPage > 1) {
+ blocks.add("1-" + pageSize);
+ }
+ blockList.add(join("#", arrayList));
+ if (totalPage > page) {
+ for (int curPage = 2; curPage<=totalPage; curPage++) {
+ String listUrl = "https://pcweb.api.mgtv.com/episode/list?_support=10000000&version=5.5.35&video_id="+vodId+"&page="+curPage+"&size="+pageSize+"&allowedRC=1&_support=10000000";
+ String resultJson = OkHttpUtil.string(listUrl, getHeaders(listUrl));
+ JSONObject dataObj = new JSONObject(resultJson).getJSONObject("data");
+ JSONArray dataList = dataObj.getJSONArray("list");
+ int first = (curPage - 1) * pageSize + 1;
+ int last = 0;
+ if (totalPage == curPage) {
+ last = total;
+ } else {
+ last = curPage * pageSize;
+ }
+ blocks.add(first + "-" + last);
+ ArrayList curArrayList = new ArrayList();
+ for (int i = 0; i < dataList.length(); i++) {
+ JSONObject item = dataList.optJSONObject(i);
+ String viewThisName = item.optString("t1") + " " + item.optString("t2");
+ curArrayList.add(viewThisName + "$" + item.optString("url"));
+ }
+ blockList.add(join("#", curArrayList));
+ }
+ }
+
+ jSONObject2.put("vod_play_from", join("$$$", blocks));
+ jSONObject2.put("vod_play_url", join("$$$", blockList));
+ JSONObject result = new JSONObject();
+ JSONArray jSONArray = new JSONArray();
+ jSONArray.put(jSONObject2);
+ result.put("list", jSONArray);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+
+ protected HashMap getHeaders(String str) {
+ HashMap hashMap = new HashMap<>();
+ hashMap.put("referer", "https://so.mgtv.com");
+ hashMap.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");
+ return hashMap;
+ }
+
+ public String homeContent(boolean z) {
+ try {
+ JSONArray optJSONArray = new JSONObject(OkHttpUtil.string("https://pianku.api.mgtv.com/rider/config/platformChannels/v1?platform=msite&abroad=0&_support=10000000", getHeaders("https://pianku.api.mgtv.com/rider/config/platformChannels/v1?platform=msite&abroad=0&_support=10000000"))).optJSONArray("data");
+ JSONArray jSONArray = new JSONArray();
+ for (int i = 0; i < optJSONArray.length(); i++) {
+ JSONObject optJSONObject = optJSONArray.optJSONObject(i);
+ JSONObject jSONObject = new JSONObject();
+ jSONObject.put("type_name", optJSONObject.optString("channelName"));
+ jSONObject.put("type_id", optJSONObject.optString("channelId"));
+ jSONArray.put(jSONObject);
+ }
+ JSONObject jSONObject2 = new JSONObject();
+ if (z) {
+ jSONObject2.put("filters", this.a);
+ }
+ jSONObject2.put("class", jSONArray);
+ try {
+ JSONArray optJSONArray2 = new JSONObject(OkHttpUtil.string("https://pianku.api.mgtv.com/rider/list/pcweb/v3?platform=pcweb&channelId=2&pn=1&chargeInfo=&sort=c2", getHeaders("https://pianku.api.mgtv.com/rider/list/pcweb/v3?platform=pcweb&channelId=2&pn=1&chargeInfo=&sort=c2"))).optJSONObject("data").optJSONArray("hitDocs");
+ JSONArray jSONArray2 = new JSONArray();
+ for (int i2 = 0; i2 < optJSONArray2.length(); i2++) {
+ JSONObject optJSONObject2 = optJSONArray2.optJSONObject(i2);
+ String optString = optJSONObject2.optString("title");
+ String q = optJSONObject2.optString("imgUrlH");
+ String optString2 = optJSONObject2.optString("updateInfo");
+ JSONObject jSONObject3 = new JSONObject();
+ jSONObject3.put("vod_id", optJSONObject2.optString("playPartId"));
+ jSONObject3.put("vod_name", optString);
+ jSONObject3.put("vod_pic", q);
+ jSONObject3.put("vod_remarks", optString2);
+ jSONArray2.put(jSONObject3);
+ }
+ jSONObject2.put("list", jSONArray2);
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return jSONObject2.toString(4);
+ } catch (Exception e2) {
+ SpiderDebug.log(e2);
+ return "";
+ }
+ }
+
+ public String homeVideoContent() {
+ try {
+ JSONArray jSONArray = new JSONObject(OkHttpUtil.string("https://www.mgtv.com/api.php/app/index_video?token=", getHeaders("https://www.mgtv.com/api.php/app/index_video?token="))).getJSONArray("list");
+ JSONArray jSONArray2 = new JSONArray();
+ for (int i = 0; i < jSONArray.length(); i++) {
+ JSONArray jSONArray3 = jSONArray.getJSONObject(i).getJSONArray("vlist");
+ int i2 = 0;
+ while (i2 < jSONArray3.length() && i2 < 6) {
+ JSONObject jSONObject = jSONArray3.getJSONObject(i2);
+ JSONObject jSONObject2 = new JSONObject();
+ jSONObject2.put("vod_id", jSONObject.optString("vod_id"));
+ jSONObject2.put("vod_name", jSONObject.optString("vod_name"));
+ jSONObject2.put("vod_pic", jSONObject.optString("vod_pic"));
+ jSONObject2.put("vod_remarks", jSONObject.optString("vod_remarks"));
+ jSONArray2.put(jSONObject2);
+ i2++;
+ }
+ }
+ JSONObject jSONObject3 = new JSONObject();
+ jSONObject3.put("list", jSONArray2);
+ return jSONObject3.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+
+ public void init(Context context) {
+ MGTV.super.init(context);
+ try {
+ this.a = new JSONObject("{\"1\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"4\",\"n\":\"王牌综艺\"},{\"v\":\"5\",\"n\":\"大咖秀场\"},{\"v\":\"6\",\"n\":\"搞笑\"},{\"v\":\"7\",\"n\":\"情感\"},{\"v\":\"8\",\"n\":\"音乐\"},{\"v\":\"9\",\"n\":\"生活\"},{\"v\":\"179\",\"n\":\"亲子\"},{\"v\":\"170\",\"n\":\"旅游\"},{\"v\":\"171\",\"n\":\"时尚\"},{\"v\":\"173\",\"n\":\"真人秀\"},{\"v\":\"174\",\"n\":\"竞技\"},{\"v\":\"172\",\"n\":\"访谈\"},{\"v\":\"180\",\"n\":\"脱口秀\"}],\"key\":\"kind\"},{\"name\":\"地区\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"内地\"},{\"v\":\"2\",\"n\":\"港台\"},{\"v\":\"3\",\"n\":\"其他\"}],\"key\":\"area\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c1\",\"n\":\"最新\"},{\"v\":\"c2\",\"n\":\"最热\"},{\"v\":\"c4\",\"n\":\"知乎高分\"}],\"key\":\"sort\"}],\"2\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"14\",\"n\":\"甜蜜互宠\"},{\"v\":\"15\",\"n\":\"虐恋情深\"},{\"v\":\"16\",\"n\":\"青涩校园\"},{\"v\":\"17\",\"n\":\"仙侠玄幻\"},{\"v\":\"19\",\"n\":\"都市职场\"},{\"v\":\"148\",\"n\":\"古装\"},{\"v\":\"20\",\"n\":\"快意江湖\"},{\"v\":\"147\",\"n\":\"偶像\"},{\"v\":\"21\",\"n\":\"悬疑推理\"},{\"v\":\"22\",\"n\":\"家长里短\"},{\"v\":\"23\",\"n\":\"芒果出品\"},{\"v\":\"24\",\"n\":\"轻松搞笑\"},{\"v\":\"25\",\"n\":\"铁血战争\"},{\"v\":\"26\",\"n\":\"其他\"}],\"key\":\"kind\"},{\"name\":\"地区\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"10\",\"n\":\"内地\"},{\"v\":\"11\",\"n\":\"日韩\"},{\"v\":\"12\",\"n\":\"港台\"}],\"key\":\"area\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c2\",\"n\":\"最热\"},{\"v\":\"c1\",\"n\":\"最新\"},{\"v\":\"c4\",\"n\":\"知乎高分\"}],\"key\":\"sort\"},{\"name\":\"版本\",\"value\":[{\"v\":\"all\",\"n\":\"全部\"},{\"v\":\"2037\",\"n\":\"TV版\"},{\"v\":\"2038\",\"n\":\"特别版\"},{\"v\":\"2040\",\"n\":\"精华版\"},{\"v\":\"2036\",\"n\":\"未删减版\"}],\"key\":\"edition\"}],\"3\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"34\",\"n\":\"院线大片\"},{\"v\":\"175\",\"n\":\"爱情\"},{\"v\":\"176\",\"n\":\"喜剧\"},{\"v\":\"177\",\"n\":\"动作\"},{\"v\":\"178\",\"n\":\"科幻\"},{\"v\":\"39\",\"n\":\"青春\"},{\"v\":\"43\",\"n\":\"恐怖悬疑\"},{\"v\":\"44\",\"n\":\"战争\"},{\"v\":\"45\",\"n\":\"警匪\"},{\"v\":\"46\",\"n\":\"历史\"},{\"v\":\"47\",\"n\":\"歌舞\"},{\"v\":\"48\",\"n\":\"动画\"},{\"v\":\"50\",\"n\":\"其他\"}],\"key\":\"kind\"},{\"name\":\"资费\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"b1\",\"n\":\"免费\"},{\"v\":\"b2\",\"n\":\"VIP\"},{\"v\":\"b3\",\"n\":\"VIP用券\"},{\"v\":\"b4\",\"n\":\"付费点播\"}],\"key\":\"chargeInfo\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c2\",\"n\":\"最热\"},{\"v\":\"c1\",\"n\":\"最新\"},{\"v\":\"c4\",\"n\":\"知乎高分\"}],\"key\":\"sort\"}],\"106\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"106\",\"n\":\"时事\"},{\"v\":\"107\",\"n\":\"社会\"},{\"v\":\"108\",\"n\":\"文娱\"},{\"v\":\"109\",\"n\":\"军事\"}],\"key\":\"kind\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c1\",\"n\":\"最新\"},{\"v\":\"c2\",\"n\":\"最热\"}],\"key\":\"sort\"}],\"91\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"119\",\"n\":\"吐槽\"},{\"v\":\"120\",\"n\":\"恶搞\"},{\"v\":\"121\",\"n\":\"爆笑\"},{\"v\":\"122\",\"n\":\"奇趣\"},{\"v\":\"123\",\"n\":\"饭制\"},{\"v\":\"124\",\"n\":\"其他\"}],\"key\":\"kind\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c2\",\"n\":\"最热\"},{\"v\":\"c1\",\"n\":\"最新\"}],\"key\":\"sort\"}],\"50\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"60\",\"n\":\"恋爱少女\"},{\"v\":\"86\",\"n\":\"热血\"},{\"v\":\"62\",\"n\":\"搞笑\"},{\"v\":\"63\",\"n\":\"青春\"},{\"v\":\"64\",\"n\":\"魔幻仙侠\"},{\"v\":\"65\",\"n\":\"激燃运动\"},{\"v\":\"66\",\"n\":\"特摄\"},{\"v\":\"67\",\"n\":\"推理\"},{\"v\":\"68\",\"n\":\"亲子幼教\"},{\"v\":\"69\",\"n\":\"芒果出品\"},{\"v\":\"70\",\"n\":\"动漫音乐\"},{\"v\":\"71\",\"n\":\"经典\"},{\"v\":\"72\",\"n\":\"其他\"}],\"key\":\"kind\"},{\"name\":\"地区\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"52\",\"n\":\"内地\"},{\"v\":\"53\",\"n\":\"欧美\"},{\"v\":\"54\",\"n\":\"日韩\"},{\"v\":\"55\",\"n\":\"其他\"}],\"key\":\"area\"},{\"name\":\"版本\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"165\",\"n\":\"剧场版\"},{\"v\":\"57\",\"n\":\"TV版\"},{\"v\":\"166\",\"n\":\"OVA版\"},{\"v\":\"167\",\"n\":\"真人版\"}],\"key\":\"edition\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c2\",\"n\":\"最热\"},{\"v\":\"c1\",\"n\":\"最新\"}],\"key\":\"sort\"}],\"51\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"97\",\"n\":\"美食\"},{\"v\":\"98\",\"n\":\"文化\"},{\"v\":\"99\",\"n\":\"社会\"},{\"v\":\"100\",\"n\":\"历史\"},{\"v\":\"101\",\"n\":\"军事\"},{\"v\":\"102\",\"n\":\"人物\"},{\"v\":\"103\",\"n\":\"探索\"},{\"v\":\"104\",\"n\":\"自然\"},{\"v\":\"105\",\"n\":\"其他\"}],\"key\":\"kind\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c2\",\"n\":\"最热\"},{\"v\":\"c1\",\"n\":\"最新\"}],\"key\":\"sort\"}],\"20\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"150\",\"n\":\"MV\"},{\"v\":\"151\",\"n\":\"影视原声\"},{\"v\":\"152\",\"n\":\"音乐节目\"},{\"v\":\"153\",\"n\":\"演唱会\"},{\"v\":\"154\",\"n\":\"颁奖礼\"},{\"v\":\"155\",\"n\":\"音乐现场\"},{\"v\":\"156\",\"n\":\"其他\"}],\"key\":\"kind\"},{\"name\":\"风格\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"157\",\"n\":\"流行\"},{\"v\":\"158\",\"n\":\"Hip-hop\"},{\"v\":\"159\",\"n\":\"R&B\"},{\"v\":\"160\",\"n\":\"摇滚\"},{\"v\":\"161\",\"n\":\"民谣\"},{\"v\":\"162\",\"n\":\"爵士\"},{\"v\":\"163\",\"n\":\"古典\"},{\"v\":\"164\",\"n\":\"其他\"}],\"key\":\"musicStyle\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c1\",\"n\":\"最新\"},{\"v\":\"c2\",\"n\":\"最热\"}],\"key\":\"sort\"}]}");
+ } catch (JSONException e) {
+ SpiderDebug.log(e);
+ }
+ }
+
+ public String join(@NonNull CharSequence charSequence, @NonNull Iterable iterable) {
+ Iterator it = iterable.iterator();
+ if (!it.hasNext()) {
+ return "";
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append(it.next());
+ while (it.hasNext()) {
+ sb.append(charSequence);
+ sb.append(it.next());
+ }
+ return sb.toString();
+ }
+
+ public String playerContent(String str, String str2, List list) {
+ try {
+ JSONObject jSONObject = new JSONObject();
+ try {
+ jSONObject.put("parse", 1);
+ jSONObject.put("jx", "1");
+ jSONObject.put("url", "https://www.mgtv.com" + str2);
+ return jSONObject.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return jSONObject.toString();
+ }
+ } catch (Exception e2) {
+ SpiderDebug.log(e2);
+ return "";
+ }
+ }
+
+ public String searchContent(String str, boolean quick) {
+ try {
+ String url = "https://mobileso.bz.mgtv.com/pc/search/v1?allowedRC=1&q=" + str + "&pn=1&pc=10&uid=&corr=1&_support=10000000";
+ String json = OkHttpUtil.string(url, getHeaders(url));
+ JSONObject data = new JSONObject(json).getJSONObject("data");
+ JSONArray contents = data.getJSONArray("contents");
+ JSONArray items = new JSONArray();
+ for (int i = 0; i < contents.length(); i++) {
+ JSONObject jSONObject = contents.getJSONObject(i).getJSONObject("data");
+ if (!jSONObject.has("sourceList")) {
+ continue;
+ }
+ JSONArray sourceList = jSONObject.getJSONArray("sourceList");
+ String vodUrl = sourceList.getJSONObject(0).getString("url");
+ String vodId = sourceList.getJSONObject(0).getString("vid");
+ String pic = jSONObject.optString("pic");
+ JSONObject item = new JSONObject();
+ item.put("vod_id", vodId);
+ item.put("vod_name", jSONObject.optString("title"));
+ item.put("vod_pic", pic);
+ item.put("vod_remarks", jSONObject.optString("playTime"));
+ items.put(item);
+ }
+ JSONObject result = new JSONObject();
+ result.put("list", items);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ return "";
+ }
+ }
+}
diff --git a/app/src/main/java/com/github/catvod/spider/NongMing.java b/app/src/main/java/com/github/catvod/spider/NongMing.java
new file mode 100644
index 00000000..9f7a330e
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/NongMing.java
@@ -0,0 +1,243 @@
+package com.github.catvod.spider;
+
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.net.OkHttp;
+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.nodes.TextNode;
+import org.jsoup.select.Elements;
+
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhixc
+ * 农民影视
+ */
+public class NongMing extends Spider {
+
+ private final String siteUrl = "https://www.nmddd.com";
+ private final String userAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1";
+
+ private Map getHeader() {
+ Map header = new HashMap<>();
+ header.put("User-Agent", userAgent);
+ return header;
+ }
+
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ JSONObject movieType = new JSONObject()
+ .put("type_id", "1")
+ .put("type_name", "电影");
+
+ JSONObject teleplayType = new JSONObject()
+ .put("type_id", "2")
+ .put("type_name", "电视剧");
+
+ JSONObject varietyType = new JSONObject()
+ .put("type_id", "3")
+ .put("type_name", "综艺");
+
+ JSONObject anime = new JSONObject()
+ .put("type_id", "4")
+ .put("type_name", "动漫");
+
+ JSONArray classes = new JSONArray()
+ .put(movieType)
+ .put(teleplayType)
+ .put(varietyType)
+ .put(anime);
+
+ // filter 二级筛选 start
+ String s = "{\"1\": [{\"key\": \"cateId\", \"name\": \"类型\", \"value\": [{\"n\": \"全部\", \"v\": \"1\"}, {\"n\": \"动作片\", \"v\": \"5\"}, {\"n\": \"喜剧片\", \"v\": \"6\"}, {\"n\": \"爱情片\", \"v\": \"7\"}, {\"n\": \"科幻片\", \"v\": \"8\"}, {\"n\": \"恐怖片\", \"v\": \"9\"}, {\"n\": \"剧情片\", \"v\": \"10\"}, {\"n\": \"战争片\", \"v\": \"11\"}, {\"n\": \"惊悚片\", \"v\": \"16\"}, {\"n\": \"奇幻片\", \"v\": \"17\"}]}, {\"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\": \"俄罗斯\"}, {\"n\": \"其它\", \"v\": \"其它\"}]}, {\"key\": \"year\", \"name\": \"年代\", \"value\": [{\"n\": \"全部\", \"v\": \"\"}, {\"n\": \"2023\", \"v\": \"2023\"}, {\"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\"}, {\"n\": \"1999\", \"v\": \"1999\"}, {\"n\": \"1998\", \"v\": \"1998\"}, {\"n\": \"1997\", \"v\": \"1997\"}, {\"n\": \"1996\", \"v\": \"1996\"}, {\"n\": \"1995\", \"v\": \"1995\"}, {\"n\": \"1994\", \"v\": \"1994\"}, {\"n\": \"1993\", \"v\": \"1993\"}, {\"n\": \"1992\", \"v\": \"1992\"}, {\"n\": \"1991\", \"v\": \"1991\"}, {\"n\": \"1990\", \"v\": \"1990\"}, {\"n\": \"1989\", \"v\": \"1989\"}, {\"n\": \"1988\", \"v\": \"1988\"}, {\"n\": \"1987\", \"v\": \"1987\"}, {\"n\": \"1986\", \"v\": \"1986\"}, {\"n\": \"1985\", \"v\": \"1985\"}, {\"n\": \"1984\", \"v\": \"1984\"}, {\"n\": \"1983\", \"v\": \"1983\"}, {\"n\": \"1982\", \"v\": \"1982\"}, {\"n\": \"1981\", \"v\": \"1981\"}, {\"n\": \"1980\", \"v\": \"1980\"}, {\"n\": \"1979\", \"v\": \"1979\"}, {\"n\": \"1978\", \"v\": \"1978\"}, {\"n\": \"1977\", \"v\": \"1977\"}, {\"n\": \"1976\", \"v\": \"1976\"}, {\"n\": \"1975\", \"v\": \"1975\"}, {\"n\": \"1974\", \"v\": \"1974\"}, {\"n\": \"1973\", \"v\": \"1973\"}, {\"n\": \"1972\", \"v\": \"1972\"}, {\"n\": \"1971\", \"v\": \"1971\"}, {\"n\": \"1970\", \"v\": \"1970\"}, {\"n\": \"1969\", \"v\": \"1969\"}, {\"n\": \"1968\", \"v\": \"1968\"}, {\"n\": \"1967\", \"v\": \"1967\"}, {\"n\": \"1966\", \"v\": \"1966\"}, {\"n\": \"1965\", \"v\": \"1965\"}, {\"n\": \"1964\", \"v\": \"1964\"}, {\"n\": \"1963\", \"v\": \"1963\"}, {\"n\": \"1962\", \"v\": \"1962\"}, {\"n\": \"1961\", \"v\": \"1961\"}, {\"n\": \"1960\", \"v\": \"1960\"}]}, {\"key\": \"by\", \"name\": \"排序\", \"value\": [{\"n\": \"时间\", \"v\": \"time\"}, {\"n\": \"人气\", \"v\": \"hits\"}, {\"n\": \"评分\", \"v\": \"score\"}]}], \"2\": [{\"key\": \"cateId\", \"name\": \"类型\", \"value\": [{\"n\": \"全部\", \"v\": \"2\"}, {\"n\": \"国产剧\", \"v\": \"12\"}, {\"n\": \"港台泰\", \"v\": \"13\"}, {\"n\": \"日韩剧\", \"v\": \"14\"}, {\"n\": \"欧美剧\", \"v\": \"15\"}]}, {\"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\": \"俄罗斯\"}, {\"n\": \"其它\", \"v\": \"其它\"}]}, {\"key\": \"year\", \"name\": \"年代\", \"value\": [{\"n\": \"全部\", \"v\": \"\"}, {\"n\": \"2023\", \"v\": \"2023\"}, {\"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\"}, {\"n\": \"1999\", \"v\": \"1999\"}, {\"n\": \"1998\", \"v\": \"1998\"}, {\"n\": \"1997\", \"v\": \"1997\"}, {\"n\": \"1996\", \"v\": \"1996\"}, {\"n\": \"1995\", \"v\": \"1995\"}, {\"n\": \"1994\", \"v\": \"1994\"}, {\"n\": \"1993\", \"v\": \"1993\"}, {\"n\": \"1992\", \"v\": \"1992\"}, {\"n\": \"1991\", \"v\": \"1991\"}, {\"n\": \"1990\", \"v\": \"1990\"}, {\"n\": \"1989\", \"v\": \"1989\"}, {\"n\": \"1988\", \"v\": \"1988\"}, {\"n\": \"1987\", \"v\": \"1987\"}, {\"n\": \"1986\", \"v\": \"1986\"}, {\"n\": \"1985\", \"v\": \"1985\"}, {\"n\": \"1984\", \"v\": \"1984\"}, {\"n\": \"1983\", \"v\": \"1983\"}, {\"n\": \"1982\", \"v\": \"1982\"}, {\"n\": \"1981\", \"v\": \"1981\"}, {\"n\": \"1980\", \"v\": \"1980\"}, {\"n\": \"1979\", \"v\": \"1979\"}, {\"n\": \"1978\", \"v\": \"1978\"}, {\"n\": \"1977\", \"v\": \"1977\"}, {\"n\": \"1976\", \"v\": \"1976\"}, {\"n\": \"1975\", \"v\": \"1975\"}, {\"n\": \"1974\", \"v\": \"1974\"}, {\"n\": \"1973\", \"v\": \"1973\"}, {\"n\": \"1972\", \"v\": \"1972\"}, {\"n\": \"1971\", \"v\": \"1971\"}, {\"n\": \"1970\", \"v\": \"1970\"}, {\"n\": \"1969\", \"v\": \"1969\"}, {\"n\": \"1968\", \"v\": \"1968\"}, {\"n\": \"1967\", \"v\": \"1967\"}, {\"n\": \"1966\", \"v\": \"1966\"}, {\"n\": \"1965\", \"v\": \"1965\"}, {\"n\": \"1964\", \"v\": \"1964\"}, {\"n\": \"1963\", \"v\": \"1963\"}, {\"n\": \"1962\", \"v\": \"1962\"}, {\"n\": \"1961\", \"v\": \"1961\"}, {\"n\": \"1960\", \"v\": \"1960\"}]}, {\"key\": \"by\", \"name\": \"排序\", \"value\": [{\"n\": \"时间\", \"v\": \"time\"}, {\"n\": \"人气\", \"v\": \"hits\"}, {\"n\": \"评分\", \"v\": \"score\"}]}], \"3\": [{\"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\": \"俄罗斯\"}, {\"n\": \"其它\", \"v\": \"其它\"}]}, {\"key\": \"year\", \"name\": \"年代\", \"value\": [{\"n\": \"全部\", \"v\": \"\"}, {\"n\": \"2023\", \"v\": \"2023\"}, {\"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\"}, {\"n\": \"1999\", \"v\": \"1999\"}, {\"n\": \"1998\", \"v\": \"1998\"}, {\"n\": \"1997\", \"v\": \"1997\"}, {\"n\": \"1996\", \"v\": \"1996\"}, {\"n\": \"1995\", \"v\": \"1995\"}, {\"n\": \"1994\", \"v\": \"1994\"}, {\"n\": \"1993\", \"v\": \"1993\"}, {\"n\": \"1992\", \"v\": \"1992\"}, {\"n\": \"1991\", \"v\": \"1991\"}, {\"n\": \"1990\", \"v\": \"1990\"}, {\"n\": \"1989\", \"v\": \"1989\"}, {\"n\": \"1988\", \"v\": \"1988\"}, {\"n\": \"1987\", \"v\": \"1987\"}, {\"n\": \"1986\", \"v\": \"1986\"}, {\"n\": \"1985\", \"v\": \"1985\"}, {\"n\": \"1984\", \"v\": \"1984\"}, {\"n\": \"1983\", \"v\": \"1983\"}, {\"n\": \"1982\", \"v\": \"1982\"}, {\"n\": \"1981\", \"v\": \"1981\"}, {\"n\": \"1980\", \"v\": \"1980\"}, {\"n\": \"1979\", \"v\": \"1979\"}, {\"n\": \"1978\", \"v\": \"1978\"}, {\"n\": \"1977\", \"v\": \"1977\"}, {\"n\": \"1976\", \"v\": \"1976\"}, {\"n\": \"1975\", \"v\": \"1975\"}, {\"n\": \"1974\", \"v\": \"1974\"}, {\"n\": \"1973\", \"v\": \"1973\"}, {\"n\": \"1972\", \"v\": \"1972\"}, {\"n\": \"1971\", \"v\": \"1971\"}, {\"n\": \"1970\", \"v\": \"1970\"}, {\"n\": \"1969\", \"v\": \"1969\"}, {\"n\": \"1968\", \"v\": \"1968\"}, {\"n\": \"1967\", \"v\": \"1967\"}, {\"n\": \"1966\", \"v\": \"1966\"}, {\"n\": \"1965\", \"v\": \"1965\"}, {\"n\": \"1964\", \"v\": \"1964\"}, {\"n\": \"1963\", \"v\": \"1963\"}, {\"n\": \"1962\", \"v\": \"1962\"}, {\"n\": \"1961\", \"v\": \"1961\"}, {\"n\": \"1960\", \"v\": \"1960\"}]}, {\"key\": \"by\", \"name\": \"排序\", \"value\": [{\"n\": \"时间\", \"v\": \"time\"}, {\"n\": \"人气\", \"v\": \"hits\"}, {\"n\": \"评分\", \"v\": \"score\"}]}], \"4\": [{\"key\": \"cateId\", \"name\": \"类型\", \"value\": [{\"n\": \"全部\", \"v\": \"4\"}, {\"n\": \"动漫剧\", \"v\": \"18\"}, {\"n\": \"动漫片\", \"v\": \"19\"}]}, {\"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\": \"俄罗斯\"}, {\"n\": \"其它\", \"v\": \"其它\"}]}, {\"key\": \"year\", \"name\": \"年代\", \"value\": [{\"n\": \"全部\", \"v\": \"\"}, {\"n\": \"2023\", \"v\": \"2023\"}, {\"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\"}, {\"n\": \"1999\", \"v\": \"1999\"}, {\"n\": \"1998\", \"v\": \"1998\"}, {\"n\": \"1997\", \"v\": \"1997\"}, {\"n\": \"1996\", \"v\": \"1996\"}, {\"n\": \"1995\", \"v\": \"1995\"}, {\"n\": \"1994\", \"v\": \"1994\"}, {\"n\": \"1993\", \"v\": \"1993\"}, {\"n\": \"1992\", \"v\": \"1992\"}, {\"n\": \"1991\", \"v\": \"1991\"}, {\"n\": \"1990\", \"v\": \"1990\"}, {\"n\": \"1989\", \"v\": \"1989\"}, {\"n\": \"1988\", \"v\": \"1988\"}, {\"n\": \"1987\", \"v\": \"1987\"}, {\"n\": \"1986\", \"v\": \"1986\"}, {\"n\": \"1985\", \"v\": \"1985\"}, {\"n\": \"1984\", \"v\": \"1984\"}, {\"n\": \"1983\", \"v\": \"1983\"}, {\"n\": \"1982\", \"v\": \"1982\"}, {\"n\": \"1981\", \"v\": \"1981\"}, {\"n\": \"1980\", \"v\": \"1980\"}, {\"n\": \"1979\", \"v\": \"1979\"}, {\"n\": \"1978\", \"v\": \"1978\"}, {\"n\": \"1977\", \"v\": \"1977\"}, {\"n\": \"1976\", \"v\": \"1976\"}, {\"n\": \"1975\", \"v\": \"1975\"}, {\"n\": \"1974\", \"v\": \"1974\"}, {\"n\": \"1973\", \"v\": \"1973\"}, {\"n\": \"1972\", \"v\": \"1972\"}, {\"n\": \"1971\", \"v\": \"1971\"}, {\"n\": \"1970\", \"v\": \"1970\"}, {\"n\": \"1969\", \"v\": \"1969\"}, {\"n\": \"1968\", \"v\": \"1968\"}, {\"n\": \"1967\", \"v\": \"1967\"}, {\"n\": \"1966\", \"v\": \"1966\"}, {\"n\": \"1965\", \"v\": \"1965\"}, {\"n\": \"1964\", \"v\": \"1964\"}, {\"n\": \"1963\", \"v\": \"1963\"}, {\"n\": \"1962\", \"v\": \"1962\"}, {\"n\": \"1961\", \"v\": \"1961\"}, {\"n\": \"1960\", \"v\": \"1960\"}]}, {\"key\": \"by\", \"name\": \"排序\", \"value\": [{\"n\": \"时间\", \"v\": \"time\"}, {\"n\": \"人气\", \"v\": \"hits\"}, {\"n\": \"评分\", \"v\": \"score\"}]}]}";
+ JSONObject filterConfig = new JSONObject(s);
+ // filter 二级筛选 end
+ JSONObject result = new JSONObject()
+ .put("class", classes)
+ .put("filters", filterConfig);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) {
+ try {
+ HashMap ext = new HashMap<>();
+ if (extend != null && extend.size() > 0) {
+ ext.putAll(extend);
+ }
+ String area = ext.get("area") == null ? "" : ext.get("area");
+ String year = ext.get("year") == null ? "" : ext.get("year");
+ String by = ext.get("by") == null ? "" : ext.get("by");
+ String classType = ext.get("class") == null ? tid : ext.get("class");
+// String lang = ext.get("lang") == null ? "" : ext.get("lang");
+
+ String cateUrl = siteUrl + String.format("/vod-list-id-%s-pg-%s-order--by-%s-class-0-year-%s-letter--area-%s-lang-.html", classType, pg, by, year, area);
+ String content = OkHttp.string(cateUrl, getHeader());
+ JSONArray videos = new JSONArray();
+ Elements lis = Jsoup.parse(content)
+ .select("[class=globalPicList]")
+ .select("li");
+ for (Element li : lis) {
+ Element item = li.select("a").get(0);
+ String vid = siteUrl + item.attr("href");
+ String name = item.attr("title");
+ String pic = item.select("img").attr("src");
+ List textNodes = item.select(".sBottom").select("span").textNodes();
+ String remark = textNodes.size() > 0 ? textNodes.get(0).text() : "";
+
+ JSONObject vod = new JSONObject()
+ .put("vod_id", vid)
+ .put("vod_name", name)
+ .put("vod_pic", pic)
+ .put("vod_remarks", remark);
+ videos.put(vod);
+ }
+ JSONObject result = new JSONObject()
+ .put("page", Integer.parseInt(pg))
+ .put("pagecount", Integer.MAX_VALUE)
+ .put("limit", lis.size())
+ .put("total", Integer.MAX_VALUE)
+ .put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String detailContent(List ids) {
+ try {
+ String detailUrl = ids.get(0);
+ Document detailPage = Jsoup.parse(OkHttp.string(detailUrl, getHeader()));
+ Elements sourceList = detailPage.select("[class=numList]");
+ StringBuilder vod_play_url = new StringBuilder(); // 线路/播放源 里面的各集的播放页面链接
+ StringBuilder vod_play_from = new StringBuilder(); // 线路 / 播放源标题
+ for (int i = 0; i < sourceList.size(); i++) {
+ int b = i + 1;
+ vod_play_from.append("源").append(b).append("$$$");
+ Elements aList = sourceList.get(i).select("a");
+ for (int j = aList.size() - 1; j >= 0; j--) { // 逆序遍历,因为网站的集数是从大到小的
+ String href = aList.get(j).attr("href");
+ String playUrl = siteUrl + href;
+ String playTitle = aList.get(j).text();
+ vod_play_url.append(playTitle).append("$").append(playUrl);
+ vod_play_url.append(j == 0 ? "$$$" : "#");// 逆序遍历,最后一集的索引为 0
+ }
+ }
+
+ // 影片标题
+ String title = detailPage.select(".page-hd")
+ .select("a")
+ .get(0)
+ .attr("title");
+
+ // 图片
+ String pic = detailPage.select(".page-hd")
+ .select("img")
+ .attr("src");
+
+ String classifyName = detailPage.select(".type-title").text();
+ String year = detailPage.select(".detail-con")
+ .select("span")
+ .get(0)
+ .select("em")
+ .text();
+ String area = "";
+ String remarks = "";
+ String actor = "";
+ String director = "";
+ String brief = detailPage.select(".detail-con")
+ .select("p")
+ .text()
+ .replaceAll("简 介:", "");
+ Elements descItem = detailPage.select(".desc_item");
+ if (descItem.size() >= 3) {
+ actor = descItem.get(1).text().replaceAll("主演: ", "");
+ director = descItem.get(2).text().replaceAll("导演: ", "");
+ }
+
+ JSONObject vod = new JSONObject()
+ .put("vod_id", ids.get(0))
+ .put("vod_name", title)
+ .put("vod_pic", pic)
+ .put("type_name", classifyName)
+ .put("vod_year", year)
+ .put("vod_area", area)
+ .put("vod_remarks", remarks)
+ .put("vod_actor", actor)
+ .put("vod_director", director)
+ .put("vod_content", brief)
+ .put("vod_play_from", vod_play_from.toString())
+ .put("vod_play_url", vod_play_url.toString());
+
+ JSONArray jsonArray = new JSONArray()
+ .put(vod);
+ JSONObject result = new JSONObject()
+ .put("list", jsonArray);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) {
+ try {
+ String searchUrl = siteUrl + "/index.php?m=vod-search&wd=" + URLEncoder.encode(key);
+ JSONArray videos = new JSONArray();
+ Elements lis = Jsoup.parse(OkHttp.string(searchUrl, getHeader())).select("[id=data_list]")
+ .select("li");
+ for (Element li : lis) {
+ Element a = li.select(".pic").select("a").get(0);
+ String vid = siteUrl + a.attr("href");
+ String name = li.select(".sTit").text();
+ String pic = a.select("img").attr("data-src");
+ String remark = "";
+
+ JSONObject vod = new JSONObject()
+ .put("vod_id", vid)
+ .put("vod_name", name)
+ .put("vod_pic", pic)
+ .put("vod_remarks", remark);
+ videos.put(vod);
+ }
+
+ JSONObject result = new JSONObject()
+ .put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) {
+ try {
+ HashMap header = new HashMap<>();
+ header.put("User-Agent", userAgent);
+ JSONObject result = new JSONObject()
+ .put("parse", 1) // 1=嗅探 0=直连
+ .put("header", header.toString())
+ .put("playUrl", "")
+ .put("url", id);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+}
diff --git a/app/src/main/java/com/github/catvod/spider/PiaoHua.java b/app/src/main/java/com/github/catvod/spider/PiaoHua.java
new file mode 100644
index 00000000..a082f7fc
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/PiaoHua.java
@@ -0,0 +1,236 @@
+package com.github.catvod.spider;
+
+import android.text.TextUtils;
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.net.OkHttp;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+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;
+
+import java.net.URLEncoder;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+/**
+ * @author zhixc
+ * 新飘花电影网
+ */
+public class PiaoHua extends Spider {
+
+ private final String siteURL = "https://www.xpiaohua.com";
+
+ private final String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36";
+
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ JSONArray classes = new JSONArray();
+ List typeIds = Arrays.asList("/dongzuo/", "/xiju/", "/aiqing/", "/kehuan/", "/juqing/", "/xuanyi/", "/zhanzheng/", "/kongbu/", "/zainan/", "/dongman/", "/jilu/");
+ List typeNames = Arrays.asList("动作片", "喜剧片", "爱情片", "科幻片", "剧情片", "悬疑片", "战争片", "恐怖片", "灾难片", "动漫", "纪录片");
+ for (int i = 0; i < typeIds.size(); i++) {
+ JSONObject obj = new JSONObject();
+ obj.put("type_id", typeIds.get(i));
+ obj.put("type_name", typeNames.get(i));
+ classes.put(obj);
+ }
+ JSONObject result = new JSONObject()
+ .put("class", classes);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) {
+ try {
+ // 第一页
+ // https://www.xpiaohua.com/column/xiju/
+ // 第二页
+ // https://www.xpiaohua.com/column/xiju/list_2.html
+ String cateURL = siteURL + "/column" + tid;
+ if (!pg.equals("1")) {
+ cateURL += "/list_" + pg + ".html";
+ }
+ String html = getWebContent(cateURL);
+ JSONArray videos = new JSONArray();
+ Elements items = Jsoup.parse(html).select("#list dl");
+ for (Element item : items) {
+ String vid = item.select("strong a").attr("href");
+ String name = item.select("strong").text();
+ String pic = item.select("img").attr("src");
+ JSONObject vod = new JSONObject()
+ .put("vod_id", vid)
+ .put("vod_name", name)
+ .put("vod_pic", pic)
+ .put("vod_remarks", "");
+ videos.put(vod);
+ }
+
+ JSONObject result = new JSONObject()
+ .put("pagecount", 999)
+ .put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ private String getWebContent(String targetURL) throws Exception {
+ Request request = new Request.Builder()
+ .addHeader("User-Agent", userAgent)
+ .get()
+ .url(targetURL)
+ .build();
+ OkHttpClient okHttpClient = OkHttp.client();
+ Response response = okHttpClient.newCall(request).execute();
+ if (response.body() == null) return "";
+ byte[] bytes = response.body().bytes();
+ response.close();
+ return new String(bytes, "gb2312");
+ }
+
+ @Override
+ public String detailContent(List ids) {
+ try {
+ String detailURL = ids.get(0);
+ String html = getWebContent(detailURL);
+ Document doc = Jsoup.parse(html);
+ String vod_play_url = "";
+ String vod_play_from = "magnet";
+ Elements aList = doc.select("table").get(0).select("a");
+ List vodItems = new ArrayList<>();
+ for (Element element : aList) {
+ String episodeURL = element.attr("href");
+ if (!episodeURL.startsWith("magnet")) continue;
+ String episodeName = getEpisodeName(episodeURL);
+ vodItems.add(episodeName + "$" + episodeURL);
+ }
+ if (vodItems.size() > 0) {
+ vod_play_url = TextUtils.join("#", vodItems);
+ }
+
+ String name = doc.select("h3").text();
+ String pic = doc.select("#showinfo img").attr("src");
+ String typeName = getStrByRegex(Pattern.compile("◎类 别 (.*?)
0) {
+ vod.put("vod_play_from", vod_play_from);
+ vod.put("vod_play_url", vod_play_url);
+ }
+
+ JSONArray jsonArray = new JSONArray().put(vod);
+ JSONObject result = new JSONObject()
+ .put("list", jsonArray);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ private static String getEpisodeName(String episodeURL) {
+ try {
+ return episodeURL.split("&dn=")[1];
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "第1集";
+ }
+
+ private String getDescription(Pattern pattern, String html) {
+ return getStrByRegex(pattern, html).replaceAll("?[^>]+>", "");
+ }
+
+ private String getDirectorStr(Pattern pattern, String html) {
+ return getStrByRegex(pattern, html)
+ .replaceAll("·", "·");
+ }
+
+ private String getActorStr(String html) {
+ Pattern p1 = Pattern.compile("◎演 员 (.*?)◎");
+ Pattern p2 = Pattern.compile("◎主 演 (.*?)◎");
+ String actor = getStrByRegex(p1, html).equals("") ? getStrByRegex(p2, html) : "";
+ return actor.replaceAll("?[^>]+>", "")
+ .replaceAll(" ", "")
+ .replaceAll("·", "·");
+ }
+
+ private String getStrByRegex(Pattern pattern, String html) {
+ try {
+ Matcher matcher = pattern.matcher(html);
+ if (matcher.find()) return matcher.group(1);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) {
+ try {
+ String searchURL = siteURL + "/plus/search.php?q=" + URLEncoder.encode(key, "GBK") + "&searchtype.x=0&searchtype.y=0";
+ String html = getWebContent(searchURL);
+ JSONArray videos = new JSONArray();
+ Elements items = Jsoup.parse(html).select("#list dl");
+ for (Element item : items) {
+ String vid = item.select("strong a").attr("href");
+ String name = item.select("strong").text();
+ String pic = item.select("img").attr("src");
+ JSONObject vod = new JSONObject()
+ .put("vod_id", vid)
+ .put("vod_name", name)
+ .put("vod_pic", pic)
+ .put("vod_remarks", "");
+ videos.put(vod);
+ }
+ JSONObject result = new JSONObject()
+ .put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) {
+ try {
+ JSONObject result = new JSONObject()
+ .put("parse", 0)
+ .put("header", "")
+ .put("playUrl", "")
+ .put("url", id);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+}
diff --git a/app/src/main/java/com/github/catvod/spider/SixV.java b/app/src/main/java/com/github/catvod/spider/SixV.java
new file mode 100644
index 00000000..fdfd10c8
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/SixV.java
@@ -0,0 +1,266 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+import android.text.TextUtils;
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.net.OkHttp;
+import okhttp3.*;
+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;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author zhixc
+ * 6V电影网(新版页面)
+ */
+public class SixV extends Spider {
+
+ private String siteURL;
+
+ private final String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36";
+
+ private Map getHeader() {
+ Map header = new HashMap<>();
+ header.put("User-Agent", userAgent);
+ header.put("Referer", siteURL + "/");
+ return header;
+ }
+
+ private Map getDetailHeader() {
+ Map header = new HashMap<>();
+ header.put("User-Agent", userAgent);
+ return header;
+ }
+
+ @Override
+ public void init(Context context, String extend) {
+ super.init(context, extend);
+ if (extend.endsWith("/")) {
+ extend = extend.substring(0, extend.lastIndexOf("/"));
+ }
+ siteURL = extend;
+ }
+
+ @Override
+ public String homeContent(boolean filter) {
+ try {
+ JSONArray classes = new JSONArray();
+ List typeIds = Arrays.asList("xijupian", "dongzuopian", "aiqingpian", "kehuanpian", "kongbupian", "juqingpian", "zhanzhengpian", "jilupian", "donghuapian", "dianshiju/guoju", "dianshiju/rihanju", "dianshiju/oumeiju");
+ List typeNames = Arrays.asList("喜剧片", "动作片", "爱情片", "科幻片", "恐怖片", "剧情片", "战争片", "纪录片", "动画片", "国剧", "日韩剧", "欧美剧");
+ for (int i = 0; i < typeIds.size(); i++) {
+ JSONObject c = new JSONObject();
+ c.put("type_id", typeIds.get(i));
+ c.put("type_name", typeNames.get(i));
+ classes.put(c);
+ }
+ JSONObject result = new JSONObject()
+ .put("class", classes);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) {
+ try {
+ String cateURL = siteURL + "/" + tid;
+ if (!pg.equals("1")) {
+ cateURL += "/index_" + pg + ".html";
+ }
+ String html = OkHttp.string(cateURL, getHeader());
+ Elements items = Jsoup.parse(html).select("#post_container .post_hover");
+ JSONArray videos = new JSONArray();
+ for (Element item : items) {
+ Element li = item.select("[class=zoom]").get(0);
+ String vid = li.attr("href");
+ String name = li.attr("title");
+ String pic = li.select("img").attr("src");
+ String remark = item.select("[rel=category tag]").text();
+
+ JSONObject vod = new JSONObject()
+ .put("vod_id", vid)
+ .put("vod_name", name)
+ .put("vod_pic", pic)
+ .put("vod_remarks", remark);
+ videos.put(vod);
+ }
+ JSONObject result = new JSONObject()
+ .put("pagecount", 999)
+ .put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String detailContent(List ids) {
+ try {
+ String vid = ids.get(0);
+ String detailURL = siteURL + vid;
+ String html = OkHttp.string(detailURL, getDetailHeader());
+ Document doc = Jsoup.parse(html);
+ Elements sourceList = doc.select("#post_content");
+
+ String vod_play_from = "magnet";
+ Map playMap = new LinkedHashMap<>();
+ int i = 0;
+ for (Element source : sourceList) {
+ i++;
+ Elements aList = source.select("table a");
+ List vodItems = new ArrayList<>();
+ for (Element a : aList) {
+ String episodeURL = a.attr("href");
+ String episodeName = a.text();
+ if (!episodeURL.startsWith("magnet")) continue;
+ vodItems.add(episodeName + "$" + episodeURL);
+ }
+ if (vodItems.size() > 0) {
+ playMap.put(vod_play_from + i, TextUtils.join("#", vodItems));
+ }
+ }
+
+ String partHTML = doc.select(".context").html();
+ String name = doc.select(".article_container > h1").text();
+ String pic = doc.select("#post_content img").attr("src");
+ String typeName = getStrByRegex(Pattern.compile("◎类 别 (.*?)
"), partHTML);
+ String year = getStrByRegex(Pattern.compile("◎年 代 (.*?)
"), partHTML);
+ String area = getStrByRegex(Pattern.compile("◎产 地 (.*?)
"), partHTML);
+ String remark = getStrByRegex(Pattern.compile("◎上映日期 (.*?)
"), partHTML);
+ String actor = getActorOrDirector(Pattern.compile("◎演 员 (.*?)"), partHTML);
+ if (actor.equals("")) {
+ actor = getActorOrDirector(Pattern.compile("◎主 演 (.*?)"), partHTML);
+ }
+ String director = getActorOrDirector(Pattern.compile("◎导 演 (.*?)
"), partHTML);
+ String description = getDescription(Pattern.compile("◎简 介(.*?)
", Pattern.CASE_INSENSITIVE | Pattern.DOTALL), partHTML);
+
+ JSONObject vod = new JSONObject()
+ .put("vod_id", ids.get(0))
+ .put("vod_name", name)
+ .put("vod_pic", pic)
+ .put("type_name", typeName)
+ .put("vod_year", year)
+ .put("vod_area", area)
+ .put("vod_remarks", remark)
+ .put("vod_actor", actor)
+ .put("vod_director", director)
+ .put("vod_content", description);
+ if (playMap.size() > 0) {
+ vod.put("vod_play_from", TextUtils.join("$$$", playMap.keySet()));
+ vod.put("vod_play_url", TextUtils.join("$$$", playMap.values()));
+ }
+
+ JSONArray jsonArray = new JSONArray().put(vod);
+ JSONObject result = new JSONObject().put("list", jsonArray);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ private String getStrByRegex(Pattern pattern, String str) {
+ try {
+ Matcher matcher = pattern.matcher(str);
+ if (matcher.find()) {
+ return matcher.group(1).trim();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ private String getActorOrDirector(Pattern pattern, String str) {
+ return getStrByRegex(pattern, str)
+ .replaceAll("
", "")
+ .replaceAll(" ", "")
+ .replaceAll("&", "")
+ .replaceAll("middot;", "・")
+ .replaceAll(" ", ",");
+ }
+
+ private String getDescription(Pattern pattern, String str) {
+ return getStrByRegex(pattern, str)
+ .replaceAll("?[^>]+>", "") // 去掉 html 标签
+ .replaceAll("\n", "") // 去掉换行符
+ .replaceAll(" ", "")
+ .replaceAll("&", "")
+ .replaceAll("middot;", "・")
+ .replaceAll("ldquo;", "【")
+ .replaceAll("rdquo;", "】");
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) {
+ try {
+ String searchURL = siteURL + "/e/search/index.php";
+ RequestBody formBody = new FormBody.Builder()
+ .add("show", "title")
+ .add("tempid", "1")
+ .add("tbname", "article")
+ .add("mid", "1")
+ .add("dopost", "search")
+ .add("submit", "")
+ .addEncoded("keyboard", key)
+ .build();
+ Request request = new Request.Builder()
+ .url(searchURL)
+ .addHeader("User-Agent", userAgent)
+ .addHeader("Origin", siteURL)
+ .addHeader("Referer", siteURL + "/")
+ .post(formBody)
+ .build();
+ OkHttpClient okHttpClient = OkHttp.client();
+ Response response = okHttpClient.newCall(request).execute();
+ if (response.body() == null) return "";
+ String html = response.body().string();
+ response.close(); // 关闭响应资源
+ Elements items = Jsoup.parse(html).select("#post_container [class=zoom]");
+ JSONArray videos = new JSONArray();
+ for (Element item : items) {
+ String vid = item.attr("href");
+ String name = item.attr("title").replaceAll("?[^>]+>", "");
+ String pic = item.select("img").attr("src");
+ JSONObject vod = new JSONObject()
+ .put("vod_id", vid)
+ .put("vod_name", name)
+ .put("vod_pic", pic)
+ .put("vod_remarks", "");
+ videos.put(vod);
+ }
+
+ JSONObject result = new JSONObject()
+ .put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) {
+ try {
+ JSONObject result = new JSONObject()
+ .put("parse", 0)
+ .put("header", "")
+ .put("playUrl", "")
+ .put("url", id);
+ return result.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+}