diff --git a/CHANGELOG.md b/CHANGELOG.md index 75b2854d..cf16babd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ ## [Unreleased] +### 修复 +- 憨憨详情页(按 2026-10-02 真实页面):豆瓣信息一项一行,去掉分隔线、空值项、重复的标题行和「该信息最后更新」提示;MediaInfo 只取原文,不再混进摘要表。已缓存的详情在过期或手动刷新后生效。 + ## [0.3.18] - 2026-10-02 ## [0.3.17] - 2026-10-02 diff --git a/packages/adapters/src/sites/definitions/hhanclub.json b/packages/adapters/src/sites/definitions/hhanclub.json index d9e6e326..61b17a5d 100644 --- a/packages/adapters/src/sites/definitions/hhanclub.json +++ b/packages/adapters/src/sites/definitions/hhanclub.json @@ -264,7 +264,9 @@ }, "page": { "labelSelectors": ["div.font-bold.leading-6", "span.font-bold"], - "fileListPath": "viewfilelist.php?id={id}" + "fileListPath": "viewfilelist.php?id={id}", + "mediaInfo": "#mediainfo-raw", + "descriptionStrip": "div.mt-5, div.flex.flex-row.items-center" } }, "vipLevels": ["贵宾", "VIP"], diff --git a/packages/adapters/src/sites/spider/detail-page.test.ts b/packages/adapters/src/sites/spider/detail-page.test.ts index 26a78b52..05306475 100644 --- a/packages/adapters/src/sites/spider/detail-page.test.ts +++ b/packages/adapters/src/sites/spider/detail-page.test.ts @@ -1,4 +1,9 @@ -import { HHANCLUB_DETAIL_PAGE_2026, HHANCLUB_DETAIL_PAGE_FULL, HHANCLUB_FILELIST_FRAGMENT } from "@umt/testkit"; +import { + HHANCLUB_DETAIL_PAGE_2026, + HHANCLUB_DETAIL_PAGE_FULL, + HHANCLUB_DETAIL_PAGE_REAL_2026, + HHANCLUB_FILELIST_FRAGMENT, +} from "@umt/testkit"; import { describe, expect, it } from "vitest"; import { hhanclubDefinition } from "../definitions/index.ts"; import { looksLikeMediaInfo, pageFromBbcode } from "../detail-text.ts"; @@ -109,6 +114,30 @@ Format : AVC[/quote] }); }); +describe("憨憨真实详情页(2026-10-02 摘录)", () => { + const { detail } = parseDetailPage(HHANCLUB_DETAIL_PAGE_REAL_2026, hhanclubDefinition, "219860", OBSERVED); + const page = detail!.page!; + + it("MediaInfo 只取 #mediainfo-raw 原文,不带摘要表", () => { + expect(page.mediaInfo!.startsWith("General\nComplete name")).toBe(true); + expect(page.mediaInfo).not.toContain("体 积"); + }); + + it("豆瓣块一项一行;去掉分隔线、空值项、标题行与更新提示;链接之间已有逗号不再补分隔", () => { + const t = page.descriptionText!; + expect(t.split("\n").slice(0, 3)).toEqual([ + "片名: 斗罗大陆Ⅱ绝世唐门 年番1", + "别名: 斗罗大陆2,斗罗大陆2:绝世唐门\u200e,斗罗大陆2绝世唐门,绝世唐门动画版", + "年代: 2023", + ]); + expect(t).toContain("\n导演: 沈乐平 Leping Shen\n"); + expect(t).toContain("编剧: 沈乐平 Leping Shen,唐家三少 Wei Zhang"); + expect(t).toContain("主演:\n梁达伟 Dawei Liang / 蒋丽 Li Jiang"); + expect(t).not.toMatch(/-{5,}|标语|该信息最后更新|\(23691\)/); + expect(page.doubanId).toBe("35567787"); + }); +}); + describe("详情页扩展内容(憨憨 2026 真实结构:分节 div,无 #kdescr)", () => { const { kind, detail } = parseDetailPage(HHANCLUB_DETAIL_PAGE_2026, hhanclubDefinition, "91003", OBSERVED); const page = detail!.page!; diff --git a/packages/adapters/src/sites/spider/detail-page.ts b/packages/adapters/src/sites/spider/detail-page.ts index 78aeaa73..17aaf50d 100644 --- a/packages/adapters/src/sites/spider/detail-page.ts +++ b/packages/adapters/src/sites/spider/detail-page.ts @@ -220,16 +220,38 @@ export function extractDetailPage($: CheerioAPI, conf: DetailConf, base: string) } else if (infoBlock) { const c = infoBlock.clone(); c.find("img").remove(); + if (p.descriptionStrip) c.find(p.descriptionStrip).remove(); // 块里的「标签」span 与值之间补上冒号 / 换行,读起来是「片名:xxx」一行一项 + // (换行要用 BR 占位:源码里的换行在 blockText 里按空白处理) + // 站点排版用的分隔线(憨憨是行内 font):换成换行 + c.find("font, span, div") + .filter((_, x) => /^[-=_—]{5,}$/.test($(x).text().trim())) + .replaceWith(BR); c.find(p.labelSelectors?.join(", ") || "span.font-bold").each((_, n) => { const e = $(n); const t = e.text().trim(); + // 空值的项(憨憨「标语:」)整项去掉 + const v = e.next(); + if (v.length && !v.text().trim() && !v.find("img").length) { + (e.parent().children().length === 2 ? e.parent() : e).remove(); + v.remove(); + return; + } if (t && t.length <= 16 && !/[::]$/.test(t)) e.text(`${t}:`); - e.before("\n"); + e.before(BR); + }); + // 并排的演职员链接之间补分隔(之间已有逗号等文字的不补) + c.find("a + a").each((_, n) => { + const prev = n.prev; + if (prev && prev.type === "text" && prev.data.trim()) return; + $(n).before(" / "); }); const t = blockText($, c) + .replace(/[ \t]{2,}/g, " ") .replace(/[ \t]*\n[ \t]*/g, "\n") - .replace(/:\s*\n(?=\S)/g, ":"); + .replace(/\n{3,}/g, "\n\n") + .replace(/:\s*\n(?=\S)/g, ":") + .trim(); if (t) page.descriptionText = t.slice(0, 20_000); } diff --git a/packages/testkit/src/sites/fixtures/definitions/hhanclub.ts b/packages/testkit/src/sites/fixtures/definitions/hhanclub.ts index a4812cb7..d5237a57 100644 --- a/packages/testkit/src/sites/fixtures/definitions/hhanclub.ts +++ b/packages/testkit/src/sites/fixtures/definitions/hhanclub.ts @@ -154,3 +154,10 @@ export const HHANCLUB_FILELIST_FRAGMENT = `
Example.Show.S01E18.2026.2160p.mkv5.04 GB
Example.Show.S01E19.2026.2160p.mkv4.98 GB
`; + +/** + * 2026-10-02 真实详情页(219860)摘录:MediaInfo 一节(#mediainfo-info 摘要 + #mediainfo-raw 原文,原文截前 25 行) + * 与海报、豆瓣两节,原样保留标签结构;页面其余部分(含下载链接 passkey、用户链接)未收录。 + */ +export const HHANCLUB_DETAIL_PAGE_REAL_2026 = + 'HHCLUB :: 种子详情\n
bob 退出
\n
\n
MediaInfo
文件名:斗罗大陆Ⅱ绝世唐门.Soul.Land.2.The.Peerless.Tang.Clan.S01E173.2023.2160p.WEB-DL.H.265.AAC2.0-HHWEB.mp4
体 积: 1.20 GiB
时 长: 21 min 52 s
分辨率: 3 840 pixels x 2 160 pixels
码 率: 7 701 kb/s
帧 率: 30.000 FPS
音 频:
01: AAC LC 2 channels 125 kb/s
\'展开缩进\'海报
\n \'海报\'\n
\n
\n \'展开缩进\'\n\n 豆瓣\n
\n
\n
\n 豆瓣\n 斗罗大陆Ⅱ绝世唐门 年番1\n
2023
\n
电视剧
\n
7.7
\n
(23691)\n
\n
\n
\n
\n \n ------------------------------------------------------------------------------------------------------------------------------------\n \n
\n \n 片名:\n 斗罗大陆Ⅱ绝世唐门 年番1\n \n \n 别名:\n 斗罗大陆2,斗罗大陆2:绝世唐门‎,斗罗大陆2绝世唐门,绝世唐门动画版\n \n \n 年代:\n 2023\n \n \n 片长:\n 20分钟\n \n \n 票数:\n 23691\n \n \n 评分:\n 7.7/10 from 23691 users\n \n \n 对白语言:\n 汉语普通话\n \n \n 国家:\n 中国大陆\n \n \n 类别:\n 动画,奇幻\n \n \n 标语:\n \n \n \n 导演:\n \n 沈乐平 Leping Shen \n \n \n 编剧:\n 沈乐平 Leping Shen,唐家三少 Wei Zhang\n \n
\n \n ------------------------------------------------------------------------------------------------------------------------------------\n \n \n 剧情概要:\n \n \n ------------------------------------------------------------------------------------------------------------------------------------\n \n \n 这里没有魔法,没有斗气,没有武术,却有武魂。唐门创立万年之后的斗罗大陆上,唐门式微。一代天骄横空出世,新一代史莱克七怪能否重振唐门,谱写一曲绝世唐门之歌?百万年魂兽,手握日月摘星辰的死灵圣法神,导致唐门衰落的全新魂导器体系。一切的神奇都将一一展现。唐门暗器能否重振雄风,唐门能否重现辉煌~ \n \n ------------------------------------------------------------------------------------------------------------------------------------\n \n \n 主演:\n \n \n ------------------------------------------------------------------------------------------------------------------------------------\n \n 梁达伟 Dawei Liang蒋丽 Li Jiang
\n 注意:该信息最后更新于2026-10-02 20:13:02,可能已过期,点击\n 这里\n 更新信息\n
\n
\n\n\n\n\n
\n
\n \n
'; diff --git a/scripts/mp-sync/movieclaw-overrides/hhanclub.json b/scripts/mp-sync/movieclaw-overrides/hhanclub.json index c78d18b6..537749f3 100644 --- a/scripts/mp-sync/movieclaw-overrides/hhanclub.json +++ b/scripts/mp-sync/movieclaw-overrides/hhanclub.json @@ -1,5 +1,5 @@ { - "$comment": "HHClub 分类名取自 MovieClaw hhanclub.yaml 注释(导航栏分类表);REQ §4.5 要求综艺/体育/短剧保留原始分类。2026-09-29 真实账号核对:列表标题链接里带站点的新种标记「[新]」(详情页标题没有),用 replace 过滤掉;等级「贵宾」为 VIP;访问默认按低频原则收紧(快照只抓第 1 页、健康检测 6 小时、详情缓存 24 小时、搜索并发 1)。 2026-10-02 真实列表页核对:标签在 torrent-title 里的 span.tag(促销是 promotion-tag,不混入)。", + "$comment": "HHClub 分类名取自 MovieClaw hhanclub.yaml 注释(导航栏分类表);REQ §4.5 要求综艺/体育/短剧保留原始分类。2026-09-29 真实账号核对:列表标题链接里带站点的新种标记「[新]」(详情页标题没有),用 replace 过滤掉;等级「贵宾」为 VIP;访问默认按低频原则收紧(快照只抓第 1 页、健康检测 6 小时、详情缓存 24 小时、搜索并发 1)。 2026-10-02 真实列表页核对:标签在 torrent-title 里的 span.tag(促销是 promotion-tag,不混入)。 2026-10-02 真实详情页核对:MediaInfo 只取 #mediainfo-raw 原文(#mediainfo-info 是摘要);豆瓣块去掉标题行与「该信息最后更新」提示。", "umt": { "categoryNames": { "401": "电影", @@ -30,7 +30,9 @@ "detail": { "page": { "labelSelectors": ["div.font-bold.leading-6", "span.font-bold"], - "fileListPath": "viewfilelist.php?id={id}" + "fileListPath": "viewfilelist.php?id={id}", + "mediaInfo": "#mediainfo-raw", + "descriptionStrip": "div.mt-5, div.flex.flex-row.items-center" } } },