v1.7.156 HOTFIX: MKV-Collection loescht keine pending Archive im outputDir mehr
KRITISCHER Datenverlust-Fix (Regression aus v1.7.154): collectMkvFilesToLibrary lief seit v1.7.154 mit einem Cleanup-Loop ueber BEIDE Source-Dirs (extractDir + outputDir). cleanupNonMkvResidualFiles loescht alle Nicht-Video-Dateien — auf dem outputDir traf das auch die RAR-Archive. Bei Multi-Archive-Set-Paketen (z.B. S01 + S02 RARs im selben outputDir) wurde nach dem Extrahieren von S01 die MKV-Collection getriggert, die dann die noch nicht entpackten S02-RAR-Parts als "Restdateien" loeschte. Folge: S02 ging verloren (missing_file beim spaeteren Extract). Fix: Destruktiver Cleanup (Restdateien + leere Ordner) laeuft jetzt NUR noch auf dem cleanupDir: - autoExtract=true -> extractDir (entpackter Inhalt, fertig verarbeitet) - autoExtract=false -> outputDir (kein Extract, finaler Inhalt) Der outputDir wird bei autoExtract=true nie hier aufgeraeumt — das macht die separate Archive-Cleanup-Pipeline mit Extraktions-Guards. Das MKV-Scannen beider Dirs (v1.7.154 Mega-Direct-.mkv) bleibt erhalten, nur der Cleanup ist eingegrenzt. Regressionstest verifiziert: 2 RAR-Sets im outputDir, S01-MKVs in extractDir -> collectMkvFilesToLibrary darf S02-RARs nicht loeschen. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
dfab5e0cb4
commit
ceda9817f8
@@ -4654,6 +4654,21 @@ export class DownloadManager extends EventEmitter {
|
||||
return;
|
||||
}
|
||||
|
||||
// CLEANUP-DIR: NUR dieser Ordner darf nach dem Move destruktiv aufgeraeumt
|
||||
// werden (Restdateien loeschen + leere Ordner entfernen).
|
||||
// - autoExtract=true -> extractDir (entpackter Inhalt, fertig verarbeitet)
|
||||
// - autoExtract=false -> outputDir (kein Extract, das ist der finale Inhalt)
|
||||
//
|
||||
// WICHTIG: Bei autoExtract=true wird der outputDir NICHT hier aufgeraeumt!
|
||||
// Dort liegen die RAR-Archive, die von der separaten Archive-Cleanup-Pipeline
|
||||
// (mit Extraktions-Guards) verwaltet werden. Ein blindes Loeschen aller
|
||||
// Nicht-Video-Dateien im outputDir wuerde noch nicht entpackte Archive-Sets
|
||||
// anderer Staffeln/Items zerstoeren (Regression v1.7.154, gefixt v1.7.156).
|
||||
const cleanupDirCandidate = this.settings.autoExtract ? pkg.extractDir : pkg.outputDir;
|
||||
const cleanupDir = (cleanupDirCandidate && sourceDirs.some(
|
||||
(d) => path.resolve(d).toLowerCase() === path.resolve(cleanupDirCandidate).toLowerCase()
|
||||
)) ? cleanupDirCandidate : null;
|
||||
|
||||
try {
|
||||
await fs.promises.mkdir(targetDir, { recursive: true });
|
||||
} catch (error) {
|
||||
@@ -4830,19 +4845,16 @@ export class DownloadManager extends EventEmitter {
|
||||
}
|
||||
}
|
||||
|
||||
if (sourceArtifactsChanged || sourceCleanupRelevant) {
|
||||
// Cleanup pro Source-Dir — beide können Restdateien hinterlassen haben
|
||||
// (Mega-Direct .mkv weg aus outputDir, oder extracted .mkv weg aus extractDir).
|
||||
for (const dir of sourceDirs) {
|
||||
if (!await this.existsAsync(dir)) continue;
|
||||
const removedResidual = await this.cleanupNonMkvResidualFiles(dir, targetDir);
|
||||
if (removedResidual > 0) {
|
||||
logger.info(`MKV-Sammelordner entfernte Restdateien: pkg=${pkg.name}, dir=${dir}, entfernt=${removedResidual}`);
|
||||
}
|
||||
const removedDirs = await this.removeEmptyDirectoryTree(dir);
|
||||
if (removedDirs > 0) {
|
||||
logger.info(`MKV-Sammelordner entfernte leere Ordner: pkg=${pkg.name}, dir=${dir}, entfernt=${removedDirs}`);
|
||||
}
|
||||
if ((sourceArtifactsChanged || sourceCleanupRelevant) && cleanupDir && await this.existsAsync(cleanupDir)) {
|
||||
// NUR cleanupDir aufraeumen — niemals den outputDir bei autoExtract=true,
|
||||
// sonst werden noch nicht entpackte Archive-Sets geloescht (s.o.).
|
||||
const removedResidual = await this.cleanupNonMkvResidualFiles(cleanupDir, targetDir);
|
||||
if (removedResidual > 0) {
|
||||
logger.info(`MKV-Sammelordner entfernte Restdateien: pkg=${pkg.name}, dir=${cleanupDir}, entfernt=${removedResidual}`);
|
||||
}
|
||||
const removedDirs = await this.removeEmptyDirectoryTree(cleanupDir);
|
||||
if (removedDirs > 0) {
|
||||
logger.info(`MKV-Sammelordner entfernte leere Ordner: pkg=${pkg.name}, dir=${cleanupDir}, entfernt=${removedDirs}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user