From d300dd25d3bcb1032315d35d919e5327cba9230f Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:23:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=90=9C=E7=B4=A2=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=99=A8=E5=8E=BB=E6=8E=89tbody=E8=A6=81=E6=B1=82+=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E5=8C=B9=E9=85=8D=E6=9B=BF=E4=BB=A3=E5=88=97=E7=B4=A2?= =?UTF-8?q?=E5=BC=95=EF=BC=8C=E5=85=BC=E5=AE=B9PTTIME?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/scripts/default-nexusphp.groovy | 61 +++++++++++++------ 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/par-core/src/main/resources/scripts/default-nexusphp.groovy b/par-core/src/main/resources/scripts/default-nexusphp.groovy index 036d001..4d5f870 100644 --- a/par-core/src/main/resources/scripts/default-nexusphp.groovy +++ b/par-core/src/main/resources/scripts/default-nexusphp.groovy @@ -39,21 +39,36 @@ private Map parseUserInfo(doc) { private Map parseSearch(doc) { def rows = [] - doc.select('table.torrents > tbody > tr:has(td.rowfollow):not(:has(th)):not(:has(.colhead))').each { row -> + // 兼容有/无 tbody 的 NexusPHP 变体 + doc.select('table.torrents tr:has(td.rowfollow):not(:has(.colhead))').each { row -> def titleEl = utils.selectFirst(row, 'td.embedded a[href*=details]') - def catEl = utils.selectFirst(row, 'td.rowfollow a[href*=cat] img, td.rowfollow a[href*=torrents] img') - def freeEl = utils.selectFirst(row, 'td.rowfollow font.free') + if (!titleEl) return + def catEl = utils.selectFirst(row, 'td.rowfollow a[href*=cat] img, td.rowfollow a[href*=torrents] img, span.category') + def freeEl = utils.selectFirst(row, 'font.promotion') def tds = row.select('td.rowfollow') + // 按列索引查找:size(含br)、seeders、leechers、completed、time + def size = '', seeders = '', leechers = '', completed = '', time = '', publisher = '' + for (int i = 0; i < tds.size(); i++) { + def t = utils.text(tds.get(i)) + if (!t) continue + if (t.contains('GB') || t.contains('MB') || t.contains('TB') || t.contains('KB')) size = t + else if (t ==~ /^\d+$/ && !seeders) { seeders = t } + else if (t ==~ /^\d+$/ && seeders) { leechers = t } + else if (t ==~ /^\d+$/ && seeders && leechers) { completed = t } + else if (t ==~ /^\d+年|^\d+月|^\d+天|^\d+时/) time = t + else if (seeders && !leechers) publisher = t + } rows << [ - title: utils.text(titleEl), - detailUrl: utils.attr(titleEl, 'href'), - category: utils.attr(catEl, 'alt'), - free: utils.text(freeEl), - size: tds.size() > 4 ? utils.text(tds.get(4)) : '', - seeders: utils.text(tds.size() > 5 ? tds.get(5) : null), - leechers: utils.text(tds.size() > 6 ? tds.get(6) : null), - completed: utils.text(tds.size() > 7 ? tds.get(7) : null), - publishDate:utils.text(tds.size() > 3 ? tds.get(3) : null), + title: utils.text(titleEl), + detailUrl: utils.attr(titleEl, 'href'), + category: utils.attr(catEl, 'alt') ?: utils.attr(catEl, 'title') ?: '', + free: utils.text(freeEl), + size: size, + seeders: seeders, + leechers: leechers, + completed: completed, + publishDate: time, + publisher: publisher, ] } return [pageName: '搜索', extracted: rows, message: "共 ${rows.size()} 条"] @@ -126,17 +141,27 @@ List search(PluginContext ctx, Map params) { def conn = ctx.httpGet("/torrents.php?search=${URLEncoder.encode(keyword,'UTF-8')}&page=${page}") def doc = jsoup.parse(conn.body()) def rows = [] - doc.select('table.torrents > tbody > tr:has(td.rowfollow):not(:has(th)):not(:has(.colhead))').each { row -> + doc.select('table.torrents tr:has(td.rowfollow):not(:has(.colhead))').each { row -> def titleEl = utils.selectFirst(row, 'td.embedded a[href*=details]') + if (!titleEl) return def tds = row.select('td.rowfollow') + def size = 0, seeders = 0, leechers = 0, grabs = 0 + boolean hasSize = false, hasSeed = false, hasLeech = false + for (int i = 0; i < tds.size(); i++) { + def t = utils.text(tds.get(i)) + if (!t) continue + if (!hasSize && (t.contains('GB')||t.contains('MB')||t.contains('TB')||t.contains('KB'))) {size=parseHtmlSize(t);hasSize=true} + else if (hasSize && !hasSeed && t ==~ /^\d+$/) {seeders=t as int;hasSeed=true} + else if (hasSeed && !hasLeech && t ==~ /^\d+$/) {leechers=t as int;hasLeech=true} + else if (hasSeed && hasLeech && t ==~ /^\d+$/) {grabs=t as int} + } rows << [ title: utils.text(titleEl), detailUrl: "${ctx.siteUrl}${utils.attr(titleEl,'href')}", - size: tds.size() > 4 ? parseHtmlSize(utils.text(tds.get(4))) : 0, - seeders: tds.size() > 5 ? utils.toInt(utils.text(tds.get(5))) ?: 0 : 0, - leechers: tds.size() > 6 ? utils.toInt(utils.text(tds.get(6))) ?: 0 : 0, - grabs: tds.size() > 7 ? utils.toInt(utils.text(tds.get(7))) ?: 0 : 0, - publishDate: tds.size() > 3 ? utils.text(tds.get(3)) : '', + size: size, + seeders: seeders, + leechers: leechers, + grabs: grabs, ] } return rows