# Info-Board Neu - `layout_json` fuer `message_wall` ## Ziel Dieses Dokument definiert das `layout_json` fuer `message_wall` verbindlich fuer v1. Es beschreibt nicht die eigentliche Mediendatei, sondern die serverseitige Segmentlogik, mit der aus einem Gesamtmotiv konkrete Screen-Szenen erzeugt werden. ## Grundentscheidung fuer v1 - `message_wall` wird serverseitig aufgeloest - der Player bekommt nur fertige Screen-Szenen - `layout_json` wird vom Backend oder Worker interpretiert - der Player berechnet keine Ausschnitte ueber mehrere Displays hinweg ## V1-Modell Das `layout_json` beschreibt ein virtuelles Gesamtkoordinatensystem und eine Menge von Slots. Jeder Slot repraesentiert einen Zielbereich im Gesamtmotiv. ## Struktur ```json { "version": 1, "coordinate_space": { "width": 300, "height": 300, "unit": "grid" }, "fit_mode": "cover", "slots": [ { "slot_id": "wall-r1-c1", "x": 0, "y": 0, "width": 100, "height": 100 }, { "slot_id": "wall-r1-c2", "x": 100, "y": 0, "width": 100, "height": 100 } ] } ``` ## Felder ### `version` - aktuell fest `1` - erlaubt spaetere Weiterentwicklung ohne uneindeutiges Parsing ### `coordinate_space` Definiert den virtuellen Gesamtraum. Felder: - `width` - `height` - `unit` Fuer v1 gilt: - `unit` ist immer `grid` - `width` und `height` sind positive Ganzzahlen Interpretation: - das Gesamtmotiv wird in diesem virtuellen Raum beschrieben - Slots schneiden daraus Teilbereiche aus ### `fit_mode` Definiert, wie das Ausgangsmedium auf den virtuellen Gesamtraum bezogen wird. Zulaessige Werte fuer v1: - `cover` - `contain` V1-Standard: - `cover` Interpretation: - `cover`: das Motiv fuellt den Gesamtraum vollstaendig, mit moeglichem Beschnitt - `contain`: das Motiv bleibt vollstaendig sichtbar, mit moeglichen Randflaechen ### `slots` Liste aller Zielslots innerhalb des virtuellen Gesamtraums. Jeder Slot hat: - `slot_id` - `x` - `y` - `width` - `height` Regeln: - `slot_id` ist innerhalb eines Layouts eindeutig - `x`, `y`, `width`, `height` sind Ganzzahlen im virtuellen Koordinatensystem - `width > 0` und `height > 0` - Slots duerfen sich in v1 nicht ueberlappen - Slots muessen vollstaendig innerhalb des `coordinate_space` liegen ## Semantik Ein Slot beschreibt den Ausschnitt, den ein bestimmter Screen spaeter bekommt. Das Backend oder der Worker erzeugt daraus pro Zielscreen eine konkrete Scene mit: - Zielscreen oder Zielslot - Originalmedium - berechnetem Crop-Bereich - Dauer, Timeout und Fehlerverhalten ## Beispiel 3x3-Infowand ```json { "version": 1, "coordinate_space": { "width": 300, "height": 300, "unit": "grid" }, "fit_mode": "cover", "slots": [ { "slot_id": "wall-r1-c1", "x": 0, "y": 0, "width": 100, "height": 100 }, { "slot_id": "wall-r1-c2", "x": 100, "y": 0, "width": 100, "height": 100 }, { "slot_id": "wall-r1-c3", "x": 200, "y": 0, "width": 100, "height": 100 }, { "slot_id": "wall-r2-c1", "x": 0, "y": 100, "width": 100, "height": 100 }, { "slot_id": "wall-r2-c2", "x": 100, "y": 100, "width": 100, "height": 100 }, { "slot_id": "wall-r2-c3", "x": 200, "y": 100, "width": 100, "height": 100 }, { "slot_id": "wall-r3-c1", "x": 0, "y": 200, "width": 100, "height": 100 }, { "slot_id": "wall-r3-c2", "x": 100, "y": 200, "width": 100, "height": 100 }, { "slot_id": "wall-r3-c3", "x": 200, "y": 200, "width": 100, "height": 100 } ] } ``` ## Ergebnis der serverseitigen Aufloesung Aus einem `message_wall`-Template mit diesem `layout_json` entstehen konkrete Screen-Szenen. Jede resultierende Szene enthaelt fachlich mindestens: - `slot_id` - `src` - `crop` - `fit_mode` - `duration_seconds` - `load_timeout_seconds` - `on_error` Der `crop` beschreibt dann genau den Ausschnitt fuer diesen Slot. ## Warum Grid statt Pixel? Fuer v1 wird absichtlich ein abstrahiertes Grid-Modell verwendet. Vorteile: - leicht lesbar und dokumentierbar - unabhaengiger von konkreten Asset-Abmessungen - einfach im Backend validierbar - gut fuer Admin-Vorschau und Segmentlogik Pixelgenaue Berechnung kann spaeter intern aus dem Grid abgeleitet werden. ## Validierungsregeln fuer das Backend Das Backend oder der Worker muss mindestens pruefen: - `version == 1` - `coordinate_space.width > 0` - `coordinate_space.height > 0` - `unit == grid` - `fit_mode` ist erlaubt - keine doppelten `slot_id` - keine Slots ausserhalb des Gesamtraums - keine ueberlappenden Slots ## V1-Abgrenzung Nicht Teil von v1: - rotierte Slots - verschachtelte Layouts - freie Polygonformen - playerseitige Segmentlogik - automatische Textsatz-Engine im Layout selbst ## Bezug zur Implementierung Die erste Backend-Implementierung soll aus diesem `layout_json` eine Liste konkreter Screen-Szenen ableiten koennen. Dabei gilt: - das Input-Modell bleibt bewusst einfach - die Aufloesung ist serverseitige Fachlogik - der Player bekommt nur bereits aufgeloeste Einzelinhalte