Add "missing" job state to jobs dict with idle/total/done/error tracking. Update start_scan() to handle "missing" source by filtering radarr_rows() and sonarr_groups() for is_german_review_candidate() entries without has_german_track(). Skip cache deletion for missing-German scan in api_rescan() with comment explaining cache preservation. Add "Nur Ohne Deutsch" option to scanSource select
171 lines
5.6 KiB
Markdown
171 lines
5.6 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
|
|
|
|
- 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
|
|
- 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
|
|
|
|
Scans laufen nach dem Laden der Bibliotheksdaten im Hintergrund. Über den Button „Neu scannen“ kann zwischen Radarr, Sonarr, allen Quellen und ausschließlich den aktuellen Einträgen der Liste „Ohne Deutsch“ gewählt werden. Die automatische Scan-Häufigkeit wird in den Einstellungen festgelegt.
|
|
|
|
```env
|
|
SCAN_WORKERS=4
|
|
REQUEST_TIMEOUT=20
|
|
DB_PATH=/data/cache.db
|
|
```
|
|
|
|
`SCAN_WORKERS` steuert die Anzahl paralleler `ffprobe`-Jobs. Höhere Werte beschleunigen große Bibliotheken, erhöhen aber die I/O-Last.
|
|
|
|
## 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.
|
|
|
|
## 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.
|