299 lines
23 KiB
Java
299 lines
23 KiB
Java
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<String, String> extend) {
|
|
try {
|
|
HashMap<String, String> 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<String> 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("年份:(.*?)</p>", html);
|
|
String area = getStrByRegex("地区:(.*?)/", html);
|
|
String remark = getStrByRegex("状态:.*?>(.*?)</span>", html);
|
|
String actor = getStrByRegex("主演:(.*?)</p>", html);
|
|
String director = getStrByRegex("导演:(.*?)</p>", 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<String> vipFlags) {
|
|
try {
|
|
String lastURL = id;
|
|
int parseFlag = 1;
|
|
String content = getWebContent(id);
|
|
Pattern pattern = Pattern.compile("player_aaaa=(.*?)</script>");
|
|
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<String, String> 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 "";
|
|
}
|
|
} |