GENERATOREN + MEDIEN-VERTEILUNG + AUTOSTART-SETTINGS (33/33 E2E)
1) MADRIX-artige Generator-Layer (15 prozedurale Quellen): - engine.GENERATORS: ball (animiert), gradient, pinwheel (animiert), zone-plate (animiert), checkers, snow (Rauschen animiert), circular, spokes, smpte, gamut, red/green/blue/black/white - alle per gst-launch verifiziert, kombinierbar mit FX1/FX2 (Generator+FX gerendert, 28 Frames im Test) - add_generator + Pattern-Wechsel zur Laufzeit (ball->snow) mit Rebuild, Katalog-Endpoint /api/generators, UI-Dropdown im Layer-Tab - Generatoren in Projekten speicher-/ladbar (gradient nach Load aktiv) - Ungueltige Generator-IDs werden mit 400 abgewiesen 2) Medien-Verteilung ueber mehrere Server: - hms_app/distribution.py: Server-Check (/api/health), Remote-Medien-Liste, Streaming-Import mit Upload-Sicherung - config.servers: Remote-Server registrieren (Name+URL, HTTP-only, Duplikat-Schutz), /api/servers (online/offline + Medien), servers/import: Datei von Remote ins lokale Archiv ziehen - UI: Remote-Server in Einstellungen verwalten, Remote-Medien im Medien-Tab mit 'Ins Archiv ziehen'-Button - run.py --data-root: mehrere Instanzen auf einer Maschine mit getrennten config/media/projects-Ordnern - E2E mit ZWEI echten Servern: A registriert B, sieht B-Medien, zieht clip byte-identisch (SHA verifiziert) und spielt ihn als Layer; Offline-Erkennung nach B-Stop; 404/400-Faelle 3) Autostart in den Einstellungen: - Einstellungen: Autostart-Projekt-Dropdown (aus Projektliste), abwaehlbar; Projekte-Tab weiterhin mit Autostart-Button - FIX Settings-Save-Merge: POST /api/settings merged jetzt auf die AKTUELLEN Settings - Autostart und registrierte Server gehen beim Speichern anderer Einstellungen nicht mehr verloren (E2E: Autostart ueberlebt Settings-Save, FPS uebernommen) E2E: 33/33 PASS (Verteilung/Generatoren) + Regressionen: Projekte 25/25, App 14/14, FX 16/16 - alle gruen
This commit is contained in:
@@ -29,6 +29,7 @@ DEFAULTS: dict = {
|
||||
},
|
||||
"engine": {"max_layers": 8, "loop_default": True,
|
||||
"autostart_project": None},
|
||||
"servers": [],
|
||||
}
|
||||
|
||||
|
||||
@@ -131,6 +132,19 @@ def validate(new: dict) -> tuple[dict | None, str | None]:
|
||||
ap = e.get("autostart_project")
|
||||
if ap is not None and not isinstance(ap, str):
|
||||
errors.append("engine.autostart_project")
|
||||
sv = merged.get("servers")
|
||||
if not isinstance(sv, list):
|
||||
errors.append("servers")
|
||||
else:
|
||||
for item in sv:
|
||||
if (not isinstance(item, dict)
|
||||
or not isinstance(item.get("name"), str)
|
||||
or not item.get("name", "").strip()
|
||||
or not isinstance(item.get("url"), str)
|
||||
or not item.get("url", "").startswith(
|
||||
("http://", "https://"))):
|
||||
errors.append("servers")
|
||||
break
|
||||
if not isinstance(merged["output"].get("fullscreen"), bool):
|
||||
errors.append("output.fullscreen")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user