No description
  • Shell 91.1%
  • Dockerfile 8.9%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-23 11:47:33 +02:00
.forgejo/workflows Kommentare und README: BuildKit-Daemon liegt im Forgejo-Stack 2026-10-19 16:40:06 +00:00
flows Tdarr-Node aus dem Homelab-Repo übernommen, Build-Workflow ergänzt 2026-10-19 15:42:57 +00:00
.gitignore Tdarr-Node aus dem Homelab-Repo übernommen, Build-Workflow ergänzt 2026-10-19 15:42:57 +00:00
Dockerfile Tdarr-Node aus dem Homelab-Repo übernommen, Build-Workflow ergänzt 2026-10-19 15:42:57 +00:00
plex-transcode.sh Bitrate-Schwelle standardmäßig aus: Video immer per HEVC versuchen 2026-10-23 11:42:41 +02:00
README.md README: keine Mindest-Bitrate mehr im Standard 2026-10-23 11:43:06 +02:00

Tdarr Node (Plex)

Eigener Tdarr-Node für die automatische Transcodierung der Plex-Bibliothek, GPU-beschleunigt (NVIDIA, NVENC). Das Image besteht aus dem offiziellen Node-Image (haveagitgat/tdarr_node) plus dovi_tool, mkvtoolnix, jq und dem Skript plex-transcode.sh. Der Tdarr-Server selbst läuft im Homelab-Repo (services/tdarr/), dort steht auch die Compose-Datei.

Inhalt

  • Dockerfile: Node-Image + dovi_tool (jeweils aktuelle Release) + mkvtoolnix + jq + Skript
  • plex-transcode.sh: Aufräumen von Audio und Untertiteln, Video-Transcodierung per NVENC, Dolby-Vision-Behandlung
  • flows/plex.json: Tdarr-Flow, der das Skript aufruft (Import als JSON-Template)
  • .forgejo/workflows/build.yaml: baut und veröffentlicht das Image

Image und CI

Der Workflow build.yaml veröffentlicht das Image in der Container-Registry von Forgejo:

forgejo.makeitsystems.de/makeitsystems/tdarr-node:latest
forgejo.makeitsystems.de/makeitsystems/tdarr-node:<YYYY.MM.N>
  • Push auf main: Image als latest und <YYYY.MM.N>, dazu Tag und Forgejo-Release im Schema YYYY.MM.N (wie im Homelab-Repo). Gearbeitet wird auf develop, main wird per Fast-Forward nachgezogen
  • Jede Nacht um 03:00: Image mit --pull neu bauen und als latest veröffentlichen, damit der Node auf dem Stand des offiziellen Images bleibt. Tdarr verlangt dieselbe Version für Server und Node. Kein Tag, kein Release
  • Manuell: "Workflow ausführen". Mit kein_cache = ja wird ohne Build-Cache gebaut, das lädt dovi_tool neu (sonst bleibt die Ebene im Cache, solange sich das Basisimage nicht ändert)

Der Deploy im Homelab-Repo läuft um 03:30, zieht das neue Image zusammen mit dem Server-Image und startet den Stack neu, falls sich etwas geändert hat. Läuft gerade ein Job und es gibt ein neues Image, wird der Container neu gestartet und der Job bricht ab. Die Originaldatei bleibt dabei unverändert.

Voraussetzungen (einmalig):

  • Runner mit Label docker (forgejo-Stack) und der BuildKit-Daemon aus dem Stack infrastructure/forgejo im Homelab-Repo (Container forgejo-buildkit) (tcp://buildkit:1234 im Netz forgejo-jobs). Der Workflow baut mit docker buildx (Treiber remote), der Docker-Socket und der Socket-Proxy werden dafür nicht gebraucht
  • Repo-Secrets REGISTRY_USER und REGISTRY_TOKEN (Token mit write:package). Ohne diese Secrets versucht der Workflow es mit dem Workflow-Token
  • Nach dem ersten Push das Paket in den Paketeinstellungen mit diesem Repo verknüpfen
  • Die Registry (/v2/) muss ohne Tinyauth erreichbar sein, sonst scheitern docker login, Push und Pull

Das Image wird nur für linux/amd64 gebaut.

Einsatz im Homelab

Im Tdarr-Stack (services/tdarr/compose.yaml im Homelab-Repo) nutzt der Node das fertige Image statt eines eigenen Builds:

  tdarr-node:
    image: forgejo.makeitsystems.de/makeitsystems/tdarr-node:latest

Was der Flow macht (flows/plex.json)

Ein einziger Flow für alle Bibliotheken, alles Weitere kommt aus Bibliotheksvariablen. Die Logik steckt in plex-transcode.sh:

  • Audio: je Sprache die beste Spur, Kommentar- und Audiodeskriptionsspuren fliegen raus, die erste Sprache aus audio_langs steht zuerst und ist Default. Codec je Spur: 2.0 und Mono werden AAC (192k, Mono 96k), 3 bis 6 Kanäle werden E-AC3 (448k, 5.1 640k). 7.1 wird nicht heruntergemischt, sondern unverändert kopiert (der ffmpeg-E-AC3-Encoder kann nur 5.1). Atmos/DTS:X sowie bereits vorhandenes AAC, AC3 und E-AC3 werden unverändert kopiert. Die Erkennung von Atmos/DTS:X hängt von der ffprobe-Version im Node ab
  • Untertitel: Text-Untertitel werden zu SRT, Bild-Untertitel (PGS/VobSub) werden verworfen, bei keep_ass=true bleibt ASS/SSA erhalten
  • Video ohne HDR: codec_sdr, HDR10/HLG ohne Dolby Vision: codec_hdr (hevc oder av1, jeweils NVENC, 10 Bit)
  • Dolby Vision Profil 7/8: HEVC NVENC, RPU per dovi_tool wieder eingefügt (Profil 7 wird zu 8.1). Wird kein Profil 8 im Ergebnis gefunden, bleibt das Video unverändert. Profil 5 bleibt unverändert
  • Weniger als 10 % Ersparnis: Video bleibt unverändert, Audio und Untertitel werden trotzdem aufgeräumt. Eine Mindest-Bitrate gibt es standardmäßig nicht (MIN_KBPS_1080 und MIN_KBPS_2160 stehen auf 0, jedes Video wird versucht). Wer niedrig bitratige Quellen überspringen will, setzt die Variablen per Umgebungsvariable am Node, z. B. MIN_KBPS_1080=3000
  • Fertige Dateien bekommen den Tag TDARR_PLEX=v1 und werden nicht erneut bearbeitet
  • Die Zieldatei behält den Namen der Originaldatei (nur Endung .mkv), sonst findet Sonarr/Radarr sie nicht mehr. Umbenannt wird nicht in Tdarr: Danach benachrichtigt der Flow Radarr/Sonarr, lässt dort die Benennungsregeln anwenden und benachrichtigt erneut
  • Fortschritt: Das Skript gibt ffmpeg -stats aus, damit Tdarr den Fortschritt anzeigen kann. Ob Tdarr das bei einem eigenen Skript auswertet, ist nicht bestätigt

Einrichtung in Tdarr (einmalig)

  1. Tdarr öffnen, Flows, Flow importieren (Import JSON Template): flows/plex.json
  2. Vier Bibliotheken anlegen (Filme, Serien, Anime Filme, Anime Serien), jeweils den Flow zuweisen, Transcode-Optionen leer lassen
  3. Bibliotheksvariablen je Bibliothek setzen:
Variable Filme Serien Anime
arr radarr sonarr radarr / sonarr
arr_host URL von Radarr URL von Sonarr passende URL
arr_api_key API-Key API-Key API-Key
audio_langs de,en de,en ja,de,en
sub_langs de,en de,en de,en
keep_ass false false true
codec_sdr hevc hevc hevc
codec_hdr hevc hevc hevc

Optional: cq_hevc (Standard 23), cq_av1 (28), nv_preset (p7). Leere Variablen nutzen den Standard. 4. In Radarr und Sonarr unter Connect die Plex-Verbindung mit "On Rename" (und Import/Upgrade) aktivieren, damit Plex nach dem Umbenennen aktualisiert wird 5. Erst mit einer Test-Bibliothek und wenigen Dateien starten und in Infuse prüfen (SDR, HDR10, Dolby Vision)

AV1 später einschalten

codec_sdr bzw. codec_hdr auf av1 setzen, mehr nicht. Neue Codecs werden in venc_args im Skript ergänzt. Dolby Vision bleibt immer HEVC. Der aktuelle Apple TV 4K (1. Generation) hat keinen AV1-Decoder, Infuse decodiert immer auf dem Gerät, deshalb vorher mit einer Testdatei prüfen.

Hinweise

  • Die GPU wird mit Plex, Immich und Ollama geteilt
  • Der Build und die Skriptteile mit NVENC und dovi_tool sind bisher nicht auf der echten Hardware getestet