# Videoplayer Ein Flask-basierter Medienplayer für Raspberry Pi, Mini-PC oder TV-Kiosk. Steuerung per Handy über HTTP, Ausgabe über HDMI am TV. ## Funktionsweise Die App besteht aus zwei getrennten Ansichten, die über einen gemeinsamen Server-Status kommunizieren: - **`/display`** – reine Ausgabe-Ansicht (TV/Mac). Zeigt das aktuelle Medium ohne Bedienelemente. Pollt den Server-Status und reagiert automatisch auf Befehle. - **`/controller`** – Steuerungs-Ansicht fürs Handy. Enthält Medienliste, Upload, Play/Stop/Next/Prev/Spulen und Lautstärkeregler. Der Server verwaltet einen zentralen Player-State (`current`, `playing`, `seek`, `volume`), den der Display pollt und der Controller per API steuert. ## Funktionen - Upload von `mp4`, `webm`, `mp3`, `wav`, `m4a`, `jpg`, `jpeg`, `png`, `gif` - Medienliste mit auswählbaren Elementen - Play, Stop, Vor/Zurück, Vor-/Rückwärtsspulen (+/-10s) - Lautstärkeregler - Bildanzeige (Diashow per Controller-Timer) - Drag-and-drop-Upload - Löschen mit Bestätigungsdialog - Fernsteuerung per Handy, Ausgabe am TV - Tabler-Oberfläche mit CANCOM-Branding, Darkmode und Theme-Toggle - Muted-Autoplay-Fallback (Display startet sofort ohne Klick) ## API-Endpunkte | Methode | Pfad | Beschreibung | |---------|------|-------------| | `GET` | `/api/state` | Aktuellen Player-State abrufen | | `POST` | `/api/play` | Medium abspielen oder Wiedergabe fortsetzen | | `POST` | `/api/stop` | Wiedergabe anhalten | | `POST` | `/api/next` | Nächstes Medium in der Playlist | | `POST` | `/api/prev` | Vorheriges Medium | | `POST` | `/api/seek` | Spulen (±10 Sekunden) | | `POST` | `/api/volume` | Lautstärke setzen | | `GET` | `/api/media` | Medienliste abrufen | ### Beispiele (mit curl) **Status abrufen** ```bash curl http://:5008/api/state # {"current":{"name":"video.mp4","kind":"video"},"playing":true,"seek":0,"version":5,"volume":0.8} ``` **Medium aus der Medienliste abspielen** ```bash curl -X POST http://:5008/api/play \ -H "Content-Type: application/json" \ -d '{"name": "video.mp4"}' ``` **Aktuelles Medium fortsetzen (nach Stop)** ```bash curl -X POST http://:5008/api/play \ -H "Content-Type: application/json" \ -d '{}' ``` **Wiedergabe anhalten** ```bash curl -X POST http://:5008/api/stop ``` **Nächstes / vorheriges Medium** ```bash curl -X POST http://:5008/api/next curl -X POST http://:5008/api/prev ``` **10 Sekunden vor / zurück spulen** ```bash curl -X POST http://:5008/api/seek \ -H "Content-Type: application/json" \ -d '{"seconds": 10}' curl -X POST http://:5008/api/seek \ -H "Content-Type: application/json" \ -d '{"seconds": -10}' ``` **Lautstärke auf 50 %** ```bash curl -X POST http://:5008/api/volume \ -H "Content-Type: application/json" \ -d '{"volume": 0.5}' ``` **Medienliste abrufen** ```bash curl http://:5008/api/media ``` ## Oberfläche - Die Kopfzeile nutzt das CANCOM-Logo aus `static/cancom.svg` - Das Favicon liegt in `static/favicon.ico` - Die Wordmark `Videoplayer / Media Kiosk` ist zweizeilig in der Kopfzeile - Darkmode und Lightmode werden über `keyadmin-theme` im Browser gespeichert - CANCOM-Rot (`#da002d`) als Primärfarbe, dunkler Header (`#2b2f36`) ## Starten ```bash python3 -m venv venv source venv/bin/activate pip install -r requirements.txt python3 app.py ``` Danach im Browser: - `http://:5008/display` auf dem HDMI-Monitor oder Mac-Kiosk - `http://:5008/controller` auf dem Handy Der Display startet sofort ohne Klick (Muted-Autoplay). Einmaliger Klick auf den Display-Bildschirm schaltet den Ton endgültig frei. ## Kioskmodus Chromium im Kioskmodus starten: ```bash chromium-browser --kiosk http://127.0.0.1:5008/display ``` ## Autostart unter Linux ```bash chmod +x install-autostart.sh ./install-autostart.sh ``` Optional auch manuell in `~/.config/autostart/launch-videoplayer.desktop`. ## systemd Autostart ```bash sudo chmod +x install-systemd.sh sudo ./install-systemd.sh sudo systemctl start videoplayer.service ``` Der Dienst nutzt standardmäßig `/opt/videoplayer`, Uploads unter `/opt/videoplayer/uploads`. ## Mac-Kiosk Start: `./start-mac-kiosk.sh` Stop: `./stop-mac-kiosk.sh` ## Umgebungsvariablen - `UPLOAD_DIR` – Upload-Verzeichnis (Standard: `/uploads`) - `PORT` – Server-Port (Standard: `5008`) ## Hinweise - Die Steuerung läuft komplett über HTTP und REST-API, also auch vom Handy aus. - `/display` enthält keinerlei Bedienelemente – nur das aktuelle Medium. - Der Lautstärkeregler auf `/controller` steuert die Ausgabe-Lautstärke auf dem Display. - Der Server-Player-State bleibt beim Wechsel zwischen den Ansichten erhalten.