// DER W-2-BEWEIS: ein voller, verlustfreier Rip der eingelegten Disc am // echten Laufwerk — dauert 30–90 Minuten. Läuft nur auf Verlangen: // // RIPPY_MESSUNG_RIP=1 RIPPY_MESSUNG_ZIEL= \ // npx vitest run test/messung.rip.test.ts --reporter=verbose // // Fortschritt wird in 5-%-Schritten geloggt; das Ergebnis nennt Dateien // und Größen. Das Protokoll wandert in den SAVEPOINT (beweisen statt // behaupten). import { statSync } from 'node:fs' import { describe, expect, it } from 'vitest' const messen = process.env.RIPPY_MESSUNG_RIP === '1' && process.platform === 'win32' const zielWurzel = process.env.RIPPY_MESSUNG_ZIEL ?? '' describe.skipIf(!messen)('Voller Rip am echten Laufwerk', () => { it('rippt die eingelegte Disc verlustfrei', { timeout: 3 * 60 * 60 * 1000 }, async () => { expect(zielWurzel.length, 'RIPPY_MESSUNG_ZIEL fehlt').toBeGreaterThan(0) const { finden } = await import('../src/kern/werkzeuge/katalog') const { rippen } = await import('../src/kern/rip/makemkv') const { win32Api } = await import('../src/kern/laufwerk/win32') const { listOptischeLaufwerke } = await import('../src/kern/laufwerk/disc') const programm = finden('makemkv') expect(programm.length).toBeGreaterThan(0) const geraete = listOptischeLaufwerke(win32Api()) expect(geraete.length).toBeGreaterThan(0) const start = Date.now() let letzteStufe = -5 const ergebnis = await rippen({ programm, geraetepfad: geraete[0], zielOrdner: zielWurzel, titel: 'all', aufFortschritt: (prozent) => { if (prozent >= letzteStufe + 5) { letzteStufe = prozent const minuten = ((Date.now() - start) / 60000).toFixed(1) console.log(`RIP-FORTSCHRITT ${prozent}% nach ${minuten}min`) } }, aufMeldung: (code, text) => { // Nur die tragenden Meldungen — sonst wird das Protokoll unlesbar. if (code >= 5000 || text.includes('errors') || text.includes('gesichert') || text.includes('saved')) { console.log(`RIP-MSG ${code}: ${text}`) } }, }) const minuten = ((Date.now() - start) / 60000).toFixed(1) if (ergebnis.status === 'success') { console.log(`RIP-ERGEBNIS success nach ${minuten}min · lesefehler=${ergebnis.lesefehler}`) for (const datei of ergebnis.dateien) { console.log(`RIP-DATEI ${datei} · ${(statSync(datei).size / 1e9).toFixed(2)} GB`) } } else { console.log(`RIP-ERGEBNIS ${ergebnis.status} nach ${minuten}min: ${'fehler' in ergebnis ? ergebnis.fehler : ''}`) } expect(ergebnis.status).toBe('success') }) }) describe.skipIf(messen)('Rip-Messung übersprungen', () => { it('läuft nur mit RIPPY_MESSUNG_RIP=1 unter Windows', () => { expect(true).toBe(true) }) })