diff --git a/README.md b/README.md index 9b90243..710b659 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,74 @@ # Media Max -## Datastore +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. -Der Datastore-Tab zeigt den read-only Speicherstatus von `/nesflix`, Medienkategorien -und den Linux-Software-RAID-Status. Größen-Scans werden standardmäßig 15 Minuten -gecacht; RAID-/Recovery-Werte aktualisieren sich live. Konfigurierbar sind -`DATASTORE_PATH`, `DATASTORE_HOST_PATH`, `RAID_DEVICE`, `STORAGE_CACHE_SECONDS` und -optional `SMART_ENABLED=true` für SMART-Healthwerte. +## Funktionen -## Wichtig: Path-Mapping +- 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 -Radarr kann seine Filme z.B. unter `/data/filme` sehen, während der Host sie unter -`/nesflix/filme` hat. Das Dashboard unterstützt diese Abbildung explizit: +## Konfiguration -```yaml -environment: - RADARR_MEDIA_PATH: "/data/filme" - LOCAL_MEDIA_PATH: "/media/filme" +Persönliche Werte gehören in `.env`. Die Datei ist in `.gitignore` eingetragen. Als Vorlage dient `.env.example`: -volumes: - - /nesflix/filme:/media/filme:ro +```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 zusätzlich Jellyfin, Seerr, Prowlarr, Easynews as Indexer, -qBittorrent, Bazarr, Lingarr, LibreTranslate sowie die Sonarr-/Radarr-Prowlarr-Proxies. -Die Prüfungen laufen parallel im Hintergrund und blockieren die Seite nicht. - -Die Standardnamen funktionieren, wenn die Container im selben Docker-Netzwerk liegen. -Für qBittorrent muss `QBITTORRENT_URL` auf eine aus dem Dashboard-Container erreichbare -URL zeigen, zum Beispiel `http://host.docker.internal:8080` oder die Host-IP. +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_ODER_IP:8080 +QBITTORRENT_URL=http://host.docker.internal:8080 BAZARR_URL=http://bazarr:6767 LINGARR_URL=http://lingarr:9876 LIBRETRANSLATE_URL=http://libretranslate:5000 @@ -47,73 +78,93 @@ SERVICE_CHECK_TIMEOUT=3 SERVICE_REFRESH_SECONDS=30 ``` -Für die bereits vorhandenen Container sind keine zusätzlichen Compose-Services nötig; -sie müssen im gemeinsamen `media-stack_default`-Netzwerk erreichbar sein. Falls -qBittorrent nicht über `host.docker.internal` erreichbar ist, kann unter Linux je nach -Docker-Konfiguration dieser Eintrag ergänzt werden: +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. -```yaml -extra_hosts: - - "host.docker.internal:host-gateway" +## Scans und Performance + +Scans laufen nach dem Laden der Bibliotheksdaten im Hintergrund. Über den Button „Neu scannen“ kann zwischen Radarr, Sonarr und allen Quellen 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 ``` -Ein Radarr-Pfad wie: +`SCAN_WORKERS` steuert die Anzahl paralleler `ffprobe`-Jobs. Höhere Werte beschleunigen große Bibliotheken, erhöhen aber die I/O-Last. -`/data/filme/Avatar (2009)/Avatar.mkv` +## Datastore, RAID und SMART -wird dadurch für ffprobe zu: +Der Datastore ist standardmäßig `/nesflix` und wird read-only eingebunden: -`/media/filme/Avatar (2009)/Avatar.mkv` - -## Konfiguration - -Die persönlichen URLs, Pfade und API-Keys liegen in `.env`. Diese Datei ist in `.gitignore` eingetragen und bleibt bei `git pull` erhalten. Als Vorlage dient `.env.example`. - -Beim ersten Start: - -```bash -cp .env.example .env +```env +DATASTORE_PATH=/nesflix +DATASTORE_HOST_PATH=/nesflix +RAID_DEVICE=/dev/md127 +STORAGE_CACHE_SECONDS=900 +SMART_ENABLED=true +HOST_SYS_PATH=/host-sys ``` -Danach die Werte in `.env` eintragen. Sonarr und SABnzbd werden dort durch Auskommentieren der jeweiligen Variablen aktiviert. Wenn Sonarr aktiv ist, muss `SERIES_MEDIA_VOLUME` auf den echten Host-Pfad deiner Serien-Library zeigen; dieser Ordner wird in den Dashboard-Container nach `/media/serien` gemountet. +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. -## Start +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. -API-Keys und Pfade in `.env` anpassen: +## 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 down docker compose up -d --build -docker compose logs -f +docker compose logs -f media-max ``` -Die Seite lädt zuerst die Library-Metadaten. Die ffprobe-Scans laufen danach im Hintergrund; oben wird der Fortschritt angezeigt. Für Sonarr die optionalen Variablen und den Serien-Volume-Mount in `docker-compose.yml` aktivieren. Die Navigation trennt Filme und Serien, Serien sind pro Show aufklappbar. - -Sonarr benötigt: +Der Compose-Stack bindet standardmäßig ein: ```yaml -SONARR_URL: "http://sonarr:8989" -SONARR_API_KEY: "..." -SONARR_MEDIA_PATH: "/data/serien" -LOCAL_SERIES_PATH: "/media/serien" +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 ``` -SABnzbd benötigt für den Download-Tab: +Für Radarr, Sonarr und die weiteren Container wird das externe Netzwerk `media-stack_default` verwendet. -```yaml -SAB_URL: "http://sabnzbd:8080" -SAB_API_KEY: "..." -``` +## Fehlersuche -Der API-Key steht in SABnzbd unter `Config > General`. Die laufenden Jobs kommen aus der SABnzbd-Queue, abgeschlossene und fehlgeschlagene Jobs aus der History. Die Sprache eines laufenden Releases wird aus dessen Namen abgeleitet; nach dem Import ist die Sprache im Radarr-/Sonarr-Scan verlässlich. - -## Bei weiterem Scanfehler - -Prüfe einen Pfad im Container: +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 -ffprobe -v error -show_entries stream=codec_type,codec_name:stream_tags=language -of json "/media/filme/DEIN/FILM.mkv" ``` + +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.