CUE-SZENENLISTE PRO LAYER + macOS-SUPPORT (35/35 E2E, 123 Checks gesamt)

1) Cue-/Szenenliste JE Layer (35/35 E2E):
- Cue sichern = Snapshot (Quelle, Alpha, Position, Groesse, Z-Order,
  FX1/FX2 + Intensitaeten); Name + fade_ms + follow_ms pro Cue
- GO vor/zurueck (steps), Goto (Index), Wrap-around am Listenende
- FADE: Quellwechsel = dip-to-black (Phase1 runter, Wechsel bei 0,
  Phase2 hoch; E2E: alpha 0.49 -> 0.32 -> Ziel 0.8), sonst sanfter
  Tween von Alpha + FX-Intensitaeten; laufende Fades abbrechbar
- AUTO-FOLLOW: follow_ms schaltet nach Ablauf automatisch weiter
  (E2E: Cue mit 600ms -> Wrap zum naechsten)
- DMX CUE-GO: cue_go_channel (Settings + UI), steigende Flanke
  >=128 = GO auf allen Layern; ohne Flanke kein GO (E2E: 0->1,
  1==1 bei High-Halten, neue Flanke 1->0); Sequenzfilter aktiv
- Cue-Entfernen mit Indexkorrektur; Cues in Projekten
  speicher-/ladbar (3 Cues nach Projekt-Load erhalten)
- UI: Cue-Bereich je Layer (Cue sichern / GO / Zurueck / Goto /
  Loeschen, aktiver Cue markiert, Fade+Follow-Anzeige)
- Fehlerfaelle: unbekannter Layer 400, fehlendes Medium 400,
  unbekannter Generator 400

2) macOS (Apple Silicon + Intel) mit Skript:
- setup_macos.sh: Homebrew installiert python@3.12, python-tk,
  GStreamer + alle Plugin-Sets + PyGObject; Apple-Silicon-PATH-
  Hinweis (/opt/homebrew); Erklaerung warum Homebrew statt
  gstreamer-.pkg (keine PyGObject-Bindings in .pkg)
- Bootstrap (--bootstrap): darwin-Zweig mit brew-Installationspfad
- run.py --generate-setup erzeugt jetzt 3 Skripte
  (Windows .ps1 / Linux .sh / macOS .sh); Bash-Syntax geprueft

3) Gefundene + behobene FEHLER:
- WEB-UI-ABSTURZ (echter JS-Ternary-Klammerfehler in loadServers,
  seit Verteilungs-Commit unentdeckt, weil API-Tests den Browser-
  Code nie parsen): Klammerstruktur korrigiert + JS-Syntax nun per
  node --check verifizierbar (Syntax OK) + Remote-Buttons robust
  per data-Attribute (kein Quote-Escaping mehr)
- update_layer blockierte Quellwechsel Video->Generator (Cues
  brauchen beides): Name entscheidet jetzt den Typ, Wechsel in
  beide Richtungen
- Cue-E2E-Timing: dip-to-black hat 2 Phasen (Pruefung 0.2s/0.6s),
  Auto-Follow-Index-Fix, Art-Net-Sequenznummern im Test
  inkrementierend (Sequenzfilter verwirft Duplikate korrekt)

E2E-Bilanz: Cue 35/35 + Regressionen Projekte 25/25,
Verteilung 33/33, App 14/14, FX 16/16 = 123 Checks gruen
This commit is contained in:
HMS MediaEngine Agent
2026-09-11 13:34:43 +02:00
parent 7e191ff6c9
commit 02765e6b34
9 changed files with 770 additions and 27 deletions
+67
View File
@@ -2,6 +2,7 @@
from __future__ import annotations
import shutil
import subprocess
import sys
from pathlib import Path
@@ -42,6 +43,32 @@ def check_and_install_dependencies() -> bool:
print(" sudo apt-get install " + " ".join(LINUX_PKGS))
return False
if sys.platform == "darwin":
pkgs = ["python@3.12", "python-tk", "gstreamer",
"gst-plugins-base", "gst-plugins-good",
"gst-plugins-bad", "gst-plugins-ugly",
"gst-libav", "pygobject"]
brew = shutil.which("brew")
if brew:
print("[Bootstrap] Installiere GStreamer + PyGObject "
"via Homebrew (dauert evtl. einige Minuten)...")
try:
subprocess.run([brew, "install"] + pkgs,
check=False, timeout=1800)
print("[Bootstrap] Fertig. Programm mit brew-python3 "
"neu starten.")
except subprocess.TimeoutExpired:
print("[Bootstrap] Timeout. Manuell: brew install "
+ " ".join(pkgs))
else:
print("[Bootstrap] Homebrew nicht gefunden.")
print(" Erst Homebrew installieren:")
print(' /bin/bash -c "$(curl -fsSL '
'https://raw.githubusercontent.com/Homebrew/'
'install/HEAD/install.sh)"')
print(" Danach: ./setup_macos.sh")
return False
if sys.platform == "win32":
url = ("https://gstreamer.freedesktop.org/data/pkg/windows/"
"1.28.4/msvc/"
@@ -64,6 +91,42 @@ def check_and_install_dependencies() -> bool:
return False
MACOS_SETUP = r'''#!/bin/bash
# HMS MediaEngine - macOS Setup (Apple Silicon & Intel, einmalig ausfuehren)
set -e
echo "=== HMS MediaEngine macOS Setup ==="
echo "Architektur: $(uname -m)"
if ! command -v brew >/dev/null; then
echo "Homebrew fehlt. Zunaechst installieren:"
echo ' /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"'
echo "Dann dieses Skript erneut ausfuehren."
exit 1
fi
echo "[1/2] Installiere GStreamer, PyGObject und tkinter (brew)..."
brew install python@3.12 python-tk gstreamer gst-plugins-base \
gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav pygobject
echo "[2/2] Umgebung pruefen..."
if [ "$(uname -m)" = "arm64" ] && [ -f /opt/homebrew/bin/brew ]; then
echo "Apple Silicon: Homebrew-Umgebung einbinden mit:"
echo ' eval "$(/opt/homebrew/bin/brew shellenv)"'
fi
echo "Pruefung:"
python3 -c "import gi; gi.require_version('Gst','1.0'); from gi.repository import Gst; Gst.init(None); print('GStreamer OK:', Gst.version_string())" || \
{ echo "PyGObject fehlt noch -> brew python3 verwenden (PATH!)"; exit 1; }
echo ""
echo "Hinweis: Die .pkg-Pakete von gstreamer.freedesktop.org/data/pkg/macos/"
echo "enthalten KEINE PyGObject-Bindings - Homebrew ist der empfohlene Weg."
echo ""
echo "=== Fertig ==="
echo "Start: python3 run.py"
echo "Dialog: python3 run.py --setup"
'''
WINDOWS_SETUP = r'''# HMS MediaEngine - Windows Setup (einmalig ausfuehren)
$ErrorActionPreference = "Stop"
Write-Host "=== HMS MediaEngine Windows Setup ===" -ForegroundColor Cyan
@@ -128,8 +191,12 @@ def generate_setup_scripts(root: Path) -> None:
p2 = root / "setup_linux.sh"
p2.write_text(LINUX_SETUP, encoding="utf-8")
p2.chmod(0o755)
p3 = root / "setup_macos.sh"
p3.write_text(MACOS_SETUP, encoding="utf-8")
p3.chmod(0o755)
print(f"Erzeugt: {p1}")
print(f"Erzeugt: {p2}")
print(f"Erzeugt: {p3}")
def run_setup(settings: dict) -> dict: