35cfcbcb07
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>
69 lines
3.7 KiB
PowerShell
69 lines
3.7 KiB
PowerShell
# Baut rippy.ico + RippyWorkerSetup.exe aus install-gui.ps1 (ps2exe).
|
|
#
|
|
# WANN NEU BAUEN: nur wenn sich install-gui.ps1 (die Installer-Oberfläche)
|
|
# ändert. NICHT bei MakeMKV-/HandBrake-Updates - die .exe holt HandBrake zur
|
|
# Laufzeit (GitHub latest) und den Worker-Code live von Rippy, friert also
|
|
# keine Versionen ein.
|
|
# AUSFUEHREN AUF WINDOWS (eine Windows-.exe kann nicht von Linux gebaut werden):
|
|
# powershell -ExecutionPolicy Bypass -File build-exe.ps1
|
|
# Danach RippyWorkerSetup.exe committen (die API serviert sie).
|
|
$ErrorActionPreference = "Stop"
|
|
Add-Type -AssemblyName System.Drawing
|
|
Set-Location $PSScriptRoot
|
|
|
|
$guiSrc = Join-Path $PSScriptRoot "install-gui.ps1"
|
|
|
|
# 1. Rippy-Disc-Icon 256x256 zeichnen -> PNG -> ICO-Container
|
|
$bmp = New-Object System.Drawing.Bitmap 256, 256
|
|
$g = [System.Drawing.Graphics]::FromImage($bmp)
|
|
$g.SmoothingMode = "AntiAlias"
|
|
$g.Clear([System.Drawing.Color]::Transparent)
|
|
$g.FillEllipse((New-Object System.Drawing.SolidBrush ([System.Drawing.Color]::FromArgb(99, 102, 241))), 8, 8, 240, 240)
|
|
$g.FillEllipse((New-Object System.Drawing.SolidBrush ([System.Drawing.Color]::FromArgb(147, 51, 234))), 40, 40, 176, 176)
|
|
$g.FillEllipse([System.Drawing.Brushes]::White, 104, 104, 48, 48)
|
|
$ms = New-Object System.IO.MemoryStream
|
|
$bmp.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png)
|
|
$png = $ms.ToArray()
|
|
|
|
$icoStream = New-Object System.IO.MemoryStream
|
|
$bw = New-Object System.IO.BinaryWriter $icoStream
|
|
$bw.Write([UInt16]0); $bw.Write([UInt16]1); $bw.Write([UInt16]1) # ICONDIR
|
|
$bw.Write([Byte]0); $bw.Write([Byte]0); $bw.Write([Byte]0); $bw.Write([Byte]0) # 256x256, colors, res
|
|
$bw.Write([UInt16]1); $bw.Write([UInt16]32) # planes, bpp
|
|
$bw.Write([UInt32]$png.Length); $bw.Write([UInt32]22) # size, offset
|
|
$bw.Write($png); $bw.Flush()
|
|
[System.IO.File]::WriteAllBytes("$PSScriptRoot\rippy.ico", $icoStream.ToArray())
|
|
Write-Host "rippy.ico erzeugt ($($png.Length) Bytes PNG)"
|
|
|
|
# 2. ps2exe sicherstellen - TLS 1.2 ist der Fix für den NuGet-Bootstrap-Fehler
|
|
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor 3072
|
|
if (-not (Get-Module -ListAvailable ps2exe)) {
|
|
Write-Host "Bootstrappe NuGet + PSGallery ..."
|
|
try { Get-PackageProvider -Name NuGet -ErrorAction Stop | Out-Null }
|
|
catch { Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Scope CurrentUser | Out-Null }
|
|
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted -ErrorAction SilentlyContinue
|
|
Write-Host "Installiere ps2exe ..."
|
|
Install-Module ps2exe -Scope CurrentUser -Force -AllowClobber
|
|
}
|
|
Import-Module ps2exe
|
|
|
|
# 3. Kompilieren (WinForms -> noConsole + STA, Icon eingebettet)
|
|
#
|
|
# -requireAdmin (seit 25.07.2026): Der Worker wird standardmäßig nach
|
|
# "C:\Program Files\Rippy Worker" installiert, und dorthin darf nur ein
|
|
# Administrator schreiben. Mit dem Schalter tragt die .exe ein Manifest, das
|
|
# Windows beim Doppelklick EINMAL per UAC fragen lässt - danach stimmen die
|
|
# Rechte für alles Weitere. Ohne ihn liefe der Installer unerhöht und
|
|
# scheiterte beim Anlegen des Ordners; wer das Ziel ins eigene Profil legt,
|
|
# braucht die Erhöhung nicht, wird aber trotzdem gefragt (normal für einen
|
|
# Installer und besser als ein Fehlschlag mitten im Lauf).
|
|
Invoke-ps2exe -inputFile $guiSrc -outputFile "$PSScriptRoot\RippyWorkerSetup.exe" `
|
|
-iconFile "$PSScriptRoot\rippy.ico" -noConsole -STA -requireAdmin `
|
|
-title "Rippy Worker Setup" -product "Rippy" -company "Rippy" -version "1.0.1.0"
|
|
|
|
if (Test-Path "$PSScriptRoot\RippyWorkerSetup.exe") {
|
|
Write-Host "OK: RippyWorkerSetup.exe = $((Get-Item "$PSScriptRoot\RippyWorkerSetup.exe").Length) Bytes"
|
|
} else {
|
|
Write-Host "FEHLER: keine .exe erzeugt"
|
|
}
|