Zum Inhalt

Tdarr — Automatisches H.264 → H.265 Transcoding

Letzte Änderung: 2026-04-22\ Status: Aktiv — Transcode läuft

Übersicht

Tdarr ist ein automatisches Transcoding-System, das alle H.264-Dateien auf dem NAS in H.265/HEVC konvertiert. Ziel: ~10-12 TB Platzersparnis (35-40%) bei gleicher Qualität.

| Eigenschaft | Wert | | Container | ghcr.io/haveagitgat/tdarr:latest | | WebUI | http://192.168.178.20:8265 | | Hardware-Encoding | AMD VAAPI (/dev/dri/renderD128) | | Encoder | hevc_vaapi | | GPU-Worker | 2 gleichzeitig | | Ausgabeformat | MKV (H.265 HEVC) |

System-Infos

  • NAS: 192.168.178.20 (Ryzen 5 PRO 4650G, 6 Kerne / 12 Threads)
  • GPU: AMD Radeon Vega (integriert) — VAAPI via /dev/dri/renderD128
  • Gruppen: render:106, video:44 (dockeruser ist Mitglied)

Docker-Struktur

  • Compose: /usr/anatol/dockeruser/compose/tdarr/docker-compose.yml
  • Daten: /usr/anatol/dockeruser/data/tdarr/
  • Transcode-Cache: /usr/anatol/downloads/tdarr_cache/ (NVMe, schnell!)

Libraries

| Library ID | Pfad | Inhalt | | lib_filme | /filme1 | Filme | | lib_kinderfilme | /KinderFilme | Kinderfilme | | lib_christmas | /christmas | Weihnachtsfilme | | lib_dokufilme | /dokufilme | Dokumentarfilme | | lib_serien | /Serien1 | Serien | | lib_dokuserien | /dokuserien | Doku-Serien | | lib_kinderserien | /kidstv | Kinder-Serien |

Nicht konvertiert: /mnt/expansion (externe Platte)

Plugin-Konfiguration

Plugin: Tdarr_Plugin_Mthr_VaapiHEVCTranscode

  • Codec: hevc_vaapi
  • Hardware-Decoding: VAAPI
  • Bitrate: currentBitrate / 2
  • Bereits HEVC-Dateien werden übersprungen

FFmpeg-Kommando (Beispiel):

tdarr-ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi \
  -i input.mkv -map 0:v -map 0:a -map 0:s? -c copy -c:v:0 hevc_vaapi \
  -b:v 1396k -minrate 977k -maxrate 1814k -bufsize 1M output.mkv

Bekannte Bugs & Lösungen

Bug 1: TypeError settingsPlugin

Fehler: TypeError: Cannot read properties of undefined (reading 'settingsPlugin')\ Ursache: Library-JSON hatte kein decisionMaker-Objekt\ Fix: decisionMaker mit settingsPlugin:true zu allen Libraries hinzugefügt

Bug 2: workDir "undefined/..."

Fehler: Cache-Pfad wurde zu undefined/tdarr-workDir2-...\ Ursache: Library-JSON hatte kein cache-Feld\ Fix: cache: "/temp" zu allen Libraries hinzugefügt (/temp = Container-Pfad des NVMe-Cache)

Bug 3: "No pre-processing plugins selected!"

Fehler: Jeder Transcode-Job schlug fehl mit ☒No pre-processing plugins selected!\ Ursache: pluginIDs-Format war falsch — Tdarr erwartet _id, checked:true, source, priority, InputsDB\ Fix: Korrektes Format in alle 7 Libraries geschrieben

Bug 4: Scanner findet 0 Dateien

Fehler: Scanner lief durch, fand aber keine Dateien\ Ursache: Tdarr liest nicht allowedContainers sondern containerFilter (internes Mapping im obfuskierten Code)\ Fix: containerFilter: "mkv,mp4,avi,m2ts,mov" zu allen Libraries hinzugefügt

Bug 5: Healthcheck-Fehler

Fehler: Healthcheck-Worker produzierte ständig Fehler (leere Args, Exit Code 1)\ Ursache: healthCheck ist in Libraries deaktiviert, aber Node hatte healthcheckcpu:1\ Fix: workerLimits.healthcheckcpu: 0 im Node gesetzt

Bug 6: autoAcceptTranscodes deaktiviert — Dateien warten auf Bestätigung

Fehler: Fertig transkodierte Dateien stecken in transcodeSuccess fest, Originale werden nicht ersetzt, Cache füllt sich\ Ursache: autoAcceptTranscodes: false ist der Default. Tdarr wartet nach jedem Transcode auf manuelle Bestätigung via WebUI\ Fix: In settingsglobaljsondb auf true setzen (Container muss gestoppt sein):

docker run --rm -v /usr/anatol/dockeruser/data/tdarr:/data python:3-slim python3 -c "
import sqlite3, json
con = sqlite3.connect('/data/server/Tdarr/DB2/SQL/database.db')
cur = con.cursor()
cur.execute('SELECT id, json_data FROM settingsglobaljsondb LIMIT 1')
row = cur.fetchone()
j = json.loads(row[1])
j['autoAcceptTranscodes'] = True
cur.execute('UPDATE settingsglobaljsondb SET json_data = ? WHERE id = ?', (json.dumps(j), row[0]))
con.commit(); con.close(); print('Done')
"

Stuck files manuell accepten (falls schon viele angesammelt):

# IDs sammeln
docker run --rm -v /usr/anatol/dockeruser/data/tdarr:/data python:3-slim python3 -c "
import sqlite3, json
con = sqlite3.connect('/data/server/Tdarr/DB2/SQL/database.db')
cur = con.cursor()
cur.execute("UPDATE stagedjsondb SET json_data = json_patch(json_data, '{\"status\":\"accepted\",\"handling\":\"awaitingCopy\"}') WHERE json_extract(json_data, '$.status') = 'transcodeSuccess'")
con.commit(); print('Updated:', cur.rowcount); con.close()
"
# Container danach neu starten
docker restart tdarr

DB-Zugriff

SQLite-Datenbank: /usr/anatol/dockeruser/data/tdarr/server/Tdarr/DB2/SQL/database.db

Da claude-User keine Schreibrechte hat, immer via Docker:

docker run --rm -v /usr/anatol/dockeruser/data/tdarr:/data python:3-slim python3 -c "
import sqlite3, json
con = sqlite3.connect('/data/server/Tdarr/DB2/SQL/database.db')
# ... queries ...
"

Wichtige Tabellen: - librarysettingsjsondb — Library-Konfigurationen - filejsondb — Alle indizierten Dateien + Status - stagedjsondb — Aktive Jobs - nodejsondb — Node/Worker-Konfiguration - jobsjsondb — Job-Historie

Transcode-Ergebnisse

Erster Testlauf (2026-04-21): - Datei: Yu-Gi-Oh GX S03E51 (480p, 20 Minuten) - Vorher: H.264, 423 MB - Nachher: H.265 HEVC (hevc_vaapi), 217 MB - Ersparnis: -48% - Laufzeit: ~2 Minuten

Speicherverbrauch (Vor/Nach-Vergleich)

Gemessen am 2026-04-22 (Tdarr-Start, ~100 Dateien bereits konvertiert):

| Bibliothek | Pfad | Größe vorher | | Filme | /filme1 | 11 TB | | KinderFilme | /KinderFilme | 997 GB | | Weihnachtsfilme | /christmas | 826 GB | | Dokufilme | /dokufilme | 130 GB | | Serien | /Serien1 | 14 TB | | Dokuserien | /dokuserien | 622 GB | | KinderSerien | /kidstv | 1,3 TB | | Gesamt | ~28,9 TB |

Nach Abschluss des Transcoding hier die "Nachher"-Werte eintragen zum Vergleich.

Fortschritt

  • Start: 2026-04-21
  • Dateien gesamt: 17.558
  • Geschätzte Dauer: 6-10 Wochen
  • Geschätzte Ersparnis: ~10-12 TB

Changelog

  • 2026-04-22 — Bug autoAcceptTranscodes behoben, 100 stuck files manuell accepted, Transcode läuft durch
  • 2026-04-21 — Setup abgeschlossen, erster VAAPI-Transcode erfolgreich, alle Bugs behoben