FESTPLATTE: Kompakt-Installation (spart ca. 1-1,5 GB) + Cache-Aufräumen

Mac-Installer fragt jetzt nach dem Installationsumfang:
- VOLLSTÄNDIG: alle 21 Effekte, GStreamer belegt ca. 1,5-2,5 GB
- KOMPAKT: 15 Effekte, nur ca. 0,5-1 GB (verzichtet auf 6
  Effekte aus gst-plugins-bad/ugly: Blur/Schärfen, Solarize,
  Brennen, Dilate, Exclusion). Videowiedergabe (libav),
  Compositor und alle 15 restlichen Effekte voll nutzbar.
- Auswahl läuft über native macOS-Dialoge (osascript, 3 Buttons)
- Danach: Homebrew-Cache-Aufräumen anbieten (gibt 0,5-2 GB frei,
  Installation bleibt unverändert) - nativer Ja/Nein-Dialog,
  zusätzlich im GUI-Installer nach Mac-Installation
- GUI-Installer hat Variante als Combobox (wird an Worker durchgereicht)

Gesamt-Festplatte nach Installation (Kompakt): ca. 1-1,5 GB
statt ca. 2,5 GB. RAM unverändert ca. 42 MB Leerlauf (gemessen).

GUI-Smoke-Test: Variante vorhanden, Cleanup-Dialog existiert und
läuft mit gemockter Antwort durch, Fenster sauber beendet.
This commit is contained in:
HMS MediaEngine Agent
2026-09-11 23:29:01 +02:00
parent bc1da530de
commit 34b1cb8cec
2 changed files with 95 additions and 39 deletions
+54 -6
View File
@@ -34,11 +34,19 @@ IS_WIN = sys.platform == "win32"
GST_MSI = ("https://gstreamer.freedesktop.org/data/pkg/windows/"
"1.28.4/msvc/gstreamer-1.0-msvc-x86_64-1.28.4.msi")
PY_EXE = "https://www.python.org/ftp/python/3.13.2/python-3.13.2-amd64.exe"
BREW_PKGS = [
BREW_PKGS_FULL = [
"python@3.12", "python-tk", "gstreamer", "gst-plugins-base",
"gst-plugins-good", "gst-plugins-bad", "gst-plugins-ugly",
"gst-libav", "pygobject",
]
# Kompakt: ohne gst-plugins-bad/ugly. Spart ca. 1-1,5 GB; Effekte
# sinken von 21 auf 15 (Blur/Schaerfen/Solarize/Burn/Dilate/Exclusion
# stecken in gst-plugins-bad). Videowiedergabe (libav), Compositor
# und 15 Effekte bleiben voll nutzbar.
BREW_PKGS_COMPACT = [
"python@3.12", "python-tk", "gstreamer", "gst-plugins-base",
"gst-plugins-good", "gst-libav", "pygobject",
]
def brew_path() -> str | None:
@@ -128,6 +136,19 @@ class InstallerApp:
tk.Label(self.root, textvariable=self.status_var,
bg="#16181d", fg="#c8ccd4").pack(fill="x", padx=16)
var_row = tk.Frame(self.root, bg="#16181d")
var_row.pack(fill="x", padx=16, pady=(0, 2))
tk.Label(var_row, text="Installationsumfang:",
bg="#16181d", fg="#8a8f9a").pack(side="left")
self.variant = tk.StringVar(
value="Vollständig (alle 21 Effekte)")
ttk.Combobox(
var_row, textvariable=self.variant, state="readonly",
width=38, values=(
"Vollständig (alle 21 Effekte)",
"Kompakt (15 Effekte, spart ca. 1,5 GB)")
).pack(side="left", padx=8)
self.bar = ttk.Progressbar(self.root, mode="determinate",
length=640)
self.bar.pack(fill="x", padx=16, pady=8)
@@ -212,16 +233,20 @@ class InstallerApp:
def start_install(self):
self.install_btn.config(state="disabled")
threading.Thread(target=self._install_worker, daemon=True).start()
variant = self.variant.get() # tk-Variable im Hauptthread lesen
threading.Thread(target=self._install_worker, args=(variant,),
daemon=True).start()
def _install_worker(self):
def _install_worker(self, variant: str):
try:
if IS_MAC:
self._install_mac()
self._install_mac(variant)
elif IS_WIN:
self._install_win()
self.on_log("")
self.on_log("Installation abgeschlossen.")
if IS_MAC:
self.root.after(0, self._offer_cleanup)
self.on_log("Falls gerade etwas installiert wurde, das Python "
"betrifft: dieses Fenster einmal schließen und "
"die App erneut starten.")
@@ -243,7 +268,7 @@ class InstallerApp:
raise RuntimeError(r.stderr.strip() or "osascript fehlgeschlagen")
return r.stdout
def _install_mac(self):
def _install_mac(self, variant: str):
self.on_status("macOS: Installation läuft (Passwort-Dialog folgt)…")
lines = ["set -e"]
brew = brew_path()
@@ -259,7 +284,10 @@ class InstallerApp:
'if [ -x /opt/homebrew/bin/brew ]; then '
'BREW=/opt/homebrew/bin/brew; '
'else BREW=/usr/local/bin/brew; fi')
lines.append('"$BREW" install ' + " ".join(BREW_PKGS))
pkgs = (BREW_PKGS_FULL if variant.startswith("Voll")
else BREW_PKGS_COMPACT)
self.on_log("Variante: " + variant)
lines.append('"$BREW" install ' + " ".join(pkgs))
script = "\n".join(lines)
with tempfile.NamedTemporaryFile("w", suffix=".sh",
delete=False) as f:
@@ -300,6 +328,26 @@ class InstallerApp:
"Fenster schließen und HMS-Start.vbs erneut "
"doppelklicken.")
def _offer_cleanup(self):
"""Homebrew-Cache aufräumen gibt ca. 0,5-2 GB frei."""
try:
if messagebox.askyesno(
"HMS MediaEngine",
"Homebrew-Cache jetzt aufräumen?\n\n"
"Löscht heruntergeladene Installationspakete und "
"gibt etwa 0,5-2 GB Festplatte frei.\n"
"Die Installation selbst bleibt unverändert.",
parent=self.root):
brew = brew_path() or "/opt/homebrew/bin/brew"
self.on_log("Räume Homebrew-Cache auf…")
r = subprocess.run([brew, "cleanup", "--prune=all"],
capture_output=True, timeout=600)
self.on_log(
"Cache aufgeräumt." if r.returncode == 0
else f"cleanup endete mit Code {r.returncode}")
except Exception as e: # noqa: BLE001
self.on_log(f"cleanup übersprungen: {e}")
# ---------- Start ----------
def start_engine(self):