diff --git a/app/src/main/java/com/github/catvod/spider/Ddrk.java b/app/src/main/java/com/github/catvod/spider/Ddrk.java new file mode 100644 index 00000000..889cef14 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Ddrk.java @@ -0,0 +1,429 @@ +package com.github.catvod.spider; + +import android.text.TextUtils; + +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.Util; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Demo for self study + *

+ * Source from Author: CatVod + */ + +public class Ddrk extends Spider { + + private static final String siteUrl = "https://ddys.pro"; + private static final String siteHost = "ddys.pro"; + + protected JSONObject filterConfig; + + protected Pattern regexCategory = Pattern.compile("/category/(\\S+)/"); + protected Pattern regexVid = Pattern.compile("https://ddys.pro/(\\S+)/"); + + protected Pattern regexPage = Pattern.compile("\\S+/page/(\\S+)\\S+"); + protected Pattern m = Pattern.compile("\\S+(http\\S+g)"); + protected Pattern mark = Pattern.compile("\\S+(.*)"); + + // protected Pattern t = Pattern.compile("(\\S+)"); + + + /** + * 爬虫headers + * + * @param url + * @return + */ + protected HashMap getHeaders(String url) { + HashMap 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; + } + + protected static HashMap Headers() { + HashMap headers = new HashMap<>(); + 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("Referer", siteUrl); + return headers; + } + + /** + * 获取分类数据 + 首页最近更新视频列表数据 + * + * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 + * @return + */ + @Override + public String homeContent(boolean filter) { + + List vods = new ArrayList<>(); + String url = siteUrl + '/'; + Document doc = Jsoup.parse(OkHttp.string(url, getHeaders(url))); + Elements elements = doc.select("li.menu-item a"); + List classes = new ArrayList<>(); + ArrayList allClass = new ArrayList<>(); + for (Element ele : elements) { + String name = ele.attr("title"); + boolean show = !filter || (name.equals("热映中") || name.equals("欧美剧") || name.equals("日剧") || name.equals("韩剧") || name.equals("华语剧") || name.equals("其他地区") || name.equals("全部") || name.equals("欧美电影") || name.equals("日韩电影") || name.equals("华语电影") || name.equals("新番") || name.equals("动画") || name.equals("纪录片") || name.equals("综艺")); + if (allClass.contains(name)) show = false; + if (show) { + allClass.add(name); + Matcher mather = regexCategory.matcher(ele.attr("href")); + if (!mather.find()) continue; + // 把分类的id和名称取出来加到列表里 + String id = mather.group(1).trim(); + + classes.add(new Class(id, name)); + } + } + + + // 取首页推荐视频列表 + Elements list = doc.select("div.post-box-container"); + + for (int i = 0; i < list.size(); i++) { + Element vod = list.get(i); + String title = vod.selectFirst(".post-box-title > a").text(); + String id = vod.selectFirst(".post-box-title > a").attr("href"); + String imageHtml = vod.selectFirst("div.post-box-image").attr("style"); + String image = ""; + String regex = "url\\((.*?)\\)"; + + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(imageHtml); + if (matcher.find()) { + image = matcher.group(1); + } + vods.add(new Vod(id, title, image)); + } + + + return Result.string(classes, vods, filterConfig); + } + + + /** + * 获取分类信息数据 + * + * @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 extend) { + String url = ""; + try { + if (extend != null && extend.size() > 0) { + for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { + String key = it.next(); + String value = extend.get(key); + if (value != null && value.length() != 0 && value != " ") { + url = siteUrl + "/category/" + tid + "/" + value; + } else { + url = siteUrl + "/category/" + tid; + } + ; + } + } else { + url = siteUrl + "/category/" + tid; + } + ; + if (pg.equals("1")) { + url = url + "/"; + } else { + url = url + "/page/" + pg + "/"; + } + //System.out.println(url); + String html = OkHttp.string(url, getHeaders(url)); + Document doc = Jsoup.parse(html); + JSONObject result = new JSONObject(); + int pageCount = 0; + int page = -1; + + // 取页码相关信息 + Elements pageInfo = doc.select("div.nav-links"); + 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 wy = doc.select("div.nav-links a").last().attr("href"); + String span = doc.select("span.current").text().trim(); + if (page == -1) { + page = Integer.parseInt(span); + } else { + + page = 0; + } + Matcher matcher = regexPage.matcher(wy); + if (matcher.find()) { + //System.out.println("尾页" + matcher.group(1)); + pageCount = Integer.parseInt(matcher.group(1)); + } else { + pageCount = 0; + } + break; + } + } + + JSONArray videos = new JSONArray(); + if (!html.contains("没有找到您想要的结果哦")) { + // 取当前分类页的视频列表 + Elements list = doc.select("div.post-box-container"); + for (int i = 0; i < list.size(); i++) { + Element vod = list.get(i); + String a = vod.selectFirst(".post-box-title a").text(); + if (a.contains("(")) { + String[] item = a.split("\\("); + String title = item[0]; + String remark = item[1].replace(")", ""); + String cover = doReplaceRegex(m, vod.selectFirst(".post-box-image").attr("style")); + + String id = vod.selectFirst(".post-box-title a").attr("href"); + 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); + } else { + String title = a; + String cover = doReplaceRegex(m, vod.selectFirst(".post-box-image").attr("style")); + String remark = doReplaceRegex(mark, vod.selectFirst(".post-box-title a").text()); + Matcher matcher = regexVid.matcher(vod.selectFirst(".post-box-title 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", 24); + result.put("total", pageCount <= 1 ? videos.length() : pageCount * 24); + + result.put("list", videos); + return result.toString(); + } catch (Exception e) { + SpiderDebug.log(e); + } + return ""; + } + + /** + * 视频详情信息 + * + * @param ids 视频id + * @return + */ + @Override + public String detailContent(List ids) { + try { + // 视频详情url + String url = ids.get(0); + Document doc = Jsoup.parse(OkHttp.string(url, getHeaders(url))); + JSONObject result = new JSONObject(); + JSONObject vodList = new JSONObject(); + + // 取基本数据 + String cover = doc.select("div.post img").attr("src"); + String ab = doc.select("h1.post-title").text(); + if (ab.contains("(")) { + String[] b = ab.split("\\("); + String title = b[0]; + String remark = b[1].replace("(", ""); + vodList.put("vod_name", title); + vodList.put("vod_remarks", remark); + } else { + vodList.put("vod_name", ab); + String remark = doc.select("time").text().trim(); + vodList.put("vod_remarks", "全"); + } + String str2 = doc.select("div.abstract").text().replace(" ", ""); + String replace = str2.replace("
", ""); + String text = replace.replace("

", ""); + Pattern categorys = Pattern.compile("类型:(.*)制"); + String category = doReplaceRegex(categorys, text); + Pattern a = Pattern.compile("年份:(.*)简"); + String year = doReplaceRegex(a, text); + Pattern b = Pattern.compile("地区:(.*)年份"); + String area = doReplaceRegex(b, text); + Pattern c = Pattern.compile("演员:(.*)类"); + String actor = doReplaceRegex(c, text); + Pattern d = Pattern.compile("导演:(.*)演"); + String director = doReplaceRegex(d, text); + Pattern e = Pattern.compile("简介:(.*)"); + String desc = doReplaceRegex(e, text); + + + vodList.put("vod_id", ids.get(0)); + vodList.put("vod_pic", cover); + vodList.put("type_name", category); + vodList.put("vod_year", year); + vodList.put("vod_area", area); + vodList.put("vod_actor", actor); + vodList.put("vod_director", director); + vodList.put("vod_content", desc); + + List vodItems = new ArrayList<>(); + List vodItems2 = new ArrayList<>(); + Map vod_play = new LinkedHashMap<>(); + + Elements allScript = doc.select(".wp-playlist-script"); + String sourceName = "第1季"; + for (int j = 0; j < allScript.size(); j++) { + String scContent = allScript.get(j).html().trim(); + int start = scContent.indexOf('{'); + int end = scContent.lastIndexOf('}') + 1; + String json = scContent.substring(start, end); + JSONObject UJson = new JSONObject(json); + JSONArray Track = UJson.getJSONArray("tracks"); + for (int k = 0; k < Track.length(); k++) { + JSONObject src = Track.getJSONObject(k); + String adk = src.getString("src1"); + String vodName = src.getString("caption"); + String playURL = siteUrl + "/getvddr/video?id=" + adk + "&type=mix"; + String zm = siteUrl + "/subddr/" + src.getString("subsrc"); + String pzm = playURL + "|" + zm; + vodItems.add(vodName + "$" + pzm); + } + vod_play.put(sourceName, TextUtils.join("#", vodItems)); + } + Elements sources = doc.select(".post-page-numbers"); + if (!sources.isEmpty()) for (int i = 0; i < sources.size(); i++) { + Element source = sources.get(i); + sourceName = "第" + source.text() + "季"; + String Purl = siteUrl + "/" + ids.get(0) + "/" + source.text() + "/"; + Document docs = Jsoup.parse(OkHttp.string(Purl, getHeaders(Purl))); + Elements allScripts = docs.select(".wp-playlist-script"); + for (int j = 0; j < allScripts.size(); j++) { + String scContent = allScripts.get(j).html().trim(); + int start = scContent.indexOf('{'); + int end = scContent.lastIndexOf('}') + 1; + String json = scContent.substring(start, end); + JSONObject UJson = new JSONObject(json); + JSONArray Track = UJson.getJSONArray("tracks"); + for (int k = 0; k < Track.length(); k++) { + JSONObject src = Track.getJSONObject(k); + String adk = src.getString("src1"); + String vodName = src.getString("caption"); + String playURL = siteUrl + "/getvddr/video?id=" + adk + "&type=mix"; + String zm = siteUrl + "/subddr/" + src.getString("subsrc"); + String pzm = playURL + "|" + zm; + vodItems2.add(vodName + "$" + pzm); + } + vod_play.put(sourceName, TextUtils.join("#", vodItems2)); + } + vodItems2.removeAll(vodItems2); + } + + 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 vipFlags) { + + String[] item = id.split("\\|"); + String playUrl = item[0]; + String ZiMu = item[1]; + + String content = OkHttp.string(playUrl, getHeaders(playUrl)); + + String RealUrl = ""; + String regex = "\"src0\":\"(.*?)\","; + + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(content); + if (matcher.find()) { + RealUrl = matcher.group(1); + } + + return Result.get().url(siteUrl + RealUrl.replace("\\/", "/")).header(Headers()).string(); + } + + + @Override + public String searchContent(String key, boolean quick) { + + String url = "https://ddys.pro/?s=" + URLEncoder.encode(key) + "&post_type=post"; + Document doc = Jsoup.parse(OkHttp.string(url, getHeaders(url))); + List vods = new ArrayList<>(); + Elements elements = doc.select("h2.post-title > a"); + for (int i = 0; i < elements.size(); i++) { + String id = elements.get(i).attr("href"); + String name = elements.get(i).text(); + vods.add(new Vod(id, name, "")); + } + return Result.string(vods); + } + + 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; + } + + +} \ No newline at end of file diff --git a/app/src/test/java/DdrkTest.java b/app/src/test/java/DdrkTest.java new file mode 100644 index 00000000..7b11c1e7 --- /dev/null +++ b/app/src/test/java/DdrkTest.java @@ -0,0 +1,99 @@ +import android.app.Application; + +import com.github.catvod.spider.Ddrk; +import com.github.catvod.spider.HkTv; +import com.github.catvod.spider.Init; +import com.github.catvod.utils.Json; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; + +import org.junit.Assert; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +import java.util.ArrayList; +import java.util.Arrays; + +@RunWith(RobolectricTestRunner.class) +public class DdrkTest { + // @Mock + private Application mockContext; + + private Ddrk spider; + + @org.junit.Before + public void setUp() throws Exception { + mockContext = RuntimeEnvironment.application; + Init.init(mockContext); + spider = new Ddrk(); + spider.init(mockContext, ""); + } + + @org.junit.Test + public void homeContent() throws Exception { + String content = spider.homeContent(true); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + System.out.println("homeContent--" + gson.toJson(map)); + + //Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } + + @org.junit.Test + public void homeVideoContent() throws Exception { + String content = spider.homeVideoContent(); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + System.out.println("homeVideoContent--" + gson.toJson(map)); + + //Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } + + @org.junit.Test + public void categoryContent() throws Exception { + String content = spider.categoryContent("drama/western-drama", "2", true, null); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println("categoryContent--" + gson.toJson(map)); + Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } + + @org.junit.Test + public void detailContent() throws Exception { + + String content = spider.detailContent(Arrays.asList("https://ddys.pro/the-fable/")); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println("detailContent--" + gson.toJson(map)); + Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } + + @org.junit.Test + public void playerContent() throws Exception { + String froms = "第1季"; + String urls = "第01集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfOrVlYXtr0IrFW8lVeTT91H%2BUSu5z72Gkx6JAGA8EXlJLvetAfVTXXDhxuKCGJ6Q3Ngws821BcBwndpb%2B2GPjbo%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E01.ddr#第02集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfML0vn1KlTxF0sG%2BEHO21R1cpLbSt%2BXLLxl1R4ROccMqgxKrfB%2BNEqcywjLdgdnFeNOYu8Jp86q1LceYrzyfRNA%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E02.ddr#第03集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfLSbJjBcNaYf0d9KYtSt4Dc4guy5jGVmk1NGoRUN%2FTKNo3wIPi9zaht0T3iaVrIG9aowYlrg4M3ZhF5tpKa5a3Q%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E03.ddr#第04集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfOhtDTTFt4SsSqDAXc29K%2FjRaWjRW4rFJYEkL3dGQ8lunDdVoVDCdwLM3MRdkE5GKZiwJnFV4yokt%2FJTlu6W9B0%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E04.ddr#第05集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfOekWLffYiwPueR2d%2F2jlsdoB2MFrn7KZ7RZxnTO2Cl79FQ6JxdhLFZVKQMUfXjl61OPbX6mB2pwuMC8EZDTZM0%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E05.ddr#第06集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfBlB%2BSpxUCnlGPrINcu%2F1SBXw9E48vZepi2rbznJEL%2B7KaG%2FemNxcMt6i2tonlv%2Fj7Yiciu6%2FJp%2FnYHm9azBMMg%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E06.ddr#第07集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfA3oc9ABVnVTvqzAM188IauJwfyfj0mjiLGQipukzelI2Q3Wr%2F8jwBx1eB8yXqjb8GyGOSE4HjylzNNZEeNIPOE%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E07.ddr#第08集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfJOKQJ6QC7TwGBw%2B7XCHqWtRHmOW78EwIA2WdpWoLK6LZMorbbBF7F8CY0%2F8%2BybxkKutVTxcbwJHLYeq5KfaWXE%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E08.ddr#第09集$https://ddys.pro/getvddr/video?id\u003dKqivU7FCez3AzaByqNMjDfGnF9itLkgWcRnE0NAeMTe7Z8DVPXWR%2FJvYQBGf52fOhv3jBlQ5LihxM6O5JO%2FANOmvP8XvKojMNTHvRaasviQ%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E09.ddr#第10集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfFuxdVAN%2F0ZWpHmPYouX2tGpQafvtO9opv55jVEdqxgnUQwDcXdACwZgP4oMbk0O41aQjab0YOv7F6a2%2BcyCxfk%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E10.ddr#第11集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfB7AzCUzGnvni8EaQgDUAeruvMOEP%2By29vrNL0bgRjV9I4o2IIifgYqTV8EVqhjFogonUNDLNcMFJ5w408hLH3k%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E11.ddr#第12集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfNEKVB%2FplZ4P8g2xyropO3Y344w4x0tjIUr6ZONvPl8QALRIdahfpQFpp5qbK4ufOGYGLHq6zXREpfmhWe0HAkI%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E12.ddr#第13集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfBFMTt9r5WqhZpmc4QQgU0iRjSqc8YQDAEEFCzIar44C%2FwGy4p9PfsBWfynJpu42%2BRv4DgCcpqB%2BXLsv8X24NDQ%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E13.ddr#第14集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfNSmR2YMg3lNOPuwjam%2BOxI4BpWDMdwFRRHLh4PixAzLN5296mDjoA763gkjeEDNYsn6HIU597ge05ZI%2BgWizC8%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E14.ddr#第15集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfI4TiWm%2FCMVOWx2lxRgpl%2BVtwmPeyHyP%2FtdIdfekVgRV69u4HkYZYbLrCHFMLabFTSn3jdgVM5TyCIjypo9O%2F0E%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E15.ddr#第16集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfMieUkuUIEB34HJ4yRt0c18%2F%2BfEyUXCCGYReb9sKVXc8X%2FfcV1nHUDLMb9HeDSZSuf14zDDFEk9DHQNpUgvFa8A%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E16.ddr#第17集$https://ddys.pro/getvddr/video?id\u003dfBG%2Flj6cvF9dk4FfQ5csfKeqB9W4XjNkL%2FsKDi7jnfOhHRtJsT4E1o9nXo8o28wnphO1591NKKbPAWn8Sf%2FFcmrKbymYzH4wwwzlKCL1IQY%3D\u0026type\u003dmix|https://ddys.pro/subddr//v/Anime/The_Fable/The_Fable_S01E17.ddr"; + for (int i = 0; i < urls.split("\\$\\$\\$").length; i++) { + for (int i1 = 0; i1 < urls.split("\\$\\$\\$")[i].split("#").length; i1++) { + String content = spider.playerContent(froms.split("\\$\\$\\$")[i], urls.split("\\$\\$\\$")[i].split("#")[i1].split("\\$")[1], new ArrayList<>()); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println("playerContent--" + gson.toJson(map)); + Assert.assertFalse(map.getAsJsonPrimitive("url").getAsString().isEmpty()); + } + + } + } + + @org.junit.Test + public void searchContent() throws Exception { + String content = spider.searchContent("海", false); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println("searchContent--" + gson.toJson(map)); + Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } +} \ No newline at end of file diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 8cfe4356..9a64445e 100644 Binary files a/jar/custom_spider.jar and b/jar/custom_spider.jar differ diff --git a/jar/custom_spider.jar.md5 b/jar/custom_spider.jar.md5 index 8e7fe768..afc30631 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -e3bc7843d766de40c20a38dd72c989cd +10c3ce1b9c5b8dd9f5d3ef1b88f42f19 diff --git a/json/index.json b/json/index.json index 991cb4d3..a2ae7a6c 100644 --- a/json/index.json +++ b/json/index.json @@ -1,5 +1,5 @@ { - "spider": "../jar/custom_spider.jar;md5;e3bc7843d766de40c20a38dd72c989cd", + "spider": "../jar/custom_spider.jar;md5;10c3ce1b9c5b8dd9f5d3ef1b88f42f19", "lives": [ { "name": "直播ipv6", @@ -127,6 +127,14 @@ "searchable": 1, "filterable": 0, "ext": "https://www.libvio.app" + }, { + "key": "Ddrk", + "name": "低端影视", + "type": 3, + "api": "csp_Ddrk", + "searchable": 1, + "filterable": 0 + }, { "key": "Ysj",