fix: 搜索选择器去掉tbody要求+内容匹配替代列索引,兼容PTTIME

This commit is contained in:
mediabot-pt
2026-07-01 22:23:55 +08:00
parent 1ab21024dd
commit d300dd25d3

View File

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