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 @@ -

+ << 上一页      下一页 >>
151 - 200 | ... | 28051 - 28100 | 28101 - 28150 | 28151 - 28164

+ 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); + } }
类型