Media Library Grundlagen
Die Mediathek (im Dashboard-Menü heißt sie „Mediathek", intern „Media Library") ist deine zentrale Asset-Verwaltung in Chatlix. Alle Bilder, Sounds, GIFs, Videos, Stinger und Transitions, die du in Overlays, Automations, Alerts, Soundboard oder OBS-Steuerung nutzt, liegen hier. Pro Account, mit Ordnern, Labels, Kind-Filter und Suche.
Du erreichst sie unter /dashboard/media. Backend-seitig steckt das Ganze in Chatlix\Service\MediaService plus den spezialisierten Diensten unter Chatlix\Service\Media\*: MediaEngine (Playback/Fanout an Overlays), MediaProbe (Format-/Metadaten-Erkennung), MediaValidator (Codec-Whitelist), MediaQuotaService (Plan-Limits), MediaFolderService (Ordner-Baum), MediaJobQueue/MediaJobProcessor (asynchrones Transcoding/Thumbnails) und MediaProxy/MediaProxyService (Auslieferung).
Asset-Typen (Kind)
Es gibt keine freien Kategorien wie „Sticker" oder „Alert" – die Mediathek klassifiziert jedes Asset in ein festes kind-Feld. Das steuert Icon, Filter und welche Validierung beim Upload läuft:
- image 🖼️ — statische Bilder (Logos, Wasserzeichen, Hintergründe).
- sound 🔊 — Audio-Assets (Alert-Sounds, Soundboard-Effekte, TTS).
- gif — animierte GIFs (werden intern als Video-Stream ohne Audiospur behandelt).
- video 🎬 — kurze Videoclips (MP4/WebM/MOV/M4V).
- stinger ⚡ — kurze Übergangs-Clips, typischerweise für Szenenwechsel in OBS.
- transition 🌀 — Transition-Assets für Overlay-/Szenen-Übergänge.
Zusätzlich landen automatisch generierte Assets mit eigenen Kind-Werten in derselben Mediathek: tts, sfx, tts-preview, sfx-preview aus dem Audio Studio, sowie cam_background aus der Kamera-Hintergrund-Funktion. Diese erscheinen automatisch, sobald du sie im jeweiligen Studio erzeugst — kein manueller Upload nötig.
Die Kind-Auswahl beim manuellen Upload läuft automatisch über die Dateiendung (z.B. .mp3 → sound, .mp4 → video, .gif → gif); du kannst danach nicht mehr zwischen image/sound wechseln, weil das die Backend-Validierung bestimmt.
Ordner statt Kategorien
Organisation läuft über einen echten Ordner-Baum (nicht über feste Kategorien): Du legst beliebig viele Ordner an, auch verschachtelt (bis max. 8 Ebenen tief), verschiebst Assets per Drag-and-drop oder über den „Verschieben"-Dialog dorthin, und benennst Ordner um oder löschst sie. Löschst du einen Ordner, wandern die enthaltenen Dateien automatisch zurück nach „Ohne Ordner" — sie werden nicht mitgelöscht.
Zusätzlich hat jedes Asset ein optionales, einzeiliges Label (max. 120 Zeichen) als Anzeigename — das ist der einzige „Tagging"-Mechanismus, den es gibt. Es gibt kein Mehrfach-Tag-System. Details zu Label und Ordner-Workflow findest du im Kapitel Upload + Tagging (dort ist auch das Mapping des Kapitelnamens auf den echten Workflow erklärt).
Unterstützte Formate
Die Whitelist ist strikt (Server-seitiges MIME-Sniffing per finfo, nicht der Browser-Header):
- Bilder (Kind
image): PNG, JPG/JPEG, WebP, GIF, AVIF, APNG (animiertes PNG — Animation bleibt beim Metadaten-Strip erhalten). - Video (läuft technisch über denselben
image-Upload-Pfad, Kind wird über die Endung erkannt): MP4, WebM, MOV, M4V. - Audio (Kind
sound): MP3, WAV, OGG, OGA, OPUS, AAC, FLAC, M4A.
Nicht unterstützt, auch wenn sie technisch ähnlich sind: SVG (aus Sicherheitsgründen aktiv geblockt, siehe unten), OGV/Theora, AIFF, CAF, WEBA. Wenn ffprobe/finfo ein Format nicht sauber von Video trennen kann (z.B. WEBA vs. WebM-Video), ist es bewusst draußen.
SVG/HTML/XML sind hart gesperrt — sowohl über die Endungs-Whitelist als auch über eine zusätzliche Deny-Liste (Endung und erkannter MIME-Typ). Grund: SVG kann Inline-<script> und <foreignObject> enthalten und wäre ein XSS-Vektor, wenn es direkt im Overlay/Browser gerendert wird. Ein Upload-Versuch mit .svg scheitert immer mit extension_denied/mime_denied, unabhängig vom Plan.
Größenlimits — planabhängig
Es gibt kein festes 50-MB-Limit für alle. Das Limit pro Upload und der Gesamt-Speicher hängen vom Plan ab:
| Plan | Speicher gesamt | Max. pro Upload | Videos erlaubt |
|---|---|---|---|
| Free | 100 MB | 5 MB | Nein |
| Starter | 1 GB | 10 MB | Ja |
| Creator | 5 GB | 30 MB | Ja |
| Pro | 20 GB | 100 MB | Ja |
| Team | 100 GB | 200 MB | Ja |
Auf Free-Plan sind Video-Uploads komplett gesperrt (Fehlercode free_video_blocked) — dazu zählen alle Dateien mit MIME video/mp4, video/webm, video/quicktime, video/x-m4v. GIFs sind davon nicht betroffen, die zählen als Bild-Kind.
Serverseitig (Nginx/PHP-FPM) ist zusätzlich ein technisches Hard-Limit von 20 MB upload_max_filesize / 25 MB post_max_size gesetzt — das ist unabhängig vom Plan-Limit die absolute Obergrenze für einen einzelnen Request. Für Pro/Team mit 100–200 MB Plan-Limit heißt das: aktuell größere Assets müssten über einen anderen Weg hochgeladen werden; sprich in dem Fall den Support an, falls du an diese Grenze stößt.
Bei Erreichen des Speicher-Kontingents schlägt der Upload fehl mit free_storage_full (Free) bzw. storage_full (bezahlte Pläne) — inklusive einer freundlichen deutschen Fehlermeldung und ggf. einem Upgrade-Hinweis. Im Dashboard siehst du oben in der Mediathek den belegten/verfügbaren Speicher als Balken.
Speicherung, CDN und Sicherheit
Dateien liegen geschützt auf dem Server — der Dateiname wird beim Upload durch einen Zufalls-Hash ersetzt (kein User-Input im Pfad, verhindert Path-Traversal und Enumeration fremder Assets). Ausgeliefert werden Assets über einen signierten Proxy-Pfad (/v1/media/proxy/<token>), nicht über eine öffentlich erratbare URL — das verhindert, dass jemand fremde Storage-URLs direkt erraten oder scrapen kann.
Bilder werden beim Upload von EXIF-/Metadaten befreit (außer bei erkannten Animationen wie APNG, da sonst die Animation verloren geht). Für Sounds und Bilder wird zusätzlich zum MIME-Sniffing ein Magic-Bytes-Check gefahren.
Wenn du ein Asset ersetzen willst (z.B. neues Logo mit gleichem Namen), gibt es kein „Überschreiben" — ein neuer Upload bekommt immer eine neue ID. Referenzen in Automations/Overlays/Alerts musst du manuell auf die neue ID umstellen. Das ist Absicht: verhindert, dass ein Live-Overlay plötzlich kaputtes Audio bekommt, weil im Hintergrund eine Datei ausgetauscht wurde.
Wo werden Assets verwendet?
- Automations als Action
play_media_sound(„Sound abspielen"). - Pro Editor (Overlay-Builder) als Image-, Audio- oder Video-Widget.
- Alerts als Alert-Sound/Alert-Bild.
- Soundboard/StreamDeck-Buttons.
- OBS-Steuerung: Stinger/Transition-Assets für Szenenwechsel.
Details und konkrete Konfigurationsschritte dazu findest du im Kapitel Media in Action verwenden. Löschst du ein Asset, das noch irgendwo referenziert ist, zeigt die Mediathek eine Warnung — Details dazu im Kapitel Upload + Tagging, Abschnitt „Asset entfernen".