diff --git a/app/src/main/java/com/github/catvod/spider/KuaKeBa.java b/app/src/main/java/com/github/catvod/spider/KuaKeBa.java
new file mode 100644
index 00000000..06c7b855
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/KuaKeBa.java
@@ -0,0 +1,151 @@
+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.net.OkHttp;
+import com.github.catvod.utils.Util;
+
+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.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * 夸克吧
+ *
+ * @author lushunming
+ */
+public class KuaKeBa extends Cloud {
+
+ private final String siteUrl = "https://www.kuakeba.top/yunpan";
+
+
+ private Map getHeader() {
+ Map header = new HashMap<>();
+ header.put("User-Agent", Util.CHROME);
+ return header;
+ }
+
+ private Map getHeaderWithCookie() {
+ Map header = new HashMap<>();
+ header.put("User-Agent", Util.CHROME);
+ header.put("cookie", "esc_search_captcha=1; result=43");
+ return header;
+ }
+
+ @Override
+ public void init(Context context, String extend) throws Exception {
+
+ super.init(context, extend);
+ }
+
+ @Override
+ public String homeContent(boolean filter) {
+ List classes = new ArrayList<>();
+ Document doc = Jsoup.parse(OkHttp.string(siteUrl, getHeader()));
+ Elements elements = doc.select(" div.catleader > ul > li > a");
+ for (Element e : elements) {
+ String url = e.attr("href");
+ String name = e.text();
+ classes.add(new Class(url, name));
+ }
+
+ return Result.string(classes, parseVodListFromDoc(doc));
+ }
+
+ private List parseVodListFromDoc(Document doc) {
+ List list = new ArrayList<>();
+ Elements elements = doc.select(" article.excerpt");
+ for (Element e : elements) {
+ String vodId = e.selectFirst(" a").attr("href");
+ String vodPic = e.selectFirst(" img").attr("data-src");
+ if (!vodPic.startsWith("http")) {
+ vodPic = siteUrl + vodPic;
+ }
+ String vodName = e.selectFirst(" header > h2 > a").text();
+ String vodRemarks = "";
+ list.add(new Vod(vodId, vodName, vodPic, vodRemarks));
+ }
+ return list;
+ }
+
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) {
+
+ Document doc = Jsoup.parse(OkHttp.string(String.format("%s/page/%s", tid, pg), getHeader()));
+ List list = parseVodListFromDoc(doc);
+ int total = (Integer.parseInt(pg) + 1) * 20;
+ return Result.get().vod(list).page(Integer.parseInt(pg), Integer.parseInt(pg) + 1, 20, total).string();
+ }
+
+
+ @Override
+ public String detailContent(List ids) throws Exception {
+ String vodId = ids.get(0);
+ Document doc = Jsoup.parse(OkHttp.string(vodId, getHeader()));
+
+ Vod item = new Vod();
+ item.setVodId(vodId);
+ item.setVodName(doc.selectFirst(" h1.article-title > a").text());
+ item.setVodPic(doc.selectFirst(" img").attr("src"));
+ item.setVodArea(getStrByRegex(Pattern.compile("导演:(.*?)
剧情简介\n(.*?)
"), doc.html()).replace("", ""));
+
+ List shareLinks = new ArrayList<>();
+ List tags = new ArrayList<>();
+ for (Element element : doc.select("article.article-content p a")) {
+ if (element.attr("href").matches(Util.patternQuark)) {
+ shareLinks.add(element.attr("href").trim());
+ } else if (element.attr("href").contains("tag")) {
+ tags.add(element.attr("href"));
+ }
+ }
+
+ item.setTypeName(String.join(",", tags));
+
+ item.setVodPlayUrl(super.detailContentVodPlayUrl(shareLinks));
+ item.setVodPlayFrom(super.detailContentVodPlayFrom(shareLinks));
+
+ return Result.string(item);
+ }
+
+ private String getStrByRegex(Pattern pattern, String str) {
+ Matcher matcher = pattern.matcher(str);
+ if (matcher.find()) return matcher.group(1).trim();
+ return "";
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) throws Exception {
+ return searchContent(key, "1");
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick, String pg) throws Exception {
+ return searchContent(key, pg);
+ }
+
+ private String searchContent(String key, String pg) {
+ String searchURL = siteUrl + String.format("/?s=%s", URLEncoder.encode(key));
+ String html = OkHttp.string(searchURL, getHeaderWithCookie());
+ Document doc = Jsoup.parse(html);
+
+ return Result.string(parseVodListFromDoc(doc));
+ }
+}
\ No newline at end of file
diff --git a/app/src/test/java/KuaKeBaTest.java b/app/src/test/java/KuaKeBaTest.java
new file mode 100644
index 00000000..6cccd085
--- /dev/null
+++ b/app/src/test/java/KuaKeBaTest.java
@@ -0,0 +1,99 @@
+import android.app.Application;
+import com.github.catvod.server.Server;
+import com.github.catvod.spider.Init;
+import com.github.catvod.spider.KuaKeBa;
+import com.github.catvod.spider.Wogg;
+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 KuaKeBaTest {
+
+ private Application mockContext;
+
+ private KuaKeBa spider;
+
+ @org.junit.Before
+ public void setUp() throws Exception {
+ mockContext = RuntimeEnvironment.application;
+ Init.init(mockContext);
+ spider = new KuaKeBa();
+ Server.get().start();
+ // spider.init(mockContext, "{\"cookie\":\"b-user-id=89ede34e-0efc-e1dd-c997-f16aaa792d0c; _UP_A4A_11_=wb9661c6dfb642f88f73d8e0c7edd398; b-user-id=89ede34e-0efc-e1dd-c997-f16aaa792d0c; ctoken=wla6p3EUOLyn1FSB8IKp1SEW; grey-id=5583e32b-39df-4bf0-f39f-1adf83f604a2; grey-id.sig=p8ReBIMG2BeZu1sYvsuOAZxYbx-MVrsfKEiCv87MsTM; isQuark=true; isQuark.sig=hUgqObykqFom5Y09bll94T1sS9abT1X-4Df_lzgl8nM; _UP_F7E_8D_=ZkyvVHnrBLp1A1NFJIjWi0PwKLOVbxJPcg0RzQPI6KmBtV6ZMgPh38l93pgubgHDQqhaZ2Sfc0qv%2BRantbfg1mWGAUpRMP4RqXP78Wvu%2FCfvkWWGc5NhCTV71tGOIGgDBR3%2Bu6%2Fjj44KlE5biSNDOWW7Bigcz27lvOTidzNw8s%2FWtKAIxWbnCzZn4%2FJMBUub1SIMcW89g57k4mfPmDlCgpZKzxwl6beSfdtZ4RUWXmZOn5v5NkxVKhU4wR0Pq7NklczEGdRq2nIAcu7v22Uw2o%2FxMY0xBdeC9Korm5%2FNHnxl6K%2Bd6FXSoT9a3XIMQO359auZPiZWzrNlZe%2BqnOahXcx7KAhQIRqSOapSmL4ygJor4r5isJhRuDoXy7vJAVuH%2FRDtEJJ8rZTq0BdC23Bz%2B0MrsdgbK%2BiW; _UP_D_=pc; __wpkreporterwid_=3d3f74a7-99b7-4916-3f78-911fc2eb9d87; tfstk=fIoZNxjnbhKwPOu0TWZ4LsaRqirTcudSSmNbnxD0C5VgClMm8xMyB-GsnSu4tjpOflAOmSD-9PNiGl120XrgkVNb1SrqHbJBN3tSBAEYoQOWVUUg9qZ8n1bGGkD3CqGYINKSBABhjnXgp3_Vywz6gSc0Syj3BWf0mr2DLW24eZfiiovEKWefj1q0swq3E82iNEMinMy7SLrcpA4Fh3z_ZAViCfih3PbtdW5N_DuU77AaTijmYRkL2Wq54ENoy5a7ZXxCbok33XzS7QSZgxD-oyoVsdGotql0p2dVu7umC4nLStbiLmParc4FELHrI-c0u2dPVRrs8zoZWKCnIbNZrlHfUCMUz2z8KyXVSlgSFmUojh58OzeqTzgwaGll4YCYKwctDV5coP2LL79eKHxpNTXHmre1kZU32JPWCR_AkP2LL79eLZQY-WeUNdw1.; __pus=2051c82285199d8be553be41dd5a2100AAQ+mmv35G4FDDZ5x+3Mhe2OMbNgweQ1ODbW8zDt9YuP1LQVqHUuAAz9KWLsPjpNtim0AVGHusN4MCosTmbq/khM; __kp=e6604120-6051-11ef-bfe4-c31b6cdd0766; __kps=AATcZArVgS76EPn0FMaV4HEj; __ktd=sii/iz4ePzEaoVirXul7QQ==; __uid=AATcZArVgS76EPn0FMaV4HEj; __itrace_wid=5829b95d-dac1-48d3-bfd5-f60cd9462786; __puus=7da0b96cb710fa1b376934485f977e05AATp/q8/QupT7IiBR1GWqZhxlIRT677smMvoHlLxQA0Lk6CkP0YJBOTl+p9DZgzlMz6w4hPXPgWsokukk8PW7ZfhFfPmv8tKMgLpCGLW+tk57luhNghmSdTeVPkAF59STtyCPBEtiNzNAd/zZJ6qILJDi5ywEBAAAg+gOyWHoLHNUR+QxeHRuQa8g5WWA95J8jebIlrr8rCvI1vjTbtiYktT\",\"token\":\"26fc6787afff43e78b78992e782502f1\"}");
+ spider.init(mockContext, "{\"cookie\":\"ctoken=rldVUeNBAbGyhJdbpC4wEUE-;__pus=75e54cf66f9ea5ed1497838782a90a78AATTBUV9c9w7KXUiHDEl6VdV8Wxki4L9R5kIIjSKQnX1wedJe3s8weva95YKUkRqI1aBY/MA+YBNvaTO0JkXvLp+;__kp=be6b9e10-74f8-11ef-aa08-7d8956cd7603;__kps=AATcZArVgS76EPn0FMaV4HEj;__ktd=sii/iz4ePzEaoVirXul7QQ==;__uid=AATcZArVgS76EPn0FMaV4HEj\"}");
+ // 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("2", "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("/voddetail/86829.html"));
+ System.out.println("detailContent--" + content);
+
+ 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 content = spider.playerContent("quark4K", "81c9aa49887d4b07aba861d7dd76d0ac++0ec2d75805f83bd045434f0d22f71489++4be1d75e17aa++wGlrbmw95nBbzO2rbCcEicZ8f4a+z5aKiuyoLQLA5SQ=", new ArrayList<>());
+ System.out.println("playerContent--" + content);
+ 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 5c354f6f..e02035a4 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 f3e01653..3f5049ec 100644
--- a/jar/custom_spider.jar.md5
+++ b/jar/custom_spider.jar.md5
@@ -1 +1 @@
-8c701767a5109d01ea59c6b4619c334c
+1eb56031ca34a7f44b85e65c86dcc5a8
diff --git a/json/index.json b/json/index.json
index efc64f18..659ccead 100644
--- a/json/index.json
+++ b/json/index.json
@@ -1,5 +1,5 @@
{
- "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;8c701767a5109d01ea59c6b4619c334c",
+ "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;1eb56031ca34a7f44b85e65c86dcc5a8",
"lives": [
{
"name": "直播ipv6",
@@ -52,6 +52,15 @@
"changeable": 1,
"ext": {}
},
+ {
+ "key": "KuaKeBa",
+ "name": "夸克吧",
+ "type": 3,
+ "api": "csp_KuaKeBa",
+ "searchable": 1,
+ "changeable": 1,
+ "ext": {}
+ },
{
"key": "XuanFeng",
"name": "旋风影视",
diff --git a/json/index1.json b/json/index1.json
index e96ff2d5..bfc135a4 100644
--- a/json/index1.json
+++ b/json/index1.json
@@ -1,5 +1,5 @@
{
- "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;8c701767a5109d01ea59c6b4619c334c",
+ "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;1eb56031ca34a7f44b85e65c86dcc5a8",
"lives": [
{
"name": "直播ipv6",
diff --git a/json/index2.json b/json/index2.json
index 646cb1a4..445e2c24 100644
--- a/json/index2.json
+++ b/json/index2.json
@@ -1,5 +1,5 @@
{
- "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;8c701767a5109d01ea59c6b4619c334c",
+ "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;1eb56031ca34a7f44b85e65c86dcc5a8",
"lives": [
{
"name": "直播ipv6",
@@ -52,6 +52,15 @@
"changeable": 1,
"ext":{"cookie":"_UP_A4A_11_=wb965111521e45ffa80410c24a071a54; _UP_D_=pc; tfstk=fXFith4nnRk114LAjWc1TT-OQUXL5hGjqodxDjnVLDoBBchYujR4Drht3GaYxmqYlcPtWc34mknIMcFTB-Y_tuAv6G6_uIcxggIRw_U15jGV2EjCXmnslyoqlSMN9PGjgMEW0dR85uVOAjYmgwcEoqOqgIrqLyoIlq-ZuC738DgqgCJZgH8EuqxZNmAqqSPQTaC3h7bb2rFnSvW87D8jTW0iX0zasIR2zVDi4Poh2svabvzjnSTXixaaFogzbhS-Cry3xVcc9dlz--roR55Jj2wT8znUrEdYrfV3t-kh71znscDo-vYWpf24fSD_IE_78frQF0MNdMg367HmVvxFbyUnbY20XMOqX84UxYFpvQhbA-rqok-G4A9eUc4wG27YtK9jQ2gnVNJioG_mbu_h-wv5CAuIWgQh-K9jQ2gn2wbHFhMZRVIR.; __pus=c81f57897dafcb65d4ecb501bc299199AARcqF72zsatdbsCbiT3qVqsk36caaycoPQW7hz8rbEf+UY7f5aGgH1e90lsONAUwCAW8y27u5A/KXyYqkHCWgjS; __kp=99fa2760-1669-11ef-90cf-8f7a59c3b86e; __kps=AATSt4xuf6r6bqes3LdJvxvy; __ktd=c2e+aLICIvFoeklXXz36VA==; __uid=AATSt4xuf6r6bqes3LdJvxvy; Video-Auth=smob3MOUslklDq2MutANJYZCVo50sLv0GFelx3+cu1nK2fkdL2kvkdpT5yNOhNz0NLTyi5ThWRL47+ztJA4kXQ==; __puus=72f667c533c9a22496f88d2f1bb7ae71AAQ7mrvFw7s9AUPUXvnuGPkcDU3RRTVPdYaYQfsM9Cje2doYXgRZXbImg02EaUaEG+G9ikpo3xubGGdElArOuYvUtJzIXb6yHDnSZbtEUxkwvjfQRNEnDnVwLQ6LL2ORjRaxa9OUfwk/WppWvy6OcDqQtHYkaqB+Poxn5kFs7ZVdAtX7ZQks1czD+g9gAZjsbeBHxHQ1AP5MGc1s3M4RhwZQ","token":"26fc6787afff43e78b78992e782502f1"}
},
+ {
+ "key": "KuaKeBa",
+ "name": "夸克吧",
+ "type": 3,
+ "api": "csp_KuaKeBa",
+ "searchable": 1,
+ "changeable": 1,
+ "ext":{"cookie":"_UP_A4A_11_=wb965111521e45ffa80410c24a071a54; _UP_D_=pc; tfstk=fXFith4nnRk114LAjWc1TT-OQUXL5hGjqodxDjnVLDoBBchYujR4Drht3GaYxmqYlcPtWc34mknIMcFTB-Y_tuAv6G6_uIcxggIRw_U15jGV2EjCXmnslyoqlSMN9PGjgMEW0dR85uVOAjYmgwcEoqOqgIrqLyoIlq-ZuC738DgqgCJZgH8EuqxZNmAqqSPQTaC3h7bb2rFnSvW87D8jTW0iX0zasIR2zVDi4Poh2svabvzjnSTXixaaFogzbhS-Cry3xVcc9dlz--roR55Jj2wT8znUrEdYrfV3t-kh71znscDo-vYWpf24fSD_IE_78frQF0MNdMg367HmVvxFbyUnbY20XMOqX84UxYFpvQhbA-rqok-G4A9eUc4wG27YtK9jQ2gnVNJioG_mbu_h-wv5CAuIWgQh-K9jQ2gn2wbHFhMZRVIR.; __pus=c81f57897dafcb65d4ecb501bc299199AARcqF72zsatdbsCbiT3qVqsk36caaycoPQW7hz8rbEf+UY7f5aGgH1e90lsONAUwCAW8y27u5A/KXyYqkHCWgjS; __kp=99fa2760-1669-11ef-90cf-8f7a59c3b86e; __kps=AATSt4xuf6r6bqes3LdJvxvy; __ktd=c2e+aLICIvFoeklXXz36VA==; __uid=AATSt4xuf6r6bqes3LdJvxvy; Video-Auth=smob3MOUslklDq2MutANJYZCVo50sLv0GFelx3+cu1nK2fkdL2kvkdpT5yNOhNz0NLTyi5ThWRL47+ztJA4kXQ==; __puus=72f667c533c9a22496f88d2f1bb7ae71AAQ7mrvFw7s9AUPUXvnuGPkcDU3RRTVPdYaYQfsM9Cje2doYXgRZXbImg02EaUaEG+G9ikpo3xubGGdElArOuYvUtJzIXb6yHDnSZbtEUxkwvjfQRNEnDnVwLQ6LL2ORjRaxa9OUfwk/WppWvy6OcDqQtHYkaqB+Poxn5kFs7ZVdAtX7ZQks1czD+g9gAZjsbeBHxHQ1AP5MGc1s3M4RhwZQ","token":"26fc6787afff43e78b78992e782502f1"}
+ },
{
"key": "XuanFeng",
"name": "旋风影视",