Ampel / ampel (push) Successful in 1m25s
FUND 1 — 'Key korrekt, aber als ungueltig angezeigt': Stimmt beides. Live gemessen: Der aktuelle Forum-Key ist in Ordnung, aber MakeMKV 1.18.4 ist ZU ALT fuer ihn — makemkvcon meldet 5020 UND 5021 zusammen, und die alte Pruefung brach beim ersten Code ab und beschuldigte den Schluessel. urteilAusAusgabe sammelt jetzt ALLE Codes (5021 schlaegt 5020, MakeMKV-Version aus MSG 1005 wird mitgelesen) und die Kachel sagt den wahren Satz: 'Der Key ist in Ordnung — MakeMKV 1.18.4 ist zu alt. Rippy hat ihn entfernt, damit der Beta-Modus weiterlaeuft (Rips klappen trotzdem). Abhilfe: MakeMKV aktualisieren.' Neues Feld weiterBetrieb: Beta-Modus ist GELB (Warnung), nicht rot. Test mit der echten Ausgabe als Fixture. FUND 2 — 'Komprimieren auf CPU statt GPU': Der Default 'H.265 MKV 1080p30' ist ein CPU-Preset. Neue GEMESSENE Empfehlung (gemeinsam/preset-empfehlung.ts): aus den echten Backends und der echten Preset-Liste des eigenen HandBrake — VCN vor NVENC vor QSV vor CPU, nur Namen die WIRKLICH in der Liste stehen, HandBrake-Presets deckeln die Aufloesung nur (DVD bleibt SD). Kette: eigene Wahl > allgemeines Preset > Empfehlung > CPU-Default. Auf dem Commander-PC: bluray/dvd -> 'H.265 VCN 1080p', uhd -> 'H.265 VCN 2160p 4K'. Die Preset-Auswahl zeigt 'automatisch: <Empfehlung>' als Leer-Option. FUND 3 — 'keine Alternative waehlbar': 'Aendern …'-Dialog an der Laufwerks-Kachel (§ 5 Schritt 4): TMDb-Suche (Film + Serie, mit Postern), Klick uebernimmt — Nutzer-Wahl gilt als 100 % und steuert Ablage-Ordner, NFO und Poster. Neue Nachrichten metadaten-suchen / zuordnung-setzen / metadaten-vorschlaege. Dazu: Poster in der Laufwerks-Kachel (CSP um image.tmdb.org erweitert), Restzeit-Schaetzung am Fortschritt. 192 Tests gruen, Smoke gruen. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
74 lines
3.0 KiB
TypeScript
74 lines
3.0 KiB
TypeScript
// 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<string, string> = {
|
|
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<string, string | boolean | undefined>
|
|
|
|
/** 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<string, string> = {
|
|
'.mkv': 'av_mkv',
|
|
'.mp4': 'av_mp4',
|
|
'.m4v': 'av_mp4',
|
|
'.mov': 'av_mov',
|
|
'.webm': 'av_webm',
|
|
}
|