70 lines
3.1 KiB
TypeScript
70 lines
3.1 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
decodeSubtitle,
|
|
detectSubtitleLanguage,
|
|
isSidecarOf,
|
|
pairSubtitle,
|
|
subtitleEpisode,
|
|
subtitleExtOf,
|
|
subtitleFileName,
|
|
} from "../src/index.ts";
|
|
|
|
const srt = (lines: string[]) =>
|
|
lines.map((l, i) => `${i + 1}\n00:00:0${i},000 --> 00:00:0${i},500\n${l}\n`).join("\n");
|
|
|
|
describe("补字幕:识别", () => {
|
|
it("扩展名", () => {
|
|
expect(subtitleExtOf("a.ASS")).toBe("ass");
|
|
expect(subtitleExtOf("a.mkv")).toBeNull();
|
|
});
|
|
|
|
it("编码:UTF-8 BOM、GB18030", () => {
|
|
expect(decodeSubtitle(new Uint8Array([0xef, 0xbb, 0xbf, 0x61])).text).toBe("a");
|
|
// 「你好」的 GB18030 编码
|
|
const gb = new Uint8Array([0xc4, 0xe3, 0xba, 0xc3]);
|
|
expect(decodeSubtitle(gb)).toMatchObject({ text: "你好", encoding: "gb18030" });
|
|
});
|
|
|
|
it("语言:文件名标签优先,其次内容;中英双语、繁体按字形", () => {
|
|
expect(detectSubtitleLanguage("Show.S01E01.cht.ass", "")).toBe("zh-Hant");
|
|
expect(detectSubtitleLanguage("Show.S01E01.srt", srt(Array(30).fill("我们这个时候说的话")))).toBe("zh-Hans");
|
|
expect(detectSubtitleLanguage("Show.S01E01.srt", srt(Array(30).fill("我們這個時候說的話")))).toBe("zh-Hant");
|
|
expect(
|
|
detectSubtitleLanguage("Show.S01E01.srt", srt(Array(30).fill("我们这个时候 What are you doing over there"))),
|
|
).toBe("zh-Hans&en");
|
|
expect(detectSubtitleLanguage("Show.S01E01.srt", srt(Array(60).fill("What are you doing over there")))).toBe("en");
|
|
expect(detectSubtitleLanguage("[SweetSub] Frieren [03][CHS&JPN].ass", "")).toBe("zh&ja");
|
|
});
|
|
|
|
it("季集:SxxEyy、第N集;季号推断标记", () => {
|
|
expect(subtitleEpisode("Severance.S02E05.zh-cn.srt")).toEqual({ season: 2, seasonInferred: false, episode: 5 });
|
|
expect(subtitleEpisode("第05集.srt")).toMatchObject({ episode: 5, seasonInferred: true });
|
|
expect(subtitleEpisode("Dune.Part.Two.2024.chs.ass").episode).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe("补字幕:配对与命名", () => {
|
|
const tv = [
|
|
{ id: "s1e1", season: 1, episode: 1 },
|
|
{ id: "s1e2", season: 1, episode: 2 },
|
|
{ id: "s2e1", season: 2, episode: 1 },
|
|
];
|
|
it("明确季号按季 + 集;推断季号只在集号唯一时配;电影只有一个目标", () => {
|
|
expect(pairSubtitle({ season: 2, seasonInferred: false, episode: 1 }, tv)).toBe("s2e1");
|
|
expect(pairSubtitle({ season: 1, seasonInferred: true, episode: 1 }, tv)).toBeNull();
|
|
expect(pairSubtitle({ season: 1, seasonInferred: true, episode: 2 }, tv)).toBe("s1e2");
|
|
expect(
|
|
pairSubtitle({ season: null, seasonInferred: true, episode: null }, [{ id: "m", season: null, episode: null }]),
|
|
).toBe("m");
|
|
});
|
|
|
|
it("目标文件名:视频主干 + 整理规则的语言后缀", () => {
|
|
expect(subtitleFileName("Season 1/Show - S01E01 - 1080p.mkv", "zh-Hans", "ass")).toBe(
|
|
"Show - S01E01 - 1080p.chi.zh-cn.ass",
|
|
);
|
|
expect(subtitleFileName("Show.S01E01.mkv", "zh-Hant&en", "srt")).toBe("Show.S01E01.zh-tw.srt");
|
|
expect(subtitleFileName("Movie (2024).mkv", "en", "srt", "en")).toBe("Movie (2024).eng.default.srt");
|
|
expect(isSidecarOf("Show.S01E01.chi.zh-cn.ass", "Show.S01E01.mkv")).toBe(true);
|
|
});
|
|
});
|