feat(parser,sites): W5-D port title/zhconv/site parsing gaps found by MP differential

Title recognition (parseRelease / parseReleasePath):
- anime prefix tags (★N月新番, [国漫], 【22年日剧】), category lead bracket, `A / B` cn aliases
- `Name [01]`, `[TV 04]`, `#13`, `名称 12.mkv`, `S01 13-14`, `E13-14` episodes
- lead bracket as title vs group, trailing [Group], YTS.MX/Hall_of_C style groups, 字幕组 suffix
- `[dot.release.name][…]` unbracketing, `Season 2017` as year, leading date not airDate,
  date-only parent dir does not merge as TV
- original disc: Blu-ray + AVC/HEVC/VC-1/MPEG-2 without x26x/H.26x -> BluRay-Disc
- `{[tmdbid=;type=;s=;e=]}` explicit block, bangumi/anilist ids
- bare [1080]/[5.1], DTS-HD MA5.1, £ multi-group, 合集, pinyin title -> cn from subtitle,
  streaming platform table, CHS/CHT/GB/BIG5 in subtitle
zh-map: add 迴滾魷瑯臥駭; document one-to-many chars kept out.
Sites: tbody branch + header-row tightening via movieclaw-import rowSelector (18 definitions),
row-level case/hr/labels include the row itself, subtitle branch (searchType: "subtitles"),
parseSizeMp banker's rounding.
Differential snapshots regenerated; MP test sample sources registered in ledger.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-27 23:09:14 +08:00
1 parent 8352e5e881
commit 36dc048e89
41 files changed
+3111 -2372

No files matched your search

@@ -12216,78 +12216,30 @@
}
],
"deviations": {
"R06:t03": {
"kind": "our_bug",
"note": "原盘命名「2160p UHD Blu-ray HEVC」被 parseRelease 判为 BluRay 压制(isEncode=true);MP BLU 判为原盘。应识别为 BluRay-Disc",
"mp": 1,
"ours": null
},
"R06:t08": {
"kind": "mp_bug",
"note": "MP BLU 正则分支 `(UHD|4K|2160p).*(HEVC|H.265)` 在无来源标记的 2160p HEVC 上误判为原盘;我们来源未知按 !BLU 放行",
"mp": 1,
"ours": null
},
"R06:t12": {
"kind": "our_bug",
"note": "原盘命名「1080p Blu-ray AVC」(无 x264)被 parseRelease 判为 BluRay 压制;MP BLU 判为原盘。应识别为 BluRay-Disc",
"mp": 1,
"ours": null
},
"R07:t03": {
"kind": "our_bug",
"note": "原盘命名「2160p UHD Blu-ray HEVC」被 parseRelease 判为 BluRay 压制(isEncode=true);MP BLU 判为原盘。应识别为 BluRay-Disc",
"mp": null,
"ours": 1
},
"R07:t08": {
"kind": "mp_bug",
"note": "MP BLU 正则分支 `(UHD|4K|2160p).*(HEVC|H.265)` 在无来源标记的 2160p HEVC 上误判为原盘;我们来源未知按 !BLU 放行",
"mp": null,
"ours": 1
},
"R07:t12": {
"kind": "our_bug",
"note": "原盘命名「1080p Blu-ray AVC」(无 x264)被 parseRelease 判为 BluRay 压制;MP BLU 判为原盘。应识别为 BluRay-Disc",
"mp": null,
"ours": 1
},
"R11:t03": {
"kind": "our_bug",
"note": "原盘命名「2160p UHD Blu-ray HEVC」被 parseRelease 判为 BluRay 压制(isEncode=true);MP BLU 判为原盘。应识别为 BluRay-Disc",
"mp": null,
"ours": 1
},
"R11:t08": {
"kind": "mp_bug",
"note": "MP BLU 正则分支 `(UHD|4K|2160p).*(HEVC|H.265)` 在无来源标记的 2160p HEVC 上误判为原盘;我们来源未知按 !BLU 放行",
"mp": null,
"ours": 1
},
"R11:t12": {
"kind": "our_bug",
"note": "原盘命名「1080p Blu-ray AVC」(无 x264)被 parseRelease 判为 BluRay 压制;MP BLU 判为原盘。应识别为 BluRay-Disc",
"mp": null,
"ours": 1
},
"R13:t17": {
"kind": "our_bug",
"note": "副标题「CHS/ENG」:MP CNSUB 命中 chs/cht 词;parseRelease 字幕扫描只认中文关键词,未识别 CHS/CHT/GB/BIG5",
"mp": 1,
"ours": null
},
"R13:t26": {
"kind": "mp_bug",
"note": "副标题「国语」(音轨语言)被 MP CNSUB 正则当作中文字幕;我们把国语视为音轨,不满足 requiredSubtitles",
"mp": 1,
"ours": null
},
"R14:t17": {
"kind": "our_bug",
"note": "副标题「CHS/ENG」:MP CNSUB 命中 chs/cht 词;parseRelease 字幕扫描只认中文关键词,未识别 CHS/CHT/GB/BIG5",
"mp": 1,
"ours": null
},
"R14:t26": {
"kind": "mp_bug",
"note": "副标题「国语」(音轨语言)被 MP CNSUB 正则当作中文字幕;我们把国语视为音轨,不满足 requiredSubtitles",
@@ -12324,54 +12276,18 @@
"mp": 1,
"ours": null
},
"R19:t03": {
"kind": "our_bug",
"note": "原盘命名「2160p UHD Blu-ray HEVC」被 parseRelease 判为 BluRay 压制(isEncode=true);MP BLU 判为原盘。应识别为 BluRay-Disc",
"mp": null,
"ours": 1
},
"R19:t08": {
"kind": "mp_bug",
"note": "MP BLU 正则分支 `(UHD|4K|2160p).*(HEVC|H.265)` 在无来源标记的 2160p HEVC 上误判为原盘;我们来源未知按 !BLU 放行",
"mp": null,
"ours": 1
},
"R19:t12": {
"kind": "our_bug",
"note": "原盘命名「1080p Blu-ray AVC」(无 x264)被 parseRelease 判为 BluRay 压制;MP BLU 判为原盘。应识别为 BluRay-Disc",
"mp": null,
"ours": 1
},
"R20:t03": {
"kind": "our_bug",
"note": "原盘命名「2160p UHD Blu-ray HEVC」被 parseRelease 判为 BluRay 压制(isEncode=true);MP BLU 判为原盘。应识别为 BluRay-Disc",
"mp": null,
"ours": 1
},
"R20:t12": {
"kind": "our_bug",
"note": "原盘命名「1080p Blu-ray AVC」(无 x264)被 parseRelease 判为 BluRay 压制;MP BLU 判为原盘。应识别为 BluRay-Disc",
"mp": null,
"ours": 1
},
"R21:t03": {
"kind": "our_bug",
"note": "原盘命名「2160p UHD Blu-ray HEVC」被 parseRelease 判为 BluRay 压制(isEncode=true);MP BLU 判为原盘。应识别为 BluRay-Disc",
"mp": null,
"ours": 1
},
"R21:t08": {
"kind": "mp_bug",
"note": "MP BLU 正则分支 `(UHD|4K|2160p).*(HEVC|H.265)` 在无来源标记的 2160p HEVC 上误判为原盘;我们来源未知按 !BLU 放行",
"mp": null,
"ours": 1
},
"R21:t12": {
"kind": "our_bug",
"note": "原盘命名「1080p Blu-ray AVC」(无 x264)被 parseRelease 判为 BluRay 压制;MP BLU 判为原盘。应识别为 BluRay-Disc",
"mp": null,
"ours": 2
},
"R23:t01": {
"kind": "missing",
"note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件",
@@ -12432,12 +12348,6 @@
"mp": 1,
"ours": null
},
"R23:t17": {
"kind": "missing",
"note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件",
"mp": 1,
"ours": null
},
"R23:t18": {
"kind": "missing",
"note": "MP 规则可带 tmdb 条件:媒体 original_language∈{zh,cn} 时 CNSUB 对任何种子直接放行(华语片不要求中字);Slot 无媒体上下文条件",
@@ -12546,6 +12456,12 @@
"mp": null,
"ours": 1
},
"R25:t17": {
"kind": "not_expressible",
"note": "SPECSUB(特效字幕)无对应字段,近似翻译丢失该条件",
"mp": null,
"ours": 1
},
"R25:t21": {
"kind": "not_expressible",
"note": "SPECSUB(特效字幕)无对应字段,近似翻译丢失该条件",
@@ -317,12 +317,6 @@
"mp": null,
"ours": "grp",
"note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None"
},
"web_source": {
"kind": "missing",
"mp": "bbciplayer",
"ours": null,
"note": "流媒体平台表缺 iP(BBC iPlayer)"
}
},
"T-14": {
@@ -345,6 +339,12 @@
"mp": null,
"ours": "WEB-DL",
"note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出"
},
"web_source": {
"kind": "mp_bug",
"mp": null,
"ours": "baha",
"note": "MetaAnime(anitopy 路径)不产出流媒体平台;Baha 在 MP 平台表里,MetaVideo 路径同样会产出"
}
},
"A-02": {
@@ -359,6 +359,12 @@
"mp": null,
"ours": "WEB-DL",
"note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出"
},
"web_source": {
"kind": "mp_bug",
"mp": null,
"ours": "baha",
"note": "MetaAnime(anitopy 路径)不产出流媒体平台;Baha 在 MP 平台表里,MetaVideo 路径同样会产出"
}
},
"A-03": {
@@ -772,36 +778,6 @@
}
},
"MP-01": {
"name": {
"kind": "our_bug",
"mp": "thelongseason",
"ours": "thelong",
"note": "\"Season 2017\" 被当成第 2017 季、吞掉年份;MP 自带用例期望 en=The Long Season y=2017"
},
"en_name": {
"kind": "our_bug",
"mp": "thelongseason",
"ours": "thelong",
"note": "\"Season 2017\" 被当成第 2017 季、吞掉年份;MP 自带用例期望 en=The Long Season y=2017"
},
"year": {
"kind": "our_bug",
"mp": "2017",
"ours": null,
"note": "\"Season 2017\" 被当成第 2017 季、吞掉年份;MP 自带用例期望 en=The Long Season y=2017"
},
"type": {
"kind": "our_bug",
"mp": "unknown",
"ours": "tv",
"note": "\"Season 2017\" 被当成第 2017 季、吞掉年份;MP 自带用例期望 en=The Long Season y=2017"
},
"begin_season": {
"kind": "our_bug",
"mp": null,
"ours": "2017",
"note": "\"Season 2017\" 被当成第 2017 季、吞掉年份;MP 自带用例期望 en=The Long Season y=2017"
},
"resource_team": {
"kind": "intentional",
"mp": null,
@@ -818,18 +794,6 @@
}
},
"MP-03": {
"name": {
"kind": "our_bug",
"mp": "欢迎来到实力至上主义的教室",
"ours": "★7月新番欢迎来到实力至上主义的教室",
"note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名"
},
"cn_name": {
"kind": "our_bug",
"mp": "欢迎来到实力至上主义的教室",
"ours": "★7月新番欢迎来到实力至上主义的教室",
"note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名"
},
"resource_team": {
"kind": "intentional",
"mp": null,
@@ -838,57 +802,29 @@
}
},
"MP-05": {
"name": {
"kind": "mp_bug",
"mp": "akibamaidsensou",
"ours": "秋叶原冥途战争",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"cn_name": {
"kind": "mp_bug",
"mp": null,
"ours": "秋叶原冥途战争",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"begin_season": {
"kind": "intentional",
"mp": null,
"ours": "1",
"note": "有集号无季号推定第 1 季(seasonInferred)"
},
"resource_pix": {
"kind": "missing",
"mp": "1080p",
"ours": null,
"note": "方括号裸数字 [1080] 不识别为分辨率"
},
"resource_type": {
"kind": "mp_bug",
"mp": null,
"ours": "WEB-DL",
"note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出"
},
"resource_team": {
"kind": "our_bug",
"mp": "leagueweb",
"ours": "秋叶原冥途战争",
"note": "开头方括号是片名而非组名,仍被当 bracket 组;MP 按组表命中 LeagueWEB"
}
},
"MP-06": {
"name": {
"kind": "our_bug",
"mp": "哆啦a梦大雄的宇宙小战争2021",
"ours": "哆啦梦大雄的宇宙小战争2021",
"note": "哆啦A梦 的拉丁字母 A 被拆出中文名成为英文名"
},
"cn_name": {
"kind": "our_bug",
"mp": "哆啦a梦大雄的宇宙小战争2021",
"ours": "哆啦梦大雄的宇宙小战争2021",
"note": "哆啦A梦 的拉丁字母 A 被拆出中文名成为英文名"
},
"en_name": {
"kind": "our_bug",
"mp": null,
"ours": "a",
"note": "哆啦A梦 的拉丁字母 A 被拆出中文名成为英文名"
}
},
"MP-10": {
"web_source": {
"kind": "missing",
"mp": "bglobal",
"ours": null,
"note": "流媒体平台表缺 B-Global"
}
},
"MP-12": {
@@ -897,12 +833,6 @@
"mp": null,
"ours": "WEBRip",
"note": "MP 未识别方括号内 [WEBRip]"
},
"audio_encode": {
"kind": "missing",
"mp": "51",
"ours": null,
"note": "孤立声道 [5.1] 不识别为音频"
}
},
"MP-13": {
@@ -918,32 +848,20 @@
"ours": "诛仙",
"note": "MP 丢中文名(/ 分隔或嵌套方括号)"
},
"resource_pix": {
"kind": "mp_bug",
"mp": null,
"ours": "2160p",
"note": "MetaAnime 不认方括号裸数字 [2160](同一路径认 [1080]);我们按分辨率识别"
},
"resource_type": {
"kind": "mp_bug",
"mp": null,
"ours": "WEB-DL",
"note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出"
},
"resource_team": {
"kind": "our_bug",
"mp": "leagueweb",
"ours": "animations(动画片)",
"note": "开头方括号是片名而非组名,仍被当 bracket 组;MP 按组表命中 LeagueWEB"
}
},
"MP-17": {
"name": {
"kind": "our_bug",
"mp": "据幸存的六人所说",
"ours": "22年日剧据幸存的六人所说",
"note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名"
},
"cn_name": {
"kind": "our_bug",
"mp": "据幸存的六人所说",
"ours": "22年日剧据幸存的六人所说",
"note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名"
},
"begin_season": {
"kind": "intentional",
"mp": null,
@@ -953,16 +871,16 @@
},
"MP-18": {
"name": {
"kind": "our_bug",
"kind": "mp_bug",
"mp": "soredemoayumuwayosetekuru",
"ours": "★7月新番即使如此依旧步步进逼",
"note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名"
"ours": "即使如此依旧步步进逼",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"cn_name": {
"kind": "our_bug",
"kind": "mp_bug",
"mp": null,
"ours": "★7月新番即使如此依旧步步进逼",
"note": "前缀标签混入中文名;MP 丢中文名"
"ours": "即使如此依旧步步进逼",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"begin_season": {
"kind": "intentional",
@@ -973,31 +891,19 @@
},
"MP-20": {
"name": {
"kind": "our_bug",
"kind": "mp_bug",
"mp": "swordquest",
"ours": "国漫寻剑",
"note": "动漫标题前缀标签(国漫)未剥离,且 name 取中文"
"ours": "寻剑",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"cn_name": {
"kind": "our_bug",
"kind": "mp_bug",
"mp": null,
"ours": "国漫寻剑",
"note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名"
"ours": "寻剑",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
}
},
"MP-21": {
"name": {
"kind": "our_bug",
"mp": "组长女儿与保姆",
"ours": "组长女儿与照料专员组长女儿与保姆",
"note": "\"A / B\" 两个中文名被拼接;MP 取后者"
},
"cn_name": {
"kind": "our_bug",
"mp": "组长女儿与保姆",
"ours": "组长女儿与照料专员组长女儿与保姆",
"note": "\"A / B\" 两个中文名被拼接;MP 取后者"
},
"begin_season": {
"kind": "intentional",
"mp": null,
@@ -1022,56 +928,26 @@
}
},
"MP-24": {
"name": {
"kind": "our_bug",
"mp": "galtokyouryuu",
"ours": "bdrip",
"note": "[Name][02][BDRIP] 取到 BDRIP 作名称"
},
"en_name": {
"kind": "our_bug",
"mp": "galtokyouryuu",
"ours": "bdrip",
"note": "[Name][02][BDRIP] 取到 BDRIP 作名称"
},
"begin_season": {
"kind": "intentional",
"mp": null,
"ours": "1",
"note": "有集号无季号推定第 1 季(seasonInferred)"
},
"resource_type": {
"kind": "mp_bug",
"mp": null,
"ours": "BluRay",
"note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出"
},
"resource_team": {
"kind": "mp_bug",
"mp": "gal to kyouryuu",
"ours": null,
"note": "MP 把开头的片名方括号 [Gal to Kyouryuu] 同时当成组名;我们判为片名(紧跟集号 [02])"
}
},
"MP-25": {
"name": {
"kind": "missing",
"mp": "逆境無頼カイジ",
"ours": "逆境無頼カイジ13",
"note": "#13 集号写法不识别"
},
"cn_name": {
"kind": "missing",
"mp": "逆境無頼カイジ",
"ours": "逆境無頼カイジ13",
"note": "#13 集号写法不识别"
},
"type": {
"kind": "missing",
"mp": "tv",
"ours": "unknown",
"note": "#13 集号写法不识别"
},
"begin_season": {
"kind": "missing",
"mp": "1",
"ours": null,
"note": "#13 集号写法不识别"
},
"begin_episode": {
"kind": "missing",
"mp": "13",
"ours": null,
"note": "#13 集号写法不识别"
},
"resource_team": {
"kind": "intentional",
"mp": null,
@@ -1080,43 +956,37 @@
}
},
"MP-27": {
"name": {
"kind": "mp_bug",
"mp": "throneofseal",
"ours": "神印王座",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"cn_name": {
"kind": "mp_bug",
"mp": null,
"ours": "神印王座",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"resource_pix": {
"kind": "mp_bug",
"mp": null,
"ours": "2160p",
"note": "MetaAnime 不认方括号裸数字 [2160](同一路径认 [1080]);我们按分辨率识别"
},
"resource_type": {
"kind": "mp_bug",
"mp": null,
"ours": "WEB-DL",
"note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出"
},
"resource_team": {
"kind": "our_bug",
"mp": "leagueweb",
"ours": "神印王座",
"note": "开头方括号是片名而非组名,仍被当 bracket 组;MP 按组表命中 LeagueWEB"
}
},
"MP-29": {
"name": {
"kind": "missing",
"mp": "西部世界",
"ours": "西部世界12",
"note": "\"中文名 12.mkv\" 文件名尾部裸数字不识别为集号"
},
"cn_name": {
"kind": "missing",
"mp": "西部世界",
"ours": "西部世界12",
"note": "\"中文名 12.mkv\" 文件名尾部裸数字不识别为集号"
},
"type": {
"kind": "missing",
"mp": "tv",
"ours": "unknown",
"note": "\"中文名 12.mkv\" 文件名尾部裸数字不识别为集号"
},
"begin_episode": {
"kind": "missing",
"mp": "12",
"ours": null,
"note": "\"中文名 12.mkv\" 文件名尾部裸数字不识别为集号"
"begin_season": {
"kind": "intentional",
"mp": null,
"ours": "1",
"note": "有集号无季号推定第 1 季(seasonInferred)"
}
},
"MP-30": {
@@ -1125,6 +995,12 @@
"mp": null,
"ours": "WEB-DL",
"note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出"
},
"web_source": {
"kind": "mp_bug",
"mp": null,
"ours": "baha",
"note": "MetaAnime(anitopy 路径)不产出流媒体平台;Baha 在 MP 平台表里,MetaVideo 路径同样会产出"
}
},
"MP-31": {
@@ -1143,16 +1019,16 @@
},
"MP-32": {
"name": {
"kind": "our_bug",
"kind": "mp_bug",
"mp": "fightsbreakspherev",
"ours": "国漫斗破苍穹",
"note": "动漫标题前缀标签(国漫)未剥离,且 name 取中文"
"ours": "斗破苍穹",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"cn_name": {
"kind": "our_bug",
"kind": "mp_bug",
"mp": null,
"ours": "国漫斗破苍穹",
"note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名"
"ours": "斗破苍穹",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
}
},
"MP-34": {
@@ -1215,6 +1091,12 @@
"mp": null,
"ours": "WEB-DL",
"note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出"
},
"web_source": {
"kind": "mp_bug",
"mp": null,
"ours": "baha",
"note": "MetaAnime(anitopy 路径)不产出流媒体平台;Baha 在 MP 平台表里,MetaVideo 路径同样会产出"
}
},
"MP-41": {
@@ -1227,10 +1109,10 @@
},
"MP-44": {
"name": {
"kind": "our_bug",
"kind": "mp_bug",
"mp": "isekaiojisan",
"ours": "异世界归来的舅舅",
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"cn_name": {
"kind": "mp_bug",
@@ -1238,55 +1120,31 @@
"ours": "异世界归来的舅舅",
"note": "MP 丢中文名"
},
"en_name": {
"kind": "our_bug",
"mp": "isekaiojisan",
"ours": "isekaiojisan01",
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
},
"type": {
"kind": "our_bug",
"mp": "tv",
"ours": "unknown",
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
},
"begin_episode": {
"kind": "our_bug",
"mp": "1",
"ours": null,
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
"begin_season": {
"kind": "intentional",
"mp": null,
"ours": "1",
"note": "有集号无季号推定第 1 季(seasonInferred)"
}
},
"MP-45": {
"name": {
"kind": "our_bug",
"kind": "mp_bug",
"mp": "summertimerendering",
"ours": "★04月新番★夏日重現",
"note": "前缀标签混入中文名"
"ours": "夏日重現",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"cn_name": {
"kind": "our_bug",
"kind": "mp_bug",
"mp": null,
"ours": "★04月新番★夏日重現",
"note": "前缀标签混入中文名;MP 丢中文名"
"ours": "夏日重現",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"en_name": {
"kind": "our_bug",
"mp": "summertimerendering",
"ours": "summertimerendering15",
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
},
"type": {
"kind": "our_bug",
"mp": "tv",
"ours": "unknown",
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
},
"begin_episode": {
"kind": "our_bug",
"mp": "15",
"ours": null,
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
"begin_season": {
"kind": "intentional",
"mp": null,
"ours": "1",
"note": "有集号无季号推定第 1 季(seasonInferred)"
}
},
"MP-46": {
@@ -1305,56 +1163,12 @@
"note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None"
}
},
"MP-48": {
"audio_encode": {
"kind": "our_bug",
"mp": "DTSHDMA51",
"ours": "DTSHD",
"note": "DTS-HD MA5.1(MA 与声道粘连)只识别到 DTSHD"
}
},
"MP-49": {
"audio_encode": {
"kind": "mp_bug",
"mp": null,
"ours": "AC3",
"note": "AC3£cXcY:MP 未切开 £ 分隔,音频丢失"
},
"resource_team": {
"kind": "missing",
"mp": "cxcy@frds",
"ours": "frds",
"note": "£ 分隔的多组 cXcY@FRDS 只取到 FRDS"
}
},
"MP-50": {
"begin_episode": {
"kind": "missing",
"mp": "13",
"ours": null,
"note": "S01 13-14 裸数字集区间不识别"
},
"end_episode": {
"kind": "missing",
"mp": "14",
"ours": null,
"note": "S01 13-14 裸数字集区间不识别"
}
},
"MP-51": {
"end_episode": {
"kind": "our_bug",
"mp": "14",
"ours": null,
"note": "E13-14 只取到起始集"
}
},
"MP-52": {
"type": {
"kind": "our_bug",
"mp": "unknown",
"ours": "tv",
"note": "开头下载日期 2022.8.2 被当成 airDate → 误判剧集"
}
},
"MP-54": {
@@ -1363,12 +1177,6 @@
"mp": null,
"ours": "AC3",
"note": "AC3£cXcY:MP 未切开 £ 分隔,音频丢失"
},
"resource_team": {
"kind": "missing",
"mp": "cxcy@frds",
"ours": "frds",
"note": "£ 分隔的多组 cXcY@FRDS 只取到 FRDS"
}
},
"MP-55": {
@@ -1385,10 +1193,10 @@
"note": "MP 丢中文名(/ 分隔或嵌套方括号)"
},
"en_name": {
"kind": "our_bug",
"kind": "mp_bug",
"mp": "うたわれるもの",
"ours": "utawarerumonoうたわれるもの",
"note": "三段 / 名称(中/罗马字/日文)未拆开"
"ours": "utawarerumono",
"note": "MP 把 `/` 最后一段的日文假名名当英文名;我们取罗马字名,假名名只在没有英文名时兜底"
},
"begin_season": {
"kind": "intentional",
@@ -1415,44 +1223,36 @@
"note": "flac_ac3 我们记两种音轨,MP 只记 FLAC"
}
},
"MP-56": {
"MP-57": {
"name": {
"kind": "our_bug",
"mp": "欢迎来到实力至上主义的教室",
"ours": "7月新番欢迎来到实力至上主义的教室",
"note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名"
"kind": "mp_bug",
"mp": "jadedynasty",
"ours": "诛仙",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"cn_name": {
"kind": "our_bug",
"mp": "欢迎来到实力至上主义的教室",
"ours": "7月新番欢迎来到实力至上主义的教室",
"note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名"
}
},
"MP-57": {
"type": {
"kind": "missing",
"mp": "tv",
"ours": "unknown",
"note": "[TV 04] 集号写法不识别"
"kind": "mp_bug",
"mp": null,
"ours": "诛仙",
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"begin_episode": {
"kind": "missing",
"mp": "4",
"ours": null,
"note": "[TV 04] 集号写法不识别"
"begin_season": {
"kind": "intentional",
"mp": null,
"ours": "1",
"note": "有集号无季号推定第 1 季(seasonInferred)"
},
"resource_pix": {
"kind": "mp_bug",
"mp": null,
"ours": "2160p",
"note": "MetaAnime 不认方括号裸数字 [2160](同一路径认 [1080]);我们按分辨率识别"
},
"resource_type": {
"kind": "mp_bug",
"mp": null,
"ours": "WEB-DL",
"note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出"
},
"resource_team": {
"kind": "our_bug",
"mp": "leagueweb",
"ours": "诛仙",
"note": "开头方括号是片名而非组名,仍被当 bracket 组;MP 按组表命中 LeagueWEB"
}
},
"MP-58": {
@@ -1472,38 +1272,6 @@
}
},
"MP-60": {
"en_name": {
"kind": "our_bug",
"mp": "zhuxianjadedynasty",
"ours": "hallofczhuxianjadedynasty",
"note": "开头 [Hall_of_C] 组名混入英文名"
},
"begin_season": {
"kind": "intentional",
"mp": null,
"ours": "1",
"note": "有集号无季号推定第 1 季(seasonInferred)"
}
},
"MP-63": {
"name": {
"kind": "our_bug",
"mp": "金属口红",
"ours": "★1月新番金属口红",
"note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名"
},
"cn_name": {
"kind": "our_bug",
"mp": "金属口红",
"ours": "★1月新番金属口红",
"note": "动漫标题前缀标签(★N月新番/N年日剧/国漫)未剥离,混入中文名"
},
"en_name": {
"kind": "our_bug",
"mp": "metallicrouge",
"ours": "metallicrougegb",
"note": "语言标记 GB 未剥离,进英文名"
},
"begin_season": {
"kind": "intentional",
"mp": null,
@@ -1511,33 +1279,21 @@
"note": "有集号无季号推定第 1 季(seasonInferred)"
},
"resource_team": {
"kind": "our_bug",
"mp": "极影字幕社",
"ours": null,
"note": "【极影字幕社】全角方括号开头组未取到"
"kind": "intentional",
"mp": null,
"ours": "hall_of_c",
"note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None"
}
},
"MP-64": {
"name": {
"kind": "missing",
"mp": "麦香",
"ours": "maixiang",
"note": "英文名为拼音时从副标题取中文名(MP metavideo 规则)未迁"
},
"cn_name": {
"kind": "missing",
"mp": "麦香",
"ours": null,
"note": "英文名为拼音时从副标题取中文名(MP metavideo 规则)未迁"
"MP-63": {
"begin_season": {
"kind": "intentional",
"mp": null,
"ours": "1",
"note": "有集号无季号推定第 1 季(seasonInferred)"
}
},
"MP-73": {
"type": {
"kind": "our_bug",
"mp": "unknown",
"ours": "tv",
"note": "父目录 Collection.20240501 的日期被当 airDate,合并后误判剧集"
},
"audio_encode": {
"kind": "representation",
"mp": "2AUDIO",
@@ -1547,66 +1303,24 @@
},
"MP-74": {
"name": {
"kind": "our_bug",
"kind": "intentional",
"mp": "caligulatheultimatecut",
"ours": "罗马帝国艳情史最终剪辑版澳大利亚版",
"note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁"
},
"cn_name": {
"kind": "our_bug",
"mp": null,
"ours": "罗马帝国艳情史最终剪辑版澳大利亚版",
"note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁"
"ours": "caligula",
"note": "剪辑版本(Ultimate Cut 等)单独进 cut 字段,不留在名称里(REQ §6.1)"
},
"en_name": {
"kind": "our_bug",
"kind": "intentional",
"mp": "caligulatheultimatecut",
"ours": "diy",
"note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁"
},
"year": {
"kind": "our_bug",
"mp": "2023",
"ours": null,
"note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁"
},
"resource_pix": {
"kind": "our_bug",
"mp": "2160p",
"ours": null,
"note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁"
},
"resource_type": {
"kind": "our_bug",
"mp": "UHD BluRay",
"ours": "UHD ?",
"note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁"
},
"video_encode": {
"kind": "our_bug",
"mp": "H.265",
"ours": null,
"note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁"
},
"audio_encode": {
"kind": "our_bug",
"mp": "DTSHDMA51",
"ours": null,
"note": "[点分隔发布名][..] 形式:方括号内是完整发布名(MP BRACKET_DOT_TITLE_RE),未迁"
"ours": "caligula",
"note": "剪辑版本(Ultimate Cut 等)单独进 cut 字段,不留在名称里(REQ §6.1)"
}
},
"MP-76": {
"name": {
"kind": "our_bug",
"mp": "theshawshankredemption",
"ours": "ytsmxtheshawshankredemption",
"note": "[YTS.MX] 前缀未当作组名剥离"
},
"en_name": {
"kind": "our_bug",
"mp": "theshawshankredemption",
"ours": "ytsmxtheshawshankredemption",
"note": "[YTS.MX] 前缀未当作组名剥离"
"resource_team": {
"kind": "intentional",
"mp": null,
"ours": "yts.mx",
"note": "未知发布组兜底(末段 -GROUP / 开头方括号),MP 组表未命中为 None"
}
},
"Z-02": {
@@ -1663,6 +1377,12 @@
"mp": null,
"ours": "WEB-DL",
"note": "MetaAnime(anitopy 路径)不产出来源/编码,我们产出"
},
"web_source": {
"kind": "mp_bug",
"mp": null,
"ours": "baha",
"note": "MetaAnime(anitopy 路径)不产出流媒体平台;Baha 在 MP 平台表里,MetaVideo 路径同样会产出"
}
},
"Z-06": {
@@ -1675,10 +1395,10 @@
},
"Z-07": {
"name": {
"kind": "our_bug",
"kind": "mp_bug",
"mp": "dungeonmeshi",
"ours": "迷宫饭",
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
"note": "MP 丢中文名(MetaAnime 取 `/` 后段,或把中英混排/纯中文片名块删掉),name 随之取英文名;我们保留中文名"
},
"cn_name": {
"kind": "mp_bug",
@@ -1686,23 +1406,11 @@
"ours": "迷宫饭",
"note": "MP 丢中文名"
},
"en_name": {
"kind": "our_bug",
"mp": "dungeonmeshi",
"ours": "dungeonmeshi13",
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
},
"type": {
"kind": "our_bug",
"mp": "tv",
"ours": "unknown",
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
},
"begin_episode": {
"kind": "our_bug",
"mp": "13",
"ours": null,
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
"begin_season": {
"kind": "intentional",
"mp": null,
"ours": "1",
"note": "有集号无季号推定第 1 季(seasonInferred)"
}
},
"Z-08": {
@@ -1730,18 +1438,6 @@
}
},
"Z-12": {
"name": {
"kind": "missing",
"mp": "指环王三部曲",
"ours": "指环王三部曲合集",
"note": "\"合集\" 干扰词未剥离"
},
"cn_name": {
"kind": "missing",
"mp": "指环王三部曲",
"ours": "指环王三部曲合集",
"note": "\"合集\" 干扰词未剥离"
},
"resource_team": {
"kind": "intentional",
"mp": null,
@@ -1814,29 +1510,11 @@
}
},
"Z-27": {
"name": {
"kind": "our_bug",
"mp": "shingekinokyojin",
"ours": "shingekinokyojin05ma10p",
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
},
"en_name": {
"kind": "our_bug",
"mp": "shingekinokyojin",
"ours": "shingekinokyojin05ma10p",
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
},
"type": {
"kind": "our_bug",
"mp": "tv",
"ours": "unknown",
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
},
"begin_episode": {
"kind": "our_bug",
"mp": "5",
"ours": null,
"note": "名称后的方括号集号 [01] 未识别,拼进英文名"
"begin_season": {
"kind": "intentional",
"mp": null,
"ours": "1",
"note": "有集号无季号推定第 1 季(seasonInferred)"
}
},
"Z-28": {
@@ -1855,62 +1533,12 @@
"note": "name 选择:我们有中文名就取中文,MP 仅中文名全为汉字时取中文(cn/en 一致)"
}
},
"Z-31": {
"name": {
"kind": "missing",
"mp": "houseofthedragon",
"ours": "{tmdbid=94997type=tvs=1e=34}houseofthedragon",
"note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)"
},
"en_name": {
"kind": "missing",
"mp": "houseofthedragon",
"ours": "{tmdbid=94997type=tvs=1e=34}houseofthedragon",
"note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)"
},
"type": {
"kind": "missing",
"mp": "tv",
"ours": "unknown",
"note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)"
},
"begin_season": {
"kind": "missing",
"mp": "1",
"ours": null,
"note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)"
},
"begin_episode": {
"kind": "missing",
"mp": "3",
"ours": null,
"note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)"
},
"end_episode": {
"kind": "missing",
"mp": "4",
"ours": null,
"note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)"
},
"media_id": {
"kind": "missing",
"mp": "themoviedb:94997",
"ours": null,
"note": "{[tmdbid=..;type=tv;s=1;e=3-4]} 显式身份块未迁(find_metainfo)"
}
},
"Z-32": {
"begin_season": {
"kind": "intentional",
"mp": null,
"ours": "1",
"note": "有集号无季号推定第 1 季(seasonInferred)"
},
"media_id": {
"kind": "missing",
"mp": "bangumi:400602",
"ours": null,
"note": "[bangumiid=..] 未迁(我们只认 tmdb/imdb/douban/tvdb)"
}
},
"Z-33": {
@@ -183,7 +183,14 @@ export function canonMp(m: MpMeta): Canon {
};
}
const PROVIDER: Record<string, string> = { tmdb: "themoviedb", douban: "douban", imdb: "imdb", tvdb: "tvdb" };
const PROVIDER: Record<string, string> = {
tmdb: "themoviedb",
douban: "douban",
imdb: "imdb",
tvdb: "tvdb",
bangumi: "bangumi",
anilist: "anilist",
};
export function oursParse(s: MetaSample): ParsedRelease {
return s.kind === "path"
@@ -1,21 +1,35 @@
{
"note": "繁→简差分已知差异:key=输入。kind 同 meta-deviations.json。",
"deviations": {
"咒術迴戰": { "kind": "missing", "mp": "咒术回战", "ours": "咒术迴战", "note": "字表缺 迴→回" },
"孤獨搖滾": { "kind": "missing", "mp": "孤独摇滚", "ours": "孤独摇滾", "note": "字表缺 滾→滚" },
"魷魚遊戲": { "kind": "missing", "mp": "鱿鱼游戏", "ours": "魷鱼游戏", "note": "字表缺 魷→鱿" },
"瑯琊榜": { "kind": "missing", "mp": "琅琊榜", "ours": "瑯琊榜", "note": "字表缺 瑯→琅(异体)" },
"慶餘年": {
"kind": "mp_bug",
"mp": "庆馀年",
"ours": "庆余年",
"note": "MediaWiki 词表把 餘 转成 馀,官方简体片名为 庆余年"
},
"臥虎藏龍": { "kind": "missing", "mp": "卧虎藏龙", "ours": "臥虎藏龙", "note": "字表缺 臥→卧" },
"駭客任務": { "kind": "missing", "mp": "骇客任务", "ours": "駭客任务", "note": "字表缺 駭→骇" },
"乾杯": { "kind": "missing", "mp": "干杯", "ours": "乾杯", "note": "一对多字 乾 刻意不收;MP 有词组表" },
"瞭解": { "kind": "missing", "mp": "了解", "ours": "瞭解", "note": "一对多字 瞭 刻意不收;MP 有词组表" },
"頭髮": { "kind": "missing", "mp": "头发", "ours": "头髮", "note": "髮→发 未收(发/發 合并字)" },
"理髮": { "kind": "missing", "mp": "理发", "ours": "理髮", "note": "髮→发 未收" }
"乾杯": {
"kind": "intentional",
"mp": "干杯",
"ours": "乾杯",
"note": "一对多字 乾 刻意不收;MP 有词组表(见 identity/zh-map.ts 注释)"
},
"瞭解": {
"kind": "intentional",
"mp": "了解",
"ours": "瞭解",
"note": "一对多字 瞭 刻意不收;MP 有词组表(见 identity/zh-map.ts 注释)"
},
"頭髮": {
"kind": "intentional",
"mp": "头发",
"ours": "头髮",
"note": "一对多字 髮 刻意不收;MP 有词组表(见 identity/zh-map.ts 注释)"
},
"理髮": {
"kind": "intentional",
"mp": "理发",
"ours": "理髮",
"note": "一对多字 髮 刻意不收;MP 有词组表(见 identity/zh-map.ts 注释)"
}
}
}
+177 -2
View File
@@ -56,8 +56,9 @@ const TITLES: Sample[] = [
title: "奥本海默",
titleCn: "奥本海默",
titleEn: "Oppenheimer",
source: "BluRay",
isEncode: true,
// Blu-ray + HEVC 且没有 x265/H.265 → 原盘(对照 MP 内置规则 BLU)
source: "BluRay-Disc",
isEncode: false,
uhd: true,
hdr: ["DV"],
group: "MTeam",
@@ -446,6 +447,180 @@ const TITLES: Sample[] = [
{ id: "V-18", input: "某剧 第1-10集 1080p", expect: { episodes: { start: 1, end: 10 } } },
];
// W5-D:按 MP 差分报告(docs/porting/mp-rust-logic-parity.md §2)补迁的写法,编号对应报告 B/M 条目
const MP_PARITY: Sample[] = [
{
id: "B1",
input:
"【爪爪字幕组】★7月新番[欢迎来到实力至上主义的教室 第二季/Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e S2][11][1080p][HEVC][GB][MP4]",
expect: { titleCn: "欢迎来到实力至上主义的教室", season: 2, episodes: { start: 11, end: 11 }, group: "爪爪字幕组" },
},
{
id: "B1b",
input: "[GM-Team][国漫][寻剑 第1季][Sword Quest Season 1][2002][02][AVC][GB][1080P]",
expect: { titleCn: "寻剑" },
},
{
id: "B1c",
input: "【幻月字幕组】【22年日剧】【据幸存的六人所说】【04】【1080P】",
expect: { titleCn: "据幸存的六人所说" },
},
{
id: "B2",
input: "[桜都字幕组] 异世界归来的舅舅 / Isekai Ojisan [01][1080p][简体内嵌]",
expect: { titleEn: "Isekai Ojisan", episodes: { start: 1, end: 1 }, mediaTypeHint: "tv" },
},
{
id: "B3",
input: "[秋叶原冥途战争][Akiba Maid Sensou][2022][WEB-DL][1080][TV Series][第01话][LeagueWEB]",
expect: { titleCn: "秋叶原冥途战争", resolution: "1080p", group: "LeagueWEB" },
},
{
id: "B3b",
input: "[某动画][Some Anime][2022][WEB-DL][1080p][TV 03][NewSub]",
expect: { titleCn: "某动画", episodes: { start: 3, end: 3 }, group: "NewSub", groupSource: "bracket" },
},
{
id: "B4",
input:
"[Caligula.The.Ultimate.Cut.2023.2160p.UHD.Blu-ray.HEVC.DTS-HD.MA.5.1-BHYS@OurBits][DIY中字原盘] [罗马帝国艳情史][91.86GB].iso",
expect: { titleEn: "Caligula", year: 2023, resolution: "2160p", source: "BluRay-Disc", cut: "Ultimate" },
},
{
id: "B5",
input: "The Long Season 2017 2160p WEB-DL H265 120FPS AAC-XXX",
expect: { titleEn: "The Long Season", year: 2017, season: undefined },
},
{
id: "B6",
input: "2022.8.2.Twelve.Monkeys.1995.GBR.4K.REMASTERED.BluRay.1080p.X264.DTS",
expect: { titleEn: "Twelve Monkeys", year: 1995, airDate: undefined, mediaTypeHint: "unknown" },
},
{
id: "B7",
input: "[YTS.MX] The Shawshank Redemption 1994 1080p BluRay x264",
expect: { titleEn: "The Shawshank Redemption", group: "YTS.MX" },
},
{
id: "B8",
input: "[猎户不鸽发布组] 组长女儿与照料专员 / 组长女儿与保姆 Kumichou Musume to Sewagakari [09] [1080p+]",
expect: { titleCn: "组长女儿与保姆", group: "猎户不鸽发布组" },
},
{
id: "B8b",
input: "[xyx98]传颂之物/Utawarerumono/うたわれるもの[BDrip][1920x1080][TV 01-26 Fin]",
expect: { titleCn: "传颂之物", titleEn: "Utawarerumono", episodes: { start: 1, end: 26 } },
},
{ id: "B9", input: "哆啦A梦:大雄的宇宙小战争 2021 (2022) - 1080p.mp4", expect: { titleEn: undefined, year: 2022 } },
{
id: "B10",
input: "[Gal to Kyouryuu][02][BDRIP][1080P][H264_FLAC].mkv",
expect: { titleEn: "Gal to Kyouryuu", episodes: { start: 2, end: 2 }, releaseGroup: undefined },
},
{
id: "B11",
input: "The 355 2022 BluRay 1080p DTS-HD MA5.1 X265.10bit-BeiTai",
expect: { audio: ["DTS-HD MA 5.1"] },
},
{
id: "B11b",
input: "The Heart of Genius E13-14 2022 1080p WEB-DL H264 AAC",
expect: { episodes: { start: 13, end: 14 } },
},
{
id: "B11c",
input: "【极影字幕社】★1月新番 Metallic Rouge/金属口红 第13话 GB 1080P MP4",
expect: { titleEn: "Metallic Rouge", titleCn: "金属口红", group: "极影字幕社", subtitles: ["zh-Hans"] },
},
{
id: "M1",
input: "{[tmdbid=94997;type=tv;s=1;e=3-4]}House.of.the.Dragon.1080p.mkv",
expect: {
titleEn: "House of the Dragon",
explicitIds: [{ provider: "tmdb", id: "94997" }],
season: 1,
episodes: { start: 3, end: 4 },
mediaTypeHint: "tv",
},
},
{
id: "M2",
input: "Sousou no Frieren - 05 [1080p] [bangumiid=400602].mkv",
expect: { explicitIds: [{ provider: "bangumi", id: "400602" }] },
},
{
id: "M3a",
input: "[AI-Raws] 逆境無頼カイジ #13 (BD HEVC 1920x1080 FLAC)[7CFEE642].mkv",
expect: { titleCn: "逆境無頼カイジ", episodes: { start: 13, end: 13 } },
},
{ id: "M3b", input: "西部世界 12.mkv", expect: { titleCn: "西部世界", episodes: { start: 12, end: 12 } } },
{
id: "M3c",
input: "The Heart of Genius S01 13-14 2022 1080p WEB-DL H264 AAC",
expect: { season: 1, episodes: { start: 13, end: 14 } },
},
{ id: "M3d", input: "流浪地球 2.mkv", expect: { episodes: undefined } },
{
id: "M4",
input: "Mai Xiang S01 2019 2160p WEB-DL H.265 DDP2.0-HHWEB",
subtitle: "麦香 | 全36集 | 4K",
expect: { titleCn: "麦香", title: "麦香" },
},
{ id: "M4b", input: "Blade Runner 2017 1080p WEB-DL", subtitle: "银翼杀手 | 科幻", expect: { titleCn: undefined } },
{ id: "M5", input: "Thor Love and Thunder (2022) [1080p] [WEBRip] [5.1]", expect: { audio: ["5.1"] } },
{
id: "M6",
input: "Planet.Earth.III.S01.2160p.iP.WEB-DL.AAC2.0.HLG.H.265-GRP",
expect: { webSource: "BBC iPlayer" },
},
{
id: "M6b",
input: "Some Anime S01E02 2022 1080p B-Global WEB-DL X264 AAC-AnimeS@ADWeb[2022年10月新番]",
expect: { webSource: "B-Global", titleEn: "Some Anime" },
},
{
id: "M7",
input: "Sense8 S2E1 2015-2017 1080P WEB-DL X265 AC3£cXcY@FRDS",
expect: { group: "cXcY@FRDS", audio: ["AC3"] },
},
{
id: "M7b",
input: "指环王三部曲合集 The Lord of the Rings Trilogy 2001-2003 Extended 2160p UHD BluRay REMUX",
expect: { titleCn: "指环王三部曲" },
},
{
id: "DISC",
input: "Some.Movie.2021.1080p.Blu-ray.AVC.DTS-HD.MA.5.1-GRP",
expect: { source: "BluRay-Disc", isEncode: false },
},
{ id: "DISC-x264", input: "Some.Movie.2021.1080p.BluRay.AVC.x264-GRP", expect: { source: "BluRay", isEncode: true } },
{ id: "DISC-rip", input: "Some.Movie.2021.1080p.BDRip.AVC-GRP", expect: { source: "BluRay", isEncode: true } },
{
id: "SUB-latin",
input: "Oppenheimer.2023.2160p.BluRay.x265-GRP",
subtitle: "奥本海默 CHS/ENG",
expect: { subtitles: ["zh-Hans"] },
},
{
id: "SUB-size",
input: "Oppenheimer.2023.2160p.BluRay.x265-GRP",
subtitle: "奥本海默 60 GB",
expect: { subtitles: undefined },
},
];
describe("MP 差分补迁写法", () => {
for (const s of MP_PARITY) {
it(`${s.id} ${s.input}`, () => check(parseRelease(s.input, s.subtitle ? { subtitle: s.subtitle } : {}), s.expect));
}
it("父目录只有日期不把电影合并成剧集", () => {
const r = parseReleasePath(
"/movies/Mixed.Collection.20240501.FRDS/12.Years.a.Slave.2013.BluRay.1080p.x265-FRDS/12.Years.a.Slave.2013.BluRay.1080p.x265-FRDS.mkv",
);
expect(r.mediaTypeHint).toBe("unknown");
});
});
describe("parseRelease 样本表", () => {
it("样本数量 ≥ 60", () => {
expect(TITLES.length).toBeGreaterThanOrEqual(60);