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