v1.7.151 Review-Findings nachgepflegt: 3 Edge-Cases entschaerft

Independent code review fand drei echte Probleme an v1.7.151:

(a) File-stability check bei Clock-Skew rueckwaerts:
   negative ageMs (mtime in der Zukunft, z.B. NTP-Korrektur, VM-Resume)
   wurde von "ageMs < 2000" als "frisch" interpretiert → Datei stuck
   bis Clock aufschliesst. Fix: ageMs >= 0 zusaetzlich pruefen — negativ
   = "definitiv stabil".

(c) Suffix-Loop koennte Source-File als Resolved-Target waehlen:
   wenn Source schon "<base>.2.mkv" heisst und das Original "<base>.mkv"
   anderswo existiert, koennte die .2/.3-Loop sich selbst auswaehlen.
   Fix: pathKey-Vergleich gegen sourcePath im Loop, springt weiter.

(f) xX-Format matched x264/x265/x266 Codec-Tokens:
   "5x265.x265.mkv" wurde als S05E265 interpretiert.
   "Movie.x264-GROUP.mkv" konnte phantome Episode triggern.
   Fix: zweite Number-Group auf \d{1,2} (max 99) gecapped + negativer
   Lookahead [\dx] dahinter. 3-stellige xX-Episoden (sehr selten) gehen
   verloren — moderne SxxEnnn deckt das ab. Schutz gegen alle gaengigen
   Codecs (x264/265/266, h264/265) und Aspect-Ratios (1920x1080).

Tests: neue assertions fuer x264/x265/aspect-ratio + 10x99 vs 10x100.
591/591 gruen.
This commit is contained in:
Sucukdeluxe
2026-04-22 02:25:10 +02:00
parent c9d4e69bea
commit 7f7bcf8ab2
2 changed files with 38 additions and 5 deletions
+21 -2
View File
@@ -59,10 +59,15 @@ describe("looksLikeObfuscatedSceneFileName", () => {
});
describe("extractEpisodeToken (extended formats)", () => {
it("recognizes the older xX format", () => {
it("recognizes the older xX format (capped at 2 episode digits)", () => {
expect(extractEpisodeToken("show.1x01.720p.mkv")).toBe("S01E01");
expect(extractEpisodeToken("Show.Name.10x100.mkv")).toBe("S10E100");
expect(extractEpisodeToken("show-2x05-hdtv.mkv")).toBe("S02E05");
expect(extractEpisodeToken("Show.Name.10x99.mkv")).toBe("S10E99");
// 3-digit episode in xX format is intentionally NOT supported — would
// collide with codec tokens (x264/x265/x266). 3-digit episodes still
// work in the modern SxxEnnn format which has explicit S/E delimiters.
expect(extractEpisodeToken("Show.Name.10x100.mkv")).toBeNull();
expect(extractEpisodeToken("Show.Name.S10E100.mkv")).toBe("S10E100");
});
it("does not falsely match resolution tokens like 1080x720", () => {
@@ -71,6 +76,20 @@ describe("extractEpisodeToken (extended formats)", () => {
expect(extractEpisodeToken("show.1080p.mkv")).toBeNull();
expect(extractEpisodeToken("show.S01E01.1080p.mkv")).toBe("S01E01");
});
it("does not falsely match codec tokens like x264 / x265 (caps episode digits)", () => {
// First number 5, second number capped to 2 digits → "5x265" CANNOT
// match because 265 has 3 digits. Same for x264, x266, h264, h265.
expect(extractEpisodeToken("Movie.x264-GROUP.mkv")).toBeNull();
expect(extractEpisodeToken("Movie.5x265.x265.mkv")).toBeNull();
// SxxExx still wins ahead of phantom xX matches.
expect(extractEpisodeToken("Show.S01E01.x265-GROUP.mkv")).toBe("S01E01");
});
it("does not falsely match common aspect ratios like 1920x1080", () => {
// 1920 has 4 digits, first group capped at 2 → no match.
expect(extractEpisodeToken("Movie.1920x1080.mkv")).toBeNull();
});
});
describe("extractEpisodeToken", () => {