fix(finalizeMedia): scope subtitles to episode baseName and handle empty season/series folder cleanup
Build / Lint & Test (push) Successful in 18s

This commit is contained in:
PickleRick committed 2026-09-30 17:58:19 +02:00
1 parent 86448988ed
commit 30fb556af7
2 files changed
+163 -10

No files matched your search

+76 -1
View File
@@ -130,7 +130,82 @@ async function testCopyAndSubtitles() {
assert(!fs.existsSync(path.join(libraryDir, 'Movie.eng.sdh.default.srt')), 'eng.sdh.default.srt was renamed');
assert(fs.existsSync(path.join(libraryDir, 'Movie.eng.sdh.srt')), 'eng.sdh.srt exists (default stripped)');
console.log('\n=== ALL COPY, MOVE & SUBTITLE TESTS PASSED ===\n');
// 5. Test TV Series: Multi-episode sidecar isolation & empty Season/Series directory cleanup
const stagingRoot = path.join(tmpDir, 'staging');
const seriesSourceDir = path.join(stagingRoot, 'Halo', 'Season 01');
fs.mkdirSync(seriesSourceDir, { recursive: true });
const finalSeasonDir = path.join(tmpDir, 'final_library', 'Halo', 'Season 01');
fs.mkdirSync(finalSeasonDir, { recursive: true });
// In finalSeasonDir, put Episode 1 and Episode 2 with their sidecars
const ep1File = path.join(finalSeasonDir, 'Halo - S01E01.mkv');
const ep2File = path.join(finalSeasonDir, 'Halo - S01E02.mkv');
fs.writeFileSync(ep1File, Buffer.alloc(100));
fs.writeFileSync(ep2File, Buffer.alloc(100));
// Sidecars for Ep1 (to be normalized when Ep1 is finalized)
fs.writeFileSync(path.join(finalSeasonDir, 'Halo - S01E01.ita.forced.srt'), 'ep1 sub');
fs.writeFileSync(path.join(finalSeasonDir, 'Halo - S01E01_chapters.xml'), '<chapters/>');
// Sidecars for Ep2 (should NOT be touched when Ep1 is finalized!)
fs.writeFileSync(path.join(finalSeasonDir, 'Halo - S01E02.eng.forced.default.srt'), 'ep2 sub');
fs.writeFileSync(path.join(finalSeasonDir, 'Halo - S01E02_chapters.xml'), '<chapters ep2/>');
// In source directory, simulate that Ep2 is still waiting in staging
fs.writeFileSync(path.join(seriesSourceDir, 'Halo - S01E02.mkv'), Buffer.alloc(100));
const finalizeEp1Args = {
inputFileObj: {
_id: ep1File,
ffProbeData: { streams: [] },
},
variables: { originalLibraryDir: seriesSourceDir },
inputs: { removeEmptySourceDir: 'true', removeEmptyParentSeriesDir: 'true' },
jobLog: () => {},
};
await finalizePlugin(finalizeEp1Args);
// Ep1 sidecars were processed
assert(fs.existsSync(path.join(finalSeasonDir, 'Halo - S01E01.ita.forced.default.srt')), 'Ep1 subtitle normalized to .default');
assert(fs.existsSync(path.join(finalSeasonDir, 'Halo - S01E01_chapters.xml')), 'Ep1 chapters intact');
// Ep2 sidecars were COMPLETELY UNTOUCHED!
assert(fs.existsSync(path.join(finalSeasonDir, 'Halo - S01E02.eng.forced.default.srt')), 'Ep2 subtitle was untouched when Ep1 was finalized');
assert(fs.existsSync(path.join(finalSeasonDir, 'Halo - S01E02_chapters.xml')), 'Ep2 chapters untouched');
// Source season directory was NOT removed because Ep2 was still in staging
assert(fs.existsSync(seriesSourceDir), 'Source Season 01 directory kept while Ep2 remains');
// Now simulate Ep2 finishing and removing from staging, leaving only a junk file (e.g. Thumbs.db)
fs.unlinkSync(path.join(seriesSourceDir, 'Halo - S01E02.mkv'));
fs.writeFileSync(path.join(seriesSourceDir, 'Thumbs.db'), 'junk');
// Also put a junk file in parent series folder
fs.writeFileSync(path.join(stagingRoot, 'Halo', 'desktop.ini'), 'junk');
const finalizeEp2Args = {
inputFileObj: {
_id: ep2File,
ffProbeData: { streams: [] },
},
variables: { originalLibraryDir: seriesSourceDir },
inputs: { removeEmptySourceDir: 'true', removeEmptyParentSeriesDir: 'true' },
jobLog: () => {},
};
await finalizePlugin(finalizeEp2Args);
// Ep2 subtitle normalized now
assert(fs.existsSync(path.join(finalSeasonDir, 'Halo - S01E02.eng.forced.srt')), 'Ep2 subtitle normalized when Ep2 was finalized');
assert(!fs.existsSync(path.join(finalSeasonDir, 'Halo - S01E02.eng.forced.default.srt')), 'Ep2 default stripped');
// Season 01 and parent Halo directory removed, but stagingRoot (library root) preserved
assert(!fs.existsSync(seriesSourceDir), 'Empty Season 01 directory removed');
assert(!fs.existsSync(path.join(stagingRoot, 'Halo')), 'Empty Series directory removed');
assert(fs.existsSync(stagingRoot), 'Staging root directory preserved');
console.log('\n=== ALL COPY, MOVE, SUBTITLE & SERIES TESTS PASSED ===\n');
} finally {
fs.rmSync(tmpDir, { recursive: true, force: true });
}