From 3a73ce04a72d464367ac17ceb065f38afa7752b1 Mon Sep 17 00:00:00 2001 From: kvymin <106472307+Kvymin@users.noreply.github.com> Date: Thu, 31 Aug 2023 10:02:07 +0800 Subject: [PATCH] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加豆瓣、SixV电影网、厂长、农民影视、哔哩兔影视、AppYsV2、飘花电影网、 --- .../com/github/catvod/spider/AppYsV2.java | 852 ++++++++++++++++++ .../com/github/catvod/spider/Bilituys.java | 299 ++++++ .../java/com/github/catvod/spider/Czsapp.java | 435 +++++++++ .../java/com/github/catvod/spider/Douban.java | 216 +++++ .../java/com/github/catvod/spider/IQIYI.java | 324 +++++++ .../com/github/catvod/spider/Kunyu77.java | 377 ++++++++ .../java/com/github/catvod/spider/MGTV.java | 314 +++++++ .../com/github/catvod/spider/NongMing.java | 243 +++++ .../com/github/catvod/spider/PiaoHua.java | 236 +++++ .../java/com/github/catvod/spider/SixV.java | 266 ++++++ 10 files changed, 3562 insertions(+) create mode 100644 app/src/main/java/com/github/catvod/spider/AppYsV2.java create mode 100644 app/src/main/java/com/github/catvod/spider/Bilituys.java create mode 100644 app/src/main/java/com/github/catvod/spider/Czsapp.java create mode 100644 app/src/main/java/com/github/catvod/spider/Douban.java create mode 100644 app/src/main/java/com/github/catvod/spider/IQIYI.java create mode 100644 app/src/main/java/com/github/catvod/spider/Kunyu77.java create mode 100644 app/src/main/java/com/github/catvod/spider/MGTV.java create mode 100644 app/src/main/java/com/github/catvod/spider/NongMing.java create mode 100644 app/src/main/java/com/github/catvod/spider/PiaoHua.java create mode 100644 app/src/main/java/com/github/catvod/spider/SixV.java diff --git a/app/src/main/java/com/github/catvod/spider/AppYsV2.java b/app/src/main/java/com/github/catvod/spider/AppYsV2.java new file mode 100644 index 00000000..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 ""; + } +}