1e921a9085
Der Nutzer will KEINE Konsole - jetzt ist alles Doppelklick: 1) GRAFISCHER INSTALLER (installer_gui.py, 336 Zeilen): - Fenster mit Status-Checks (Python/GStreamer/Homebrew: fehlt/vorhanden), Fortschrittsbalken beim Download, Log-Bereich, grosse Buttons - macOS: Homebrew + GStreamer + PyGObject + tkinter via brew; Passwort-Dialog kommt NATIV von macOS (osascript administrator privileges) - kein sudo-Tippen - Windows: laedt und startet die OFFIZIELLEN Installer-GUIs (GStreamer-MSI + Python-Setup) - Nutzer klickt nur Weiter/Fertig - Nach Installation: Button 'MediaEngine starten' spawnt die Engine UNSICHTBAR im Hintergrund und oeffnet den Browser - Smoke-Test im Container bestanden (xvfb): Fenster baut sich auf, Statuschecks laufen, sauber beendet 2) macOS: 'HMS MediaEngine.app' (echtes App-Bundle im Repo): - CFBundleExecutable HMS-Launcher (Bash): sucht brew-python3, prueft GStreamer unsichtbar -> Engine nohup im Hintergrund + Browser oeffnet sich; fehlt etwas -> grafischer Installer - make_mac_app.py: App neu erzeugen falls noetig - HMS-Mac-Install.command: Doppelklick-Installation mit nativen osascript-Dialogen (Abbrechen/Weiter) + GUI-Installer am Ende 3) Windows: HMS-Start.vbs (unsichtbar) + HMS-Install.vbs (sichtbar): - HMS-Start.vbs: findet pythonw (4 Pfade + versteckte PATH-Suche ohne Konsolenblitz), startet launcher.pyw KOMPLETT unsichtbar (CREATE_NO_WINDOW) -> nur Browser erscheint - HMS-Install.vbs: oeffnet grafischen Installer; fehlt Python, oeffnet offizielle Downloadseite mit Hinweis auf PATH-Haeckchen - launcher_core.py: gemeinsame Logik (gst_ok -> Engine-Spawn -> Health-Poll -> webbrowser.open; sonst Installer-Fenster) 4) BEWEISE (im Container ausgefuehrt): - Launcher-E2E: launch() -> Engine unsichtbar gestartet, Health gruen, Browser-URL korrekt (http://localhost:8080), RC=0 - GUI-Smoke-Test: Fenster + 'Alles bereit' + sauber beendet - VBS: sh.Run-Zeilen geprueft (Chr(34)-Konstruktion, versteckte cmd-Suche) - Alle 5 Regressionssuiten unveraendert gruen: Projekte 25/25 + Cue 35/35 + Verteilung 33/33 + App 14/14 + FX 16/16 = 123 Checks Download: TAR.GZ (macOS, erhaelt Exec-Bits!) oder ZIP (Windows)
78 lines
2.7 KiB
Python
78 lines
2.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Erzeugt 'HMS MediaEngine.app' im Projektordner (macOS App-Bundle).
|
|
|
|
Aufruf: python3 make_mac_app.py
|
|
Danach: 'HMS MediaEngine.app' per Doppelklick im Finder starten.
|
|
Der Launcher prueft unsichtbar: fehlt GStreamer, oeffnet sich der
|
|
grafische Installer; ist alles da, startet die Engine im Hintergrund
|
|
und der Browser oeffnet sich.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parent
|
|
APP = ROOT / "HMS MediaEngine.app"
|
|
|
|
INFO_PLIST = """<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>CFBundleName</key><string>HMS MediaEngine</string>
|
|
<key>CFBundleDisplayName</key><string>HMS MediaEngine</string>
|
|
<key>CFBundleIdentifier</key><string>de.hms.mediaengine</string>
|
|
<key>CFBundleVersion</key><string>0.1.0</string>
|
|
<key>CFBundleShortVersionString</key><string>0.1.0</string>
|
|
<key>CFBundlePackageType</key><string>APPL</string>
|
|
<key>CFBundleExecutable</key><string>HMS-Launcher</string>
|
|
<key>LSMinimumSystemVersion</key><string>11.0</string>
|
|
<key>NSHighResolutionCapable</key><true/>
|
|
<key>CFBundleInfoDictionaryVersion</key><string>6.0</string>
|
|
</dict>
|
|
</plist>
|
|
"""
|
|
|
|
LAUNCHER = r'''#!/bin/bash
|
|
# HMS MediaEngine App-Start (vom Finder, ohne sichtbares Terminal)
|
|
DIR="$(cd "$(dirname "$0")/../../.." && pwd)"
|
|
PY=""
|
|
for p in /opt/homebrew/bin/python3 /usr/local/bin/python3 python3; do
|
|
if command -v "$p" >/dev/null 2>&1; then PY="$p"; break; fi
|
|
done
|
|
if [ -z "$PY" ]; then
|
|
osascript -e 'display alert "Python nicht gefunden" message "Bitte HMS-Mac-Install.command im Projektordner einmal ausfuehren - es installiert alles Grafische." as critical' >/dev/null 2>&1
|
|
exit 1
|
|
fi
|
|
cd "$DIR"
|
|
if "$PY" -c "import gi; gi.require_version('Gst','1.0')" >/dev/null 2>&1; then
|
|
nohup "$PY" "$DIR/run.py" >>/tmp/hms-mediaengine.log 2>&1 &
|
|
PORT=8080
|
|
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
|
|
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40; do
|
|
curl -s -o /dev/null "http://localhost:$PORT/api/health" && break
|
|
sleep 0.5
|
|
done
|
|
open "http://localhost:$PORT"
|
|
exit 0
|
|
else
|
|
nohup "$PY" "$DIR/installer_gui.py" >/tmp/hms-installer.log 2>&1 &
|
|
exit 0
|
|
fi
|
|
'''
|
|
|
|
|
|
def build() -> None:
|
|
macos = APP / "Contents" / "MacOS"
|
|
macos.mkdir(parents=True, exist_ok=True)
|
|
(APP / "Contents" / "Info.plist").write_text(INFO_PLIST, "utf-8")
|
|
launcher = macos / "HMS-Launcher"
|
|
launcher.write_text(LAUNCHER, "utf-8")
|
|
launcher.chmod(0o755)
|
|
print(f"App erstellt: {APP}")
|
|
print("Doppelklick im Finder: 'HMS MediaEngine.app'")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
build()
|