From f6cedc1a3700b2d1c47123100d530311eb4e7484 Mon Sep 17 00:00:00 2001
From: dengqn <434500374@qq.com>
Date: Fri, 26 Sep 2025 10:56:18 +0800
Subject: [PATCH] aaaaaaaaa
---
.../com/dengqn/app/lingyinapi/apis/Seed.java | 21 +++++--
.../app/lingyinapi/beans/SeedListItem.java | 6 +-
.../dengqn/app/lingyinapi/beans/api/Page.java | 29 ++++++++++
.../dengqn/app/lingyinapi/beans/api/Resp.java | 55 +++++++++++++++++++
.../dengqn/app/lingyinapi/html/HtmlTool.java | 26 +++++++--
.../dengqn/app/lingyinapi/http/HttpTool.java | 1 +
src/main/resources/test-seed-list-page.html | 6 +-
.../app/lingyinapi/http/HttpToolTest.java | 10 +++-
8 files changed, 137 insertions(+), 17 deletions(-)
create mode 100644 src/main/java/com/dengqn/app/lingyinapi/beans/api/Page.java
create mode 100644 src/main/java/com/dengqn/app/lingyinapi/beans/api/Resp.java
diff --git a/src/main/java/com/dengqn/app/lingyinapi/apis/Seed.java b/src/main/java/com/dengqn/app/lingyinapi/apis/Seed.java
index cdf9b1d..706662c 100644
--- a/src/main/java/com/dengqn/app/lingyinapi/apis/Seed.java
+++ b/src/main/java/com/dengqn/app/lingyinapi/apis/Seed.java
@@ -1,6 +1,8 @@
package com.dengqn.app.lingyinapi.apis;
import com.dengqn.app.lingyinapi.beans.SeedListItem;
+import com.dengqn.app.lingyinapi.beans.api.Page;
+import com.dengqn.app.lingyinapi.beans.api.Resp;
import com.dengqn.app.lingyinapi.config.CookieConfig;
import com.dengqn.app.lingyinapi.html.HtmlTool;
import com.dengqn.app.lingyinapi.http.HttpTool;
@@ -40,20 +42,27 @@ public class Seed {
}
@GetMapping("/list")
- public ResponseEntity> getSeedPage(
+ public ResponseEntity>> getSeedPage(
@RequestParam(required = false, defaultValue = "0", name = "inclbookmarked") String inclbookmarked,
@RequestParam(required = false, defaultValue = "1", name = "incldead") String incldead,
@RequestParam(required = false, defaultValue = "0", name = "spstate") String spstate,
- @RequestParam(required = false, defaultValue = "1", name = "page") String page
+ @RequestParam(required = false, defaultValue = "0", name = "page") String page,
+ @RequestParam(required = false, defaultValue = "50", name = "size") String size,
+ @RequestParam(required = false, defaultValue = "", name = "search") String search
) throws IOException {
-
- String url = "https://pt.soulvoice.club/special.php?inclbookmarked=%s&incldead=%s&spstate=%s&page=%s"
- .formatted(inclbookmarked, incldead, spstate, page);
+ String url = "https://pt.soulvoice.club/special.php?inclbookmarked=%s&incldead=%s&spstate=%s&page=%s&search=%s"
+ .formatted(inclbookmarked, incldead, spstate, page, search);
String html = HttpTool.getHTML(url, okHttpClient);
log.info("html:{}", html);
Document doc = Jsoup.parse(html);
List listItem = HtmlTool.getSeedListItem(doc);
- return ResponseEntity.ok(listItem);
+ return ResponseEntity.ok(
+ Resp.ok(Page.builder()
+ .page(Integer.valueOf(page))
+ .size(Integer.valueOf(size))
+ .total(HtmlTool.getPageTotal(doc))
+ .list(listItem)
+ .build()));
}
diff --git a/src/main/java/com/dengqn/app/lingyinapi/beans/SeedListItem.java b/src/main/java/com/dengqn/app/lingyinapi/beans/SeedListItem.java
index 383ce8f..c7d187b 100644
--- a/src/main/java/com/dengqn/app/lingyinapi/beans/SeedListItem.java
+++ b/src/main/java/com/dengqn/app/lingyinapi/beans/SeedListItem.java
@@ -5,7 +5,11 @@ package com.dengqn.app.lingyinapi.beans;
* @author dengqn
* @since 2025/9/25 18:22
*/
-public record SeedListItem(String seedCover, String seedName, String seedUrl, boolean isFree, boolean isHitAndRun,
+public record SeedListItem(String seedCover,
+ String seedName,
+ String seedUrl,
+ String seedDesc,
+ boolean isFree, boolean isHitAndRun,
String downloadUrl, String time, String size, String seeders, String views,
boolean isAnonymous) {
}
diff --git a/src/main/java/com/dengqn/app/lingyinapi/beans/api/Page.java b/src/main/java/com/dengqn/app/lingyinapi/beans/api/Page.java
new file mode 100644
index 0000000..b5b6860
--- /dev/null
+++ b/src/main/java/com/dengqn/app/lingyinapi/beans/api/Page.java
@@ -0,0 +1,29 @@
+package com.dengqn.app.lingyinapi.beans.api;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 分页
+ *
+ * @author dengqn
+ * @since 2025/9/26 10:28
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Data
+public class Page implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 7287992347791111742L;
+ private Integer page;
+ private Integer size;
+ private Integer total;
+ private List list;
+}
diff --git a/src/main/java/com/dengqn/app/lingyinapi/beans/api/Resp.java b/src/main/java/com/dengqn/app/lingyinapi/beans/api/Resp.java
new file mode 100644
index 0000000..15f6f97
--- /dev/null
+++ b/src/main/java/com/dengqn/app/lingyinapi/beans/api/Resp.java
@@ -0,0 +1,55 @@
+package com.dengqn.app.lingyinapi.beans.api;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ *
+ * @author dengqn
+ * @since 2025/9/26 10:19
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class Resp implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 3854320483518994111L;
+
+ private Integer code;
+
+ private String msg;
+
+ private T data;
+
+ public static Resp ok(T data) {
+ return ok("ok", data);
+ }
+
+ public static Resp ok(String msg, T data) {
+ return Resp.builder()
+ .code(10000)
+ .msg(msg)
+ .data(data)
+ .build();
+ }
+
+ public static Resp error(String msg) {
+ return Resp.builder()
+ .code(10001)
+ .msg(msg)
+ .build();
+ }
+
+ public static Resp error(Integer code, String msg) {
+ return Resp.builder()
+ .code(code)
+ .msg(msg)
+ .build();
+ }
+}
diff --git a/src/main/java/com/dengqn/app/lingyinapi/html/HtmlTool.java b/src/main/java/com/dengqn/app/lingyinapi/html/HtmlTool.java
index fe02349..0d8d382 100644
--- a/src/main/java/com/dengqn/app/lingyinapi/html/HtmlTool.java
+++ b/src/main/java/com/dengqn/app/lingyinapi/html/HtmlTool.java
@@ -18,17 +18,15 @@ import java.util.Objects;
@Slf4j
public class HtmlTool {
public static List getSeedListItem(Document doc) {
- List items = new ArrayList<>();
-
Element torrents;
try {
torrents = doc.getElementsByClass("torrents").getFirst();
} catch (Exception e) {
- e.printStackTrace();
+ log.info("搜不到东西:{}", e.getMessage());
return new ArrayList<>();
}
- return torrents.select("tr").stream().skip(1)
+ return torrents.select("tr").parallelStream().skip(1)
.map(tr -> {
try {
/**
@@ -39,6 +37,7 @@ public class HtmlTool {
String seedCover = seedNames.get(0).getElementsByTag("img").first().attr("data-src");
String seedName = seedNames.get(1).getElementsByTag("a").first().attr("title");
String seedUrl = seedNames.get(1).getElementsByTag("a").first().attr("href");
+ String seedDesc = seedNames.text().replaceFirst(seedName, "");
boolean isFree = seedNames.get(1).getElementsByClass("pro_free").size() > 0;
boolean isHitAndRun = seedNames.get(1).getElementsByClass("hitandrun").size() > 0;
String downloadUrl = seedNames.get(3).getElementsByTag("a").first().attr("href");
@@ -54,12 +53,27 @@ public class HtmlTool {
String views = tds.get(7).getElementsByTag("b") == null || tds.get(7).getElementsByTag("b").size() == 0 ? "0" : tds.get(7).getElementsByTag("b").first().text().trim();
boolean isAnonymous = tds.get(8).text().trim().contains("匿名");
-
- return new SeedListItem(seedCover, seedName, seedUrl, isFree, isHitAndRun, downloadUrl, time, size, seeders, views, isAnonymous);
+ return new SeedListItem(seedCover, seedName, seedUrl, seedDesc, isFree, isHitAndRun, downloadUrl, time, size, seeders, views, isAnonymous);
} catch (Exception e) {
log.error("解析报错跳过:" + e.getMessage());
return null;
}
}).filter(Objects::nonNull).toList();
}
+
+ public static Integer getPageTotal(Document document) {
+ Elements paginationEl = document.getElementsByClass("nexus-pagination");
+ if (paginationEl == null) return 0;
+
+ Elements pages = paginationEl.first().getElementsByTag("a");
+ if (pages == null || pages.size() == 0) return 0;
+
+ Element lastA = pages.last();
+ String text = lastA.text();
+ if ("".equalsIgnoreCase(text.trim())) return 0;
+ return Integer.valueOf(text.trim()
+ .replaceAll("\"", "")
+ .replaceAll(" ", "")
+ .split("-")[1]);
+ }
}
diff --git a/src/main/java/com/dengqn/app/lingyinapi/http/HttpTool.java b/src/main/java/com/dengqn/app/lingyinapi/http/HttpTool.java
index 24f5a5f..2757c49 100644
--- a/src/main/java/com/dengqn/app/lingyinapi/http/HttpTool.java
+++ b/src/main/java/com/dengqn/app/lingyinapi/http/HttpTool.java
@@ -20,6 +20,7 @@ public class HttpTool {
try {
Response response = okHttpClient.newCall(new Request.Builder()
.url(url)
+ .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36")
.method("GET", null)
.build())
.execute();
diff --git a/src/main/resources/test-seed-list-page.html b/src/main/resources/test-seed-list-page.html
index a827053..4e9b41c 100644
--- a/src/main/resources/test-seed-list-page.html
+++ b/src/main/resources/test-seed-list-page.html
@@ -580,7 +580,8 @@
-
+ href="?inclbookmarked=0&incldead=1&spstate=0&page=563">28151 - 28164
+
类型 |
diff --git a/src/test/java/com/dengqn/app/lingyinapi/http/HttpToolTest.java b/src/test/java/com/dengqn/app/lingyinapi/http/HttpToolTest.java
index 8f5207d..0a8556c 100644
--- a/src/test/java/com/dengqn/app/lingyinapi/http/HttpToolTest.java
+++ b/src/test/java/com/dengqn/app/lingyinapi/http/HttpToolTest.java
@@ -17,13 +17,19 @@ import java.util.List;
public class HttpToolTest {
@Test
- public void testGetHtml() throws IOException {
+ public void testGetSeedList() throws IOException {
String htmlData = new String(this.getClass().getResourceAsStream("/test-seed-list-page.html").readAllBytes());
-// log.info("htmlData: {}", htmlData);
Document parse = Jsoup.parse(htmlData);
List listItem = HtmlTool.getSeedListItem(parse);
for (SeedListItem seedListItem : listItem) {
log.info("item-->{}", seedListItem);
}
}
+
+ @Test
+ public void testGetSeedTotal() throws IOException {
+ String htmlData = new String(this.getClass().getResourceAsStream("/test-seed-list-page.html").readAllBytes());
+ Document parse = Jsoup.parse(htmlData);
+ Integer pageTotal = HtmlTool.getPageTotal(parse);
+ }
}