# Media Upload & Embed Specification **Version:** 1.2 **Datum:** 2026-05-07 **Status:** Aktuell für Upload-Limits, MIME, Embed — **zentraler Medien-Ist-Stand** inkl. Archiv, Lifecycle, Pfadkonvention: **`MEDIA_ASSETS_AND_ARCHIVE_SPEC.md`** > **Zielbild Medien-Archiv, Wiederverwendung, Papierkorb, Copyright, externe Speicherung, später Inline im Fließtext:** > Verbindliche Single Source of Truth: **`MEDIA_ASSETS_AND_ARCHIVE_SPEC.md`** (§11 Leitplanken Inline, ohne Umsetzung). > Dieses Dokument bleibt maßgeblich für **konkrete Upload-Limits, MIME-Liste und Embed-Hosting** des aktuellen Stands bis zum Refactor. --- ## 1. Upload-Strategie ### 1.1 Hybrid-Ansatz **Zwei Medienquellen:** 1. **Lokale Uploads:** Datei-Upload auf Server (Images, Videos, PDFs, Sketches) 2. **Embeds:** Einbetten von YouTube, Instagram, Vimeo, TikTok **Vorteile:** - Lokale Kontrolle über kritische Inhalte - Keine Abhängigkeit von Drittanbietern für Kern-Content - Externe Plattformen für ergänzende Videos **Limitierungen (implementiert):** - Max. Dateigröße: **50 MB** Standardnutzer (`EXERCISE_MEDIA_MAX_UPLOAD_MB`, Default 50). - **`admin` / `superadmin`**: höheres Limit (**1024 MB** Default `EXERCISE_MEDIA_ADMIN_MAX_UPLOAD_MB`; nie unter dem Nutzer-Limit in MB). - Max. 10 Media-Items pro Übung (kombiniert Local + Embeds) — siehe Backend-Validierung - Erlaubte Formate: JPEG, PNG, GIF, MP4, PDF --- ## 2. Upload-Flow (Lokale Dateien) ### 2.1 Frontend-Komponente: MediaUploader **Props:** ```typescript interface MediaUploaderProps { exerciseId: number existingMedia: Media[] onUploadComplete: (media: Media) => void maxFiles?: number // default: 10 maxSizeMB?: number // default: 50 } ``` **UI-Struktur:** ```jsx
{/* Drag & Drop Area */} {/* Preview Grid */}
{uploadQueue.map(file => (
))}
{/* Metadata Form (per File) */}