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
+49 -1
View File
@@ -4,7 +4,7 @@
// gewollt UND HandBrake da, sonst VERSCHIEBEN; ein Kompressions-Fehler
// lässt den verlustfreien Rip STEHEN und sagt wo er liegt; Sprachen je
// Datei erreichen HandBrake; Folgen von Hand schlagen die Laufzeit-Raterei.
import { existsSync, mkdirSync, mkdtempSync, readdirSync, rmSync, writeFileSync } from 'node:fs'
import { existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
import { afterEach, describe, expect, it, vi } from 'vitest'
@@ -299,3 +299,51 @@ describe('komprimierenUndAblegen', () => {
expect(prozente).toContain(87)
})
})
describe('Wiederholen ersetzt die alte Fassung', () => {
it('Serie: die alten S01E03/E04 fallen erst nach dem Encode, dann greift die Umbenennung', async () => {
const { ablage, roh, dateien } = aufbau(['title_t00.mkv', 'title_t01.mkv'], ['folge', 'folge'])
const ziel = join(ablage, 'Serien', 'Spartacus', 'Season 01')
mkdirSync(ziel, { recursive: true })
const alt3 = join(ziel, 'Spartacus S01E03.mkv')
const alt4 = join(ziel, 'Spartacus S01E04.mkv')
writeFileSync(alt3, 'alt')
writeFileSync(alt4, 'alt')
const ergebnis = await komprimierenUndAblegen(
auftrag({
rohOrdner: roh,
dateien,
zuordnung: zuordnung('tv', 'Spartacus', 2010),
staffel: 1,
ersteFolge: 3,
zielOrdner: ziel,
ersetzt: [alt3, alt4],
}),
umgebung(ablage),
() => {},
KEIN_ABBRUCH,
)
expect(ergebnis.status).toBe('fertig')
expect(readdirSync(ziel).filter((n) => n.endsWith('.mkv')).sort()).toEqual(['Spartacus S01E03.mkv', 'Spartacus S01E04.mkv'])
expect(readFileSync(alt3, 'utf8')).toBe('encoded')
expect(ergebnis.hinweise.join(' ')).toContain('Alte Fassung ersetzt')
expect(ergebnis.hinweise.join(' ')).not.toContain('existiert schon')
})
it('scheitert der zweite Lauf, bleibt die alte Fassung stehen', async () => {
hb.ergebnis = 'error'
const { ablage, roh, dateien } = aufbau(['title_t00.mkv'])
const ziel = join(ablage, 'Filme', 'Akira (1988)')
mkdirSync(ziel, { recursive: true })
const alt = join(ziel, 'title_t00.mkv')
writeFileSync(alt, 'alt')
const ergebnis = await komprimierenUndAblegen(
auftrag({ rohOrdner: roh, dateien, zuordnung: zuordnung('movie', 'Akira', 1988), zielOrdner: ziel, ersetzt: [alt] }),
umgebung(ablage),
() => {},
KEIN_ABBRUCH,
)
expect(ergebnis.status).toBe('fehler')
expect(readFileSync(alt, 'utf8')).toBe('alt')
})
})