feat(search): 筛选选项只列结果里有的值,季集合并成一个维度放最前

对照 MP useTorrentFilter:分面选项按实际结果生成,计数为 0 的不再列出(已选的值仍列出,可删除);
新增季集维度 seasonEpisode(MP season_episode 写法 `S01` / `S01-S02` / `S02 E14` / `S01 E25-E48`),
整季在前、单集在后、季号新的在前,在筛选条最前。旧的季 / 集维度保留(旧链接仍生效,以标签列出)。
搜索结果页与站点资源 Tab 共用这套口径。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-10-06 15:39:32 +08:00
1 parent 18ee466664
commit f6d976a963
7 files changed
+181 -91

No files matched your search

+7 -7
View File
@@ -437,14 +437,16 @@ describe.skipIf(!up)("全局搜索", () => {
let d = await q("");
expect(d.total).toBe(3);
expect(counts(d.facets.resolution)).toEqual({ "2160p": 2, "1080p": 1, "720p": 0 });
expect(counts(d.facets.videoCodec)).toEqual({ "H.265": 2, "H.264": 1, AV1: 0 });
expect(counts(d.facets.releaseType)).toEqual({ disc: 0, remux: 1, encode: 0, webdl: 2, hdtv: 0 });
// 只列结果里有的档位
expect(counts(d.facets.resolution)).toEqual({ "2160p": 2, "1080p": 1 });
expect(counts(d.facets.videoCodec)).toEqual({ "H.265": 2, "H.264": 1 });
expect(counts(d.facets.releaseType)).toEqual({ remux: 1, webdl: 2 });
expect(counts(d.facets.site)).toEqual({ [sites.nexus]: 2, [sites.mteam]: 1 });
expect(d.facets.site.find((f: Loose) => f.value === sites.nexus).label).toBe("观众");
expect(counts(d.facets.releaseGroup)).toEqual({ FraMeSToR: 1, GRP: 1, FLUX: 1 });
expect(d.facets.hdr.find((f: Loose) => f.value === "SDR").count).toBe(2);
expect(d.facets.season).toEqual([]);
expect(d.facets.seasonEpisode).toEqual([]);
expect(d.facets.hr.reduce((n: number, f: Loose) => n + f.count, 0)).toBe(3);
// 旧分面仍在
expect(d.facets.resolutions.length).toBe(2);
@@ -500,10 +502,8 @@ describe.skipIf(!up)("全局搜索", () => {
d = await list("resolution:1080p");
expect(d.items.map((i: Loose) => i.siteReleaseId)).toEqual(["900001"]);
expect(d).toMatchObject({ total: 1, unfilteredTotal: 2 });
expect(d.facets.releaseGroup.map((f: Loose) => [f.value, f.count])).toEqual([
["FraMeSToR", 0],
["GRP", 1],
]);
// 在 1080p 下没有资源的制作组不列
expect(d.facets.releaseGroup.map((f: Loose) => [f.value, f.count])).toEqual([["GRP", 1]]);
// 分页
const p1 = await req(`/sites/${sites.nexus}/releases?q=Dune&live=false&limit=1`).then((r) => r.body.data);
expect(p1.items.length).toBe(1);