style: echte Umlaute im ganzen Projekt + Installer im Rippy-Look
Ampel / ampel (push) Successful in 27s
Ampel / ampel (push) Successful in 27s
Commander-Rueckmeldung: Umlaute fehlen. Ausloeser war sichtbar der Installer -
"Diese Maschine uebernimmt die Video-Kompression fuer Rippy" stand woertlich im
Screenshot.
## Die .ps1-Falle war loesbar, nicht unumgehbar
Bisher galt: ausgelieferte .ps1 MUESSEN ASCII sein, weil PowerShell 5.1 sie
ohne BOM als ANSI liest. Das ist nur die halbe Wahrheit - gemessen mit echtem
powershell.exe 5.1:
ohne BOM: $s = "Größe: äöü" + Unerwartetes Token -> Skript kaputt
mit BOM: Groesse: aeoeue + laeuft, Length 16 korrekt
Alle drei Skripte sind jetzt UTF-8 MIT BOM und tragen echte Umlaute; unter 5.1
gegengeprueft (BOM vorhanden, Parser fehlerfrei, Text korrekt gelesen). Der
Kopfkommentar sagt das jetzt richtig statt "ASCII-only".
## Umstellung: Text ja, Bezeichner nein
Umlaute gehoeren in Kommentare und Anzeigetexte, nicht in Funktionsnamen oder
Datenschluessel. Deshalb je Sprache das passende Werkzeug:
- Python: ueber den TOKENIZER - angefasst wurden ausschliesslich COMMENT- und
STRING-Tokens. 156 Stellen. Code ist damit garantiert unberuehrt.
- TypeScript: nur // und /* */ Kommentare sowie JSX-Text (kann per Definition
kein Bezeichner sein). 24 Stellen. `const waehlen`, `let laeuft`, `plaetze`,
`GeraetInfo` sind nachweislich unversehrt.
- install.sh: Anzeigetext, aber die Shell-Funktionen (gruen/rot/gelb/titel) und
der Schalter --nur-pruefen bleiben ASCII - das sind Schnittstellen.
- Markdown: 0 Aenderungen, die Doku hatte schon Umlaute.
ZWEI FEHLER MEINES KONVERTERS, beide von Werkzeugen gefangen:
1. In f-Strings steht in {...} CODE, kein Text. Aus f"{groesse}" wurde
f"{größe}", waehrend die Variable groesse hiess - Ruff meldete F821
"Undefined name". Der Konverter lagert Einsetzungen jetzt aus.
2. Ein Dict-Schluessel wurde umbenannt: die Wortliste enthaelt das PRAEFIX
"uebersprung", der Tabu-Schutz prueft aber ganze Woerter. bericht[...] ist
wieder ASCII - Umlaute in Datenschluesseln brechen JSON-Runden und DB-Felder.
## Installer im Rippy-Look
Statt hellgrau jetzt dieselben Toene wie das Web-UI (aus lib/design.ts
uebernommen): slate-900 Flaeche, dunkle Eingabefelder, Amber-Hauptknopf wie
"Los geht's" im Wizard. Oben ein Kopfbereich mit dem Farbverlauf
amber -> indigo -> purple und dem Disc-Symbol - in WinForms per Paint-Ereignis
gezeichnet, weil es dort keine Verlaeufe von der Stange gibt.
Geprueft, nicht gehofft: Das Fenster wurde headless in ein PNG gerendert
(DrawToBitmap) und angesehen - Verlauf, Symbol, Umlaute und Farben sitzen.
RippyWorkerSetup.exe neu gebaut (57344 -> 60416 Bytes); Umlaute und das
requireAdministrator-Manifest sind in der .exe verifiziert.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -113,7 +113,7 @@ def test_parse_msg_trennt_code_und_klartext():
|
||||
|
||||
def test_parse_msg_liest_die_uhd_fehlermeldung():
|
||||
"""3303 ist der Befund, um den es beim ganzen KEYDB-Thema geht: das
|
||||
Laufwerk laeuft im LibreDrive-Modus, MakeMKV kennt nur den Schluessel
|
||||
Laufwerk läuft im LibreDrive-Modus, MakeMKV kennt nur den Schluessel
|
||||
DIESER Pressung nicht. Ohne diese Zeile im Log raet der Commander."""
|
||||
assert parse_msg(
|
||||
'MSG:3303,16777216,0,"The volume key is unknown for this disc - video can\'t be decrypted","The volume key is unknown for this disc - video can\'t be decrypted"'
|
||||
@@ -125,9 +125,9 @@ def test_parse_msg_liest_die_uhd_fehlermeldung():
|
||||
|
||||
|
||||
def test_parse_msg_schneidet_meldungen_mit_komma_nicht_ab():
|
||||
"""DER Grund fuer die Regex (Stand 25.07.2026): vorher stand hier
|
||||
"""DER Grund für die Regex (Stand 25.07.2026): vorher stand hier
|
||||
line.split(",", 4)[3]. Das schnitt jede Meldung ab, die selbst ein Komma
|
||||
enthaelt — und MakeMKV schreibt solche laufend. Im Log stand dann nur noch
|
||||
enthält — und MakeMKV schreibt solche laufend. Im Log stand dann nur noch
|
||||
ein Satzfragment, das mehr verwirrt als hilft."""
|
||||
zeile = (
|
||||
'MSG:3025,0,3,"Title #1 has length of 12 seconds, which is less than '
|
||||
@@ -142,7 +142,7 @@ def test_parse_msg_schneidet_meldungen_mit_komma_nicht_ab():
|
||||
|
||||
|
||||
def test_parse_msg_ignoriert_fremde_zeilen():
|
||||
# Alles ausser MSG muss None liefern, sonst landet Fortschritts-Rauschen
|
||||
# Alles außer MSG muss None liefern, sonst landet Fortschritts-Rauschen
|
||||
# (PRGV kommt mehrmals pro Sekunde) als Log-Eintrag in der Datenbank.
|
||||
assert parse_msg("PRGV:100,32768,65536") is None
|
||||
assert parse_msg('DRV:0,2,999,12,"BD-RE ASUS BW-16D1HT","AKIRA","/dev/sr0"') is None
|
||||
@@ -188,8 +188,8 @@ def test_abcde_config_enthaelt_zielverzeichnis():
|
||||
|
||||
|
||||
def test_preset_fuer_nimmt_das_preset_des_disc_typs():
|
||||
# Befund 25.07.2026: vorher galt EIN Preset fuer alles — eine 4K-UHD wurde
|
||||
# damit auf 1080p heruntergerechnet, und beim ersten echten UHD-Rip waere
|
||||
# Befund 25.07.2026: vorher galt EIN Preset für alles — eine 4K-UHD wurde
|
||||
# damit auf 1080p heruntergerechnet, und beim ersten echten UHD-Rip wäre
|
||||
# die 4K-Aufloesung still verlorengegangen.
|
||||
from ripping import preset_fuer
|
||||
|
||||
@@ -206,13 +206,13 @@ def test_preset_fuer_nimmt_das_preset_des_disc_typs():
|
||||
|
||||
def test_preset_fuer_faellt_auf_das_allgemeine_preset_zurueck():
|
||||
# Bestandsinstallationen kennen die drei neuen Felder nicht. Solange der
|
||||
# Nutzer sie nicht speichert, MUSS sich sein Verhalten nicht aendern.
|
||||
# Nutzer sie nicht speichert, MUSS sich sein Verhalten nicht ändern.
|
||||
from ripping import preset_fuer
|
||||
|
||||
alt = {"transcodePreset": "HQ 1080p30 Surround"}
|
||||
assert preset_fuer("uhd", alt) == "HQ 1080p30 Surround"
|
||||
assert preset_fuer("dvd", alt) == "HQ 1080p30 Surround"
|
||||
# Leere Zeichenkette zaehlt als "nicht gesetzt" (leeres Select-Feld im UI)
|
||||
# Leere Zeichenkette zählt als "nicht gesetzt" (leeres Select-Feld im UI)
|
||||
assert preset_fuer("uhd", {"transcodePresetUhd": " ", "transcodePreset": "X"}) == "X"
|
||||
|
||||
|
||||
@@ -269,7 +269,7 @@ def test_handbrake_prueft_abbruch_bei_jeder_zeile_nicht_nur_bei_fortschritt():
|
||||
|
||||
assert ergebnis["status"] == "cancelled"
|
||||
assert prozess.getoetet is True
|
||||
# Zwei Scan-Zeilen genuegten — es musste NICHT auf eine Encode-Zeile gewartet
|
||||
# Zwei Scan-Zeilen genügten — es musste NICHT auf eine Encode-Zeile gewartet
|
||||
# werden. Genau das war der Fehler.
|
||||
assert len(gesehen) == 2
|
||||
|
||||
@@ -279,16 +279,16 @@ def test_komprimieren_fuer_globaler_schalter_schlaegt_alles():
|
||||
|
||||
assert komprimieren_fuer("uhd", {"transcodeEnabled": False}) is False
|
||||
assert komprimieren_fuer("dvd", {"transcodeEnabled": False}) is False
|
||||
# Standard ist AN - Bestandsinstallationen aendern ihr Verhalten nicht
|
||||
# Standard ist AN - Bestandsinstallationen ändern ihr Verhalten nicht
|
||||
assert komprimieren_fuer("bluray", {}) is True
|
||||
assert komprimieren_fuer("bluray", None) is True
|
||||
|
||||
|
||||
def test_komprimieren_fuer_einzelner_disc_typ_abwaehlbar():
|
||||
"""Der Grund dafuer (Befund 25.07.2026): 4K-HEVC brauchte auf der Rippy-VM
|
||||
"""Der Grund dafür (Befund 25.07.2026): 4K-HEVC brauchte auf der Rippy-VM
|
||||
gemessene 28-55 Stunden, weil die CPU kein AVX2 hat. Vorher gab es nur
|
||||
einen globalen Schalter - wer 4K verlustfrei behalten und DVDs trotzdem
|
||||
schrumpfen wollte, hatte keine Moeglichkeit."""
|
||||
schrumpfen wollte, hatte keine Möglichkeit."""
|
||||
from ripping import PRESET_KEINE, komprimieren_fuer
|
||||
|
||||
nur_uhd_aus = {"transcodePresetUhd": PRESET_KEINE,
|
||||
@@ -299,20 +299,20 @@ def test_komprimieren_fuer_einzelner_disc_typ_abwaehlbar():
|
||||
|
||||
|
||||
def test_preset_fuer_gibt_den_reservewert_nie_als_preset_zurueck():
|
||||
"""Sonst bekaeme HandBrake `--preset keine` und wuerde scheitern. Wer ueber
|
||||
"""Sonst bekaeme HandBrake `--preset keine` und würde scheitern. Wer über
|
||||
"Neu komprimieren" ausdruecklich doch komprimieren will, soll ein
|
||||
brauchbares Preset bekommen statt eines Fehlers."""
|
||||
from ripping import DEFAULT_HB_PRESET, PRESET_KEINE, preset_fuer
|
||||
|
||||
assert preset_fuer("uhd", {"transcodePresetUhd": PRESET_KEINE,
|
||||
"transcodePreset": "HQ 1080p30 Surround"}) == "HQ 1080p30 Surround"
|
||||
# Auch ohne allgemeines Preset kommt ein gueltiger Name heraus
|
||||
# Auch ohne allgemeines Preset kommt ein gültiger Name heraus
|
||||
assert preset_fuer("uhd", {"transcodePresetUhd": PRESET_KEINE}) == DEFAULT_HB_PRESET
|
||||
|
||||
|
||||
def test_reservewert_kollidiert_mit_keinem_echten_preset():
|
||||
"""Gegengeprueft gegen alle 90 Presets aus `HandBrakeCLI --preset-list`
|
||||
im Worker-Image (25.07.2026) - keines heisst so."""
|
||||
im Worker-Image (25.07.2026) - keines heißt so."""
|
||||
from ripping import PRESET_KEINE
|
||||
|
||||
assert PRESET_KEINE == "keine"
|
||||
|
||||
Reference in New Issue
Block a user