feat(scrape): 多集文件写多个 episodedetails 块,综艺日期期数按播出日期对集
- 多集文件(文件名 E01-E02 或覆盖多个集单元)按 Kodi 约定在一个 NFO 里每集写一块,MP 只写首集,偏离登记在 nfo-deviations.json; - 综艺按日期命名的期数按本地季表或 TMDB 季详情的播出日期对上集,写季号、集号与 aired,不再 scrape_no_episode 跳过; - 认不出集号、集数待确认的跳过让记录记部分完成(已存在 / 没变 / 被人改过仍算完成)。 Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
This commit is contained in:
1 parent
0085e45ca7
commit
8c4c7d028a
8 files changed
+513
-61
No files matched your search
@@ -3,6 +3,7 @@ import {
|
||||
episodeNfo,
|
||||
inferWorkDir,
|
||||
isSeasonDirName,
|
||||
multiEpisodeNfo,
|
||||
planScrapeTargets,
|
||||
scrapeKindOf,
|
||||
seasonNfo,
|
||||
@@ -255,3 +256,37 @@ describe("作品类型 → 刮削类型", () => {
|
||||
expect(["movie", "collection", "other"].map(scrapeKindOf)).toEqual(["movie", "movie", "movie"]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("多集文件", () => {
|
||||
it("集 NFO 每集一个 <episodedetails> 块,只有一个 XML 声明;一集时与 episodeNfo 相同", () => {
|
||||
const xml = multiEpisodeNfo([
|
||||
{ season: 1, episode: 1, title: "上", airDate: "2022-02-17" },
|
||||
{ season: 1, episode: 2, title: "下", airDate: "2022-02-17" },
|
||||
]);
|
||||
expect(xml.match(/<\?xml /g)).toHaveLength(1);
|
||||
expect(xml.match(/<episodedetails>/g)).toHaveLength(2);
|
||||
expect(xml).toContain(" <title>上</title>\n <aired>2022-02-17</aired>");
|
||||
expect(xml.indexOf("<episode>1</episode>")).toBeLessThan(xml.indexOf("<episode>2</episode>"));
|
||||
const one = { season: 1, episode: 3, title: "单集" };
|
||||
expect(multiEpisodeNfo([one])).toBe(episodeNfo(one));
|
||||
});
|
||||
|
||||
it("布局:多集文件只写一个 NFO(按视频名)与首集剧照,目标带全部集号", () => {
|
||||
const t = planScrapeTargets({
|
||||
kind: "tv",
|
||||
workDir: "剧 (2020)",
|
||||
videos: [{ path: "剧 (2020)/Season 1/剧 - S01E01-E02.mkv", season: 1, episode: 1, episodes: [2, 1] }],
|
||||
images: { stills: new Map([["1:1", "/e1.jpg"]]) },
|
||||
options: { images: true, episodeThumbs: true },
|
||||
parts: { work: false, season: false },
|
||||
});
|
||||
expect(t).toEqual([
|
||||
expect.objectContaining({
|
||||
role: "episode_nfo",
|
||||
path: "剧 (2020)/Season 1/剧 - S01E01-E02.nfo",
|
||||
episodes: [1, 2],
|
||||
}),
|
||||
expect.objectContaining({ role: "episode_thumb", path: "剧 (2020)/Season 1/剧 - S01E01-E02-thumb.jpg" }),
|
||||
]);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user