// Tests des HandBrake-Scans (kern/komprimieren/scan.ts, 5.4.0) — am // gemessenen Format: „JSON Title Set:" + Objekt + weiterer Text. import { describe, expect, it } from 'vitest' import { buildScanArgs, fehlendeSprachen, spurenAusScan } from '../src/kern/komprimieren/scan' import { regelAusQuery, RIPPY_REGEL } from '../src/kern/werkzeuge/spurauswahl' const AUSGABE = `[21:27:54] hb_init: starting libhb thread Scanning title 1 of 1, preview 1, 25.00 % JSON Title Set: { "MainFeature": 0, "TitleList": [ { "AudioList": [ { "Description": "\u65e5\u672c\u8a9e (AAC LC, 2.0 ch)", "Language": "\u65e5\u672c\u8a9e", "LanguageCode": "jpn", "TrackNumber": 1 }, { "Description": "Deutsch (AAC LC, 2.0 ch)", "Language": "Deutsch", "LanguageCode": "deu", "TrackNumber": 2 }, { "Description": "English (AAC LC, 2.0 ch)", "Language": "English", "LanguageCode": "eng", "TrackNumber": 3 } ], "Duration": { "Hours": 0, "Minutes": 52, "Seconds": 47, "Ticks": 542070 }, "Index": 1, "Name": "quelle", "SubtitleList": [ { "Format": "text", "Language": "Deutsch (UTF-8)", "LanguageCode": "deu", "SourceName": "UTF-8", "TrackNumber": 1 }, { "Format": "text", "Language": "English (UTF-8)", "LanguageCode": "eng", "SourceName": "UTF-8", "TrackNumber": 2 } ] } ] } HandBrake has exited. ` describe('spurenAusScan', () => { it('schneidet das Objekt aus dem Textprotokoll und liest Spuren + Dauer', () => { const s = spurenAusScan(AUSGABE)! expect(s.audio.map((a) => `${a.nr}:${a.lang}`)).toEqual(['1:jpn', '2:deu', '3:eng']) expect(s.untertitel.map((u) => u.lang)).toEqual(['deu', 'eng']) expect(s.dauerS).toBe(52 * 60 + 47) }) it('ohne Marke oder mit kaputtem JSON: null, nie ein leerer Befund', () => { expect(spurenAusScan('nichts')).toBeNull() expect(spurenAusScan('JSON Title Set: { "TitleList": [ ')).toBeNull() expect(spurenAusScan('JSON Title Set: { "TitleList": [] }')).toBeNull() }) it('buildScanArgs: --scan --json, Titel 1', () => { expect(buildScanArgs('R:\\roh\\a.mkv')).toEqual(['--scan', '--json', '--input', 'R:\\roh\\a.mkv', '--title', '1']) }) }) describe('fehlendeSprachen', () => { it('nennt, was gewünscht ist und nicht drin', () => { const s = spurenAusScan(AUSGABE)! expect(fehlendeSprachen(s, { audio: ['jpn', 'fra'], untertitel: ['deu', 'jpn'] })).toEqual({ audio: ['fra'], untertitel: ['jpn'] }) expect(fehlendeSprachen(s, { audio: [], untertitel: [] })).toEqual({ audio: [], untertitel: [] }) }) }) describe('MakeMKV-Auswahlregel — reg query lesen', () => { it('findet den Wert in der Ausgabe', () => { const ausgabe = `\r\nHKEY_CURRENT_USER\\Software\\MakeMKV\r\n app_DefaultSelectionString REG_SZ ${RIPPY_REGEL}\r\n\r\n` expect(regelAusQuery(ausgabe)).toBe(RIPPY_REGEL) expect(regelAusQuery('FEHLER: Der angegebene Registrierungsschlüssel oder Wert wurde nicht gefunden.')).toBeNull() }) })