feat: parseMetadata方法(搜索→详情→提取豆瓣链接)

This commit is contained in:
mediabot-pt
2026-07-06 08:58:47 +08:00
parent b4291dd357
commit 0ef8080dd8

View File

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