diff --git a/docs/nexusphp-default.groovy b/docs/nexusphp-default.groovy index 4c1536f..7ec699e 100644 --- a/docs/nexusphp-default.groovy +++ b/docs/nexusphp-default.groovy @@ -157,10 +157,39 @@ private Map parseDownloadPage(context) { // ==================== RSS ==================== -/** RSS 页面解析:默认不做 XML 解析,由 Java 层 parseRssXml 处理。 - * 站点如需要自定义 RSS 解析,可覆盖此方法返回 items 列表。 */ +/** RSS 页面解析:解析 NexusPHP 标准 RSS XML,返回 items 列表 */ private Map parseRssPage(context) { - return [pageName: 'RSS', matched: true, message: 'RSS 内容由 Java 层解析'] + def xml = context.content + if (!xml) return [pageName: 'RSS', matched: false, message: '无内容'] + + // 解析 RSS XML + def rss = new XmlSlurper().parseText(xml) + def items = [] + rss.channel.item.each { item -> + // 下载链接优先从 enclosure url 获取 + def dlUrl = '' + def size = 0 + def enclosure = item.enclosure + if (enclosure && enclosure.@url) { + dlUrl = enclosure.@url.text() + try { size = enclosure.@length.toLong() } catch (e) {} + } + if (!dlUrl) dlUrl = item.link.text() + + def title = item.title.text() + + items << [ + title: title, + detailUrl: item.link.text(), + downloadUrl: dlUrl, + torrentUrl: dlUrl, + size: size, + publishDate: item.pubDate.text(), + category: item.category.text(), + author: item.author.text(), + ] + } + return [pageName: 'RSS', matched: !items.isEmpty(), items: items] } // ==================== 工具方法 ==================== diff --git a/par-core/src/main/resources/scripts/default-gazelle.groovy b/par-core/src/main/resources/scripts/default-gazelle.groovy index f3d821b..792e7d9 100644 --- a/par-core/src/main/resources/scripts/default-gazelle.groovy +++ b/par-core/src/main/resources/scripts/default-gazelle.groovy @@ -8,13 +8,13 @@ Map parse(String content, String url) { if (url.contains('/torrents.php')) return parseSearch(doc) if (url.contains('/torrents.php?id=')) return parseDetail(doc) if (url.contains('/index.php') && !url.contains('?')) return parseUserInfo(doc) - if (url.contains('/torrentrss.php') || url.contains('/rss')) return parseRss() + if (url.contains('/torrentrss.php') || url.contains('/rss')) return parseRss(content) return [pageName: '未知页面', message: "未配置: ${url}"] } -private Map parseRss() { - return [pageName: 'RSS', message: 'RSS 内容由 Java 层解析'] +private Map parseRss(String xml) { + return [pageName: 'RSS', matched: true, message: 'RSS 内容由 Java 层解析'] } private Map parseUserInfo(doc) { diff --git a/par-core/src/main/resources/scripts/default-mtorrent.groovy b/par-core/src/main/resources/scripts/default-mtorrent.groovy index e53b0e8..b13bad4 100644 --- a/par-core/src/main/resources/scripts/default-mtorrent.groovy +++ b/par-core/src/main/resources/scripts/default-mtorrent.groovy @@ -12,13 +12,13 @@ Map parse(String content, String url) { if (url.contains('/api/member/profile')) return parseProfile(root?.data) if (url.contains('/api/tracker/myPeerStatistics')) return parsePeerStats(root?.data) if (url.contains('/api/torrent/search')) return parseSearch(root?.data?.data ?: []) - if (url.contains('/torrentrss.php') || url.contains('/rss')) return parseRss() + if (url.contains('/torrentrss.php') || url.contains('/rss')) return parseRss(content) return [pageName: '未知接口', message: "未配置: ${url}"] } -private Map parseRss() { - return [pageName: 'RSS', message: 'RSS 内容由 Java 层解析'] +private Map parseRss(String xml) { + return [pageName: 'RSS', matched: true, message: 'RSS 内容由 Java 层解析'] } private Map parseProfile(d) { diff --git a/par-core/src/main/resources/scripts/default-nexusphp.groovy b/par-core/src/main/resources/scripts/default-nexusphp.groovy index 3470dc7..2c4a9bb 100644 --- a/par-core/src/main/resources/scripts/default-nexusphp.groovy +++ b/par-core/src/main/resources/scripts/default-nexusphp.groovy @@ -9,13 +9,40 @@ Map parse(String content, String url) { if (url.contains('/attendance.php')) return parseSign(doc) if (url.contains('/index.php') && !url.contains('?')) return parseUserInfo(doc) if (url.contains('/usercp.php')) return parseUserPanel(doc) - if (url.contains('/torrentrss.php') || url.contains('/rss')) return parseRss(doc) + if (url.contains('/torrentrss.php') || url.contains('/rss')) return parseRss(content) return [pageName: '未知页面', message: "未配置: ${url}"] } -private Map parseRss(doc) { - return [pageName: 'RSS', message: 'RSS 内容由 Java 层解析'] +private Map parseRss(String xml) { + if (!xml) return [pageName: 'RSS', matched: false, message: '无内容'] + try { + def rss = new XmlSlurper().parseText(xml) + def items = [] + rss.channel.item.each { item -> + def dlUrl = '' + long size = 0 + def enclosure = item.enclosure + if (enclosure && enclosure.@url) { + dlUrl = enclosure.@url.text() + try { size = enclosure.@length.toLong() } catch (e) {} + } + if (!dlUrl) dlUrl = item.link.text() + items << [ + title: item.title.text(), + detailUrl: item.link.text(), + downloadUrl: dlUrl, + torrentUrl: dlUrl, + size: size, + publishDate: item.pubDate.text(), + category: item.category.text(), + author: item.author.text(), + ] + } + return [pageName: 'RSS', matched: !items.isEmpty(), items: items] + } catch (e) { + return [pageName: 'RSS', matched: false, message: "解析失败: ${e.message}"] + } } private Map parseUserInfo(doc) { diff --git a/par-core/src/main/resources/scripts/default-unit3d.groovy b/par-core/src/main/resources/scripts/default-unit3d.groovy index 4abf392..092c6ec 100644 --- a/par-core/src/main/resources/scripts/default-unit3d.groovy +++ b/par-core/src/main/resources/scripts/default-unit3d.groovy @@ -16,13 +16,13 @@ Map parse(String content, String url) { } catch (e) {} } - if (url.contains('/torrentrss.php') || url.contains('/rss')) return parseRss() + if (url.contains('/torrentrss.php') || url.contains('/rss')) return parseRss(content) return [pageName: '未知页面', message: "未配置: ${url}"] } -private Map parseRss() { - return [pageName: 'RSS', message: 'RSS 内容由 Java 层解析'] +private Map parseRss(String xml) { + return [pageName: 'RSS', matched: true, message: 'RSS 内容由 Java 层解析'] } private Map parseApiData(d, url) {