// DER W-3-BEWEIS: kompletter Encode einer echten Roh-MKV plus Ablage in // echter Jellyfin-Struktur (Ordner „ (Jahr)" + movie.nfo). Läuft // nur auf Verlangen und dauert je nach Material 20 min bis Stunden: // // RIPPY_MESSUNG_ENCODE=1 RIPPY_MESSUNG_MKV= \ // RIPPY_MESSUNG_ABLAGE= RIPPY_MESSUNG_TITEL= \ // RIPPY_MESSUNG_JAHR= [RIPPY_MESSUNG_PRESET=] \ // npx vitest run test/messung.encode-voll.test.ts --reporter=verbose import { existsSync, mkdirSync, statSync, writeFileSync } from 'node:fs' import { win32 as pfad } from 'node:path' import { describe, expect, it } from 'vitest' const messen = process.env.RIPPY_MESSUNG_ENCODE === '1' && process.platform === 'win32' const rohMkv = process.env.RIPPY_MESSUNG_MKV ?? '' const ablageBasis = process.env.RIPPY_MESSUNG_ABLAGE ?? '' const titel = process.env.RIPPY_MESSUNG_TITEL ?? 'Unbenannt' const jahr = process.env.RIPPY_MESSUNG_JAHR ?? '' const preset = process.env.RIPPY_MESSUNG_PRESET ?? 'H.265 MKV 1080p30' describe.skipIf(!messen)('Voller Encode + Ablage am echten System', () => { it('komprimiert und legt nach Jellyfin-Schema ab', { timeout: 8 * 60 * 60 * 1000 }, async () => { expect(rohMkv.length, 'RIPPY_MESSUNG_MKV fehlt').toBeGreaterThan(0) expect(existsSync(rohMkv), `${rohMkv} fehlt`).toBe(true) expect(ablageBasis.length, 'RIPPY_MESSUNG_ABLAGE fehlt').toBeGreaterThan(0) const { finden } = await import('../src/kern/werkzeuge/katalog') const { komprimieren } = await import('../src/kern/komprimieren/handbrake') const { zielordner } = await import('../src/kern/ablage/struktur') const { baueNfo } = await import('../src/kern/ablage/nfo') const programm = finden('handbrake') expect(programm.length).toBeGreaterThan(0) const ordner = zielordner(ablageBasis, titel, jahr.length > 0 ? jahr : null, 'v5-beweis') mkdirSync(ordner, { recursive: true }) const ausgabe = pfad.join(ordner, pfad.basename(ordner) + '.mkv') console.log(`ENCODE-START ${rohMkv} → ${ausgabe} · Preset „${preset}"`) const start = Date.now() let letzteStufe = -5 const ergebnis = await komprimieren({ programm, eingabe: rohMkv, ausgabe, preset, audioSprachen: ['deu', 'eng'], aufFortschritt: (prozent) => { if (prozent >= letzteStufe + 5) { letzteStufe = prozent console.log(`ENCODE-FORTSCHRITT ${prozent}% nach ${((Date.now() - start) / 60000).toFixed(1)}min`) } }, }) const minuten = ((Date.now() - start) / 60000).toFixed(1) if (ergebnis.status !== 'success') { console.log(`ENCODE-ERGEBNIS ${ergebnis.status} nach ${minuten}min: ${'fehler' in ergebnis ? ergebnis.fehler : ''}`) } expect(ergebnis.status).toBe('success') if (ergebnis.status !== 'success') return const rohGb = statSync(rohMkv).size / 1e9 const fertigGb = statSync(ergebnis.ausgabe).size / 1e9 console.log( `ENCODE-ERGEBNIS success nach ${minuten}min · ${rohGb.toFixed(2)} GB → ${fertigGb.toFixed(2)} GB` + (ergebnis.hinweis !== undefined ? ` · ${ergebnis.hinweis}` : ''), ) const nfoPfad = pfad.join(ordner, 'movie.nfo') writeFileSync(nfoPfad, baueNfo({ quelle: 'Rippy v5 W-3-Beweis' }, titel, jahr.length > 0 ? jahr : null)) console.log(`ABLAGE-FERTIG ${ordner} (movie.nfo + ${pfad.basename(ergebnis.ausgabe)})`) expect(existsSync(nfoPfad)).toBe(true) expect(fertigGb).toBeGreaterThan(0.05) }) }) describe.skipIf(messen)('Encode-Messung übersprungen', () => { it('läuft nur mit RIPPY_MESSUNG_ENCODE=1 unter Windows', () => { expect(true).toBe(true) }) })