Setup-Installer, Einzelinstanz-Schutz und Update-System mit einer einzigen Installation

- Inno-Setup-Installer (packaging/playtube.iss): installiert pro Benutzer nach
  %LOCALAPPDATA%\Programs\Playtube, feste AppId -> jede neue Version ueberschreibt die
  vorhandene Installation an Ort und Stelle, raeumt den alten _internal-Ordner auf und
  beendet laufende Playtube-Prozesse vor dem Kopieren
- Updater: installierte Kopie nimmt das kleine Patch (Versionseintrag in "Apps &
  Features" wird nachgezogen), portable Kopie wechselt per stillem Setup in die
  regulaere Installation; Patch nur bei passender PySide6-Version (steht im Dateinamen),
  sonst Setup; Aufraeumen des heruntergeladenen Installers
- Einzelinstanz-Schutz (playtube/single_instance.py): zwei Prozesse auf demselben
  Browser-Profil liessen auf YouTube alle Icons verschwinden; ein zweiter Start holt jetzt
  das laufende Fenster nach vorn (auch .play-Patchdateien werden weitergereicht)
- build.ps1 baut den Installer mit, Release-Pipeline haengt ihn an jedes Release
- README: Installation, Update-Ablauf, Troubleshooting fuer fehlende Icons
This commit is contained in:
2026-09-19 19:25:05 +02:00
parent 31797cdabb
commit 04bc96d33e
9 changed files with 564 additions and 64 deletions
+12 -4
View File
@@ -1,10 +1,12 @@
"""Erstellt bei Bedarf eine Windows-Startmenue-Verknuepfung sowie die Dateizuordnung
fuer die eigene ".play"-Patchdateiendung.
Playtube wird als portables ZIP ausgeliefert (kein MSI/Installer) - ohne das gaebe es
also nie einen Eintrag im Windows-Startmenue, wie man ihn von "richtig installierten"
Programmen kennt. Wird beim Start der gepackten .exe einmalig nachgeholt (idempotent -
prueft vorher, ob die Verknuepfung schon existiert)."""
Playtube-Setup (packaging/playtube.iss) legt Startmenue-Eintrag und Dateizuordnung
selbst an. Fuer eine portable, aus einem ZIP entpackte Kopie gaebe es sonst nie einen
Eintrag im Windows-Startmenue - der wird beim Start der gepackten .exe einmalig
nachgeholt (idempotent - prueft vorher, ob die Verknuepfung schon existiert). Eine durch
Setup installierte Kopie fasst die Verknuepfung nicht an, damit sie nicht versehentlich
wieder auf eine andere (portable) Kopie umgebogen wird."""
from __future__ import annotations
import os
@@ -21,6 +23,12 @@ def _find_icon(exe_dir: Path) -> Path | None:
def ensure_start_menu_shortcut(app_name: str) -> None:
if sys.platform != "win32" or not getattr(sys, "frozen", False):
return
# Import erst hier: shortcuts.py wird vor dem restlichen Qt-Setup importiert (siehe
# main.py), updater.py zieht PySide6 nach.
from .updater import is_installed_via_setup
if is_installed_via_setup():
return # Verknuepfung gehoert dem Installer (siehe Moduldoku)
try:
appdata = os.environ.get("APPDATA")
if not appdata: