diff --git a/docs/nexusphp-default.groovy b/docs/nexusphp-default.groovy index 7ec699e..3c4331e 100644 --- a/docs/nexusphp-default.groovy +++ b/docs/nexusphp-default.groovy @@ -22,6 +22,7 @@ Map parseSearch(context) { return checkStatus(context) ?: parseSearchPage(Jsoup Map parseSignIn(context) { return checkStatus(context) ?: parseSignPage(Jsoup.parse(context.content)) } Map parseDownload(context) { return checkStatus(context) ?: parseDownloadPage(context) } Map parseRss(context) { return checkStatus(context) ?: parseRssPage(context) } +Map parseDetail(context) { return checkStatus(context) ?: parseDetailPage(Jsoup.parse(context.content)) } /** 获取资源元数据:搜索 → 详情 → 提取豆瓣链接(Douban 解析由 Java 层负责) */ Map parseMetadata(context) { @@ -127,10 +128,18 @@ private Map parseDetailPage(doc) { // 提取下载链接 def dlUrl = doc.selectFirst('a[href*=download]:not([href*=details])')?.attr('href') + // 提取促销信息:font.promotion、img.promotion、alt 属性等 + def freeEl = doc.selectFirst('font.promotion, img.promotion, img[alt*=Free], img[alt*=free]') + def free = freeEl?.text() ?: freeEl?.attr('alt') + + // 提取豆瓣链接 + def dbLink = doc.selectFirst('a[href*=movie.douban.com], a[href*=douban.com/subject]')?.attr('href') + if (!dbLink) dbLink = doc.selectFirst('.rowhead:contains(简介) + td a[href*=douban], #kdescr a[href*=douban]')?.attr('href') + return [pageName: '种子详情', matched: title != null, title: title, subtitle: subtitle, size: parseSize(size), seeders: seeders as int, leechers: leechers as int, - downloadUrl: dlUrl + downloadUrl: dlUrl, free: free, doubanUrl: dbLink ] } diff --git a/par-core/src/main/resources/scripts/default-gazelle.groovy b/par-core/src/main/resources/scripts/default-gazelle.groovy index 792e7d9..97ca109 100644 --- a/par-core/src/main/resources/scripts/default-gazelle.groovy +++ b/par-core/src/main/resources/scripts/default-gazelle.groovy @@ -50,7 +50,7 @@ private Map parseSearch(doc) { } private Map parseDetail(doc) { - return [pageName: '种子详情', fields: [ + return [pageName: '种子详情', matched: true, fields: [ title: utils.text(utils.selectFirst(doc, '#content h2, h2.header')), artist: utils.text(utils.selectFirst(doc, '#content h3 a, .artist_name')), format: utils.text(utils.selectFirst(doc, 'td:contains(Format) + td')), diff --git a/par-core/src/main/resources/scripts/default-nexusphp.groovy b/par-core/src/main/resources/scripts/default-nexusphp.groovy index 2c4a9bb..a4c54da 100644 --- a/par-core/src/main/resources/scripts/default-nexusphp.groovy +++ b/par-core/src/main/resources/scripts/default-nexusphp.groovy @@ -108,13 +108,14 @@ private Map parseSearch(doc) { } private Map parseDetail(doc) { - return [pageName: '种子详情', fields: [ + def freeEl = doc.selectFirst('font.promotion, img.promotion, img[alt*=Free], img[alt*=free]') + return [pageName: '种子详情', matched: true, fields: [ title: doc.selectFirst('#top h1, h1')?.text(), subtitle: doc.selectFirst('td.embedded b')?.text(), size: doc.selectFirst('td:has(b:contains(大小)) + td, td.rowhead:contains(大小) + td')?.text(), seeders: doc.selectFirst('td:contains(做种者) + td')?.text(), leechers: doc.selectFirst('td:contains(下载者) + td')?.text(), - ]] + ], free: freeEl?.text() ?: freeEl?.attr('alt')] } private Map parseSign(doc) { diff --git a/par-core/src/main/resources/scripts/default-unit3d.groovy b/par-core/src/main/resources/scripts/default-unit3d.groovy index 092c6ec..88cf736 100644 --- a/par-core/src/main/resources/scripts/default-unit3d.groovy +++ b/par-core/src/main/resources/scripts/default-unit3d.groovy @@ -54,13 +54,14 @@ private Map parseSearch(doc) { } private Map parseDetail(doc) { - return [pageName: '种子详情', fields: [ + def freeEl = doc.selectFirst('.text-success:contains(FREE), .freeleech, .double-upload') + return [pageName: '种子详情', matched: true, fields: [ title: utils.text(utils.selectFirst(doc, 'h1, .torrent-title, .meta-title')), size: utils.text(utils.selectFirst(doc, 'td:contains(Size) + td, .torrent-size')), seeders: utils.text(utils.selectFirst(doc, 'td:contains(Seeders) + td, .seeders-count')), leechers: utils.text(utils.selectFirst(doc, 'td:contains(Leechers) + td, .leechers-count')), description:utils.text(utils.selectFirst(doc, '.torrent-description, #description')).take(200), - ]] + ], free: freeEl?.text()] } Map sync(PluginContext ctx) {