diff --git a/deploy/worker-windows/RippyWorkerSetup.exe b/deploy/worker-windows/RippyWorkerSetup.exe index 8b986be..8014d3a 100644 Binary files a/deploy/worker-windows/RippyWorkerSetup.exe and b/deploy/worker-windows/RippyWorkerSetup.exe differ diff --git a/deploy/worker-windows/install-gui.ps1 b/deploy/worker-windows/install-gui.ps1 index 588719b..808c07a 100644 --- a/deploy/worker-windows/install-gui.ps1 +++ b/deploy/worker-windows/install-gui.ps1 @@ -47,7 +47,7 @@ $cPurple = [System.Drawing.Color]::FromArgb(126, 34, 206) # --- Fenster --------------------------------------------------------------- $form = New-Object System.Windows.Forms.Form $form.Text = "Rippy Encoding-Worker - Installation" -$form.ClientSize = New-Object System.Drawing.Size(560, 648) +$form.ClientSize = New-Object System.Drawing.Size(560, 672) $form.StartPosition = "CenterScreen" $form.FormBorderStyle = "FixedDialog" $form.MaximizeBox = $false @@ -260,9 +260,20 @@ $chkAuto.Checked = $true $chkAuto.ForeColor = $cText $form.Controls.Add($chkAuto) +# Verknuepfung auf dem Desktop (Commander-Wunsch 26.07.2026). Vorher lagen die +# Startdateien nur im Programmordner - wer den Worker von Hand starten wollte, +# musste erst "C:\Program Files\Rippy Worker" suchen. +$chkDesktop = New-Object System.Windows.Forms.CheckBox +$chkDesktop.Text = "Verknüpfung auf dem Desktop anlegen" +$chkDesktop.Location = New-Object System.Drawing.Point(24, 388) +$chkDesktop.Size = New-Object System.Drawing.Size(400, 22) +$chkDesktop.Checked = $true +$chkDesktop.ForeColor = $cText +$form.Controls.Add($chkDesktop) + # Log-Bereich $log = New-Object System.Windows.Forms.TextBox -$log.Location = New-Object System.Drawing.Point(24, 396) +$log.Location = New-Object System.Drawing.Point(24, 420) $log.Size = New-Object System.Drawing.Size(500, 174) $log.Multiline = $true $log.ReadOnly = $true @@ -276,7 +287,7 @@ $form.Controls.Add($log) # Knöpfe $btnInstall = New-Object System.Windows.Forms.Button $btnInstall.Text = "Installieren" -$btnInstall.Location = New-Object System.Drawing.Point(24, 584) +$btnInstall.Location = New-Object System.Drawing.Point(24, 608) $btnInstall.Size = New-Object System.Drawing.Size(150, 40) $btnInstall.BackColor = $cAmber $btnInstall.ForeColor = $cBg @@ -286,7 +297,7 @@ $form.Controls.Add($btnInstall) $btnStart = New-Object System.Windows.Forms.Button $btnStart.Text = "Worker starten" -$btnStart.Location = New-Object System.Drawing.Point(190, 584) +$btnStart.Location = New-Object System.Drawing.Point(190, 608) $btnStart.Size = New-Object System.Drawing.Size(150, 40) $btnStart.BackColor = $cEmerald $btnStart.ForeColor = [System.Drawing.Color]::White @@ -520,12 +531,18 @@ Get-CimInstance Win32_Process | Where-Object { } | ForEach-Object { Stop-Process -Id `$_.ProcessId -Force -ErrorAction SilentlyContinue } Start-Sleep 3 -# 2. Autostart entfernen — BEIDE möglichen Orte, weil die Installation je nach -# Zielverzeichnis persönlich oder maschinenweit war. +# 2. Verknüpfungen entfernen — Autostart UND Desktop, jeweils an BEIDEN möglichen +# Orten, weil die Installation je nach Zielverzeichnis persönlich oder +# maschinenweit war. „Rückstandsfrei entfernbar" ist ein MUSS-Kriterium; eine +# tote Verknüpfung auf dem Desktop wäre genau so ein Rückstand. foreach (`$ort in @("Startup", "CommonStartup")) { `$lnk = Join-Path ([Environment]::GetFolderPath(`$ort)) "RippyWorker.lnk" if (Test-Path `$lnk) { Remove-Item -Force `$lnk -ErrorAction SilentlyContinue } } +foreach (`$ort in @("Desktop", "CommonDesktopDirectory")) { + `$lnk = Join-Path ([Environment]::GetFolderPath(`$ort)) "Rippy Worker.lnk" + if (Test-Path `$lnk) { Remove-Item -Force `$lnk -ErrorAction SilentlyContinue } +} # ... und die geplante Aufgabe aus älteren Installationen, falls vorhanden. schtasks /delete /tn "RippyWorker" /f 2>`$null | Out-Null @@ -588,6 +605,11 @@ Start-Process cmd.exe -ArgumentList '/c timeout /t 4 /nobreak >nul & rd /s /q "' $lnk.TargetPath = (Join-Path $InstallDir "start-tray.bat") $lnk.WorkingDirectory = $InstallDir $lnk.Description = "Rippy Encoding-Worker" + # WindowStyle 7 = minimiert. start-tray.bat startet pythonw (kein + # Konsolenfenster), aber die .bat selbst blitzt sonst kurz auf. + $lnk.WindowStyle = 7 + $ico = Join-Path $InstallDir "rippy.ico" + if (Test-Path $ico) { $lnk.IconLocation = $ico } $lnk.Save() if ($maschinenweit) { Log "Autostart eingerichtet (für alle Benutzer dieser Maschine)." @@ -603,6 +625,44 @@ Start-Process cmd.exe -ArgumentList '/c timeout /t 4 /nobreak >nul & rd /s /q "' } } + # 8. Verknüpfung auf dem Desktop (Commander-Wunsch 26.07.2026: „wenn man + # den Worker installiert braucht man auch eine exe auf dem Desktop + # zum Starten"). Vorher lagen die Startdateien nur im Programmordner — + # wer den Worker von Hand starten wollte, musste erst + # "C:\Program Files\Rippy Worker" suchen. + # + # Dieselbe Rechte-Überlegung wie beim Autostart: bei einer Installation + # unter "Programme" auf den Desktop ALLER Benutzer, sonst auf den + # eigenen. Und ein Fehlschlag hier ist nur eine Warnung — der Worker + # läuft davon unberührt. + if ($chkDesktop.Checked) { + try { + $programme = [Environment]::GetFolderPath("ProgramFiles") + $programmeX86 = [Environment]::GetFolderPath("ProgramFilesX86") + $maschinenweit = $InstallDir.StartsWith($programme, "OrdinalIgnoreCase") ` + -or ($programmeX86 -and $InstallDir.StartsWith($programmeX86, "OrdinalIgnoreCase")) + $desktopDir = if ($maschinenweit) { + [Environment]::GetFolderPath("CommonDesktopDirectory") + } else { + [Environment]::GetFolderPath("Desktop") + } + $wsh = New-Object -ComObject WScript.Shell + $lnk = $wsh.CreateShortcut((Join-Path $desktopDir "Rippy Worker.lnk")) + $lnk.TargetPath = (Join-Path $InstallDir "start-tray.bat") + $lnk.WorkingDirectory = $InstallDir + $lnk.Description = "Rippy Encoding-Worker starten (Symbol neben der Uhr)" + $lnk.WindowStyle = 7 # minimiert, damit die .bat nicht aufblitzt + $ico = Join-Path $InstallDir "rippy.ico" + if (Test-Path $ico) { $lnk.IconLocation = $ico } + $lnk.Save() + Log "Verknüpfung 'Rippy Worker' auf dem Desktop angelegt." + } catch { + Log "HINWEIS: Desktop-Verknüpfung ging nicht ($($_.Exception.Message))." + Log " Der Worker ist trotzdem fertig — starten über" + Log " $InstallDir\start-tray.bat" + } + } + Log "" Log "FERTIG! Ordner: $InstallDir" Log "Klick 'Worker starten' - er erscheint dann in Rippy unter Einstellungen -> Worker." diff --git a/deploy/worker-windows/install.ps1 b/deploy/worker-windows/install.ps1 index 431fa11..570ebf9 100644 --- a/deploy/worker-windows/install.ps1 +++ b/deploy/worker-windows/install.ps1 @@ -22,6 +22,9 @@ param( [Parameter(Mandatory = $true)] [string]$RippyHost, [string]$WorkerName = $env:COMPUTERNAME.ToLower(), [switch]$Autostart, + # Verknüpfung auf dem Desktop. Standard AN (Commander-Wunsch 26.07.2026) — + # mit -KeineDesktopVerknuepfung abschaltbar. + [switch]$KeineDesktopVerknuepfung, # Übersetzung der Rippy-Container-Pfade auf Freigaben, die DIESER PC sieht. # Leer lassen: dann holt der Installer den Wert von Rippy selbst # (GET /worker-setup/pfad-map, abgeleitet aus dessen eigenen Mounts). @@ -221,6 +224,11 @@ Start-Sleep 2 foreach (`$ordner in @("Startup", "CommonStartup")) { try { Remove-Item -Force (Join-Path ([Environment]::GetFolderPath(`$ordner)) "RippyWorker.lnk") -ErrorAction Stop } catch {} } +# ... und die Desktop-Verknüpfung. „Rückstandsfrei entfernbar" ist ein +# MUSS-Kriterium; ein totes Symbol auf dem Desktop wäre genau so ein Rückstand. +foreach (`$ordner in @("Desktop", "CommonDesktopDirectory")) { + try { Remove-Item -Force (Join-Path ([Environment]::GetFolderPath(`$ordner)) "Rippy Worker.lnk") -ErrorAction Stop } catch {} +} # ... und die geplante Aufgabe aus älteren Installationen, falls vorhanden. schtasks /delete /tn "RippyWorker" /f 2>`$null | Out-Null try { @@ -267,6 +275,11 @@ if ($Autostart) { $lnk.TargetPath = (Join-Path $ziel "start-tray.bat") $lnk.WorkingDirectory = $ziel $lnk.Description = "Rippy Encoding-Worker" + # WindowStyle 7 = minimiert: start-tray.bat startet pythonw (kein + # Konsolenfenster), aber die .bat selbst blitzt sonst kurz auf. + $lnk.WindowStyle = 7 + $ico = Join-Path $ziel "rippy.ico" + if (Test-Path $ico) { $lnk.IconLocation = $ico } $lnk.Save() Write-Host "Autostart eingerichtet (Verknüpfung im Autostart-Ordner)." } catch { @@ -276,8 +289,37 @@ if ($Autostart) { } } +# 10. Verknüpfung auf dem Desktop (Commander-Wunsch 26.07.2026). Vorher lagen die +# Startdateien nur im Programmordner — wer den Worker von Hand starten wollte, +# musste erst "C:\Program Files\Rippy Worker" suchen. Ein Fehlschlag hier ist nur +# eine Warnung; der Worker läuft davon unberührt. +if (-not $KeineDesktopVerknuepfung) { + try { + $programme = [Environment]::GetFolderPath("ProgramFiles") + $maschinenweit = $ziel.StartsWith($programme, "OrdinalIgnoreCase") + $desktopDir = if ($maschinenweit) { + [Environment]::GetFolderPath("CommonDesktopDirectory") + } else { + [Environment]::GetFolderPath("Desktop") + } + $wsh = New-Object -ComObject WScript.Shell + $lnk = $wsh.CreateShortcut((Join-Path $desktopDir "Rippy Worker.lnk")) + $lnk.TargetPath = (Join-Path $ziel "start-tray.bat") + $lnk.WorkingDirectory = $ziel + $lnk.Description = "Rippy Encoding-Worker starten (Symbol neben der Uhr)" + $lnk.WindowStyle = 7 + $ico = Join-Path $ziel "rippy.ico" + if (Test-Path $ico) { $lnk.IconLocation = $ico } + $lnk.Save() + Write-Host "Verknüpfung 'Rippy Worker' auf dem Desktop angelegt." + } catch { + Write-Host "HINWEIS: Desktop-Verknüpfung ging nicht ($($_.Exception.Message))." -ForegroundColor Yellow + } +} + Write-Host "" Write-Host "FERTIG." -ForegroundColor Green +Write-Host " Auf dem Desktop: Rippy Worker" Write-Host " Starten (mit Tray-Symbol): $ziel\start-tray.bat" Write-Host " Starten (Konsole/Debug): $ziel\start-worker.bat" Write-Host " Deinstallieren: $ziel\uninstall.ps1" diff --git a/docker/api/Dockerfile b/docker/api/Dockerfile index 5f7155f..609b9c4 100644 --- a/docker/api/Dockerfile +++ b/docker/api/Dockerfile @@ -22,6 +22,11 @@ COPY docker/api/ . # die Zielmaschine braucht weder git noch Docker. COPY docker/worker/*.py docker/worker/requirements.txt worker_dist/ COPY deploy/worker-windows/install.ps1 deploy/worker-windows/install-gui.ps1 worker_dist/ +# Rippy-Icon: Der Installer legt damit eine Verknüpfung auf den Desktop +# (Commander-Wunsch 26.07.2026). Ohne die Datei auf der Zielmaschine trüge die +# Verknüpfung das Standard-Batch-Symbol — und niemand fände sie zwischen den +# anderen Icons wieder. +COPY deploy/worker-windows/rippy.ico worker_dist/ # Vorgebaute .exe (Rippy-Icon, kein Konsolenfenster) — auf Windows via # deploy/worker-windows/build-exe.ps1 erzeugt (Windows-.exe geht nicht von # Linux). Nur bei GUI-Aenderungen neu bauen, nicht bei Tool-Updates. diff --git a/docker/api/main.py b/docker/api/main.py index 21e3bce..c03a762 100644 --- a/docker/api/main.py +++ b/docker/api/main.py @@ -1608,7 +1608,9 @@ async def worker_setup_paket(): for name in sorted(os.listdir("worker_dist")): if name.endswith(".py") and not name.startswith(("test_", "conftest")): z.write(os.path.join("worker_dist", name), name) - elif name == "requirements.txt": + # requirements.txt für die venv, rippy.ico für die Verknüpfung + # auf dem Desktop (sonst trägt sie das Batch-Standardsymbol). + elif name in ("requirements.txt", "rippy.ico"): z.write(os.path.join("worker_dist", name), name) return puffer.getvalue()