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",