# Media Max Media Max ist ein kompaktes Media-Control-Dashboard für Radarr, Sonarr und SABnzbd. Es zeigt Medienqualität, Audio- und Untertitelspuren, fehlende deutsche Spuren, laufende Downloads sowie System-, Speicher- und RAID-Status. ## Funktionen - Radarr-Filme mit Qualität, Status, Audio, Untertiteln, Codec und Größe - Sonarr-Serien mit Episodenansicht und Kategorien über Tags: - `anime` → Anime - `kdrama` → K-Dramen - alle anderen → Standard - Separate Liste „Ohne Deutsch“ für vorhandene oder aktuell geladene Medien - Staffel 0 kann in den Einstellungen ein- oder ausgeblendet werden - Externe Untertitel (`.srt`, `.ass`, `.ssa`, `.vtt`, `.sub`, `.idx`, `.sup`) werden berücksichtigt - SABnzbd-Downloadübersicht mit aktiven Downloads und separater Queue-/Verifying-Tabelle - Download-Sprachen aus üblichen Release-Kürzeln wie `Eng`, `Ger`, `Fre`, `Ita` und `Spa` - Dashboard mit Diensten, CPU, RAM, Speicher, I/O Pressure und Bibliotheksstatistiken - Datastore mit Kategorien, Gesamtauslastung, I/O Pressure und RAID-Status - Graphics-Tab mit NVIDIA-GPU-Modell, Treiber, UUID, Seriennummer, Temperatur, Auslastung, VRAM, Leistung, Clocks und GPU-Prozessen - RAID-Rebuild-Fortschritt, Geschwindigkeit, Restzeit, Plattenmodell, SMART, Temperatur und Hersteller-Seriennummer - Parallele Hintergrundscans mit konfigurierbarer Worker-Anzahl - PWA-Unterstützung für HTTPS-fähige Installationen auf Desktop und Android ## Konfiguration Persönliche Werte gehören in `.env`. Die Datei ist in `.gitignore` eingetragen. Als Vorlage dient `.env.example`: ```bash cp .env.example .env ``` ### Radarr und Medienpfade Radarr kann beispielsweise `/data/filme` verwenden, während Media Max die Dateien im Container unter `/media/filme` sieht: ```env RADARR_URL=http://radarr:7878 RADARR_API_KEY=... RADARR_MEDIA_PATH=/data/filme LOCAL_MEDIA_PATH=/media/filme FILM_MEDIA_VOLUME=/nesflix/filme ``` ### Sonarr ```env SONARR_URL=http://sonarr:8989 SONARR_API_KEY=... SONARR_MEDIA_PATH=/data/serien LOCAL_SERIES_PATH=/media/serien SERIES_MEDIA_VOLUME=/nesflix/serien ``` ### SABnzbd ```env SAB_URL=http://sabnzbd:8080 SAB_API_KEY=... ``` Der Download-Tab verwendet Queue und History aus SABnzbd. Für laufende Releases werden Sprachen aus dem Dateinamen abgeleitet; die Medienanalyse nach dem Import erfolgt über `ffprobe`. ## Dienststatus Der Dashboard-Tab prüft die Dienste parallel mit kurzen Timeouts und aktualisiert sie regelmäßig: ```env JELLYFIN_URL=http://jellyfin:8096 SEERR_URL=http://seerr:5055 PROWLARR_URL=http://prowlarr:9696 EASYNEWS_INDEXER_URL=http://easynews-as-indexer:8081 QBITTORRENT_URL=http://host.docker.internal:8080 BAZARR_URL=http://bazarr:6767 LINGARR_URL=http://lingarr:9876 LIBRETRANSLATE_URL=http://libretranslate:5000 SONARR_PROWLARR_PROXY_URL=http://sonarr-prowlarr-proxy:8080 RADARR_PROWLARR_PROXY_URL=http://radarr-prowlarr-proxy:8080 SERVICE_CHECK_TIMEOUT=3 SERVICE_REFRESH_SECONDS=30 ``` Die Container müssen im gemeinsamen Docker-Netzwerk `media-stack_default` erreichbar sein. qBittorrent läuft außerhalb des Compose-Stacks und benötigt deshalb eine erreichbare URL. Bei Bedarf stellt `extra_hosts` den Namen `host.docker.internal` bereit. ## Scans und Performance Der Bibliotheks-Sync läuft als serverseitiger Hintergrund-Thread und benötigt keinen geöffneten Browser. Beim Start und anschließend nach `SYNC_INTERVAL_SECONDS` werden Radarr, Sonarr und die Sprachprüfung aktualisiert. Über den Button „Neu scannen“ kann weiterhin manuell zwischen Radarr, Sonarr, allen Quellen und ausschließlich den aktuellen Einträgen der Liste „Ohne Deutsch“ gewählt werden. ```env SCAN_WORKERS=4 REQUEST_TIMEOUT=20 DB_PATH=/data/cache.db SYNC_INTERVAL_SECONDS=1800 RAID_REFRESH_SECONDS=5 IO_REFRESH_SECONDS=5 GPU_REFRESH_SECONDS=5 ``` `SCAN_WORKERS` steuert die Anzahl paralleler `ffprobe`-Jobs. Höhere Werte beschleunigen große Bibliotheken, erhöhen aber die I/O-Last. `SYNC_INTERVAL_SECONDS` steuert den serverseitigen Sync-Takt; `1800` entspricht 30 Minuten, `18000` fünf Stunden und `0` deaktiviert die periodische Wiederholung (der Start-Sync bleibt aktiv). RAID, I/O-Pressure und GPU werden unabhängig vom Browser durch eigene Hintergrund-Monitoren aktualisiert. Die Werte werden aus dem Server-Cache geliefert; die drei Intervalle können separat angepasst werden. ## Datastore, RAID und SMART Der Datastore ist standardmäßig `/nesflix` und wird read-only eingebunden: ```env DATASTORE_PATH=/nesflix DATASTORE_HOST_PATH=/nesflix RAID_DEVICE=/dev/md127 STORAGE_CACHE_SECONDS=900 SMART_ENABLED=true HOST_SYS_PATH=/host-sys ``` Für SMART, Temperaturen und echte Hersteller-Seriennummern benötigt der Container Zugriff auf `/dev`, `/sys`, `/run/udev`, `SYS_RAWIO` sowie `smartctl` im Image. Die App liest keine RAID-Daten schreibend und führt keinen Rebuild aus. Die I/O Pressure basiert auf Linux PSI (`/proc/pressure/io`). Wenn der Kernel PSI nicht unterstützt, wird die Anzeige als nicht verfügbar markiert. ### NVIDIA Graphics Der Graphics-Tab verwendet `nvidia-smi` im Container. Optional kann der Pfad über `NVIDIA_SMI_BIN` gesetzt werden: ```env NVIDIA_SMI_BIN=nvidia-smi ``` Für NVIDIA Container Toolkit kann der Service zusätzlich mit GPU-Zugriff gestartet werden: ```yaml deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] environment: NVIDIA_VISIBLE_DEVICES: all NVIDIA_DRIVER_CAPABILITIES: compute,utility ``` Wenn `nvidia-smi` nicht erreichbar ist, bleibt der Tab verfügbar und zeigt den Grund an. ## Logging ```env LOG_LEVEL=INFO LOG_FILE=/data/media-max.log LOG_RETENTION_HOURS=6 ``` Erwartbare Verbindungsfehler werden als kurze einzeilige Meldungen protokolliert. Die Logdatei wird standardmäßig alle sechs Stunden rotiert. ## Start mit Docker Compose ```bash docker compose up -d --build docker compose logs -f media-max ``` Der Compose-Stack bindet standardmäßig ein: ```yaml volumes: - ${FILM_MEDIA_VOLUME}:/media/filme:ro - ${SERIES_MEDIA_VOLUME:-/nesflix/serien}:/media/serien:ro - ${DATASTORE_HOST_PATH:-/nesflix}:/nesflix:ro - /dev:/host-dev:ro - /sys:/host-sys:ro - /run/udev:/host-run-udev:ro - ./data:/data ``` Für Radarr, Sonarr und die weiteren Container wird das externe Netzwerk `media-stack_default` verwendet. ## Fehlersuche Prüfe zuerst, ob Media Max die Medien sieht: ```bash docker exec -it media-max sh ls -lah /media/filme ls -lah /media/serien find /media/filme -type f | head ``` Teste anschließend `ffprobe` direkt im Container: ```bash ffprobe -v error \ -show_entries stream=codec_type,codec_name:stream_tags=language \ -of json "/media/filme/DEIN/FILM.mkv" ``` Für SMART: ```bash smartctl -i -d sat /host-dev/sda smartctl -A -d sat /host-dev/sda ``` Wenn eine PWA-Installation in Chrome nicht angeboten wird, muss Media Max über gültiges HTTPS aufgerufen werden. Nach Änderungen an Manifest oder Service Worker sollten alte Website-Daten bzw. eine alte Verknüpfung entfernt und die Seite neu geladen werden.