import { describe, expect, it } from "vitest"; import { normalizeSiteFeedItem } from "./feed-item.ts"; // 标题取自 2026-09-29 憨憨 RSS 真实条目(公开种子名,无凭据) describe("站点 RSS 条目规范化(憨憨)", () => { it("[分类]种子名[副标题][大小] → 分类 / 标题 / 副标题 / 大小", () => { const r = normalizeSiteFeedItem( "hhanclub", "[音乐]Travis - L.A. Times (2024) - WEB-DL - 24bit ALAC-HHWEB[Travis - L.A. Times | ALAC | 苹果音乐 | 现场版专辑][697.64 MB]", ); expect(r).toEqual({ title: "Travis - L.A. Times (2024) - WEB-DL - 24bit ALAC-HHWEB", subtitle: "Travis - L.A. Times | ALAC | 苹果音乐 | 现场版专辑", category: { id: "410", name: "音乐" }, mediaType: "music", sizeBytes: Math.round(697.64 * 1024 ** 2), uploader: null, }); }); it("电视剧:副标题里的 | 与 / 保留,GB 换算", () => { const r = normalizeSiteFeedItem( "hhanclub", "[电视剧]Spring of the Blade S01 2026 2160p YK WEB-DL H.265 DV HFR HQ AAC2.0-HHWEB[一瓯春 | 第20-24集 | 4K 高码 杜比视界 | 类型: 爱情/古装][26.37 GB]", ); expect(r.title).toBe("Spring of the Blade S01 2026 2160p YK WEB-DL H.265 DV HFR HQ AAC2.0-HHWEB"); expect(r.subtitle).toBe("一瓯春 | 第20-24集 | 4K 高码 杜比视界 | 类型: 爱情/古装"); expect(r.category).toEqual({ id: "402", name: "电视剧" }); expect(r.mediaType).toBe("tv"); expect(r.sizeBytes).toBe(Math.round(26.37 * 1024 ** 3)); }); it("副标题内嵌方括号、[新] 标记、不在任何媒体大类的分类(纪录片)", () => { const r = normalizeSiteFeedItem( "hhanclub", "[纪录片]Thirteen Talks S09 2016 2160p WEB-DL H.265 AAC2.0-HHWEB[新][十三邀 | 第14集 [内嵌中字]][3.6 GB]", ); expect(r.title).toBe("Thirteen Talks S09 2016 2160p WEB-DL H.265 AAC2.0-HHWEB"); expect(r.subtitle).toBe("十三邀 | 第14集 [内嵌中字]"); expect(r.category).toEqual({ id: "404", name: "纪录片" }); expect(r.mediaType).toBeNull(); }); it("带上传者段:[副标题][大小][上传者]", () => { const r = normalizeSiteFeedItem("hhanclub", "[电影]Some Movie 2024 1080p WEB-DL-HHWEB[某电影][8.5 GB][uploader01]"); expect(r).toMatchObject({ title: "Some Movie 2024 1080p WEB-DL-HHWEB", subtitle: "某电影", uploader: "uploader01", }); }); it("没有大小段时不拆尾部方括号;未登记的前缀不当分类", () => { const r = normalizeSiteFeedItem("hhanclub", "[BDMV]Some.Disc.2024[Extras]"); expect(r).toMatchObject({ title: "[BDMV]Some.Disc.2024[Extras]", subtitle: null, sizeBytes: null }); expect(r.category).toEqual({ id: null, name: null }); }); it("未知站点只去 [新]", () => { const r = normalizeSiteFeedItem(null, "[电影]Foo 2024[新][foo][1 GB]"); expect(r.category.id).toBeNull(); expect(r.title).toBe("[电影]Foo 2024"); expect(r.subtitle).toBe("foo"); }); });