Call refresh_library_cache() after scan completion to immediately publish scanned metadata. Add needs_missing_scan check that only triggers missing scan when German review candidates exist without German tracks. Filter out pending items from missing_german_movies/missing_german_series to prevent showing unscanned files as missing German while background scanner processes them
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→ Animekdrama→ 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,ItaundSpa - 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:
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:
RADARR_URL=http://radarr:7878
RADARR_API_KEY=...
RADARR_MEDIA_PATH=/data/filme
LOCAL_MEDIA_PATH=/media/filme
FILM_MEDIA_VOLUME=/nesflix/filme
Sonarr
SONARR_URL=http://sonarr:8989
SONARR_API_KEY=...
SONARR_MEDIA_PATH=/data/serien
LOCAL_SERIES_PATH=/media/serien
SERIES_MEDIA_VOLUME=/nesflix/serien
SABnzbd
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:
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.
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:
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:
NVIDIA_SMI_BIN=nvidia-smi
Für NVIDIA Container Toolkit kann der Service zusätzlich mit GPU-Zugriff gestartet werden:
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
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
docker compose up -d --build
docker compose logs -f media-max
Der Compose-Stack bindet standardmäßig ein:
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:
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:
ffprobe -v error \
-show_entries stream=codec_type,codec_name:stream_tags=language \
-of json "/media/filme/DEIN/FILM.mkv"
Für SMART:
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.