feat(metadata): overview falls back to Chinese variants only (MD-2)

- adapters: overviewLanguages() limits overview/tagline chain to Chinese
  variants (zh-CN→zh-SG→zh-TW→zh-HK); titles keep full chain; season
  supplement fetch skips languages useless for overview
- setting metadata.overviewNonChineseFallback (default off) + UI switch
- media detail shows "暂无简介" for empty entity/episode overview
- scripts/overview-recompute.ts: recompute stored non-Chinese overviews
  from kv_cache only (no TMDB requests), dry-run by default, --apply
- tests: chain unit tests, Heart Signal (103147) fixture, server
  recompute test, MP differential for episode overview
- runbook + CHANGELOG

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-30 18:04:23 +08:00
1 parent 081db4651c
commit f9901b514b
22 files changed
+887 -38

No files matched your search

+46
View File
@@ -328,3 +328,49 @@ export const TMDB_FIXTURES: TmdbFixture[] = [
],
},
];
/**
* MD-2:《心动的信号》(TMDB tv/103147 的真实形态):作品与每期标题有 zh-CN,简介只有 en-US(实为标题英译)。
* 不在 TMDB_FIXTURES 里,用到的测试自行拼进 fixtures。
*/
export const HEART_SIGNAL_FIXTURE: TmdbFixture = {
type: "tv",
id: 103147,
original_title: "心动的信号",
original_language: "zh",
origin_country: ["CN"],
date: "2018-08-01",
titles: { "zh-CN": "心动的信号", "en-US": "Heart Signal" },
overviews: { "en-US": "A Chinese dating reality show." },
popularity: 6.2,
alternative_titles: [],
external_ids: { imdb_id: null, tvdb_id: null },
rich: { genres: ["真人秀"], status: "Returning Series" },
seasons: [
{
season_number: 1,
air_date: "2018-08-01",
names: { "zh-CN": "第 1 季", "en-US": "Season 1" },
episodes: [
{
episode_number: 1,
air_date: "2018-08-01",
names: { "zh-CN": "心动不如行动,大胆亮出底牌!", "en-US": "Episode 1" },
overviews: { "en-US": "If Your Heart Skips a Beat, Play Your Cards Openly!" },
},
{
episode_number: 2,
air_date: "2018-08-08",
names: { "zh-CN": "第 2 集", "en-US": "Who Is the One?" },
overviews: { "en-US": "Who Is the One?" },
},
{
episode_number: 3,
air_date: "2018-08-15",
names: { "zh-CN": "约会之夜", "en-US": "Date Night" },
overviews: { "zh-TW": "約會之夜。", "en-US": "Date Night." },
},
],
},
],
};