add - bili8996

This commit is contained in:
yangqiang3504
2022-09-02 11:15:16 +08:00
parent 348270bead
commit 83bed3a118
7 changed files with 1925 additions and 0 deletions
@@ -0,0 +1,273 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import android.util.Base64;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
public class Bili extends Spider {
protected JSONObject ext = null;
@Override
public void init(Context context, String extend) {
super.init(context, extend);
try {
String content = OkHttpUtil.string(extend, null);
ext = new JSONObject(content);
} catch (JSONException ex) {
ex.printStackTrace();
}
}
@Override
public String homeContent(boolean filter) {
JSONObject results = new JSONObject();
try {
results.put("class", ext.getJSONArray("classes"));
if (filter) {
results.put("filters", ext.getJSONObject("filter"));
}
} catch (JSONException e) {
SpiderDebug.log(e);
}
return results.toString();
}
@Override
public String homeVideoContent() {
try {
JSONArray videos = new JSONArray();
try {
String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=窗 白噪音";
String content = OkHttpUtil.string(url, null);
JSONObject data = new JSONObject(content).getJSONObject("data");
JSONArray RArray = data.getJSONArray("result");
for (int i = 0; i < RArray.length(); i++) {
JSONObject info = RArray.getJSONObject(i);
JSONObject result = new JSONObject();
String pic = info.getString("pic");
if (pic.startsWith("//")) {
pic = "https:" + pic;
}
result.put("vod_id", info.getString("bvid"));
String title = info.getString("title");
Document KS = Jsoup.parse(title);
String name = KS.text();
result.put("vod_name", name);
result.put("vod_pic", pic);
String duration = info.getString("duration");
String words = duration.split(":")[0];
String remark = words + "分钟";
result.put("vod_remarks", remark);
videos.put(result);
}
} catch (Exception e) {
}
JSONObject result = new JSONObject();
result.put("list", videos);
return result.toString();
} catch (Throwable th) {
}
return "";
}
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
try {
String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=";
if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) {
url += extend.get("tid");
} else {
url += tid;
}
if (extend != null && extend.size() > 0) {
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
String key = it.next();
String value = extend.get(key);
if (value.length() > 0) {
url += "&" + key + "=" + URLEncoder.encode(value);
}
}
}
url += "&page=" + pg;
String content = OkHttpUtil.string(url, null);
JSONObject data = new JSONObject(content).getJSONObject("data");
JSONArray list = new JSONArray();
JSONArray RSArray = data.getJSONArray("result");
for (int i = 0; i < RSArray.length(); i++) {
JSONObject info = RSArray.getJSONObject(i);
JSONObject result = new JSONObject();
String pic = info.getString("pic");
if (pic.startsWith("//")) {
pic = "https:" + pic;
}
result.put("vod_id", info.getString("bvid"));
String title = info.getString("title");
Document doc = Jsoup.parse(title);
String name = doc.text();
result.put("vod_name", name);
result.put("vod_pic", pic);
String duration = info.getString("duration");
String Split = duration.split(":")[0];
String remark = Split + "分钟";
result.put("vod_remarks", remark);
list.put(result);
}
JSONObject result = new JSONObject();
int limit = 20;
int page = Integer.parseInt(pg);
result.put("page", page);
int pageCount = list.length() == limit ? page + 1 : page;
result.put("pagecount", pageCount);
result.put("limit", limit);
result.put("total", Integer.MAX_VALUE);
result.put("list", list);
return result.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public String detailContent(List<String> ids) {
int i = 0;
try {
String str = ids.get(0);
String sb2 = "https://api.bilibili.com/x/web-interface/archive/stat?bvid=" + str;
JSONObject jSONObject = new JSONObject(OkHttpUtil.string(sb2, null));
JSONObject jSONObject2 = jSONObject.getJSONObject("data");
long j = jSONObject2.getLong("aid");
String sb4 = j + "";
String sb6 = "https://api.bilibili.com/x/web-interface/view?aid=" + sb4;
JSONObject jSONObject3 = new JSONObject(OkHttpUtil.string(sb6, null));
JSONObject jSONObject4 = jSONObject3.getJSONObject("data");
JSONObject v = new JSONObject();
v.put("vod_id", str);
String string = jSONObject4.getString("title");
v.put("vod_name", string);
String string2 = jSONObject4.getString("pic");
v.put("vod_pic", string2);
String string3 = jSONObject4.getString("tname");
v.put("type_name", string3);
v.put("vod_year", "");
v.put("vod_area", "");
String sb7 = jSONObject4.getLong("duration") / 60 + "分钟";
v.put("vod_remarks", sb7);
v.put("vod_actor", "");
v.put("vod_director", "");
String string4 = jSONObject4.getString("desc");
v.put("vod_content", string4);
v.put("vod_play_from", "B站");
ArrayList arrayList = new ArrayList();
JSONArray jSONArray = jSONObject4.getJSONArray("pages");
while (true) {
int length = jSONArray.length();
if (i < length) {
JSONObject jSONObject6 = jSONArray.getJSONObject(i);
String string5 = jSONObject6.getString("part");
String replace = string5.replace("$", "_").replace("#", "_");
StringBuilder sb8 = new StringBuilder();
sb8.append(replace);
sb8.append("$");
sb8.append(sb4);
sb8.append("+ ");
long j2 = jSONObject6.getLong("cid");
sb8.append(j2);
String sb9 = sb8.toString();
arrayList.add(sb9);
i++;
} else {
v.put("vod_play_url", TextUtils.join("#", arrayList));
JSONArray jSONArray2 = new JSONArray();
jSONArray2.put(v);
JSONObject jSONObject7 = new JSONObject();
jSONObject7.put("list", jSONArray2);
return jSONObject7.toString();
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public String playerContent(String str, String str2, List<String> list) {
try {
String[] split = str2.split("\\+");
String str3 = split[0];
String str4 = split[1];
String sb2 = "https://api.bilibili.com/x/player/playurl?avid=" + str3 + "&cid= " + str4 + "&qn=120&fourk=1";
JSONObject jSONObject = new JSONObject(OkHttpUtil.string(sb2, null));
JSONObject jSONObject2 = new JSONObject();
jSONObject2.put("parse", "0");
jSONObject2.put("playUrl", "");
JSONObject jSONObject3 = jSONObject.getJSONObject("data");
JSONObject jSONObject4 = jSONObject3.getJSONArray("durl").getJSONObject(0);
String string = jSONObject4.getString("url");
jSONObject2.put("url", string);
jSONObject2.put("header", "{\"Referer\":\"https://www.bilibili.com\",\"User-Agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36\"}");
jSONObject2.put("contentType", "video/x-flv");
return jSONObject2.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public String searchContent(String key, boolean quick) {
try {
JSONObject result = new JSONObject();
String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=" + URLEncoder.encode(key);
String content = OkHttpUtil.string(url, null);
JSONObject data = new JSONObject(content).getJSONObject("data");
JSONArray videos = new JSONArray();
JSONArray RSArray = data.getJSONArray("result");
for (int i = 0; i < RSArray.length(); i++) {
JSONObject info = RSArray.getJSONObject(i);
JSONObject v = new JSONObject();
String pic = info.getString("pic");
if (pic.startsWith("//")) {
pic = "https:" + pic;
}
v.put("vod_id", info.getString("bvid"));
String title = info.getString("title");
Document doc = Jsoup.parse(title);
String name = doc.text();
v.put("vod_name", name);
v.put("vod_pic", pic);
String duration = info.getString("duration");
String Split = duration.split(":")[0];
String remark = Split + "分钟";
v.put("vod_remarks", remark);
videos.put(v);
}
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
}
@@ -0,0 +1,504 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Lib extends Spider {
private static final String siteUrl = "https://www.libvio.me/";
private static final String siteHost = "www.libvio.me";
/**
* 播放源配置
*/
private JSONObject playerConfig;
/**
* 筛选配置
*/
private JSONObject filterConfig;
private Pattern regexCategory = Pattern.compile("/type/(\\d+).html");
private Pattern regexVid = Pattern.compile("/detail/(\\d+).html");
private Pattern regexPlay = Pattern.compile("/play/(\\d+)-(\\d+)-(\\d+).html");
private Pattern regexPage = Pattern.compile("/show/(\\S+).html");
protected String ext = null;
@Override
public void init(Context context) {
super.init(context);
try {
playerConfig = new JSONObject("{\"LINE405\":{\"sh\":\"LINE405\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/lb.php?url=\",\"sn\":1,\"or\":999},\"LINE406\":{\"sh\":\"LINE406\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/zm.php?url=\",\"sn\":1,\"or\":999},\"LINE407\":{\"sh\":\"LINE407\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/lb.php?url=\",\"sn\":1,\"or\":999},\"LINE408\":{\"sh\":\"LINE408\",\"pu\":\"\",\"sn\":0,\"or\":999},\"p300\":{\"sh\":\"LINE300\",\"pu\":\"\",\"sn\":0,\"or\":999},\"p301\":{\"sh\":\"LINE301\",\"pu\":\"\",\"sn\":0,\"or\":999},\"line402-日语\":{\"sh\":\"LINE402\",\"pu\":\"\",\"sn\":0,\"or\":999},\"LINE400\":{\"sh\":\"LINE400\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/lb.php?url=\",\"sn\":1,\"or\":999},\"line401\":{\"sh\":\"LINE401\",\"pu\":\"\",\"sn\":0,\"or\":999}}");
filterConfig = new JSONObject("{\"1\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"泰语\",\"v\":\"泰语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印度语\",\"v\":\"印度语\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"西班牙语\",\"v\":\"西班牙语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"泰语\",\"v\":\"泰语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印度语\",\"v\":\"印度语\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"西班牙语\",\"v\":\"西班牙语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国\",\"v\":\"中国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"15\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"16\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
} catch (JSONException e) {
SpiderDebug.log(e);
}
}
protected static HashMap<String, String> Headers() {
HashMap<String, String> headers = new HashMap<>();
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36");
headers.put("Referer", siteUrl);
return headers;
}
/**
* 爬虫headers
*
* @param url
* @return
*/
protected HashMap<String, String> getHeaders(String url) {
HashMap<String, String> headers = new HashMap<>();
headers.put("method", "GET");
headers.put("Upgrade-Insecure-Requests", "1");
headers.put("DNT", "1");
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
return headers;
}
/**
* 获取分类数据 + 首页最近更新视频列表数据
*
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
* @return
*/
@Override
public String homeContent(boolean filter) {
try {
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
// 分类节点
Elements elements = doc.select("ul.stui-header__menu li a");
JSONArray classes = new JSONArray();
for (Element ele : elements) {
String name = ele.text();
boolean show = name.equals("电影") ||
name.equals("剧集") ||
name.equals("动漫") ||
name.equals("日韩剧") ||
name.equals("欧美剧");
if (show) {
Matcher mather = regexCategory.matcher(ele.attr("href"));
if (!mather.find())
continue;
// 把分类的id和名称取出来加到列表里
String id = mather.group(1).trim();
JSONObject jsonObject = new JSONObject();
jsonObject.put("type_id", id);
jsonObject.put("type_name", name);
classes.put(jsonObject);
}
}
JSONObject result = new JSONObject();
if (filter) {
result.put("filters", filterConfig);
}
result.put("class", classes);
try {
// 取首页推荐视频列表
Element homeList = doc.select("ul.stui-vodlist").get(0);
Elements list = homeList.select("div.stui-vodlist__box");
JSONArray videos = new JSONArray();
for (int i = 0; i < list.size(); i++) {
Element vod = list.get(i);
String title = vod.select("a").attr("title");
String cover = vod.select("a").attr("data-original");
String remark = vod.select("a .pic-text").text();
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
if (!matcher.find())
continue;
String id = matcher.group(1);
JSONObject v = new JSONObject();
v.put("vod_id", id);
v.put("vod_name", title);
v.put("vod_pic", cover);
v.put("vod_remarks", remark);
videos.put(v);
}
result.put("list", videos);
} catch (Exception e) {
SpiderDebug.log(e);
}
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
/**
* 获取分类信息数据
*
* @param tid 分类id
* @param pg 页数
* @param filter 同homeContent方法中的filter
* @param extend 筛选参数{k:v, k1:v1}
* @return
*/
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
try {
String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
urlParams[0] = tid;
urlParams[8] = pg;
if (extend != null && extend.size() > 0) {
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
String key = it.next();
String value = extend.get(key);
urlParams[Integer.parseInt(key)] = URLEncoder.encode(value);
}
}
// 获取分类数据的url
String url = siteUrl + "show/" + TextUtils.join("-", urlParams) + ".html";
String html = OkHttpUtil.string(url, getHeaders(url));
Document doc = Jsoup.parse(html);
JSONObject result = new JSONObject();
int pageCount = 0;
int page = -1;
// 取页码相关信息
Elements pageInfo = doc.select("ul.stui-page__item li");
if (pageInfo.size() == 0) {
page = Integer.parseInt(pg);
pageCount = page;
} else {
for (int i = 0; i < pageInfo.size(); i++) {
Element li = pageInfo.get(i);
Element a = li.selectFirst("a");
if (a == null)
continue;
String name = a.text();
if (page == -1 && li.hasClass("active")) {
Matcher matcher = regexPage.matcher(a.attr("href"));
if (matcher.find()) {
//System.out.println("哈哈"+matcher.group(1));
page = Integer.parseInt(matcher.group(1).split("-")[8]);
} else {
page = 0;
}
}
if (name.equals("尾页")) {
Matcher matcher = regexPage.matcher(a.attr("href"));
if (matcher.find()) {
//System.out.println("尾页" + matcher.group(1));
pageCount = Integer.parseInt(matcher.group(1).split("-")[8]);
} else {
pageCount = 0;
}
break;
}
}
}
JSONArray videos = new JSONArray();
if (!html.contains("没有找到您想要的结果哦")) {
// 取当前分类页的视频列表
Elements list = doc.select("div.stui-vodlist__box");
for (int i = 0; i < list.size(); i++) {
Element vod = list.get(i);
String title = vod.select("a").attr("title");
String cover = vod.select("a").attr("data-original");
String remark = vod.select("a .pic-text").text();
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
if (!matcher.find())
continue;
String id = matcher.group(1);
JSONObject v = new JSONObject();
v.put("vod_id", id);
v.put("vod_name", title);
v.put("vod_pic", cover);
v.put("vod_remarks", remark);
videos.put(v);
}
}
result.put("page", page);
result.put("pagecount", pageCount);
result.put("limit", 48);
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48);
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
/**
* 视频详情信息
*
* @param ids 视频id
* @return
*/
@Override
public String detailContent(List<String> ids) {
try {
// 视频详情url
String url = siteUrl + "/detail/" + ids.get(0) + ".html";
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
JSONObject result = new JSONObject();
JSONObject vodList = new JSONObject();
// 取基本数据
String cover = doc.select("div.stui-content__thumb a img").attr("data-original");
String title = doc.select("div.stui-content__detail h1").text();
String category = "", area = "", year = "", remark = "", director = "", actor = "", desc = "";
Elements data = doc.select("p.data");
Pattern cate = Pattern.compile("类型:(\\S+)");
category = doReplaceRegex(cate, data.get(0).text());
Pattern areas = Pattern.compile("地区:(\\S+)");
area = doReplaceRegex(areas, data.get(0).text());
Pattern years = Pattern.compile("年份:(\\S+)");
year = doReplaceRegex(years, data.get(0).text());
Pattern rms = Pattern.compile("更新:(\\S+)");
remark = doReplaceRegex(rms, data.get(3).text());
Pattern acs = Pattern.compile("主演:(\\S+)");
actor = doReplaceRegex(acs, data.get(1).text());
Pattern dis = Pattern.compile("导演:(\\S+)");
director = doReplaceRegex(dis, data.get(1).text());
desc = doc.selectFirst("span.detail-content").text().trim();
vodList.put("vod_id", ids.get(0));
vodList.put("vod_name", title);
vodList.put("vod_pic", cover);
vodList.put("type_name", category);
vodList.put("vod_year", year);
vodList.put("vod_area", area);
vodList.put("vod_remarks", remark);
vodList.put("vod_actor", actor);
vodList.put("vod_director", director);
vodList.put("vod_content", desc);
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
try {
int sort1 = playerConfig.getJSONObject(o1).getInt("or");
int sort2 = playerConfig.getJSONObject(o2).getInt("or");
if (sort1 == sort2) {
return 1;
}
return sort1 - sort2 > 0 ? 1 : -1;
} catch (JSONException e) {
SpiderDebug.log(e);
}
return 1;
}
});
// 取播放列表数据
Elements sources = doc.select("div.stui-vodlist__head h3");
Elements sourceList = doc.select("ul.stui-content__playlist");
for (int i = 0; i < sources.size(); i++) {
Element source = sources.get(i);
String sourceName = source.text();
boolean found = false;
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
String flag = it.next();
if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
sourceName = flag;
found = true;
break;
}
}
if (!found)
continue;
String playList = "";
Elements playListA = sourceList.get(i).select("li a");
List<String> vodItems = new ArrayList<>();
for (int j = 0; j < playListA.size(); j++) {
Element vod = playListA.get(j);
Matcher matcher = regexPlay.matcher(vod.attr("href"));
if (!matcher.find())
continue;
String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3);
vodItems.add(vod.text() + "$" + playURL);
}
if (vodItems.size() > 0)
playList = TextUtils.join("#", vodItems);
if (playList.length() == 0)
continue;
vod_play.put(sourceName, playList);
}
if (vod_play.size() > 0) {
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
String vod_play_url = TextUtils.join("$$$", vod_play.values());
vodList.put("vod_play_from", vod_play_from);
vodList.put("vod_play_url", vod_play_url);
}
JSONArray list = new JSONArray();
list.put(vodList);
result.put("list", list);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
/**
* 获取视频播放信息
*
* @param flag 播放源
* @param id 视频id
* @param vipFlags 所有可能需要vip解析的源
* @return
*/
@Override
public String playerContent(String flag, String id, List<String> vipFlags) {
try {
//定义播放用的headers
JSONObject headers = new JSONObject();
headers.put("origin", " https://www.libvio.me/");
headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
headers.put("Accept", " */*");
headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7");
headers.put("Accept-Encoding", " gzip, deflate");
headers.put("referer", " https://www.libvio.me/");
// 播放页 url
String url = siteUrl + "/play/" + id + ".html";
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
Elements allScript = doc.select("script");
for (int i = 0; i < allScript.size(); i++) {
String scContent = allScript.get(i).html().trim();
if (scContent.startsWith("var player_")) { // 取直链
int start = scContent.indexOf('{');
int end = scContent.lastIndexOf('}') + 1;
String json = scContent.substring(start, end);
JSONObject player = new JSONObject(json);
if (playerConfig.has(player.getString("from"))) {
JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
if (player.getString("from").contains("LINE")) {
String videoUrl = pCfg.getString("pu") + player.getString("url");
Document docs = Jsoup.parse(OkHttpUtil.string(videoUrl, Headers()));
Pattern pattern = Pattern.compile("(?<=urls\\s=\\s').*?(?=')");
Elements allScripts = docs.select("body script");
for (int j = 0; j < allScripts.size(); j++) {
String scContents = allScripts.get(j).html().trim();
Matcher matcher = pattern.matcher(scContents);
if (matcher.find()) {
JSONObject result = new JSONObject();
String players = matcher.group(0);
result.put("parse", 0);
result.put("playUrl", "");
result.put("url", players);
return result.toString();
}
}
}
else {
SpiderDebug.log(url);
JSONObject result = new JSONObject();
result.put("parse", 1);
result.put("playUrl", "");
result.put("url", url);
// result.put("header", "{\"Referer\", \"https://www.libvio.me/\"}");
return result.toString();
}
break;
}
}
}
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
protected static HashMap<String, String> sHeaders() {
HashMap<String, String> headers = new HashMap<>();
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36");
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
headers.put("Accept-encoding", "gzip, deflate, br");
headers.put("Accept-language", "zh-SG,zh;q=0.9,en-GB;q=0.8,en;q=0.7,zh-CN;q=0.6");
return headers;
}
@Override
public String searchContent(String key, boolean quick) {
try {
String url = "https://google.1qi777.com/search?q=site%3Alibvio.me%2Fdetail+" + URLEncoder.encode(key);
Document docs = Jsoup.parse(OkHttpUtil.string(url, sHeaders()));
JSONObject result = new JSONObject();
JSONArray videos = new JSONArray();
JSONObject v = new JSONObject();
Elements list = docs.select("div.NJo7tc div.yuRUbf");
for (int i = 0; i < list.size(); i++) {
Element doc = list.get(i);
String sourceName = doc.select("div.yuRUbf a h3").text();
if (sourceName.contains(key)) {
String list1 = doc.select("div.yuRUbf a").attr("href");
Document link = Jsoup.parse(OkHttpUtil.string(list1, getHeaders(url)));
Matcher matcher = regexVid.matcher(list1);
Elements data = link.select("p.data");
if (matcher.find()) {
String group = matcher.group(1);
String cover = link.select("div.stui-content__thumb a img").attr("data-original");
String title = link.select("div.stui-content__detail h1").text();
Pattern rms = Pattern.compile("更新:(\\S+)");
String remark = doReplaceRegex(rms, data.get(3).text());
v.put("vod_name", title);
v.put("vod_remarks", remark);
v.put("vod_id", group);
v.put("vod_pic", cover);
videos.put(v);
}
}
}
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
private static String doReplaceRegex(Pattern pattern, String src) {
if (pattern == null)
return src;
try {
Matcher matcher = pattern.matcher(src);
if (matcher.find()) {
return matcher.group(1).trim();
}
} catch (Exception e) {
SpiderDebug.log(e);
}
return src;
}
}
@@ -0,0 +1,37 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import com.github.catvod.xpath.XPathRule;
import org.json.JSONArray;
import org.json.JSONObject;
import org.seimicrawler.xpath.JXDocument;
import org.seimicrawler.xpath.JXNode;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
public class XPathMacTvgook extends XPathMac {
@Override
public boolean manualVideoCheck() {
return rule.getHomeUrl().contains("tvgook.com");
}
@Override
public boolean isVideoFormat(String url) {
return Misc.isVideoFormat(url)||(url.contains("/ppvod/")&&!url.contains("skipl=1"));
}
}
@@ -0,0 +1,154 @@
package com.github.catvod.spider;
import android.text.TextUtils;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.seimicrawler.xpath.JXDocument;
import org.seimicrawler.xpath.JXNode;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class XPbd extends XPath {
@Override
protected String categoryUrl(String tid, String pg, boolean filter, HashMap<String, String> extend) {
String cateUrl = rule.getCateUrl();
if (filter && extend != null && extend.size() > 0) {
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
String key = it.next();
String value = extend.get(key);
if (value.length() > 0) {
cateUrl = cateUrl.replace("{" + key + "}", URLEncoder.encode(value));
}
}
}
cateUrl = cateUrl.replace("{cateId}", tid).replace("{catePg}", pg);
Matcher m = Pattern.compile("\\{(.*?)\\}").matcher(cateUrl);
while (m.find()) {
String n = m.group(0).replace("{", "").replace("}", "");
cateUrl = cateUrl.replace(m.group(0), "").replace("/" + n + "/", "");
}
return cateUrl;
}
@Override
public String detailContent(List<String> ids) {
try {
String webUrl = rule.getDetailUrl().replace("{vid}", ids.get(0));
String webContent = fetch(webUrl);
JXDocument doc = JXDocument.create(webContent);
JXNode vodNode = doc.selNOne(rule.getDetailNode());
JSONObject vodAtom = new JSONObject();
String cover = "", title = "", desc = "", category = "", area = "", year = "", remark = "", director = "", actor = "";
title = vodNode.selOne(rule.getDetailName()).asString().trim();
title = rule.getDetailNameR(title);
cover = vodNode.selOne(rule.getDetailImg()).asString().trim();
cover = rule.getDetailImgR(cover);
cover = Misc.fixUrl(webUrl, cover);
if (!rule.getDetailCate().isEmpty()) {
try {
category = vodNode.selOne(rule.getDetailCate()).asString().trim();
category = rule.getDetailCateR(category);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!rule.getDetailYear().isEmpty()) {
try {
year = vodNode.selOne(rule.getDetailYear()).asString().trim();
year = rule.getDetailYearR(year);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!rule.getDetailArea().isEmpty()) {
try {
area = vodNode.selOne(rule.getDetailArea()).asString().trim();
area = rule.getDetailAreaR(area);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!rule.getDetailMark().isEmpty()) {
try {
remark = vodNode.selOne(rule.getDetailMark()).asString().trim();
remark = rule.getDetailMarkR(remark);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!rule.getDetailActor().isEmpty()) {
try {
actor = vodNode.selOne(rule.getDetailActor()).asString().trim();
actor = rule.getDetailActorR(actor);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!rule.getDetailDirector().isEmpty()) {
try {
director = vodNode.selOne(rule.getDetailDirector()).asString().trim();
director = rule.getDetailDirectorR(director);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!rule.getDetailDesc().isEmpty()) {
try {
desc = vodNode.selOne(rule.getDetailDesc()).asString().trim();
desc = rule.getDetailDescR(desc);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
vodAtom.put("vod_name", title);
vodAtom.put("vod_pic", cover);
vodAtom.put("type_name", category);
vodAtom.put("vod_year", year);
vodAtom.put("vod_area", area);
vodAtom.put("vod_remarks", remark);
vodAtom.put("vod_actor", actor);
vodAtom.put("vod_director", director);
vodAtom.put("vod_content", desc);
List<JXNode> urlListNodes = doc.selN(rule.getDetailUrlNode());
for (int i = 0; i < urlListNodes.size(); i++) {
List<JXNode> urlNodes = urlListNodes.get(i).sel(rule.getDetailUrlSubNode());
for (int j = 0; j < urlNodes.size(); j++) {
String id = urlNodes.get(j).selOne(rule.getDetailUrlId()).asString().trim();
id = rule.getDetailUrlIdR(id);
JSONObject result = new JSONObject();
JSONArray lists = new JSONArray();
vodAtom.put("vod_id", id);
vodAtom.put("vod_play_from", "磁力测试");
vodAtom.put("vod_play_url", "网站没资源$" + id);
lists.put(vodAtom);
result.put("list", lists);
return result.toString();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return "";
}
}
@@ -0,0 +1,77 @@
package com.github.catvod.spider;
import android.content.Context;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Pattern;
public class Xxys extends AppYsV2 {
@Override
protected JSONObject getFinalVideo(String flag, ArrayList<String> parseUrls, String url) throws JSONException {
String htmlPlayUrl = "";
for (String parseUrl : parseUrls) {
if (parseUrl.isEmpty() || parseUrl.equals("null"))
continue;
String playUrl = parseUrl + url;
String content = desc(OkHttpUtil.string(playUrl, null), (byte) 4);
try {
HashMap hashMap = new HashMap();
OkHttpUtil.stringNoRedirect(playUrl, null, hashMap);
String d = OkHttpUtil.getRedirectLocation(hashMap);
JSONObject result = new JSONObject();
result.put("parse", 0);
result.put("playUrl", "");
result.put("url", d);
return result;
} catch (JSONException e) {
e.printStackTrace();
}
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("<html")) {
boolean sniffer = false;
for (Pattern p : htmlVideoKeyMatch) {
if (p.matcher(content).find()) {
sniffer = true;
break;
}
}
if (sniffer) {
htmlPlayUrl = parseUrl;
}
}
}
if (!htmlPlayUrl.isEmpty()) {
JSONObject result = new JSONObject();
result.put("parse", 1);
result.put("playUrl", htmlPlayUrl);
result.put("url", url);
return result;
}
return null;
}
@Override
public void init(Context context, String str) {
super.init(context, "http://tvht.lanrentk.cc/api.php/iptv/vod");
}
}
@@ -0,0 +1,394 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONObject;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 影视工厂
* <p>
* Author: 小黄瓜
*/
public class Ysgc extends Spider {
private static final String siteUrl = "https://www.ik4.cc";
private static final String siteHost = "www.ik4.cc";
protected JSONObject playerConfig = new JSONObject();
@Override
public void init(Context context) {
super.init(context);
}
protected HashMap<String, String> getHeaders(String url) {
HashMap<String, String> headers = new HashMap<>();
headers.put("user-agent", "Dart/2.14 (dart:io)");
headers.put("version", "1.9.8");
headers.put("copyright", "xiaogui");
headers.put("host", siteHost);
headers.put("platform", "android");
return headers;
}
@Override
public String homeContent(boolean filter) {
try {
String url = siteUrl + "/xgapp.php/v1/nav?token=";
JSONObject jsonObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
JSONArray jsonArray = jsonObject.getJSONArray("data");
JSONArray classes = new JSONArray();
JSONObject filterConfig = new JSONObject();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jObj = jsonArray.getJSONObject(i);
String typeName = jObj.getString("type_name");
if (typeName.equals("电视直播"))
continue;
String typeId = jObj.getString("type_id");
JSONObject newCls = new JSONObject();
newCls.put("type_id", typeId);
newCls.put("type_name", typeName);
classes.put(newCls);
try {
JSONObject typeExtend = jObj.getJSONObject("type_extend");
Iterator<String> typeExtendKeys = typeExtend.keys();
JSONArray extendsAll = new JSONArray();
while (typeExtendKeys.hasNext()) {
String typeExtendKey = typeExtendKeys.next();
String typeExtendName = null;
switch (typeExtendKey) {
case "class":
typeExtendName = "类型";
break;
case "area":
typeExtendName = "地区";
break;
case "lang":
typeExtendName = "语言";
break;
case "year":
typeExtendName = "年代";
break;
}
if (typeExtendName == null) {
SpiderDebug.log(typeExtendKey);
continue;
}
String typeExtendStr = typeExtend.getString(typeExtendKey);
if (typeExtendStr.trim().length() == 0)
continue;
String[] newTypeExtendKeys = typeExtendStr.split(",");
JSONObject newTypeExtend = new JSONObject();
newTypeExtend.put("key", typeExtendKey);
newTypeExtend.put("name", typeExtendName);
JSONArray newTypeExtendKV = new JSONArray();
{
JSONObject kvAll = new JSONObject();
kvAll.put("n", "全部");
kvAll.put("v", "");
newTypeExtendKV.put(kvAll);
}
for (String k : newTypeExtendKeys) {
if (typeExtendName.equals("伦理"))
continue;
JSONObject kv = new JSONObject();
kv.put("n", k);
kv.put("v", k);
newTypeExtendKV.put(kv);
}
newTypeExtend.put("value", newTypeExtendKV);
extendsAll.put(newTypeExtend);
}
filterConfig.put(typeId, extendsAll);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
JSONObject result = new JSONObject();
result.put("class", classes);
if (filter) {
result.put("filters", filterConfig);
}
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
@Override
public String homeVideoContent() {
try {
String url = siteUrl + "/xgapp.php/v1/index_video?token=";
JSONObject jsonObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
JSONArray jsonArray = jsonObject.getJSONArray("data");
JSONArray videos = new JSONArray();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jObj = jsonArray.getJSONObject(i);
JSONArray videoList = jObj.getJSONArray("vlist");
for (int j = 0; j < videoList.length() && j < 6; j++) {
JSONObject vObj = videoList.getJSONObject(j);
JSONObject v = new JSONObject();
v.put("vod_id", vObj.getString("vod_id"));
v.put("vod_name", vObj.getString("vod_name"));
v.put("vod_pic", vObj.getString("vod_pic"));
v.put("vod_remarks", vObj.getString("vod_remarks"));
videos.put(v);
}
}
JSONObject result = new JSONObject();
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
try {
String url = siteUrl + "/xgapp.php/v1/video?tid=" + tid + "&pg=" + pg + "&token=";
Set<String> keys = extend.keySet();
for (String key : keys) {
url += "&" + key + "=" + URLEncoder.encode(extend.get(key));
}
JSONObject dataObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
JSONArray jsonArray = dataObject.getJSONArray("data");
JSONArray videos = new JSONArray();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject vObj = jsonArray.getJSONObject(i);
JSONObject v = new JSONObject();
v.put("vod_id", vObj.getString("vod_id"));
v.put("vod_name", vObj.getString("vod_name"));
v.put("vod_pic", vObj.getString("vod_pic"));
v.put("vod_remarks", vObj.getString("vod_remarks"));
videos.put(v);
}
JSONObject result = new JSONObject();
int limit = 20;
int page = dataObject.getInt("page");
int total = dataObject.getInt("total");
int pageCount = dataObject.getInt("pagecount");
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) {
SpiderDebug.log(e);
}
return "";
}
@Override
public String detailContent(List<String> ids) {
try {
String url = siteUrl + "/xgapp.php/v1/video_detail?id=" + ids.get(0) + "&token=";
JSONObject jsonObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
JSONObject dataObject = jsonObject.getJSONObject("data");
if (dataObject.has("vod_info")) {
try {
dataObject = dataObject.getJSONObject("vod_info");
} catch (Exception e) {
}
}
JSONObject vodList = new JSONObject();
vodList.put("vod_id", dataObject.getString("vod_id"));
vodList.put("vod_name", dataObject.getString("vod_name"));
vodList.put("vod_pic", dataObject.getString("vod_pic"));
vodList.put("type_name", dataObject.getString("vod_class"));
vodList.put("vod_year", dataObject.getString("vod_year"));
vodList.put("vod_area", dataObject.getString("vod_area"));
vodList.put("vod_remarks", dataObject.getString("vod_remarks"));
vodList.put("vod_actor", dataObject.getString("vod_actor"));
vodList.put("vod_director", dataObject.getString("vod_director"));
vodList.put("vod_content", dataObject.getString("vod_content"));
JSONArray playerList = dataObject.getJSONArray("vod_url_with_player");
List<String> playFlags = new ArrayList<>();
HashMap<String, String> playUrls = new HashMap<>();
for (int i = 0; i < playerList.length(); i++) {
JSONObject playerListObj = playerList.getJSONObject(i);
String from = playerListObj.getString("code");
playUrls.put(from, playerListObj.getString("url"));
playerListObj.remove("url");
playerConfig.put(from, playerListObj);
playFlags.add(from);
}
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int sort1 = playFlags.indexOf(o1);
int sort2 = playFlags.indexOf(o2);
if (sort1 == sort2) {
return 1;
}
return sort1 - sort2 > 0 ? 1 : -1;
}
});
String[] vod_play_from_list = dataObject.getString("vod_play_from").split("\\$\\$\\$");
String[] vod_play_url_list = dataObject.getString("vod_play_url").split("\\$\\$\\$");
for (int i = 0; i < vod_play_from_list.length; i++) {
String from = vod_play_from_list[i];
if (i >= vod_play_url_list.length || vod_play_url_list[i].trim().length() == 0) {
if (playUrls.containsKey(from) && playUrls.get(from).trim().length() > 0) {
vod_play.put(vod_play_from_list[i], playUrls.get(from));
}
continue;
}
vod_play.put(vod_play_from_list[i], vod_play_url_list[i]);
}
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
String vod_play_url = TextUtils.join("$$$", vod_play.values());
vodList.put("vod_play_from", vod_play_from);
vodList.put("vod_play_url", vod_play_url);
JSONObject result = new JSONObject();
JSONArray list = new JSONArray();
list.put(vodList);
result.put("list", list);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
private HashMap<String, String> getHeaderJxs(String url) {
HashMap<String, String> headers = new HashMap<>();
headers.put("platform_version", "LMY47I");
headers.put("user-agent", "Dart/2.12 (dart:io)");
headers.put("version", "1.6.4");
headers.put("copyright", "xiaogui");
headers.put("platform", "android");
headers.put("client_name", "6L+95Ymn6L6+5Lq6");
return headers;
}
@Override
public String playerContent(String flag, String id, List<String> vipFlags) {
try {
JSONObject result = new JSONObject();
if (id.contains("hsl.ysgc.xyz")) {
String uuu = "https://www.ysgc.cc/static/player/dplayer.php?url=" + id;
HashMap<String, String> headers = new HashMap();
headers.put("referer", "https://www.ysgc.cc/");
String content = OkHttpUtil.string(uuu, headers);
Matcher matcher = Pattern.compile("url: url\\+'(.+?)',").matcher(content);
if (matcher.find()) {
result.put("parse", 0);
result.put("playUrl", "");
result.put("url", id + matcher.group(1));
result.put("header", "{\"Referer\":\" https://www.ysgc.cc\"}");
} else {
result.put("parse", 1);
result.put("playUrl", "");
result.put("url", uuu);
result.put("header", "{\"Referer\":\"https://www.ysgc.cc/\"}");
}
return result.toString();
} else if (id.contains("duoduozy.com") || id.contains("m3u8.cache.suoyo.cc")) {
String uuu = "https://www.6080kan.cc/app.php?url=" + id;
String content = OkHttpUtil.string(uuu, null);
return Misc.jsonParse(id, content).toString();
}
if (vipFlags.contains(flag)) {
try {
result.put("parse", 1);
result.put("playUrl", "");
result.put("url", id);
return result.toString();
} catch (Exception ee) {
SpiderDebug.log(ee);
}
}
JSONObject playerObj = playerConfig.getJSONObject(flag);
String parseUrl = playerObj.getString("parse_api") + id;
String content = OkHttpUtil.string(parseUrl, getHeaderJxs(parseUrl));
JSONObject playerData = new JSONObject(content);
JSONObject headers = new JSONObject();
String ua = playerData.optString("user-agent", "");
if (ua.trim().length() > 0) {
headers.put("User-Agent", " " + ua);
}
String referer = playerData.optString("referer", "");
if (referer.trim().length() > 0) {
headers.put("Referer", " " + referer);
}
result.put("parse", 0);
result.put("header", headers.toString());
result.put("playUrl", "");
result.put("url", playerData.getString("url"));
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
if (vipFlags.contains(flag)) {
try {
JSONObject result = new JSONObject();
result.put("parse", 1);
result.put("playUrl", "");
result.put("url", id);
return result.toString();
} catch (Exception ee) {
SpiderDebug.log(ee);
}
}
}
return "";
}
@Override
public String searchContent(String key, boolean quick) {
if (quick)
return "";
try {
String url = siteUrl + "/xgapp.php/v1/search?text=" + URLEncoder.encode(key) + "&pg=1";
String content = OkHttpUtil.string(url, getHeaders(url));
JSONObject dataObject = new JSONObject(content);
JSONArray jsonArray = dataObject.getJSONArray("data");
JSONArray videos = new JSONArray();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject vObj = jsonArray.getJSONObject(i);
JSONObject v = new JSONObject();
v.put("vod_id", vObj.getString("vod_id"));
v.put("vod_name", vObj.getString("vod_name"));
v.put("vod_pic", vObj.getString("vod_pic"));
v.put("vod_remarks", vObj.getString("vod_remarks"));
videos.put(v);
}
JSONObject result = new JSONObject();
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
}
@@ -0,0 +1,486 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Zxzj extends Spider {
private static final String siteUrl = "https://zxzj.vip/";
/**
* 播放源配置
*/
private JSONObject playerConfig;
/**
* 筛选配置
*/
private JSONObject filterConfig;
private Pattern regexCategory = Pattern.compile("/list/(\\d+).html");
private Pattern regexVid = Pattern.compile("/detail/(\\d+).html");
private Pattern regexPlay = Pattern.compile("/video/(\\d+)-(\\d+)-(\\d+).html");
private Pattern regexPage = Pattern.compile("/vodshow/(\\S+).html");
protected String ext = null;
@Override
public void init(Context context) {
super.init(context);
try {
playerConfig = new JSONObject("{\"dpp\":{\"sh\":\"DP播放\",\"pu\":\"https://jx.zxzj.vip/dplayer.php?url=\",\"sn\":1,\"or\":999}}");
filterConfig = new JSONObject("{\"1\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"情色\",\"v\":\"情色\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"泰语\",\"v\":\"泰语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印度语\",\"v\":\"印度语\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"西班牙语\",\"v\":\"西班牙语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"法语\",\"v\":\"法语\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"6\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产\",\"v\":\"国产\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"5\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
} catch (JSONException e) {
SpiderDebug.log(e);
}
}
protected static HashMap<String, String> Headers() {
HashMap<String, String> headers = new HashMap<>();
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36");
headers.put("Referer", siteUrl);
return headers;
}
/**
* 爬虫headers
*
* @param url
* @return
*/
protected HashMap<String, String> getHeaders(String url) {
HashMap<String, String> headers = new HashMap<>();
headers.put("method", "GET");
headers.put("Upgrade-Insecure-Requests", "1");
headers.put("DNT", "1");
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
return headers;
}
/**
* 获取分类数据 + 首页最近更新视频列表数据
*
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
* @return
*/
@Override
public String homeContent(boolean filter) {
try {
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
// 分类节点
Elements elements = doc.select("ul.stui-header__menu li a");
JSONArray classes = new JSONArray();
for (Element ele : elements) {
String name = ele.text();
boolean show = name.equals("电影") ||
name.equals("美剧") ||
name.equals("韩剧") ||
name.equals("日剧") ||
name.equals("泰剧") ||
name.equals("动漫");
if (show) {
Matcher mather = regexCategory.matcher(ele.attr("href"));
if (!mather.find())
continue;
// 把分类的id和名称取出来加到列表里
String id = mather.group(1).trim();
JSONObject jsonObject = new JSONObject();
jsonObject.put("type_id", id);
jsonObject.put("type_name", name);
classes.put(jsonObject);
}
}
JSONObject result = new JSONObject();
if (filter) {
result.put("filters", filterConfig);
}
result.put("class", classes);
try {
// 取首页推荐视频列表
Element homeList = doc.select("ul.stui-vodlist").get(0);
Elements list = homeList.select("div.stui-vodlist__box");
JSONArray videos = new JSONArray();
for (int i = 0; i < list.size(); i++) {
Element vod = list.get(i);
String title = vod.select("a").attr("title");
String cover = vod.select("a").attr("data-original");
String remark = vod.select("a .pic-text").text();
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
if (!matcher.find())
continue;
String id = matcher.group(1);
JSONObject v = new JSONObject();
v.put("vod_id", id);
v.put("vod_name", title);
v.put("vod_pic", cover);
v.put("vod_remarks", remark);
videos.put(v);
}
result.put("list", videos);
} catch (Exception e) {
SpiderDebug.log(e);
}
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
/**
* 获取分类信息数据
*
* @param tid 分类id
* @param pg 页数
* @param filter 同homeContent方法中的filter
* @param extend 筛选参数{k:v, k1:v1}
* @return
*/
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
try {
String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
urlParams[0] = tid;
urlParams[8] = pg;
if (extend != null && extend.size() > 0) {
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
String key = it.next();
String value = extend.get(key);
urlParams[Integer.parseInt(key)] = URLEncoder.encode(value);
}
}
// 获取分类数据的url
String url = siteUrl + "vodshow/" + TextUtils.join("-", urlParams) + ".html";
String html = OkHttpUtil.string(url, getHeaders(url));
Document doc = Jsoup.parse(html);
JSONObject result = new JSONObject();
int pageCount = 0;
int page = -1;
// 取页码相关信息
Elements pageInfo = doc.select("ul.stui-page__item li");
if (pageInfo.size() == 0) {
page = Integer.parseInt(pg);
pageCount = page;
} else {
for (int i = 0; i < pageInfo.size(); i++) {
Element li = pageInfo.get(i);
Element a = li.selectFirst("a");
if (a == null)
continue;
String name = a.text();
if (page == -1 && li.hasClass("active")) {
Matcher matcher = regexPage.matcher(a.attr("href"));
if (matcher.find()) {
//System.out.println("哈哈"+matcher.group(1));
page = Integer.parseInt(matcher.group(1).split("-")[8]);
} else {
page = 0;
}
}
if (name.equals("尾页")) {
Matcher matcher = regexPage.matcher(a.attr("href"));
if (matcher.find()) {
//System.out.println("尾页" + matcher.group(1));
pageCount = Integer.parseInt(matcher.group(1).split("-")[8]);
} else {
pageCount = 0;
}
break;
}
}
}
JSONArray videos = new JSONArray();
if (!html.contains("没有找到您想要的结果哦")) {
// 取当前分类页的视频列表
Elements list = doc.select("div.stui-vodlist__box");
for (int i = 0; i < list.size(); i++) {
Element vod = list.get(i);
String title = vod.select("a").attr("title");
String cover = vod.select("a").attr("data-original");
String remark = vod.select("a .pic-text").text();
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
if (!matcher.find())
continue;
String id = matcher.group(1);
JSONObject v = new JSONObject();
v.put("vod_id", id);
v.put("vod_name", title);
v.put("vod_pic", cover);
v.put("vod_remarks", remark);
videos.put(v);
}
}
result.put("page", page);
result.put("pagecount", pageCount);
result.put("limit", 48);
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48);
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
/**
* 视频详情信息
*
* @param ids 视频id
* @return
*/
@Override
public String detailContent(List<String> ids) {
try {
// 视频详情url
String url = siteUrl + "/detail/" + ids.get(0) + ".html";
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
JSONObject result = new JSONObject();
JSONObject vodList = new JSONObject();
// 取基本数据
String cover = doc.select("div.stui-content__thumb a img").attr("data-original");
String title = doc.select("div.stui-content__detail h1").text();
String category = "", area = "", year = "", remark = "", director = "", actor = "", desc = "";
Elements data = doc.select("p.data");
Pattern cate = Pattern.compile("类型:(\\S+)");
category = doReplaceRegex(cate, data.get(0).text());
Pattern areas = Pattern.compile("地区:(\\S+)");
area = doReplaceRegex(areas, data.get(0).text());
Pattern years = Pattern.compile("年份:(\\S+)");
year = doReplaceRegex(years, data.get(0).text());
Pattern rms = Pattern.compile("更新:(\\S+)");
remark = doReplaceRegex(rms, data.get(3).text());
Pattern acs = Pattern.compile("主演:(\\S+)");
actor = doReplaceRegex(acs, data.get(1).text());
Pattern dis = Pattern.compile("导演:(\\S+)");
director = doReplaceRegex(dis, data.get(2).text());
desc = doc.selectFirst("span.detail-content").text().trim();
vodList.put("vod_id", ids.get(0));
vodList.put("vod_name", title);
vodList.put("vod_pic", cover);
vodList.put("type_name", category);
vodList.put("vod_year", year);
vodList.put("vod_area", area);
vodList.put("vod_remarks", remark);
vodList.put("vod_actor", actor);
vodList.put("vod_director", director);
vodList.put("vod_content", desc);
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
try {
int sort1 = playerConfig.getJSONObject(o1).getInt("or");
int sort2 = playerConfig.getJSONObject(o2).getInt("or");
if (sort1 == sort2) {
return 1;
}
return sort1 - sort2 > 0 ? 1 : -1;
} catch (JSONException e) {
SpiderDebug.log(e);
}
return 1;
}
});
// 取播放列表数据
Elements sources = doc.select("div.stui-vodlist__head h3");
Elements sourceList = doc.select("ul.stui-content__playlist");
for (int i = 0; i < sources.size(); i++) {
Element source = sources.get(i);
String sourceName = source.text();
boolean found = false;
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
String flag = it.next();
if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
sourceName = flag;
found = true;
break;
}
}
if (!found)
continue;
String playList = "";
Elements playListA = sourceList.get(i).select("li a");
List<String> vodItems = new ArrayList<>();
for (int j = 0; j < playListA.size(); j++) {
Element vod = playListA.get(j);
Matcher matcher = regexPlay.matcher(vod.attr("href"));
if (!matcher.find())
continue;
String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3);
vodItems.add(vod.text() + "$" + playURL);
}
if (vodItems.size() > 0)
playList = TextUtils.join("#", vodItems);
if (playList.length() == 0)
continue;
vod_play.put(sourceName, playList);
}
if (vod_play.size() > 0) {
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
String vod_play_url = TextUtils.join("$$$", vod_play.values());
vodList.put("vod_play_from", vod_play_from);
vodList.put("vod_play_url", vod_play_url);
}
JSONArray list = new JSONArray();
list.put(vodList);
result.put("list", list);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
/**
* 获取视频播放信息
*
* @param flag 播放源
* @param id 视频id
* @param vipFlags 所有可能需要vip解析的源
* @return
*/
@Override
public String playerContent(String flag, String id, List<String> vipFlags) {
try {
//定义播放用的headers
JSONObject headers = new JSONObject();
//headers.put("Host", " cokemv.co");
headers.put("origin", " https://zxzj.vip");
headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
headers.put("Accept", " */*");
headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7");
headers.put("Accept-Encoding", " gzip, deflate");
// 播放页 url
String url = siteUrl + "/video/" + id + ".html";
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
Elements allScript = doc.select("script");
JSONObject result = new JSONObject();
for (int i = 0; i < allScript.size(); i++) {
String scContent = allScript.get(i).html().trim();
if (scContent.startsWith("var player_")) { // 取直链
int start = scContent.indexOf('{');
int end = scContent.lastIndexOf('}') + 1;
String json = scContent.substring(start, end);
JSONObject player = new JSONObject(json);
if (playerConfig.has(player.getString("from"))) {
JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
String videoUrl = pCfg.getString("pu") + player.getString("url");
Document docs = Jsoup.parse(OkHttpUtil.string(videoUrl, getHeaders(videoUrl)));
Pattern pattern = Pattern.compile("(?<=urls\\s=\\s').*?(?=')");
Elements allScripts = docs.select("body script");
for (int j = 0; j < allScripts.size(); j++) {
String scContents = allScripts.get(j).html().trim();
Matcher matcher = pattern.matcher(scContents);
if (matcher.find()) {
String players = matcher.group(0);
result.put("parse", 0);
result.put("playUrl", "");
result.put("url", players);
result.put("header", headers.toString());
}
break;
}
}
}
}
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
/**
* 搜索
*
* @param key
* @param quick 是否播放页的快捷搜索
* @return
*/
@Override
public String searchContent(String key, boolean quick) {
try {
String url = siteUrl + "/vodsearch/-------------.html?wd=" + URLEncoder.encode(key) + "&submit=";
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
JSONObject result = new JSONObject();
JSONArray videos = new JSONArray();
Elements list = doc.select("div.stui-vodlist__box");
for (int i = 0; i < list.size(); i++) {
Element vod = list.get(i);
String title = vod.select("a").attr("title");
if (title.contains(key)) {
String cover = vod.select("a").attr("data-original");
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
if (!matcher.find())
continue;
String id = matcher.group(1);
JSONObject v = new JSONObject();
String remark = vod.select("a span.pic-text").text();
v.put("vod_id", id);
v.put("vod_name", title);
v.put("vod_pic", cover);
v.put("vod_remarks", remark);
videos.put(v);
}
}
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
private static String doReplaceRegex(Pattern pattern, String src) {
if (pattern == null)
return src;
try {
Matcher matcher = pattern.matcher(src);
if (matcher.find()) {
return matcher.group(1).trim();
}
} catch (Exception e) {
SpiderDebug.log(e);
}
return src;
}
}