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:
+39
-39
@@ -3,15 +3,15 @@
|
||||
# Rippy einrichten — ein Befehl, keine Handarbeit.
|
||||
#
|
||||
# Das Skript nimmt genau die Schritte ab, an denen man vorher scheitern konnte:
|
||||
# * Laufwerk finden (BEIDE Geraeteknoten — der sg-Knoten ist je Host anders,
|
||||
# * Laufwerk finden (BEIDE Geräteknoten — der sg-Knoten ist je Host anders,
|
||||
# und ein fest eingetragener Standard ist damit auf fremden Hosts falsch)
|
||||
# * Ablage- und MakeMKV-Verzeichnis anlegen
|
||||
# * shared-Mount-Propagation herstellen, falls Docker sie verlangt
|
||||
# * .env anlegen bzw. fehlende Werte ergaenzen, ohne Bestehendes zu ueberschreiben
|
||||
# * .env anlegen bzw. fehlende Werte ergänzen, ohne Bestehendes zu überschreiben
|
||||
# * bauen und starten
|
||||
#
|
||||
# Es ist absichtlich WIEDERHOLBAR: mehrfach ausfuehren aendert nichts kaputt.
|
||||
# Es aendert NIE einen Wert, der schon in der .env steht.
|
||||
# Es ist absichtlich WIEDERHOLBAR: mehrfach ausführen ändert nichts kaputt.
|
||||
# Es ändert NIE einen Wert, der schon in der .env steht.
|
||||
#
|
||||
# Aufruf: sudo ./install.sh
|
||||
# sudo ./install.sh --nur-pruefen (nichts anfassen, nur berichten)
|
||||
@@ -33,7 +33,7 @@ titel() { printf '\n\033[1m%s\033[0m\n' "$*"; }
|
||||
echo "======================================================================"
|
||||
echo " Rippy — Einrichtung"
|
||||
echo "======================================================================"
|
||||
[ "$NUR_PRUEFEN" = 1 ] && gelb "Nur-Pruefen-Modus: es wird nichts geaendert."
|
||||
[ "$NUR_PRUEFEN" = 1 ] && gelb "Nur-Prüfen-Modus: es wird nichts geändert."
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 1. Voraussetzungen
|
||||
@@ -43,7 +43,7 @@ titel "1/6 Voraussetzungen"
|
||||
if [ "$(uname -s)" != "Linux" ]; then
|
||||
rot " X Das hier ist kein Linux. Rippy braucht einen Linux-Host mit Docker."
|
||||
rot " (Docker Desktop unter Windows/macOS kann keine optischen Laufwerke"
|
||||
rot " durchreichen — deshalb geht es dort grundsaetzlich nicht.)"
|
||||
rot " durchreichen — deshalb geht es dort grundsätzlich nicht.)"
|
||||
exit 1
|
||||
fi
|
||||
gruen " OK Linux erkannt ($(uname -r))"
|
||||
@@ -71,14 +71,14 @@ fi
|
||||
if [ "$(id -u)" = "0" ]; then
|
||||
gruen " OK Als root gestartet"
|
||||
elif [ "$NUR_PRUEFEN" = 1 ]; then
|
||||
# Der Pruef-Modus aendert nichts und darf deshalb NICHT an root scheitern —
|
||||
# Der Prüf-Modus ändert nichts und darf deshalb NICHT an root scheitern —
|
||||
# sonst kann man vor der Installation nicht nachsehen, ob alles passt.
|
||||
gelb " ! Ohne root — fuer die Pruefung in Ordnung. Die echte Installation"
|
||||
gelb " ! Ohne root — für die Prüfung in Ordnung. Die echte Installation"
|
||||
gelb " braucht sudo (Verzeichnisse unter /srv, Mount-Propagation)."
|
||||
else
|
||||
rot " X Bitte mit sudo starten: sudo ./install.sh"
|
||||
rot " (Verzeichnisse unter /srv und die Mount-Propagation brauchen root.)"
|
||||
rot " Nur nachsehen, ohne etwas zu aendern: ./install.sh --nur-pruefen"
|
||||
rot " Nur nachsehen, ohne etwas zu ändern: ./install.sh --nur-pruefen"
|
||||
FEHLER=1
|
||||
fi
|
||||
|
||||
@@ -89,11 +89,11 @@ fi
|
||||
# ---------------------------------------------------------------------------
|
||||
titel "2/6 Optisches Laufwerk"
|
||||
|
||||
# MakeMKV spricht Laufwerke ueber die SCSI-Generic-Schicht an und braucht
|
||||
# MakeMKV spricht Laufwerke über die SCSI-Generic-Schicht an und braucht
|
||||
# deshalb ZWEI Knoten: /dev/srN und den passenden /dev/sgM. Welche sg-Nummer
|
||||
# dazugehoert, ist je Host anders — deshalb wird sie hier ueber die
|
||||
# dazugehört, ist je Host anders — deshalb wird sie hier über die
|
||||
# SCSI-Adresse ermittelt statt geraten. Beide Knoten zeigen in /sys auf
|
||||
# dasselbe Geraeteverzeichnis (z. B. 3:0:0:0), das ist der Abgleich.
|
||||
# dasselbe Geräteverzeichnis (z. B. 3:0:0:0), das ist der Abgleich.
|
||||
SR=""
|
||||
SG=""
|
||||
LAUFWERK=""
|
||||
@@ -118,14 +118,14 @@ if [ -n "$SR" ]; then
|
||||
gruen " $SR + $SG (SCSI-Adresse abgeglichen, nicht geraten)"
|
||||
else
|
||||
gelb " ! Kein optisches Laufwerk gefunden."
|
||||
gelb " Rippy laesst sich trotzdem installieren und kann dann als reine"
|
||||
gelb " KOMPRIMIER-Maschine fuer andere Rippy-Instanzen dienen."
|
||||
gelb " Zum Rippen fehlt das Laufwerk. Haeufigste Ursachen:"
|
||||
gelb " Rippy lässt sich trotzdem installieren und kann dann als reine"
|
||||
gelb " KOMPRIMIER-Maschine für andere Rippy-Instanzen dienen."
|
||||
gelb " Zum Rippen fehlt das Laufwerk. Häufigste Ursachen:"
|
||||
gelb " - In einer VM: Laufwerk per USB-Passthrough durchreichen"
|
||||
gelb " (Proxmox: qm set <vmid> -usb0 host=<hersteller>:<produkt>,usb3=1)"
|
||||
gelb " NICHT als emuliertes CD-ROM (media=cdrom) — das kann keine"
|
||||
gelb " SCSI-Kommandos und MakeMKV sieht es nie."
|
||||
gelb " - Auf echter Hardware: 'ls /dev/sr*' pruefen, Kabel/Strom."
|
||||
gelb " - Auf echter Hardware: 'ls /dev/sr*' prüfen, Kabel/Strom."
|
||||
fi
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -136,20 +136,20 @@ for d in "$MEDIA_DIR" "$MAKEMKV_DIR"; do
|
||||
if [ -d "$d" ]; then
|
||||
gruen " OK $d liegt schon da"
|
||||
elif [ "$NUR_PRUEFEN" = 1 ]; then
|
||||
gelb " ! $d fehlt (wuerde angelegt)"
|
||||
gelb " ! $d fehlt (würde angelegt)"
|
||||
else
|
||||
mkdir -p "$d" && gruen " OK $d angelegt"
|
||||
fi
|
||||
done
|
||||
echo " Ablage: $MEDIA_DIR (hier landen die fertigen Filme)"
|
||||
echo " MakeMKV-Daten: $MAKEMKV_DIR (Schluesselspeicher, rebuild-fest)"
|
||||
echo " MakeMKV-Daten: $MAKEMKV_DIR (Schlüsselspeicher, rebuild-fest)"
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 4. Mount-Propagation
|
||||
# ---------------------------------------------------------------------------
|
||||
titel "4/6 Mount-Propagation (fuer NAS-Freigaben aus dem UI)"
|
||||
titel "4/6 Mount-Propagation (für NAS-Freigaben aus dem UI)"
|
||||
|
||||
# Rippy haengt NAS-Freigaben aus dem UI ein. Damit die auch in den anderen
|
||||
# Rippy hängt NAS-Freigaben aus dem UI ein. Damit die auch in den anderen
|
||||
# Containern sichtbar werden, muss der Ablage-Pfad ein 'shared' Mount sein.
|
||||
# Auf den meisten systemd-Hosts ist / schon rshared und es ist nichts zu tun.
|
||||
propagation_ok() {
|
||||
@@ -159,19 +159,19 @@ propagation_ok() {
|
||||
if propagation_ok; then
|
||||
gruen " OK $MEDIA_DIR ist bereits 'shared' — nichts zu tun"
|
||||
elif [ "$NUR_PRUEFEN" = 1 ]; then
|
||||
gelb " ! Propagation fehlt (wuerde eingerichtet)"
|
||||
gelb " ! Propagation fehlt (würde eingerichtet)"
|
||||
else
|
||||
mount --bind "$MEDIA_DIR" "$MEDIA_DIR" 2>/dev/null
|
||||
mount --make-rshared "$MEDIA_DIR" 2>/dev/null
|
||||
if propagation_ok; then
|
||||
gruen " OK Propagation eingerichtet"
|
||||
# Neustart-fest machen, sonst ist es nach dem naechsten Reboot wieder weg
|
||||
# und das Einhaengen aus dem UI scheitert stillschweigend.
|
||||
# Neustart-fest machen, sonst ist es nach dem nächsten Reboot wieder weg
|
||||
# und das Einhängen aus dem UI scheitert stillschweigend.
|
||||
UNIT="/etc/systemd/system/$(systemd-escape -p --suffix=mount "$MEDIA_DIR" 2>/dev/null)"
|
||||
if [ -n "${UNIT:-}" ] && [ ! -e "$UNIT" ] && command -v systemctl >/dev/null 2>&1; then
|
||||
cat > "$UNIT" <<UNITEOF
|
||||
[Unit]
|
||||
Description=Rippy-Ablage als shared mount (fuer NAS-Freigaben aus dem UI)
|
||||
Description=Rippy-Ablage als shared mount (für NAS-Freigaben aus dem UI)
|
||||
After=local-fs.target
|
||||
|
||||
[Mount]
|
||||
@@ -187,12 +187,12 @@ UNITEOF
|
||||
systemctl enable "$(basename "$UNIT")" >/dev/null 2>&1 \
|
||||
&& gruen " OK Neustart-fest gemacht ($(basename "$UNIT"))" \
|
||||
|| gelb " ! Konnte nicht neustart-fest gemacht werden — nach einem Reboot"
|
||||
gelb " ggf. dieses Skript erneut ausfuehren."
|
||||
gelb " ggf. dieses Skript erneut ausführen."
|
||||
fi
|
||||
else
|
||||
gelb " ! Propagation liess sich nicht einrichten."
|
||||
gelb " Rippy laeuft trotzdem — nur das Einhaengen von NAS-Freigaben AUS DEM UI"
|
||||
gelb " funktioniert dann nicht. Freigaben stattdessen auf dem Host einhaengen,"
|
||||
gelb " Rippy läuft trotzdem — nur das Einhängen von NAS-Freigaben AUS DEM UI"
|
||||
gelb " funktioniert dann nicht. Freigaben stattdessen auf dem Host einhängen,"
|
||||
gelb " z. B. unter $MEDIA_DIR/nas. Betrifft nur klassisches Docker mit"
|
||||
gelb " SYS_ADMIN — nicht rootless/Podman."
|
||||
fi
|
||||
@@ -207,7 +207,7 @@ cd "$(dirname "$0")" || exit 1
|
||||
|
||||
if [ ! -f .env ]; then
|
||||
if [ "$NUR_PRUEFEN" = 1 ]; then
|
||||
gelb " ! .env fehlt (wuerde aus .env.example erzeugt)"
|
||||
gelb " ! .env fehlt (würde aus .env.example erzeugt)"
|
||||
else
|
||||
cp .env.example .env && gruen " OK .env aus .env.example erzeugt"
|
||||
fi
|
||||
@@ -218,10 +218,10 @@ fi
|
||||
# Setzt einen Wert NUR, wenn er noch nicht (unkommentiert) gesetzt ist.
|
||||
setze_wenn_leer() {
|
||||
schluessel="$1"; wert="$2"
|
||||
[ "$NUR_PRUEFEN" = 1 ] && { echo " wuerde setzen: $schluessel=$wert"; return; }
|
||||
[ "$NUR_PRUEFEN" = 1 ] && { echo " würde setzen: $schluessel=$wert"; return; }
|
||||
[ -f .env ] || return
|
||||
if grep -qE "^${schluessel}=.+" .env; then
|
||||
echo " $schluessel steht schon in der .env — unveraendert gelassen"
|
||||
echo " $schluessel steht schon in der .env — unverändert gelassen"
|
||||
else
|
||||
sed -i "/^#*${schluessel}=/d" .env
|
||||
printf '%s=%s\n' "$schluessel" "$wert" >> .env
|
||||
@@ -236,9 +236,9 @@ fi
|
||||
setze_wenn_leer MAKEMKV_DATA_HOST "$MAKEMKV_DIR"
|
||||
|
||||
echo " API-Keys (TMDB/OMDb) brauchst du hier NICHT einzutragen —"
|
||||
echo " der Einrichtungs-Assistent im Browser fragt sie ab und prueft sie."
|
||||
echo " der Einrichtungs-Assistent im Browser fragt sie ab und prüft sie."
|
||||
|
||||
# Gegenprobe: Zeigen die WIRKSAMEN Werte auf Geraete, die es hier gibt? Faengt
|
||||
# Gegenprobe: Zeigen die WIRKSAMEN Werte auf Geräte, die es hier gibt? Fängt
|
||||
# den Fall "'.env' von einem anderen Rechner kopiert" und Tippfehler ab — sonst
|
||||
# startet Docker mit einem Pfad, den es nicht gibt, und die Meldung ist kryptisch.
|
||||
if [ -f .env ]; then
|
||||
@@ -247,10 +247,10 @@ if [ -f .env ]; then
|
||||
wirksam=$(grep -E "^${schluessel}=" .env 2>/dev/null | tail -1 | cut -d= -f2-)
|
||||
[ -n "${wirksam:-}" ] || wirksam="$standard"
|
||||
if [ ! -e "$wirksam" ]; then
|
||||
gelb " ! $schluessel zeigt auf $wirksam — dieses Geraet gibt es hier NICHT."
|
||||
gelb " ! $schluessel zeigt auf $wirksam — dieses Gerät gibt es hier NICHT."
|
||||
if [ -n "$SR" ]; then
|
||||
gelb " Gefunden wurde stattdessen: $SR + $SG"
|
||||
gelb " Trage das in der .env ein (oder loesche die Zeile $schluessel=)."
|
||||
gelb " Trage das in der .env ein (oder lösche die Zeile $schluessel=)."
|
||||
else
|
||||
gelb " Es wurde auch kein anderes Laufwerk gefunden — siehe Schritt 2."
|
||||
fi
|
||||
@@ -264,9 +264,9 @@ fi
|
||||
titel "6/6 Bauen und starten"
|
||||
|
||||
if [ "$NUR_PRUEFEN" = 1 ]; then
|
||||
gelb " ! Uebersprungen (Nur-Pruefen-Modus)."
|
||||
gelb " ! Übersprungen (Nur-Prüfen-Modus)."
|
||||
echo ""
|
||||
gruen "Pruefung fertig. Ohne --nur-pruefen wuerde jetzt gebaut und gestartet."
|
||||
gruen "Prüfung fertig. Ohne --nur-pruefen würde jetzt gebaut und gestartet."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@@ -274,7 +274,7 @@ echo " Der erste Bau dauert je nach Internet 3-10 Minuten. Nur beim ersten
|
||||
echo ""
|
||||
if ! $COMPOSE up -d --build; then
|
||||
rot ""
|
||||
rot "Der Start ist gescheitert. Die haeufigsten Ursachen:"
|
||||
rot "Der Start ist gescheitert. Die häufigsten Ursachen:"
|
||||
rot " - Kein Platz auf der Platte: df -h /"
|
||||
rot " - Port 80 schon belegt: ss -tlnp | grep ':80 '"
|
||||
rot " - Download von makemkv.com gedrosselt (Cloudflare): Tarballs von"
|
||||
@@ -288,10 +288,10 @@ IP=$(ip -4 route get 1.1.1.1 2>/dev/null | grep -oE 'src [0-9.]+' | awk '{print
|
||||
|
||||
echo ""
|
||||
echo "======================================================================"
|
||||
gruen " Fertig. Rippy laeuft."
|
||||
gruen " Fertig. Rippy läuft."
|
||||
echo "======================================================================"
|
||||
echo ""
|
||||
echo " Jetzt im Browser oeffnen: http://$IP"
|
||||
echo " Jetzt im Browser öffnen: http://$IP"
|
||||
echo ""
|
||||
echo " Dort startet der Einrichtungs-Assistent. Er zeigt dir, ob Laufwerk,"
|
||||
echo " Worker und Platz in Ordnung sind, und stellt die Kompression passend"
|
||||
|
||||
Reference in New Issue
Block a user