- Shell 91.1%
- Dockerfile 8.9%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
build / build (push) Successful in 8s
Reviewed-on: #3 |
||
| .forgejo/workflows | ||
| flows | ||
| .gitignore | ||
| Dockerfile | ||
| plex-transcode.sh | ||
| README.md | ||
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+ Skriptplex-transcode.sh: Aufräumen von Audio und Untertiteln, Video-Transcodierung per NVENC, Dolby-Vision-Behandlungflows/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 alslatestund<YYYY.MM.N>, dazu Tag und Forgejo-Release im SchemaYYYY.MM.N(wie im Homelab-Repo). Gearbeitet wird aufdevelop,mainwird per Fast-Forward nachgezogen - Jede Nacht um 03:00: Image mit
--pullneu bauen und alslatestverö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 = jawird ohne Build-Cache gebaut, das lädtdovi_toolneu (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 Stackinfrastructure/forgejoim Homelab-Repo (Containerforgejo-buildkit) (tcp://buildkit:1234im Netzforgejo-jobs). Der Workflow baut mitdocker buildx(Treiberremote), der Docker-Socket und der Socket-Proxy werden dafür nicht gebraucht - Repo-Secrets
REGISTRY_USERundREGISTRY_TOKEN(Token mitwrite: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 scheiterndocker 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_langssteht 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=truebleibt ASS/SSA erhalten - Video ohne HDR:
codec_sdr, HDR10/HLG ohne Dolby Vision:codec_hdr(hevcoderav1, jeweils NVENC, 10 Bit) - Dolby Vision Profil 7/8: HEVC NVENC, RPU per
dovi_toolwieder 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_1080undMIN_KBPS_2160stehen 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=v1und 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
-statsaus, damit Tdarr den Fortschritt anzeigen kann. Ob Tdarr das bei einem eigenen Skript auswertet, ist nicht bestätigt
Einrichtung in Tdarr (einmalig)
- Tdarr öffnen, Flows, Flow importieren (Import JSON Template):
flows/plex.json - Vier Bibliotheken anlegen (Filme, Serien, Anime Filme, Anime Serien), jeweils den Flow zuweisen, Transcode-Optionen leer lassen
- 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_toolsind bisher nicht auf der echten Hardware getestet