220 lines
8.4 KiB
Markdown
220 lines
8.4 KiB
Markdown
# 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
|
|
|
|
- Tracearr-inspirierter Aufbau mit linker Navigation, dunkler Oberfläche und übersichtlichen Statuskarten
|
|
- 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
|
|
- Spracherkennung über Sprach-Tags und eindeutige Audio-/Untertitel-Titel, inklusive regionaler Codes (`de-DE`, `pt-BR`)
|
|
- Ersatzweise Dateimetadaten aus Radarr/Sonarr (mit `*` markiert); unbekannte Spuren werden nicht geraten
|
|
- 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
|
|
- Animierte Ansichtswechsel, gestaffelte Karten, Filter-Ergebnisse, aufklappende Serien und Einstellungen, Live-Status und fließende Fortschrittsanzeigen; berücksichtigt automatisch „Bewegung reduzieren“ im Betriebssystem
|
|
|
|
## 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.
|
|
Nach einem Scanner-Update werden ältere Cache-Einträge automatisch neu analysiert. Fehlgeschlagene Analysen können beim nächsten Bibliotheks-Sync nach mindestens fünf Minuten erneut versucht werden. Fehlerhafte oder noch nicht gescannte Dateien erscheinen nicht fälschlich in „Ohne Deutsch“.
|
|
`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
|
|
|
|
„Unbekannt“ bedeutet, dass eine Spur weder einen verwertbaren Sprach-Tag noch einen eindeutigen Spurtitel besitzt. Wenn auch Radarr/Sonarr keine Dateisprachen liefern, kann die App die Sprache nicht zuverlässig bestimmen. Die Originalsprache eines Films und Release-Kürzel wie `DL` sind kein Nachweis für die tatsächlichen Audiospuren.
|
|
|
|
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.
|
|
|
|
## Tests
|
|
|
|
```bash
|
|
python -m unittest discover -s tests -v
|
|
node --check static/dashboard.js
|
|
node --test tests/test_dashboard_motion.js
|
|
```
|
|
|
|
Die Tests verwenden gemockte Dienste und benötigen keine Medienbibliothek oder API-Schlüssel.
|