diff --git a/app/src/main/java/com/github/catvod/spider/Douban.java b/app/src/main/java/com/github/catvod/spider/Douban.java new file mode 100644 index 00000000..16ff947b --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Douban.java @@ -0,0 +1,145 @@ +package com.github.catvod.spider; + +import android.content.Context; +import com.github.catvod.bean.Class; +import com.github.catvod.bean.Result; +import com.github.catvod.bean.Vod; +import com.github.catvod.crawler.Spider; +import com.github.catvod.crawler.SpiderDebug; +import com.github.catvod.net.OkHttp; +import com.github.catvod.utils.Utils; +import com.google.gson.JsonParser; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.net.URLEncoder; +import java.util.*; + +public class Douban extends Spider { + private final String hostURL = "https://frodo.douban.com/api/v2"; + private final String apikey = "?apikey=0ac44ae016490db2204ce0a042db2916"; + private String extend; + + private Map getHeader() { + Map header = new HashMap<>(); + header.put("Host", "frodo.douban.com"); + header.put("Connection", "Keep-Alive"); + header.put("Referer", "https://servicewechat.com/wx2f9b06c1de1ccfca/84/page-frame.html"); + header.put("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat"); + return header; + } + + @Override + public void init(Context context, String extend) throws Exception { + super.init(context, extend); + this.extend = extend; + } + + @Override + public String homeContent(boolean filter) throws Exception { + List classes = new ArrayList<>(); + List typeIds = Arrays.asList("hot_gaia", "tv_hot", "show_hot", "movie", "tv", "rank_list_movie", "rank_list_tv"); + List typeNames = Arrays.asList("热门电影", "热播剧集", "热播综艺", "电影筛选", "电视筛选", "电影榜单", "电视剧榜单"); + for (int i = 0; i < typeIds.size(); i++) classes.add(new Class(typeIds.get(i), typeNames.get(i))); + String recommendURL = "http://api.douban.com/api/v2/subject_collection/subject_real_time_hotest/items" + apikey; + JSONObject jsonObject = new JSONObject(OkHttp.string(recommendURL, getHeader())); + JSONArray items = jsonObject.optJSONArray("subject_collection_items"); + return Result.string(classes, parseVodListFromJSONArray(items), filter ? JsonParser.parseString(OkHttp.string(extend)) : null); + } + + @Override + public String categoryContent(String tid, String pg, boolean filter, HashMap extend) throws Exception { + HashMap ext = new HashMap<>(); + if (extend != null && extend.size() > 0) { + ext.putAll(extend); + } + String sort = ext.get("sort") == null ? "T" : ext.get("sort"); + String tags = URLEncoder.encode(getTags(ext)); + int start = (Integer.parseInt(pg) - 1) * 20; + String cateURL; + String itemKey = "items"; + switch (tid) { + case "hot_gaia": + sort = ext.get("sort") == null ? "recommend" : ext.get("sort"); + String area = ext.get("area") == null ? "全部" : ext.get("area"); + sort = sort + "&area=" + URLEncoder.encode(area); + cateURL = hostURL + "/movie/hot_gaia" + apikey + "&sort=" + sort + "&start=" + start + "&count=20"; + break; + case "tv_hot": + String type = ext.get("type") == null ? "tv_hot" : ext.get("type"); + cateURL = hostURL + "/subject_collection/" + type + "/items" + apikey + "&start=" + start + "&count=20"; + itemKey = "subject_collection_items"; + break; + case "show_hot": + String showType = ext.get("type") == null ? "show_hot" : ext.get("type"); + cateURL = hostURL + "/subject_collection/" + showType + "/items" + apikey + "&start=" + start + "&count=20"; + itemKey = "subject_collection_items"; + break; + case "tv": + cateURL = hostURL + "/tv/recommend" + apikey + "&sort=" + sort + "&tags=" + tags + "&start=" + start + "&count=20"; + break; + case "rank_list_movie": + String rankMovieType = ext.get("榜单") == null ? "movie_real_time_hotest" : ext.get("榜单"); + cateURL = hostURL + "/subject_collection/" + rankMovieType + "/items" + apikey + "&start=" + start + "&count=20"; + itemKey = "subject_collection_items"; + break; + case "rank_list_tv": + String rankTVType = ext.get("榜单") == null ? "tv_real_time_hotest" : ext.get("榜单"); + cateURL = hostURL + "/subject_collection/" + rankTVType + "/items" + apikey + "&start=" + start + "&count=20"; + itemKey = "subject_collection_items"; + break; + default: + cateURL = hostURL + "/movie/recommend" + apikey + "&sort=" + sort + "&tags=" + tags + "&start=" + start + "&count=20"; + } + JSONObject jsonObject = new JSONObject(OkHttp.string(cateURL, getHeader())); + JSONArray items = jsonObject.getJSONArray(itemKey); + List list = parseVodListFromJSONArray(items); + int page = Integer.parseInt(pg), count = Integer.MAX_VALUE, limit = 20, total = Integer.MAX_VALUE; + return Result.get().vod(list).page(page, count, limit, total).string(); + } + + private List parseVodListFromJSONArray(JSONArray items) throws Exception { + List list = new ArrayList<>(); + for (int i = 0; i < items.length(); i++) { + JSONObject item = items.getJSONObject(i); + String vodId = "msearch:" + item.optString("id"); + String name = item.optString("title"); + String pic = getPic(item); + String remark = getRating(item); + list.add(new Vod(vodId, name, pic, remark)); + } + return list; + } + + private String getRating(JSONObject item) { + try { + return "评分:" + item.getJSONObject("rating").optString("value"); + } catch (Exception e) { + SpiderDebug.log(e); + } + return ""; + } + + private String getPic(JSONObject item) { + try { + return item.getJSONObject("pic").optString("normal") + "@Referer=https://api.douban.com/@User-Agent=" + Utils.CHROME; + } catch (Exception e) { + SpiderDebug.log(e); + } + return ""; + } + + private String getTags(HashMap ext) { + try { + StringBuilder tags = new StringBuilder(); + for (String key : ext.keySet()) { + if (key.equals("sort")) continue; + tags.append(ext.get(key)).append(","); + } + return tags.substring(0, tags.lastIndexOf(",")); + } catch (Exception e) { +// SpiderDebug.log(e); + } + return ""; + } +} diff --git a/app/src/main/java/com/github/catvod/spider/Xb6v.java b/app/src/main/java/com/github/catvod/spider/Xb6v.java index 9dc20436..3bd17414 100644 --- a/app/src/main/java/com/github/catvod/spider/Xb6v.java +++ b/app/src/main/java/com/github/catvod/spider/Xb6v.java @@ -97,14 +97,13 @@ public class Xb6v extends Spider { if (!pg.equals("1")) cateURL += "index_" + pg + ".html"; String html = OkHttp.string(cateURL, getHeader()); Document doc = Jsoup.parse(html); - List list = parseVodListFromDoc(doc); String href = doc.select(".pagination > a").last().attr("href"); int page = Integer.parseInt(pg); int count = Integer.parseInt(getStrByRegex(Pattern.compile("index_(.*?).html"), href)); int limit = 18; Elements items = doc.select("#post_container .post_hover"); int total = page == count ? (page - 1) * limit + items.size() : count * limit; - return Result.get().vod(list).page(page, count, limit, total).string(); + return Result.get().vod(parseVodListFromDoc(doc)).page(page, count, limit, total).string(); } @Override @@ -137,15 +136,19 @@ public class Xb6v extends Spider { String name = doc.select(".article_container > h1").text(); String pic = doc.select("#post_content img").attr("src"); String typeName = getStrByRegex(Pattern.compile("◎类  别 (.*?)
"), partHTML); + if (typeName.equals("")) typeName = doc.select("[rel=category tag]").text(); String year = getStrByRegex(Pattern.compile("◎年  代 (.*?)
"), partHTML); + if (year.equals("")) year = getStrByRegex(Pattern.compile("首播:(.*?)
"), partHTML); String area = getStrByRegex(Pattern.compile("◎产  地 (.*?)
"), partHTML); + if (area.equals("")) area = getStrByRegex(Pattern.compile("地区:(.*?)
"), partHTML); String remark = getStrByRegex(Pattern.compile("◎上映日期 (.*?)
"), partHTML); String actor = getActorOrDirector(Pattern.compile("◎演  员 (.*?)

"), partHTML); - if (actor.equals("")) { - actor = getActorOrDirector(Pattern.compile("◎主  演 (.*?)

"), partHTML); - } + if (actor.equals("")) actor = getActorOrDirector(Pattern.compile("◎主  演 (.*?)

"), partHTML); + if (actor.equals("")) actor = getActorOrDirector(Pattern.compile("主演:(.*?)
"), partHTML); String director = getActorOrDirector(Pattern.compile("◎导  演 (.*?)
"), partHTML); + if (director.equals("")) director = getActorOrDirector(Pattern.compile("导演:(.*?)
"), partHTML); String description = getDescription(Pattern.compile("◎简  介(.*?)
", Pattern.CASE_INSENSITIVE | Pattern.DOTALL), partHTML); + if (description.equals("")) description = getDescription(Pattern.compile("简介(.*?)

", Pattern.CASE_INSENSITIVE | Pattern.DOTALL), partHTML); Vod vod = new Vod(); vod.setVodId(ids.get(0)); diff --git a/json/config.json b/json/config.json index 801691bb..d5cfbd07 100644 --- a/json/config.json +++ b/json/config.json @@ -98,6 +98,23 @@ "经典片" ] }, + { + "key": "豆瓣", + "name": "豆瓣", + "type": 3, + "api": "csp_Douban", + "searchable": 0, + "changeable": 1, + "ext": "https://gh-proxy.com/https://raw.githubusercontent.com/FongMi/CatVodSpider/main/json/douban.json" + }, + { + "key": "新版6V电影网", + "name": "新版6V电影网", + "type": 3, + "api": "csp_Xb6v", + "searchable": 1, + "changeable": 1 + }, { "key": "暴風", "name": "暴風", diff --git a/json/douban.json b/json/douban.json new file mode 100644 index 00000000..21a7512f --- /dev/null +++ b/json/douban.json @@ -0,0 +1,794 @@ +{ + "hot_gaia": [ + { + "key": "sort", + "name": "排序", + "value": [ + { + "n": "热度", + "v": "recommend" + }, + { + "n": "最新", + "v": "time" + }, + { + "n": "评分", + "v": "rank" + } + ] + }, + { + "key": "area", + "name": "地区", + "value": [ + { + "n": "全部", + "v": "全部" + }, + { + "n": "华语", + "v": "华语" + }, + { + "n": "欧美", + "v": "欧美" + }, + { + "n": "韩国", + "v": "韩国" + }, + { + "n": "日本", + "v": "日本" + } + ] + } + ], + "tv_hot": [ + { + "key": "type", + "name": "分类", + "value": [ + { + "n": "综合", + "v": "tv_hot" + }, + { + "n": "国产剧", + "v": "tv_domestic" + }, + { + "n": "欧美剧", + "v": "tv_american" + }, + { + "n": "日剧", + "v": "tv_japanese" + }, + { + "n": "韩剧", + "v": "tv_korean" + }, + { + "n": "动画", + "v": "tv_animation" + } + ] + } + ], + "show_hot": [ + { + "key": "type", + "name": "分类", + "value": [ + { + "n": "综合", + "v": "show_hot" + }, + { + "n": "国内", + "v": "show_domestic" + }, + { + "n": "国外", + "v": "show_foreign" + } + ] + } + ], + "movie": [ + { + "key": "类型", + "name": "类型", + "value": [ + { + "n": "全部类型", + "v": "" + }, + { + "n": "喜剧", + "v": "喜剧" + }, + { + "n": "爱情", + "v": "爱情" + }, + { + "n": "动作", + "v": "动作" + }, + { + "n": "科幻", + "v": "科幻" + }, + { + "n": "动画", + "v": "动画" + }, + { + "n": "悬疑", + "v": "悬疑" + }, + { + "n": "犯罪", + "v": "犯罪" + }, + { + "n": "惊悚", + "v": "惊悚" + }, + { + "n": "冒险", + "v": "冒险" + }, + { + "n": "音乐", + "v": "音乐" + }, + { + "n": "历史", + "v": "历史" + }, + { + "n": "奇幻", + "v": "奇幻" + }, + { + "n": "恐怖", + "v": "恐怖" + }, + { + "n": "战争", + "v": "战争" + }, + { + "n": "传记", + "v": "传记" + }, + { + "n": "歌舞", + "v": "歌舞" + }, + { + "n": "武侠", + "v": "武侠" + }, + { + "n": "情色", + "v": "情色" + }, + { + "n": "灾难", + "v": "灾难" + }, + { + "n": "西部", + "v": "西部" + }, + { + "n": "纪录片", + "v": "纪录片" + }, + { + "n": "短片", + "v": "短片" + } + ] + }, + { + "key": "地区", + "name": "地区", + "value": [ + { + "n": "全部地区", + "v": "" + }, + { + "n": "华语", + "v": "华语" + }, + { + "n": "欧美", + "v": "欧美" + }, + { + "n": "韩国", + "v": "韩国" + }, + { + "n": "日本", + "v": "日本" + }, + { + "n": "中国大陆", + "v": "中国大陆" + }, + { + "n": "美国", + "v": "美国" + }, + { + "n": "中国香港", + "v": "中国香港" + }, + { + "n": "中国台湾", + "v": "中国台湾" + }, + { + "n": "英国", + "v": "英国" + }, + { + "n": "法国", + "v": "法国" + }, + { + "n": "德国", + "v": "德国" + }, + { + "n": "意大利", + "v": "意大利" + }, + { + "n": "西班牙", + "v": "西班牙" + }, + { + "n": "印度", + "v": "印度" + }, + { + "n": "泰国", + "v": "泰国" + }, + { + "n": "俄罗斯", + "v": "俄罗斯" + }, + { + "n": "加拿大", + "v": "加拿大" + }, + { + "n": "澳大利亚", + "v": "澳大利亚" + }, + { + "n": "爱尔兰", + "v": "爱尔兰" + }, + { + "n": "瑞典", + "v": "瑞典" + }, + { + "n": "巴西", + "v": "巴西" + }, + { + "n": "丹麦", + "v": "丹麦" + } + ] + }, + { + "key": "sort", + "name": "排序", + "value": [ + { + "n": "近期热度", + "v": "T" + }, + { + "n": "首映时间", + "v": "R" + }, + { + "n": "高分优先", + "v": "S" + } + ] + }, + { + "key": "年代", + "name": "年代", + "value": [ + { + "n": "全部年代", + "v": "" + }, + { + "n": "2023", + "v": "2023" + }, + { + "n": "2022", + "v": "2022" + }, + { + "n": "2021", + "v": "2021" + }, + { + "n": "2020", + "v": "2020" + }, + { + "n": "2019", + "v": "2019" + }, + { + "n": "2010年代", + "v": "2010年代" + }, + { + "n": "2000年代", + "v": "2000年代" + }, + { + "n": "90年代", + "v": "90年代" + }, + { + "n": "80年代", + "v": "80年代" + }, + { + "n": "70年代", + "v": "70年代" + }, + { + "n": "60年代", + "v": "60年代" + }, + { + "n": "更早", + "v": "更早" + } + ] + } + ], + "tv": [ + { + "key": "类型", + "name": "类型", + "value": [ + { + "n": "不限", + "v": "" + }, + { + "n": "电视剧", + "v": "电视剧" + }, + { + "n": "综艺", + "v": "综艺" + } + ] + }, + { + "key": "电视剧形式", + "name": "电视剧形式", + "value": [ + { + "n": "不限", + "v": "" + }, + { + "n": "喜剧", + "v": "喜剧" + }, + { + "n": "爱情", + "v": "爱情" + }, + { + "n": "悬疑", + "v": "悬疑" + }, + { + "n": "动画", + "v": "动画" + }, + { + "n": "武侠", + "v": "武侠" + }, + { + "n": "古装", + "v": "古装" + }, + { + "n": "家庭", + "v": "家庭" + }, + { + "n": "犯罪", + "v": "犯罪" + }, + { + "n": "科幻", + "v": "科幻" + }, + { + "n": "恐怖", + "v": "恐怖" + }, + { + "n": "历史", + "v": "历史" + }, + { + "n": "战争", + "v": "战争" + }, + { + "n": "动作", + "v": "动作" + }, + { + "n": "冒险", + "v": "冒险" + }, + { + "n": "传记", + "v": "传记" + }, + { + "n": "剧情", + "v": "剧情" + }, + { + "n": "奇幻", + "v": "奇幻" + }, + { + "n": "惊悚", + "v": "惊悚" + }, + { + "n": "灾难", + "v": "灾难" + }, + { + "n": "歌舞", + "v": "歌舞" + }, + { + "n": "音乐", + "v": "音乐" + } + ] + }, + { + "key": "综艺形式", + "name": "综艺形式", + "value": [ + { + "n": "不限", + "v": "" + }, + { + "n": "真人秀", + "v": "真人秀" + }, + { + "n": "脱口秀", + "v": "脱口秀" + }, + { + "n": "音乐", + "v": "音乐" + }, + { + "n": "歌舞", + "v": "歌舞" + } + ] + }, + { + "key": "地区", + "name": "地区", + "value": [ + { + "n": "全部地区", + "v": "" + }, + { + "n": "华语", + "v": "华语" + }, + { + "n": "欧美", + "v": "欧美" + }, + { + "n": "国外", + "v": "国外" + }, + { + "n": "韩国", + "v": "韩国" + }, + { + "n": "日本", + "v": "日本" + }, + { + "n": "中国大陆", + "v": "中国大陆" + }, + { + "n": "中国香港", + "v": "中国香港" + }, + { + "n": "美国", + "v": "美国" + }, + { + "n": "英国", + "v": "英国" + }, + { + "n": "泰国", + "v": "泰国" + }, + { + "n": "中国台湾", + "v": "中国台湾" + }, + { + "n": "意大利", + "v": "意大利" + }, + { + "n": "法国", + "v": "法国" + }, + { + "n": "德国", + "v": "德国" + }, + { + "n": "西班牙", + "v": "西班牙" + }, + { + "n": "俄罗斯", + "v": "俄罗斯" + }, + { + "n": "瑞典", + "v": "瑞典" + }, + { + "n": "巴西", + "v": "巴西" + }, + { + "n": "丹麦", + "v": "丹麦" + }, + { + "n": "印度", + "v": "印度" + }, + { + "n": "加拿大", + "v": "加拿大" + }, + { + "n": "爱尔兰", + "v": "爱尔兰" + }, + { + "n": "澳大利亚", + "v": "澳大利亚" + } + ] + }, + { + "key": "sort", + "name": "排序", + "value": [ + { + "n": "近期热度", + "v": "T" + }, + { + "n": "首播时间", + "v": "R" + }, + { + "n": "高分优先", + "v": "S" + } + ] + }, + { + "key": "年代", + "name": "年代", + "value": [ + { + "n": "全部", + "v": "" + }, + { + "n": "2023", + "v": "2023" + }, + { + "n": "2022", + "v": "2022" + }, + { + "n": "2021", + "v": "2021" + }, + { + "n": "2020", + "v": "2020" + }, + { + "n": "2019", + "v": "2019" + }, + { + "n": "2010年代", + "v": "2010年代" + }, + { + "n": "2000年代", + "v": "2000年代" + }, + { + "n": "90年代", + "v": "90年代" + }, + { + "n": "80年代", + "v": "80年代" + }, + { + "n": "70年代", + "v": "70年代" + }, + { + "n": "60年代", + "v": "60年代" + }, + { + "n": "更早", + "v": "更早" + } + ] + }, + { + "key": "平台", + "name": "平台", + "value": [ + { + "n": "全部", + "v": "" + }, + { + "n": "腾讯视频", + "v": "腾讯视频" + }, + { + "n": "爱奇艺", + "v": "爱奇艺" + }, + { + "n": "优酷", + "v": "优酷" + }, + { + "n": "湖南卫视", + "v": "湖南卫视" + }, + { + "n": "Netflix", + "v": "Netflix" + }, + { + "n": "HBO", + "v": "HBO" + }, + { + "n": "BBC", + "v": "BBC" + }, + { + "n": "NHK", + "v": "NHK" + }, + { + "n": "CBS", + "v": "CBS" + }, + { + "n": "NBC", + "v": "NBC" + }, + { + "n": "tvN", + "v": "tvN" + } + ] + } + ], + "rank_list_movie": [ + { + "key": "榜单", + "name": "榜单", + "value": [ + { + "n": "实时热门电影", + "v": "movie_real_time_hotest" + }, + { + "n": "一周口碑电影榜", + "v": "movie_weekly_best" + }, + { + "n": "豆瓣电影Top250", + "v": "movie_top250" + } + ] + } + ], + "rank_list_tv": [ + { + "key": "榜单", + "name": "榜单", + "value": [ + { + "n": "实时热门电视", + "v": "tv_real_time_hotest" + }, + { + "n": "华语口碑剧集榜", + "v": "tv_chinese_best_weekly" + }, + { + "n": "全球口碑剧集榜", + "v": "tv_global_best_weekly" + }, + { + "n": "国内口碑综艺榜", + "v": "show_chinese_best_weekly" + }, + { + "n": "国外口碑综艺榜", + "v": "show_global_best_weekly" + } + ] + } + ] +} \ No newline at end of file