// Preset-Wahl je Disc-Typ (KONZEPT § 6.10) — Regeln aus ripping.py, dort // mit den Befunden vom 25.07.2026 begründet: EIN Preset für alles rechnete // 4K auf 1080p herunter und DVDs hinauf. import { DEFAULT_HB_PRESET, presetEmpfehlung } from '../../gemeinsam/preset-empfehlung' export { DEFAULT_HB_PRESET, presetEmpfehlung } /** Einstellungs-Schlüssel je Disc-Typ. */ export const PRESET_SCHLUESSEL: Record = { dvd: 'transcodePresetDvd', bluray: 'transcodePresetBluray', uhd: 'transcodePresetUhd', } // Reservierter Wert: „diesen Typ NICHT komprimieren". Kein echtes // HandBrake-Preset heißt so (gegen alle 90 aus --preset-list geprüft). // Grund: 4K verlustfrei durchreichen, DVDs trotzdem schrumpfen. export const PRESET_KEINE = 'keine' export type Einstellungen = Record /** Soll dieser Disc-Typ nach dem Rip komprimiert werden? (pur) */ export function komprimierenFuer(discTyp: string, einstellungen: Einstellungen): boolean { if (einstellungen['transcodeEnabled'] === false || einstellungen['transcodeEnabled'] === 'false') { return false } const schluessel = PRESET_SCHLUESSEL[discTyp] ?? '' if (schluessel.length > 0) { const wert = String(einstellungen[schluessel] ?? '').trim() if (wert === PRESET_KEINE) return false } return true } /** Welches HandBrake-Preset gilt für diesen Disc-Typ? (pur) * Kette: Typ-Preset → allgemeines transcodePreset → EMPFEHLUNG (gemessen, * Hardware zuerst) → CPU-DEFAULT. PRESET_KEINE wird ÜBERSPRUNGEN — diese * Funktion darf nie „keine" als Preset-Namen liefern, sonst bekäme * HandBrake `--preset keine` und scheiterte. */ export function presetFuer(discTyp: string, einstellungen: Einstellungen, empfehlung = ''): string { const schluessel = PRESET_SCHLUESSEL[discTyp] ?? '' if (schluessel.length > 0) { const eigen = String(einstellungen[schluessel] ?? '').trim() if (eigen.length > 0 && eigen !== PRESET_KEINE) return eigen } const allgemein = String(einstellungen['transcodePreset'] ?? '').trim() if (allgemein.length > 0) return allgemein return empfehlung.length > 0 ? empfehlung : DEFAULT_HB_PRESET } /** „deu, eng , ,DEU" → ["deu","eng"] — HandBrake will ISO-639-2 klein; * ein „DEU" aus einem Eingabefeld soll die Auswahl nicht still lahmlegen. */ export function sprachliste(wert: string | readonly string[] | null | undefined): string[] { if (wert === null || wert === undefined) return [] const teile = typeof wert === 'string' ? wert.split(',') : [...wert] const sauber: string[] = [] for (const teil of teile) { const code = String(teil).trim().toLowerCase() if (code.length > 0 && !sauber.includes(code)) sauber.push(code) } return sauber } /** Endung → HandBrake-Container. Am mitgelieferten HandBrake 1.11.2 * gegengeprüft (`--help`, Abschnitt `-f, --format`). */ export const FORMATE: Record = { '.mkv': 'av_mkv', '.mp4': 'av_mp4', '.m4v': 'av_mp4', '.mov': 'av_mov', '.webm': 'av_webm', }