fix(v5): Neu komprimieren ersetzt die alte Fassung — erst wenn die neue fertig ist
Ampel / ampel (push) Successful in 1m31s

Bei Serien stand die alte S01E03.mkv der Umbenennung im Weg (existiert
schon), bei Filmen ueberschrieb HandBrake stumm. Jetzt traegt der
Wiederholungs-Auftrag die alten fertigen Dateien (ersetzt) und loescht
sie NACH dem Encode; scheitert der zweite Lauf, bleibt die erste Fassung.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-09-01 22:30:07 +02:00
co-authored by Claude Fable 5.1
parent 6555562a4c
commit 2c74dc6958
5 changed files with 75 additions and 3 deletions
+14
View File
@@ -252,6 +252,20 @@ export async function komprimierenUndAblegen(
if (datei.rolle === 'folge') folgenSekunden.push(datei.dauerS)
}
// ── Wiederholen: die alte Fassung weicht der neuen — JETZT erst, da alle
// neuen Dateien da sind. Vorher hätte ein gescheiterter Lauf die
// erste Fassung gekostet; danach stünde sie bei Serien der
// Umbenennung im Weg („existiert schon"). ────────────────────────
for (const alt of auftrag.ersetzt ?? []) {
if (fertigeDateien.includes(alt) || !existsSync(alt)) continue
try {
unlinkSync(alt)
hinweise.push(`Alte Fassung ersetzt: ${basename(alt)}`)
} catch (fehler) {
hinweise.push(`Alte Fassung nicht gelöscht (${basename(alt)}): ${String(fehler)}`)
}
}
// ── Serien-Staffelablage (§ 4.2) ────────────────────────────────────
// Von Hand gesetzte Folgen („ab Folge 3") schlagen die Laufzeit-
// Zuordnung; TMDb darf dann nur noch warnen. Ohne Vorgabe wird
+6
View File
@@ -45,6 +45,11 @@ export interface KompressionsAuftrag {
* Fassung ersetzt die alte, statt einen zweiten Ordner anzulegen.
* '' = Zielordner wird frisch bestimmt. */
zielOrdner: string
/** Beim Wiederholen: die fertigen Dateien des ERSTEN Durchlaufs. Sie
* werden gelöscht, sobald die neuen fertig sind — vorher nicht, damit
* ein gescheiterter zweiter Lauf die erste Fassung nicht kostet. Bei
* Serien stünden sie sonst der Umbenennung im Weg („existiert schon"). */
ersetzt?: string[]
}
export function auftragZuJson(auftrag: KompressionsAuftrag): string {
@@ -94,6 +99,7 @@ export function auftragAusJson(text: string): KompressionsAuftrag | null {
begonnen: typeof a.begonnen === 'string' ? a.begonnen : '',
preset: typeof a.preset === 'string' ? a.preset : '',
zielOrdner: typeof a.zielOrdner === 'string' ? a.zielOrdner : '',
ersetzt: Array.isArray(a.ersetzt) ? a.ersetzt.map(String) : [],
}
}
+5 -2
View File
@@ -734,12 +734,15 @@ function vorgangNeuKomprimieren(vorgangId: string, preset: string): void {
if (vorhandene.length < auftrag.dateien.length) {
hinweis(`${v.titel}": ${auftrag.dateien.length - vorhandene.length} Roh-Datei(en) fehlen — der Rest wird komprimiert.`)
}
const alteFassung = v.phase === 'fertig' && v.zielOrdner.length > 0 && existsSync(v.zielOrdner)
const neu = {
...auftrag,
dateien: vorhandene,
preset,
// Die neue Fassung ersetzt die alte im selben Ordner.
zielOrdner: v.phase === 'fertig' && v.zielOrdner.length > 0 && existsSync(v.zielOrdner) ? v.zielOrdner : '',
// Die neue Fassung ersetzt die alte im selben Ordner — die alten
// Dateien fallen erst, wenn die neuen fertig sind (ablegen.ts).
zielOrdner: alteFassung ? v.zielOrdner : '',
ersetzt: alteFassung ? dateienAusJson(v.fertigeDateien) : [],
}
db?.vorgangAktualisieren(vorgangId, { phase: 'wartet', fehler: '', auftrag: auftragZuJson(neu) })
const platz = warteschlange.einreihen(neu, v.titel)