feat(identity): source-aware short-drama enrichment with snippet mode and hit rate (META-2)

- classify enrich sources: encyclopedia, platform pages (hongguo, kuaikaw, video
  platforms), douban (search snippet only) and other sites' search snippets
  (snippet mode, pages never opened); one extractor per source, fields carry
  source kind and confidence, merged by noisy-OR across hosts
- new cast field (applied as MediaCredit with placeholder ids)
- robots.txt check (cached per host 1 day) and login-wall/captcha give-up
- per-enrichment source attempts + GET /identity/enrich-stats, 30-day hit-rate
  table under settings -> metadata -> identity
- setting identity.enrichSnippetAllSites (default on); default domains add
  baike.com and kuaikaw.cn
- replay fixtures from the real run on the 4 user-library short dramas
  (sanitized Brave responses, hongguo page, robots.txt)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-30 18:40:19 +08:00
1 parent 081db4651c
commit 9489e40e0c
23 files changed
+2615 -323

No files matched your search

+13
View File
@@ -281,6 +281,16 @@ export const ENRICH_FIELD_LABEL: Record<string, string> = {
synopsis: "简介",
posterUrl: "海报",
genre: "类型",
cast: "主演",
};
/** 补全来源类别(META-2) */
export const ENRICH_SOURCE_KIND: Record<string, string> = {
encyclopedia: "百科",
platform: "平台页",
douban: "豆瓣摘要",
snippet: "搜索摘要",
other: "其它网站",
};
/** 补全来源链接被跳过的原因 */
@@ -290,6 +300,9 @@ export const ENRICH_SKIPPED: Record<string, string> = {
irrelevant: "标题对不上",
limit: "超出读取条数",
error: "读取失败",
snippet_only: "只用搜索摘要",
robots: "网站不允许抓取",
blocked: "要求登录或验证",
};
export const UNIT_KIND: Record<string, string> = { season: "季", episode: "集", special: "特别篇", part: "分段" };