From 0ef8080dd864b4e65003371f3cd3289a44359d0f Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Mon, 6 Jul 2026 08:58:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20parseMetadata=E6=96=B9=E6=B3=95(?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E2=86=92=E8=AF=A6=E6=83=85=E2=86=92=E6=8F=90?= =?UTF-8?q?=E5=8F=96=E8=B1=86=E7=93=A3=E9=93=BE=E6=8E=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/nexusphp-default.groovy | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/nexusphp-default.groovy b/docs/nexusphp-default.groovy index 3dc9ba5..e5a57e8 100644 --- a/docs/nexusphp-default.groovy +++ b/docs/nexusphp-default.groovy @@ -22,6 +22,38 @@ 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) } +/** 获取资源元数据:搜索 → 详情 → 提取豆瓣链接(Douban 解析由 Java 层负责) */ +Map parseMetadata(context) { + if (context.status != 200) return [matched: false, error: true] + + // 1. 搜索 + String title = context.params?.title ?: '' + def searchResp = context.fetch("search", [keyword: title]) + if (searchResp.status != 200) return [matched: false, message: '搜索失败'] + def searchItems = parseSearchPage(Jsoup.parse(searchResp.content)).items + if (!searchItems || searchItems.isEmpty()) return [matched: false, message: '未搜到'] + + // 2. 取第一个结果 → 访问详情 + def first = searchItems[0] + def detailResp = context.fetch("detail", [id: first.detailUrl]) + if (detailResp.status != 200) return [matched: false, message: '详情页访问失败'] + + // 3. 提取豆瓣链接 + def detailDoc = Jsoup.parse(detailResp.content) + def dbLink = detailDoc.selectFirst('a[href*=movie.douban.com], a[href*=douban.com/subject]')?.attr('href') + // 也尝试种子的描述区域 + if (!dbLink) dbLink = detailDoc.selectFirst('.rowhead:contains(简介) + td a[href*=douban], #kdescr a[href*=douban]')?.attr('href') + if (!dbLink) { + // 从页面文本中正则提取 + def m = detailResp.content =~ /https?:\/\/(?:movie|www)\.douban\.com\/subject\/(\d+)\/?/ + if (m) dbLink = m[0][0] + } + + return dbLink + ? [matched: true, doubanUrl: dbLink, title: first.title, seedTitle: first.title] + : [matched: false, message: '未找到豆瓣链接', seedTitle: first.title] +} + /** 通用状态码检查,非 200 直接返回错误 */ private Map checkStatus(context) { if (context.status == 200) return null