Files
rippy/rippy-windows/test/rip-lauf.test.ts
T
HitonabiandClaude Opus 5 eb54c59141
Ampel / ampel (push) Successful in 1m20s
fix(v5): 5.7.1 — Titel lesen wartet, solange MakeMKV arbeitet; Grenze gilt für Stille, Dialog zeigt Schritt, Prozent und Meldung
WAS: Der Info-Lauf verlangt --progress=-same und wertet die Ausgabe
zeilenweise aus (PRGC/PRGT/PRGV/MSG). titelInfoLesen beendet makemkvcon
nur noch, wenn er so lange STILL ist, wie die Einstellung erlaubt
(Vorgabe 15 min) — jede Fortschritts- oder Meldungszeile setzt die Uhr
zurück. Kündigt MakeMKV den VOB-Scan an („IFO-Datei … beschädigt, die
VOB-Datei muss gescannt werden"), gilt nur noch eine Obergrenze von 4 h.
Der Dialog zeigt während des Lesens Schritt, Prozent und letzte Meldung
(titelLaufZwischenstand), beim VOB-Scan mit Erklärung (20–60 min, im
MakeMKV-Programm genauso). Bricht Rippy ab, stehen die letzten acht
Zeilen von makemkvcon im Fehler und im Protokoll. Einstellungs-Text
„Titel lesen — ohne Lebenszeichen höchstens". Tests mit nachgebautem
makemkvcon (redselig über die Stille-Grenze hinaus, stumm, VOB-Scan mit
Obergrenze). Version 5.7.1, Änderungsnotizen.
WARUM: Commander 12.09.2026 spät: „Der Patriot" (DVD, IFO für VTS #1
beschädigt) scheiterte in 5.7.0 erneut nach 15 Minuten, das MakeMKV-
Programm las die Disc fertig — MakeMKV liest bei so einer Disc die ganze
VOB durch, das dauert so lange wie die Disc braucht. Eine feste
Gesamtgrenze ist dafür immer zu kurz; Stille ist das richtige Maß.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 01:04:08 +02:00

75 lines
2.8 KiB
TypeScript

// Tests der Rip-Lauf-Bausteine: Zeilenzerlegung (binär, halbe Zeilen)
// und die Auswertung (Fortschritt, Lesefehler, kritische Ursachen) —
// alles ohne echtes makemkvcon.
import { describe, expect, it } from 'vitest'
import { buildInfoArgs, buildRipArgs, RipAuswertung, ZeilenLeser } from '../src/kern/rip/makemkv'
describe('Kommandobau', () => {
it('info: Robot-Mode ohne Geräte-Scan', () => {
expect(buildInfoArgs('\\\\.\\G:')).toEqual(['-r', '--noscan', '--progress=-same', 'info', 'dev:G:'])
})
it('mkv: Fortschritt in denselben Strom', () => {
expect(buildRipArgs('\\\\.\\G:', 'C:\\ziel', 'all')).toEqual([
'-r',
'--noscan',
'--progress=-same',
'mkv',
'dev:G:',
'all',
'C:\\ziel',
])
})
})
describe('ZeilenLeser — binär, halbe Zeilen bleiben liegen', () => {
it('setzt Zeilen über Stück-Grenzen zusammen', () => {
const leser = new ZeilenLeser()
expect(leser.hinzu(Buffer.from('PRGV:1,2,'))).toEqual([])
expect(leser.hinzu(Buffer.from('65536\r\nMSG:1,0,0,"a"\nRest'))).toEqual([
'PRGV:1,2,65536',
'MSG:1,0,0,"a"',
])
expect(leser.schluss()).toEqual(['Rest'])
})
it('dekodiert jede Zeile einzeln — auch cp1252 mitten im Strom', () => {
const leser = new ZeilenLeser()
const zeilen = leser.hinzu(
Buffer.concat([Buffer.from('MSG:5010,0,0,"Das '), Buffer.from('Öffnen', 'latin1'), Buffer.from('"\n')]),
)
expect(zeilen).toEqual(['MSG:5010,0,0,"Das Öffnen"'])
})
})
describe('RipAuswertung', () => {
it('meldet Fortschritt nur bei Änderung', () => {
const a = new RipAuswertung()
expect(a.verarbeite('PRGV:0,32768,65536')).toEqual({ prozent: 50 })
expect(a.verarbeite('PRGV:0,32769,65536')).toEqual({})
expect(a.verarbeite('PRGV:0,45876,65536')).toEqual({ prozent: 70 })
})
it('erkennt Lesefehler an der sprachfesten URL — auch auf Deutsch', () => {
const a = new RipAuswertung()
a.verarbeite(
'MSG:2003,0,3,"Encountered 29 errors of type \'Read Error\' - see http://www.makemkv.com/errors/read/","f"',
)
expect(a.lesefehler).toBe(true)
})
it('sammelt kritische URSACHEN über die Nummer, nicht den Text', () => {
const a = new RipAuswertung()
a.verarbeite('MSG:5051,0,0,"Der Testzeitraum ist abgelaufen. Erwerben Sie bitte einen Schlüssel"')
a.verarbeite('MSG:5010,0,0,"Das Öffnen der Disk schlug fehl"')
const fehler = a.fehlerText(11, false)
expect(fehler).toContain('Code 11')
expect(fehler).toContain('nicht freigeschaltet')
expect(fehler).toContain('keine MKV-Datei entstanden')
})
it('englische Textmuster bleiben als Rückfall', () => {
const a = new RipAuswertung()
a.verarbeite('MSG:9999,0,0,"AACS volume key is unknown for this disc"')
expect(a.kritischeMeldungen).toHaveLength(1)
})
})