fix: Priority-Playlist je Standort statt global
Die Priority-Playlist lag unter config["priority"] und wirkte damit auf *alle* Standorte. In der Praxis lief so ein Stuttgart-spezifischer Eintrag (wbxroompresence...find=Stuttgart) auch auf den Karlsruher Screens. Sie liegt jetzt unter sites.<site>.priority, die Medien unter media/<site>/priority/: - get_priority_config(cfg, site) liefert die Konfiguration des Standorts. Ist dort nichts hinterlegt, wird ein globaler Altbestand einmalig uebernommen - per deepcopy, damit spaetere Aenderungen nicht zwischen Standorten durchschlagen. - load_priority_files(site), priority_dir(site) sowie Player, Hash, Upload, Loeschen, URL-Anlegen, Umsortieren und Einzeleintrag- Bearbeitung arbeiten durchgaengig standortbezogen. - Route /media/priority/<datei> -> /media/<site>/priority/<datei>, Templates entsprechend. - Der Ordnername "priority" ist wie "logos" in der Screen-Erkennung ausgenommen. media/<site>/priority/ waere sonst als Screen in der Konfiguration gelandet; "priority" ist in den Routen ohnehin als Kennzeichen belegt, ein Screen dieses Namens war nie moeglich. Migration der vorhandenen Konfiguration: der globale Block wurde in alle drei Standorte uebernommen und der globale Schluessel entfernt. Der leere globale Ordner media/priority/ ist entfallen. README, AGENTS.md und Hilfeseite nachgezogen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
40
README.md
40
README.md
@@ -9,7 +9,7 @@ Browserbasiertes Digital-Signage-System für interne Info-Screens.
|
||||
- Browserbasierter Player (Kiosk-Modus, Chromium, Firefox)
|
||||
- Bilder, Videos (MP4/H.264), HTML-Seiten, URL-Playlist-Einträge
|
||||
- **Multi-Standort**: Standorte (sites) gruppieren Screens
|
||||
- **Priority-Playlist**: globale Inhalte wirken auf alle Player
|
||||
- **Priority-Playlist**: pro Standort; die Inhalte laufen auf allen Screens **dieses** Standorts, nicht standortübergreifend
|
||||
- **Willkommensseite**: bis zu 3 Kundenlogos via OpenAI + Brandfetch oder **manueller Upload mit automatischem Freistellen** (transparenter Hintergrund), pro Standort konfigurierbares Hintergrundbild; erscheint auf allen Screens mit `welcome_enabled` (mehrere möglich), optional mit Ablaufdatum
|
||||
- Pro Screen eigene Playlist mit Drag-&-Drop-Reihenfolge
|
||||
- Auto-Reload bei Playlist-Änderungen
|
||||
@@ -53,7 +53,7 @@ Flask App (Server)
|
||||
│ │ │ ├── bild.jpg
|
||||
│ │ │ ├── video.mp4
|
||||
│ │ │ └── welcome.html
|
||||
│ └── priority/
|
||||
│ │ └── priority/
|
||||
└── generate_welcome_page.py
|
||||
```
|
||||
|
||||
@@ -79,9 +79,9 @@ signage/
|
||||
│ │ ├── casino/
|
||||
│ │ ├── videosysteme/
|
||||
│ │ ├── background.jpg # Hintergrundbild der Willkommensseite (optional)
|
||||
│ │ ├── priority/ # Priority-Medien dieses Standorts
|
||||
│ │ ├── logo_1.png # hochgeladene Kundenlogos (Slot 1-3)
|
||||
│ │ └── welcome.html # Standort-Kopie der Willkommensseite
|
||||
│ └── priority/
|
||||
├── templates/
|
||||
│ ├── admin.html # Admin-Dashboard (Übersicht)
|
||||
│ ├── admin_dashboard.html # Admin Dashboard (Statistiken + Verlauf)
|
||||
@@ -242,7 +242,7 @@ Beides fehlte anfangs und machte die Fehlersuche unnötig schwer.
|
||||
| `POST /admin/users/reset-password/<email>` | Passwort-Reset mit temporärem Passwort (Admin) |
|
||||
| `POST /admin/users/edit/<email>` | User bearbeiten speichern (Admin) |
|
||||
| `GET /media/<site>/<screen>/<file>` | Medien-Datei ausliefern |
|
||||
| `GET /media/priority/<file>` | Priority-Medien (global) |
|
||||
| `GET /media/<site>/priority/<file>` | Priority-Medien des Standorts |
|
||||
| `GET /media/<site>/logos/<file>` | Manuell hochgeladenes Kundenlogo |
|
||||
| `GET /admin/help` | Hilfeseite zur Bedienung |
|
||||
| `GET /customer` | Alias für `/willkommen` |
|
||||
@@ -427,10 +427,6 @@ OPENAI_API_KEY=sk-...
|
||||
"background_url": null
|
||||
}
|
||||
}
|
||||
},
|
||||
"priority": {
|
||||
"enabled": true,
|
||||
"playlist": [...]
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -460,6 +456,30 @@ OPENAI_API_KEY=sk-...
|
||||
| `voice_agent_target` | string | `"overlay"` (iframe) oder `"redirect"` |
|
||||
| `voice_agent_position` | string | Position des Buttons: `top-left`, `top-center`, `top-right`, `middle-left`, `middle-center`, `middle-right`, `bottom-left`, `bottom-center`, `bottom-right` |
|
||||
|
||||
## Priority-Playlist (pro Standort)
|
||||
|
||||
Liegt in `config.json` unter `sites.<site>.priority`, die Medien unter `media/<site>/priority/`:
|
||||
|
||||
```jsonc
|
||||
"sites": {
|
||||
"stuttgart": {
|
||||
"priority": {
|
||||
"enabled": true, // schaltet die Priority-Playlist dieses Standorts
|
||||
"playlist": [ ... ] // gleiches Eintragsformat wie eine Screen-Playlist
|
||||
},
|
||||
"screens": { ... }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Die Einträge laufen auf allen Screens **dieses** Standorts, eingestreut zwischen den normalen Playlist-Einträgen. Ein anderer Standort ist davon nicht betroffen.
|
||||
|
||||
> Früher lag die Priority-Playlist global unter `config.priority` und wirkte auf *alle* Standorte. `get_priority_config()` übernimmt einen solchen Altbestand beim ersten Zugriff einmalig in den jeweiligen Standort.
|
||||
|
||||
Die Ordnernamen `priority` und `logos` sind unter `media/<site>/` **reserviert** und werden bei der Screen-Erkennung übersprungen – sonst würden sie als Screens in der Oberfläche auftauchen.
|
||||
|
||||
---
|
||||
|
||||
<a id="playlist-eintraege"></a>
|
||||
## Playlist-Einträge
|
||||
|
||||
@@ -531,7 +551,9 @@ Optional pro Eintrag. Ohne `schedule` läuft der Eintrag immer (sofern `enabled`
|
||||
- `_window_start_date(now, start, end)` – Kalendertag, an dem das laufende Zeitfenster begann (`None` = ausserhalb)
|
||||
- `_in_validity_range(schedule, day)` – optionalen Gültigkeitszeitraum prüfen
|
||||
- `schedule_text(schedule)` – Jinja-Filter: Klartext einer Zeitsteuerung für Tooltips
|
||||
- `load_priority_files()` – Priority-Playlist + Dateien laden
|
||||
- `load_priority_files(site)` – Priority-Playlist eines Standorts + Dateien laden
|
||||
- `get_priority_config(cfg, site)` – Priority-Konfiguration des Standorts (übernimmt einmalig einen globalen Altbestand)
|
||||
- `priority_dir(site)` – Pfad zu `media/<site>/priority/`
|
||||
- `welcome_target_screens(config, site)` – Zielscreens der Willkommensseite (Fallback `lobby`)
|
||||
- `save_uploaded_logo(file, site, slot, freistellen=True)` – hochgeladenes Logo freistellen und als PNG ablegen
|
||||
- `remove_logo_background(image)` – Hintergrund per Flood Fill entfernen, gibt `(bild, hinweis)` zurück
|
||||
|
||||
Reference in New Issue
Block a user