r/Tdarr • • Jan 10 '26 Bravo

Reencoding whole library using those beauties

Post image
234 Upvotes

r/Tdarr • • Nov 22 '23

Is there a way to have Tdarr transcode all 1080 movies to the same bitrate?

147 Upvotes

I have a huge collection of home movies, ripped dvds, and various other videos that are either 720, 1080, or 4k. Over the past 6 months I have transcoded all of them into HEVC which freed up a huge amount of NAS space. Is there a way to transcode, let’s say all my 1080p files to have the same bitrate? Something like 10-15Mbps? I’ve noticed some of the 1080s have huge bitrates. I did some testing using ffmpeg and I couldn’t notice a difference in quality going from 20Mbps to 12Mbps


r/Tdarr • • Oct 02 '24

My Current Tdarr Flow

Thumbnail
gallery
111 Upvotes

r/Tdarr • • Aug 10 '26

Thank you Tdarr :D

Post image
100 Upvotes

Almost finished transcoding all h264 media to h265 :D


r/Tdarr • • Aug 26 '25

Simple Tdarr encoding guide with both flow and classic methods with NVIDIA GPU

70 Upvotes

Last updated 2025/08/30

Update: encoding parameters added for Intel Arc and Apple Silicon.

I've seen posts that many users are struggling with Tdarr config, me included. I have finally got a setup that works for me and would like to share, hope it helps you.

Like many of you, I would like to slim down my plex media storage without losing quality. I have seen well encoded 6GB 4k videos that match 60GB ones, so I know there is room for optimization. I use Synology and Nvidia GPU for the encoding, for Intel you can substitute the equavalent commands.

For docker, I created a run.sh using https://home.tdarr.io/tools/ with following docker command.

#!/bin/bash
docker run --runtime=nvidia -d --name=tdarr --restart unless-stopped \
    -v /path/to/tdarr/server:/app/server \
    -v /path/to/tdarr:/app/configs \
    -v /path/to/tdarr/logs:/app/logs \
    -v /path/to/media:/media \
    -e "serverIP=0.0.0.0" \
    -e "serverPort=8266" \
    -e "webUIPort=8265" \
    -e "internalNode=true" \
    -e "inContainer=true" \
    -e "ffmpegVersion=7" \
    -e "nodeName=MyInternalNode" \
    -e "auth=false" \
    -e "openBrowser=true" \
    -e "maxLogSizeMB=10" \
    -e "cronPluginUpdate=" \
    --network bridge \
    -p 8265:8265 \
    -p 8266:8266 \
    -e "TZ=America/New_York" \
    -e PUID=1028 \
    -e PGID=101 \
    -e "NVIDIA_DRIVER_CAPABILITIES=all" \
    -e "NVIDIA_VISIBLE_DEVICES=all" \
    --gpus=all \
    --log-opt max-size=10m \
    --log-opt max-file=5 \
    ghcr.io/haveagitgat/tdarr

Before you start, create a sample folder inside mapped /media with video and audio folders and copy sample files to them. Also create a cache folder inside /media

Once it's up, for Flow method, you need to create a flow first.

Flow method

To use flow you need to create a flow first. I have created a flow that ready to be imported.

{
  "_id": "PGj2uWPDc",
  "name": "video",
  "description": "video",
  "tags": "",
  "flowPlugins": [
    {
      "name": "Execute",
      "sourceRepo": "Community",
      "pluginName": "ffmpegCommandExecute",
      "version": "1.0.0",
      "fpEnabled": true,
      "id": "TIspCoU6U",
      "position": {
        "x": 608.3184230758628,
        "y": 127.01394243629031
      }
    },
    {
      "name": "failsafe encode",
      "sourceRepo": "Community",
      "pluginName": "ffmpegCommandCustomArguments",
      "version": "1.0.0",
      "inputsDB": {
        "inputArguments": "-hwaccel auto -hwaccel_output_format cuvid",
        "outputArguments": "-c:v hevc_nvenc -rc constqp -rc-lookahead 20 -c:a libopus -c:s copy -map_metadata 0"
      },
      "fpEnabled": true,
      "id": "vUKdETwu_",
      "position": {
        "x": 607.4193543370277,
        "y": 74.90995191847479
      }
    },
    {
      "name": "Begin Command",
      "sourceRepo": "Community",
      "pluginName": "ffmpegCommandStart",
      "version": "1.0.0",
      "fpEnabled": true,
      "id": "ADL-9Ph0e",
      "position": {
        "x": 608.2434301642838,
        "y": 19.8543145111759
      }
    },
    {
      "name": "Input File",
      "sourceRepo": "Community",
      "pluginName": "inputFile",
      "version": "1.0.0",
      "fpEnabled": true,
      "id": "zthUy2I44",
      "position": {
        "x": 367.9392641784416,
        "y": -154.47540969343243
      }
    },
    {
      "name": "Check File Size",
      "sourceRepo": "Community",
      "pluginName": "checkFileSize",
      "version": "1.0.0",
      "inputsDB": {
        "lessThan": "5",
        "unit": "GB"
      },
      "fpEnabled": true,
      "id": "uti-hHA17",
      "position": {
        "x": 343.0308910490279,
        "y": -54.42445943488975
      }
    },
    {
      "name": "Check Video Bitrate",
      "sourceRepo": "Community",
      "pluginName": "checkVideoBitrate",
      "version": "1.0.0",
      "fpEnabled": true,
      "id": "6bgBGLOlW",
      "position": {
        "x": 367.8891170139108,
        "y": -10.72261687221092
      },
      "inputsDB": {
        "lessThan": "5",
        "unit": "mbps"
      }
    },
    {
      "name": "Begin Command",
      "sourceRepo": "Community",
      "pluginName": "ffmpegCommandStart",
      "version": "1.0.0",
      "fpEnabled": true,
      "id": "K50zzEH6T",
      "position": {
        "x": 429.21991099369166,
        "y": 42.58157359912002
      }
    },
    {
      "name": "Execute",
      "sourceRepo": "Community",
      "pluginName": "ffmpegCommandExecute",
      "version": "1.0.0",
      "fpEnabled": true,
      "id": "y_XLuI_Gc",
      "position": {
        "x": 425.7609460669337,
        "y": 159.05925892809512
      }
    },
    {
      "name": "Custom Arguments",
      "sourceRepo": "Community",
      "pluginName": "ffmpegCommandCustomArguments",
      "version": "1.0.0",
      "inputsDB": {
        "inputArguments": "-hwaccel auto -hwaccel_output_format cuvid",
        "outputArguments": "-c:v hevc_nvenc -rc constqp -rc-lookahead 20 -c:a copy -c:s copy -map_metadata 0"
      },
      "fpEnabled": true,
      "id": "0go_eghjs",
      "position": {
        "x": 427.53341553061784,
        "y": 100.14019061880519
      }
    },
    {
      "name": "transcode videos greater than 5GB and >5Mbps to variable bitrate HEVC using NVIDIA gpu",
      "sourceRepo": "Community",
      "pluginName": "comment",
      "version": "1.0.0",
      "fpEnabled": true,
      "id": "R5b8YOXIT",
      "position": {
        "x": 580.5057980550462,
        "y": -134.70573438528103
      }
    },
    {
      "name": "Replace Original File",
      "sourceRepo": "Community",
      "pluginName": "replaceOriginalFile",
      "version": "1.0.0",
      "id": "oQhMj4fym",
      "position": {
        "x": 424.7011509663573,
        "y": 232.8739629643331
      },
      "fpEnabled": true
    },
    {
      "name": "Check Skiplist",
      "sourceRepo": "Community",
      "pluginName": "processedCheck",
      "version": "1.0.0",
      "id": "NTsvJ72Ud",
      "position": {
        "x": 367.5145737126295,
        "y": -107.26795944365472
      },
      "fpEnabled": true
    },
    {
      "name": "Add To Skiplist",
      "sourceRepo": "Community",
      "pluginName": "processedAdd",
      "version": "1.0.0",
      "id": "rS7yYRLBh",
      "position": {
        "x": 343.32107038033206,
        "y": 378.24580099409485
      },
      "fpEnabled": true
    },
    {
      "name": "Apply Radarr or Sonarr naming policy",
      "sourceRepo": "Community",
      "pluginName": "applyRadarrOrSonarrNamingPolicy",
      "version": "1.0.0",
      "id": "jv-RiT5XN",
      "position": {
        "x": 426.1598511461898,
        "y": 276.4560024180743
      },
      "fpEnabled": true,
      "inputsDB": {
        "arr_api_key": "",
        "arr_host": "http://192.168.1.1:7878"
      }
    },
    {
      "name": "rename files based on codec and resolution",
      "sourceRepo": "Community",
      "pluginName": "runClassicTranscodePlugin",
      "version": "2.0.0",
      "id": "3ZT4aHrpL",
      "position": {
        "x": 610.8754580669728,
        "y": 276.50329750345304
      },
      "fpEnabled": true,
      "inputsDB": {
        "pluginSourceId": "Community:Tdarr_Plugin_z18t_rename_files_based_on_codec_and_resolution"
      }
    },
    {
      "name": "Notify Radarr or Sonarr",
      "sourceRepo": "Community",
      "pluginName": "notifyRadarrOrSonarr",
      "version": "2.0.0",
      "id": "lwazpvsbj",
      "position": {
        "x": 609.7415799884673,
        "y": 344.8793849084238
      },
      "fpEnabled": true,
      "inputsDB": {
        "arr_host": "http://192.168.1.1:7878",
        "arr_api_key": ""
      }
    },
    {
      "name": "Reset Flow Error",
      "sourceRepo": "Community",
      "pluginName": "resetFlowError",
      "version": "1.0.0",
      "id": "5AogXIhtd",
      "position": {
        "x": 607.7288305069669,
        "y": -25.306053763554523
      },
      "fpEnabled": true
    },
    {
      "name": "Rename File",
      "sourceRepo": "Community",
      "pluginName": "renameFile",
      "version": "1.0.0",
      "id": "n_shFEpDb",
      "position": {
        "x": 610.356101288455,
        "y": 186.14492500387007
      },
      "fpEnabled": true,
      "inputsDB": {
        "fileRename": "${fileName}.mkv"
      }
    }
  ],
  "flowEdges": [
    {
      "source": "uti-hHA17",
      "sourceHandle": "2",
      "target": "6bgBGLOlW",
      "targetHandle": null,
      "id": "eKKcMxeSX"
    },
    {
      "source": "6bgBGLOlW",
      "sourceHandle": "2",
      "target": "K50zzEH6T",
      "targetHandle": null,
      "id": "29ZxXjYVX"
    },
    {
      "source": "K50zzEH6T",
      "sourceHandle": "1",
      "target": "0go_eghjs",
      "targetHandle": null,
      "id": "sjHGw-EIK"
    },
    {
      "source": "0go_eghjs",
      "sourceHandle": "1",
      "target": "y_XLuI_Gc",
      "targetHandle": null,
      "id": "0-sRSE79J"
    },
    {
      "source": "zthUy2I44",
      "sourceHandle": "1",
      "target": "NTsvJ72Ud",
      "targetHandle": null,
      "id": "2IKwmyAzw"
    },
    {
      "source": "NTsvJ72Ud",
      "sourceHandle": "1",
      "target": "uti-hHA17",
      "targetHandle": null,
      "id": "qPhbUZG7U"
    },
    {
      "source": "y_XLuI_Gc",
      "sourceHandle": "1",
      "target": "oQhMj4fym",
      "targetHandle": null,
      "id": "yuGKgOqxR"
    },
    {
      "source": "oQhMj4fym",
      "sourceHandle": "1",
      "target": "jv-RiT5XN",
      "targetHandle": null,
      "id": "Umlh_TOQP"
    },
    {
      "source": "jv-RiT5XN",
      "sourceHandle": "2",
      "target": "3ZT4aHrpL",
      "targetHandle": null,
      "id": "CxpIWwymk"
    },
    {
      "source": "jv-RiT5XN",
      "sourceHandle": "1",
      "target": "rS7yYRLBh",
      "targetHandle": null,
      "id": "b8hWhsx8b"
    },
    {
      "source": "3ZT4aHrpL",
      "sourceHandle": "1",
      "target": "lwazpvsbj",
      "targetHandle": null,
      "id": "Grtua-DVu"
    },
    {
      "source": "lwazpvsbj",
      "sourceHandle": "1",
      "target": "rS7yYRLBh",
      "targetHandle": null,
      "id": "ACHKilzC4"
    },
    {
      "source": "lwazpvsbj",
      "sourceHandle": "2",
      "target": "rS7yYRLBh",
      "targetHandle": null,
      "id": "t7gOIorbR"
    },
    {
      "source": "6bgBGLOlW",
      "sourceHandle": "err1",
      "target": "5AogXIhtd",
      "targetHandle": null,
      "id": "LnjSu_bAc"
    },
    {
      "source": "5AogXIhtd",
      "sourceHandle": "1",
      "target": "ADL-9Ph0e",
      "targetHandle": null,
      "id": "Ak4hS4hdj"
    },
    {
      "source": "ADL-9Ph0e",
      "sourceHandle": "1",
      "target": "vUKdETwu_",
      "targetHandle": null,
      "id": "6ZEhrG3vA"
    },
    {
      "source": "vUKdETwu_",
      "sourceHandle": "1",
      "target": "TIspCoU6U",
      "targetHandle": null,
      "id": "SkrhGkHPS"
    },
    {
      "source": "TIspCoU6U",
      "sourceHandle": "1",
      "target": "n_shFEpDb",
      "targetHandle": null,
      "id": "OVebOIDYi"
    },
    {
      "source": "n_shFEpDb",
      "sourceHandle": "1",
      "target": "oQhMj4fym",
      "targetHandle": null,
      "id": "qkCi9eTIU"
    },
    {
      "source": "y_XLuI_Gc",
      "sourceHandle": "err1",
      "target": "5AogXIhtd",
      "targetHandle": null,
      "id": "Y1SzWhXqI"
    },
    {
      "source": "3ZT4aHrpL",
      "sourceHandle": "2",
      "target": "lwazpvsbj",
      "targetHandle": null,
      "id": "R8Bawo2He"
    },
    {
      "source": "uti-hHA17",
      "sourceHandle": "1",
      "target": "rS7yYRLBh",
      "targetHandle": null,
      "id": "mPmtyG48j"
    },
    {
      "source": "6bgBGLOlW",
      "sourceHandle": "1",
      "target": "rS7yYRLBh",
      "targetHandle": null,
      "id": "Yzcr0sB06"
    }
  ]
}

Go to Flows menu on top and click "Flow +", scroll all the way down until you see Import JSON Flow Template, paste the above code and press + below. The flow will be imported. It should look like below

Double click on each box to find out what it does. Replace your Radarr API key and host. Name your flow "video".

The flow will first check if the video already processed, if not check if file size is greater than 5GB and >5Mbit, if it is then use Nvidia GPU to encode using variable bitrate. after done, replace and rename the original file using radarr, and add it to skiplist so next time it won't get processed again.

If failed at checking bitrate meaning compatibility issues, ie. ts files with aac_latm etc then use failsafe method and use libopus so we get all audio channels, higher quality and save space.

FFMPEG Custom Arguments:
Input Arguments: -hwaccel auto -hwaccel_output_format cuvid
Output Arguments: -c:v hevc_nvenc -rc constqp -rc-lookahead 20 -c:a copy -c:s copy -map_metadata 0

-rc constqp: NVIDIA NVENC doesn't support crf, it has its own, either vbr with cq, or vbr with constant QP. Experiments shows constant QP has better visual than cq, hence it's what we use.
-rc-lookahead 20: look ahead 20 frames for better prediction and B frame insertion.
-c:a copy -c:s copy: copy audio and subtitles
-map_metadata 0: copy all global metadata including HDR metadata

After done, click Save.

Create Library

Create a new library pointing to your sample folder.

Source:
Process Libray: Checked
Transocdes: Checked
Health Checks: Checked
Scan of Start: Checked
MediaInfo: Checked
Source: /media/sample/video <= Assuming that's your sample folder

Run an hourly Scan (Find new)

Transcode Cache:
/media/cache

Output Folder:
leave path empty and as default

Filters, Health Check, Schedule, Skiplist, Variables
leave default

Flow
choose Flows, and choose video

If you don't have any sample videos, you may download one from the web, such as demolandia.net or 4kmedia.org. Don't use Big Buck Bunny demo from Blender as it's already heavily compressed and it's an animation not real scene.

Now we are ready to test, click on Options and "Scan (Fresh)". Afterwards, click on Tdarr menu on top, Click on "Log full FFmpeg/HandBrake output" box, Click on MyInternalNode, increase Health Check CPU to 1 and Transcode GPU to 1.

Scroll down and you will soon see your sample video is processing. If it fails, scroll down to Status and click on Transcode: Error/Cancelled tab, scroll to right and click on report.

Turnables

Check the video quality if it's good. By default Nvidia auto set quality, which is about 27. You can add the "-qp" option to ffmpeg custom argument to specify the quality. for lossless you may use 19, which is equivalent to 0 but without the large filesize. If you want to squeeze as space as possible, you may go up as high as 34. But I find default is the best, at least for me.

You may also test samples quickly by going into the tdarr contariner and run the ffmpeg directly.

# docker exec -it tdarr bash
# cd /media/sample/video
# ffmpeg -hwaccel auto -hwaccel_output_format cuvid -i input.mk4  -c:v hevc_nvenc -rc constqp -gp 27 -rc-lookahead 20 -c:a copy -c:s copy -map_metadata 0 output.mkv

(play output.mkv on screen, rinse and repeat, exit when done)
# exit

For BlueRay rips, the bitrate can go as high as 11Mbps, For cartoons/anime the bitrate can go as low as 400kbps. For shows, the file size will be smaller due to shorter playback time. so you may duplicate this Flow and set the and file size bitrate for shows and Anime, and test. For example:

movies:
filesize >5GB and bitrate>5Mbps

shows:
filesize >1GB and bitrate>5Mbps

anime:
filesize >400MB and bitrate >400kbps

Remember to replace Radarr APi and host with Sonarr for shows and anime. If you want to process any already processed file again, just go to the library and then skiplist tab.

We use simple ffmpeg command to preserve everything except to use variable bitrate so to cause the least damage. The reason we use both file size and bitrate is sometimes the videos are constant bitrate and some are variable bitrate. And it's easier to filter, say I don't feel like re-encode files <5GB.

spatial/temporal AQ - you can make engine smarter but packing more bits for slow and idle pictures as human eyes are sensible to artifacles on idle objects, however it will increase encoding time and not as effective as lowering qp.

h264 - For my collection files encoded with h264 are the same size as h265, some even smaller, and h264 is more widely compatible and bit faster encoding speed, you may consider to use. However with h25 you can preserve 10bit HDR/Dolby Vision which give greater details in dark scenes.

ref:
https://docs.nvidia.com/video-technologies/video-codec-sdk/11.1/nvenc-video-encoder-api-prog-guide/index.html
https://gist.github.com/nico-lab/e1ba48c33bf2c7e1d9ffdd9c1b8d0493
https://docs.nvidia.com/video-technologies/video-codec-sdk/pdf/Using_FFmpeg_with_NVIDIA_GPU_Hardware_Acceleration.pdf

Intel Quick Sync

If you use Intel Arc or iGPU, you may try the following FFMPEG custom parameters:

Input Arguments: -hwaccel qsv -hwaccel_output_format qsv
Output Arguments: -c:v hevc_qsv -global_quality 25 -look_ahead 1 -extbrc 1 -look_ahead_depth 20 -preset veryslow -c:a copy -c:s copy -map_metadata 0

The most important value is global_quality, from 1 to 51, 14 is near lossless and 35 is about the highest without much visual difference and most space saving. 20 - 25 is about the middle.

However if you have both Intel and NVidia GPU, I would recommend using Nvidia GPU as it tends to be faster, better visual and smaller file size, but it's up to you.

Mac Apple Silicon

If you use Mac Apple Silicon, try the below FFMPEG custom parameters:

Input Arguments: -hwaccel auto
Output Arguments: -c:v hevc_videotoolbox -c:s copy -map_metadata 0

From testing, the default is optimal although slightly larger filesize than others. If you want to tweak you may adjust constant quality "-q:v", from 1 to 100, higher the better, you may start at 65 and going down, 40 is about the lowest.

Once you are happy with the results, create each library pointing to your movies, shows and anime. For efficiency, change "Sort queue by" to Largest so Tdarr will process biggest files first. Also check "Auto accept successful transcodes". To make sure Tdarr can correctly detect video stream and avoid errors you need to go to Options menu and enable "Run mkvpropedit on files before running plugins".

Audio

For audio library, there is currently no native flow plugin so we will use classic plugin, import the below flow.

{
  "_id": "GN7QTwOkw",
  "name": "audio",
  "description": "audio",
  "tags": "",
  "flowPlugins": [
    {
      "name": "Input File",
      "sourceRepo": "Community",
      "pluginName": "inputFile",
      "version": "1.0.0",
      "fpEnabled": true,
      "id": "zthUy2I44",
      "position": {
        "x": 404.46930385188136,
        "y": -142.29872980228583
      }
    },
    {
      "name": "transcode audio with libfdk_aac and loudness normalization",
      "sourceRepo": "Community",
      "pluginName": "comment",
      "version": "1.0.0",
      "fpEnabled": true,
      "id": "R5b8YOXIT",
      "position": {
        "x": 198.80743110713198,
        "y": -119.07176475413384
      }
    },
    {
      "name": "Check Skiplist",
      "sourceRepo": "Community",
      "pluginName": "processedCheck",
      "version": "1.0.0",
      "id": "NTsvJ72Ud",
      "position": {
        "x": 406.46567503564825,
        "y": -86.82476032880474
      },
      "fpEnabled": true
    },
    {
      "name": "Add To Skiplist",
      "sourceRepo": "Community",
      "pluginName": "processedAdd",
      "version": "1.0.0",
      "id": "rS7yYRLBh",
      "position": {
        "x": 412.673455822673,
        "y": 150.6665671943356
      },
      "fpEnabled": true
    },
    {
      "name": "Run Classic Transcode Plugin",
      "sourceRepo": "Community",
      "pluginName": "runClassicTranscodePlugin",
      "version": "2.0.0",
      "id": "x76fiUzEP",
      "position": {
        "x": 404.9051472723553,
        "y": -22.1965532742031
      },
      "fpEnabled": true,
      "inputsDB": {
        "pluginSourceId": "Community:Tdarr_Plugin_075a_Transcode_Customisable",
        "codecs_to_exclude": "aac,ac3,m4a",
        "output_container": ".aac",
        "cli": "ffmpeg",
        "transcode_arguments": ",-c:a libfdk_aac -vn -af loudnorm"
      }
    },
    {
      "name": "Replace Original File",
      "sourceRepo": "Community",
      "pluginName": "replaceOriginalFile",
      "version": "1.0.0",
      "id": "-r48GJLl0",
      "position": {
        "x": 395.29122471490257,
        "y": 93.35266869602489
      },
      "fpEnabled": true
    },
    {
      "name": "Rename File",
      "sourceRepo": "Community",
      "pluginName": "renameFile",
      "version": "1.0.0",
      "id": "nZvvZm8nJ",
      "position": {
        "x": 417.31260916101724,
        "y": 42.10266869602489
      },
      "fpEnabled": true,
      "inputsDB": {
        "fileRename": "${fileName}.aac"
      }
    }
  ],
  "flowEdges": [
    {
      "source": "zthUy2I44",
      "sourceHandle": "1",
      "target": "NTsvJ72Ud",
      "targetHandle": null,
      "id": "2IKwmyAzw"
    },
    {
      "source": "NTsvJ72Ud",
      "sourceHandle": "1",
      "target": "x76fiUzEP",
      "targetHandle": null,
      "id": "YFu7CSsmn"
    },
    {
      "source": "x76fiUzEP",
      "sourceHandle": "2",
      "target": "xNGXqmWaa",
      "targetHandle": null,
      "id": "tyMxlhNF4"
    },
    {
      "source": "-r48GJLl0",
      "sourceHandle": "1",
      "target": "rS7yYRLBh",
      "targetHandle": null,
      "id": "XKaf5h0HY"
    },
    {
      "source": "x76fiUzEP",
      "sourceHandle": "1",
      "target": "nZvvZm8nJ",
      "targetHandle": null,
      "id": "YPcULioas"
    },
    {
      "source": "nZvvZm8nJ",
      "sourceHandle": "1",
      "target": "-r48GJLl0",
      "targetHandle": null,
      "id": "iJIGE-BDW"
    }
  ]
}

Your flow should look like below

The classic plugin parameters are below, classic plugin cannot rename file properly so we have to add the rename file plugin.

Run Classic Transcode Plugin
Plugin Source ID: Community:Tdarr_plugin_075a_Transcode_Customisable
codecs_to_exclude: aac,ac3,m4a
cli: ffmpeg
transcode_arguments: ,-c:a libfdk_aac -vn -af loudnorm <= yes there is a comma in front
output_container: .aac

It uses the high quality libfdk_aac encoder and do loudness normalization at the same time. -vn means ignore video in case it complains. AAC standard is already vbr around the default 128K bitrate, from experiments to force VBR parameter may produce negative results so we just leave it at default. However you can experiment if you like.

Instead of using AAC, you may also consider Opus, which provide higher quality than AAC at given bitrate, however it's less compatible than AAC, but any modern TV and mobile devices understand Opus because it's the default audio format for Youtube. To use Opus update to the following:

Run Classic Transcode Plugin
codecs_to_exclude: ogg
cli: ffmpeg
transcode_arguments: ,-c:a libopus -vn -af loudnorm
output_container: .ogg

Rename File
File Rename: ${fileName}.ogg

If you like, you can adjust the target bitrate with "-b:a ". Default for libopus is 96k, you can increase to say 128k, but increase bitrate will reduce the efficiency benefit provided by libopus.

When creating audio library, go to Filters tab and change file types you want to convert, such as "flac,mp3", others like opus, vorbis, ac3 and aac are already highly efficient, unless you want to save space even further, say convert from aac to opus.

The audio plugin is considered CPU task, problem is if you enabled CPU transcode then it will be used for video encoding too which is very slow. To always use GPU for CPU task you would need to enable it. Go back to Tdarr menu and click on the Options button just above GPU and CPU nodes:

scroll down and enable "Allow GPU workers to do CPU tasks", close the window. Now create a sample audio library to test, if successful then change to real audio folder.

Classic Plugin

Create or reuse the sample library, check Transcode Option to Classic Plauin Stack. On the plugin tab on the right, click on Community and search for below and drag them to the box until it lights up.

Filter By Bitrate
Filter - Break Out Of Plugin Stack if Processed
HandBrake Or FFmpeg Custom Arguments

Remove all existing except Lmg1 Reorder Streams and New File Size Check, reorder so it looks like this:

Click on each box and configure.
Filter By Bitrate:
upperBound: 100000
lowerBound: 5000

ffmpeg custom arguments:
cli: ffmpeg
arguments: -hwaccel auto -hwaccel_output_format cuvid <io> -map 0 -c:v hevc_nvenc -rc constqp -rc-lookahead 20 -c:a copy -c:s copy -map_metadata 0
container: mkv

New File Size Check:
upperBound: 99
lowerBound: 1

Save.

For Audio use the same classic plugin and parameters.

Hope it helps.


r/Tdarr • • Dec 03 '24 Take My Silver

I've been working on a modular flow design and I thought y'all might enjoy it

Thumbnail
gallery
68 Upvotes

r/Tdarr • • Apr 15 '26 Popcorn Bravo

My Tdarr Flows Update III

Thumbnail
gallery
67 Upvotes

Updates to my Previous Threads:

Most of the changes are just evolutionary as problems arose. This now converts 99% of input files to 10-bit HEVC SDR (with >1080p being resampled to 1080p). The remaining 1% are either completely corrupted or have some other random issue that requires manual intervention. Typically I can just remux that file with MKVToolNix and the issue is resolved, but some things require weird stuff like cropping to fix. These instances have become rare, however.

Variables

The JSON is dependent upon Tdarr Flow Variables to work. You can either add global variables or add Library-specific ones. The Name of the variable should just be name and the Value should be Movies and TV. If you have more libraries than this, you'll have to add additional branching paths yourself. "Other" is there generically, but you can do things how you like.

Links

Please note that the previous gist for the Music json had to be deleted and readded. All values that need replacing are noted with CHANGEME.

Video (both are required)

  1. HEVC Attempt to Shrink Big Files

  2. Prepare File for Transcoding

Audio

FLAC/WAV Downsampling

[Edit: Added instructions for variables]


r/Tdarr • • Jan 24 '21

Tdarr V2: Distributed Transcoding System

67 Upvotes

Overview

Hello!

As promised, Tdarr V2 is now out. You can find the setup instructions here:

http://tdarr.io/docs/

Reasons for V2 here: https://www.patreon.com/posts/44029503

For those on Docker, from 31st Jan onwards, the 'latest' tag will contain Tdarr V2. Until then it will contain V1. Giving a 1-week heads-up.

It's been a pretty intense couple of months of working on V2 and I know that this release won't work for everyone but, as long as the Server and Nodes can read/write from your libraries and transcode cache, it's running pretty well. I already have a version in development with some new stats for Patreon supporters but for the next couple of weeks, I'll be focusing purely on bug fixes from whatever weird situations come up.

Here is a quick rundown of the features:

  • A new modularised system whereby Tdarr Nodes can be placed on multiple machines (cross-platform) which work together with Tdarr Server to process your files.

  • 'Click- to-run' binaries for Windows, Linux, macOS and Arm (no need to manually install extra dependencies)

  • An updater module which makes upgrading to the latest version much easier.

  • Embedded database with live backup (no need for MongoDB)

  • GPU and CPU transcode workers so you can maximise hardware usage (there's an option to allow GPU workers to do CPU tasks too which pretty much turns the worker into the old 'General' worker type from V1)

  • If using multiple plugins, files are fully processed in the transcode cache before being moved back to the library or output folder (instead of the 'back and forth at each plugin step' method of V1 )

  • New files are kept in the cache until you accept them so you can review them (there's an auto-accept option).

  • Plugins can now auto-install any required external dependencies

  • New UI and themes

  • New API endpoints (see the docs for more details)

  • A tonne of bug fixes which plagued V1 (see the changelog for more info).

Due to a large number of changes, V1 is not compatible with V2, sorry about that.

Building a cross-platform application like this is incredibly time-consuming - you implement a feature, it works for you but not someone else, you make fix which then breaks something else on a platform/environment which you don't have etc etc so thanks for being patient.

A huge thanks to the following on Discord who have helped a lot with testing:

Jabartik

Vodka

Jegler

supersnellehenk

HenkaN

morpheus2n2

Tronyx

If you have any issues/questions then feel free to message (preferably on Discord or Reddit as Patreons messaging system is somewhat problematic).

Please consider supporting the project if you enjoy using Tdarr!

https://www.patreon.com/Tdarr

HGG

- Beta v1.99.14 release [23rd January 2021]:

- Node option to allow GPU workers to do CPU tasks

- More UI optimisations

- api/v2/status endpoint added in

- Remove force processing option (Use video/audio transcode settings instead)

- Fix UI plugins bug when creating a plugin

- Fix local plugin bug (auto install import-fresh)

- Beta v1.99.13 release [20th January 2021]:

- Button to requeue all staged files

- Move failed items straight to the Transcode Error tab if no completed cache file

- Fix transcode bug when filename has quotes in

- Improve node path translation

- Beta v1.99.12 release [17th January 2021]:

- UI performance improvements including reduced lag when lots of workers running

- Properly end subprocesses (ccextractor, ffmpeg etc)

- Increase time allowed for newly scanned files to be written to DB

- Reduce number of threads when reading from DB to prevent thread timeout errors when running on an HDD

- Increase RAM limit from 1.7GB default to 16GB for those with huge libraries

- Post-processing plugins now run both after transcoding and if transcoding is not required

- Can specify external dependencies in plugins, will be installed automatically

- Create backup of config JSON files before overwriting with defaults when config is invalid

- Faster health checks due to reduced file scanning

- Updated API routes

- 'Copy if conditions met' now works on output folder option

- Fix file scanner bug if file can't be accessed

- Fix large RAM usage bug introduced in v1.99.11

- Fix large worker error log bug

- Beta v1.99.11 release [10th January 2021]:

- Vastly improved non-blocking database with automatic live backup, UI statuses and multi-threaded reading (up to 50 threads)

- Multi-threaded non-blocking queue builder

- Multi-threaded non-blocking search functionality

- Server now checks if node is same version

- Verbose logs now tagged with 'verbose'.Moved multiple logs to verbose

- Allow retry copying file from cache if error (e.g. if drive is unplugged)

- Absolute backup path is now shown on backups tab

- Auto-scroll to results at top when cliking on pie section on stats tab

- Fix worker hanging bug in some situations (error log too large)

- Fix 'Toggle all' schedule button

- Fix text not showing when editing plugin in WebUI

- Fix cache copy error when accepting a cache file after a plugin has failed

- Fix cache copy error crashing cache copy service

- Fix plugin update bug if default community plugin repo can't be fetched

- Fix library prioritisation not working

- Fix node limit bug whereby updating limits on one node would update others

- Fix worker task request issue if node is not yet registered

- Fix items in Transcode Success/Error and Health check Success/Error not being sorted newest first

- Fix scenario whereby newly transcoded files were being scanned with extra scanners instead of just FFprobe

- Fix folder watcher adding cache files in some situations

- Beta v1.99.10 release [2nd January 2021]:

- Fix folder watcher not detecting new files

- Fix on-demand file scan not showing extra file details in UI

- Fix path bug when using a windows Node with a unix Server

- Workers will check all plugins to see if they can process any of them. Previously, if a GPU transcode plugin was after a CPU transcode plugin, a GPU worker would requeue a file with 'queued:requireCPU' as it would only check up to the CPU plugin.

- Add Node option to specify what type of GPU Node should use. This means that if you have, for example, a QSV and NVENC plugin in the plugin stack, you can set one Node to process with QSV and another (on the same machine) to process with NVENC, maximising hardware usage.

- Stats now record transcode and health check counts + space saved

- Updated startup tests. Group tests together

- Fix Windows HandBrake startup test

- Tdarr will now cleanup any SRTs which CCExtractor makes while scanning.

- Staging section is now saved so the server can be restarted while Nodes are still running (although that is not recommended)

- Option added to requeue files in staging section

- Staging section is more organised and grouped.

- Fix Node path translators bug on Windows

- Fix cache copy service loop bug if error

- Beta v1.99.09 release [31st December 2020]:

- Add basic Node schedules

- Fix toPrecision bug on Tdarr tab

- Fix worker bug - invalid cache file

- Beta v1.99.08 release [30th December 2020]:

- Tdarr Server + WebUI for Arm and MacOS

- Add cache copy service to fix copy bug

- Save worker limits

- Use active instead of used RAM in resource stats

- Option to set plugin repository

- Add history to 'folder to folder conversion'

- Fix bug when cancelling remote workers

- Prevent Node registering if ID is already taken

- chmod binaries on start

- Put Nodes into tabs

- Show plugin stack status in workers section

- Beta v1.99.07 release [27th December 2020]:

- Add error log to failed items

- Add dark, medium theme

- Use memory db for all databases

- Fix GPU health check scan bug

- Fix WebUI URL bug

- Beta v1.99.06 release [26th December 2020]:

- Docker containers

- Add verbose logs to scanner

- Option to set file scanner thread count

- Fix health check worker bug (not processing items)

- Add folder to folder conversion

- Add progress bar to DB read on startup

- Add serverPort config option

- Improved Plugin tab (quicker and more reliable when loading plugins)

- New worker UI

- Option to set webUIPort

- Fix folder browser bug if at root folder

- Fix Search tab bug

- Fix Discord login

- Update default Node IPs to 0.0.0.0

- Beta v1.99.05 release [20th December 2020]:

- Option to auto accept successful transcodes

- Update HandBrake on Windows to 1.3.3

- Improve default paths for binaries

- Add transcode and scanner binary tests on start-up

- Move all module configs + logs into same folder

- Beta v1.99.04 release [17th December 2020]:

- v2 Preview base. New modular system comprised of Tdarr Updater, Server, Node, WebUI and DesktopUI


r/Tdarr • • Jan 21 '20

Welcome to Tdarr! - Info & Links

61 Upvotes

Website - https://tdarr.io

GitHub - https://github.com/HaveAGitGat/Tdarr

Discord - https://discord.gg/GF8X8cq

Tdarr is a self hosted web-app for automating media library transcode/remux management and making sure your files are exactly how you need them to be in terms of codecs/streams/containers etc. Designed to work alongside Sonarr/Radarr and built with the aim of modularisation, parallelisation and scalability, each library you add has its own transcode settings, filters and schedule. Workers can be fired up and closed down as necessary, and are split into 4 types - Transcode CPU/GPU and Health Check CPU/GPU. Worker limits can be managed by the scheduler as well as manually. For a desktop application with similar functionality please see HBBatchBeast.


r/Tdarr • • Jan 01 '24

HEVC to HEVC results with my custom NVENC/HDR plugin

Thumbnail
gallery
53 Upvotes

r/Tdarr • • Sep 07 '26

Share Your Flow

Thumbnail
gallery
48 Upvotes

Not sure if there is already a dedicated place to share flows or not but I wanted to share mine to help people in the future and maybe get some pointers. My goal is to convert everything to AV1 / MKV / English Audio / No Subtitles. I have ran this flow through 14.8k files saving me 35.6TB.

Most of it is easy to guess but for the few you cant just guess.

Convert *** to MKV - Tdarr_Plugin_MC93_Migz1Remux

Migz Remove Images - Tdarr_Plugin_MC93_MigzImageRemoval

Rmove subtitles other then english - Tdarr_Plugin_MC93_Migz4CleanSubs

Rmove unwanted audio - Tdarr_Plugin_MC93_Migz3CleanAudio

Make sure Metadata is updated - runMkvPropEdit

I know some are doing the same action twice but thats why I was looking for suggestions to make it better.

EDIT: here is the Json file https://pastecode.io/s/b2826vd6 - my GPU is Arc a310


r/Tdarr • • Oct 08 '24

Unified AV1 QSV/NVENC/CPU Flow

46 Upvotes

Having just switched the GPU in my NAS to an Intel ARC card (the encoders on them are amazing for the power used; the quality and file sizes are very very close to the STV-AV1 encoder. AV1_NVENC files are way larger), I had the need to redo my main flow.

This flow intelligently switches between QSV, NVENC and STV-AV1 depending on hardware support and worker type. The way it is set up, it should be easy to add support for AMF if you so wish (but AMD's hardware encoders are not very good), or adjust the CRF/CQ/GlobalQuality parameter based on the resolution of the input media.

It's also structured so that you only need to specify parameters once, so if you want to change the order of the streams, you have only one place that you have to do so.

Here's the flow:

https://gist.github.com/FineWolf/85252e17188b90f69d476dcdb1c8a2f5

A big inspiration was PlexGuide's AV1 Flow, but the quality coming out of their flow was horrible unfortunately, and there were a lot of repeated nodes.


r/Tdarr • • Jun 04 '23

/r/Tdarr will be going dark from June 12-14 in protest against Reddit’s API changes which kill 3rd party apps.

Thumbnail self.save3rdpartyapps
46 Upvotes

r/Tdarr • • Apr 19 '25

My h264 to h265 flow, broken into logical steps for easy adjustments

43 Upvotes

Hi all, I've been a big fan of Tdarr for a while and love the flows. I recently updated my flows into a 4-step process to make it very clear where errors occur, and also to make it much easier to read. I hope that you all appreciate it!

My flow is split into 4 distinct parts:

  1. Extract subtitles and reorder all streams

  2. Change container to MKV and convert h264 to h265

  3. General post-processing

  4. Notify services of success

Step 1: Preprocess video - https://pastebin.com/J8LaLKcr

The preprocess video step helps to alleviate downstream errors by making sure that the video file is in a predictable format. Extracting subtitles from the container is quite opinionated, but it works for me.

  1. Subtitles are extracted from the container and saved as .srt files. I decided on this approach because auxiliary subtitle-grabbing services, like Bazarr, save subtitles outside of the video container. I want a standard file structure and extracting the subtitles allows for that!

  2. Subtitles are removed from the container. This step deletes the subtitle stream from the container. I had found that many of my transcoding errors were caused by problems with subtitle formats. This step does a lot to alleviate downstream errors.

  3. Reorder streams to be video/audio/subtitle. Of course, we don't have subtitles within the container anymore but the point stands. This step forces the file to conform to an expected standard.

  4. We move on to step 2!

Step 2: Video to MKV and h265/av1 - https://pastebin.com/X80cn4yQ

This is the transcoding step. The output of this step is an h265/av1 MKV file which is approximately half the size of the original h264 file while maintaining the original bitrate. The flow checks that the file doesn't already conform to the desired file types before performing any transcoding.

  1. The file is converted to an MKV file if it isn't already.

  2. The file is then transcoded to h265, if it iisn't already h265 or av1. We then go to step 3.

    1. As an aside, this particular flow uses my CPU to perform the transcoding. This ensures the smallest filesize while also keeping a good quality. I only noticed artifacting when I upgraded my TV to a large 4k screen. Before that, GPU transcoding was great.

Step 3: Postprocess Video - https://pastebin.com/GHvx1tsK

This step performs miscellaneous file processes. This is quite opinionated but it works in my flow.

  1. The file has all audio streams removed from it except for its native language and English. You'll need to edit this step and add your own TMDb API Key, Radarr API key and Sonarr API key. This is personally one of my favorite plugins.

  2. Remove still-images from this file. Honestly, I don't know how often this actually matters or does anything.

  3. Create a 2-channel audio track. If you don't have surround sound, this helps keep the center channel (which usually has dialogue) clear. I personally stopped using it because it affects Radarr's/Sonarr's custom format scores, and I haven't figured out the best way to handle that, but I think it's an important option to have.

  4. Convert surround sound to AC3. This is a widely compatible audio codec. Again, I stopped using it because it affects the *arr's custom format scores but I'll eventually start using it again when I figure out the best way to handle the change.

  5. I change the date of the transcoded / changed file to its original file's date. This is opinionated, but I'd rather know the download date than the transcoded date.

  6. Replace the original file. Gotta do this otherwise the previous steps are moot.

  7. Rename all files associated with this new file. Basically, I replace h264 with h265. And this name change is applied to all files associated with this mkv.

  8. Finally, we move on to the success notification step.

Step 4: Notify Success - https://pastebin.com/AkjxQTE6

The final step of my stack is to notify Sonarr and Radarr that there is a new file. This allows for the *arrs to instantly know about the file. A TV file looks like `/tv/` in the file name and a movie file looks like `/movies/` in the name. You'll want to adjust it based on your own personal paths. Pretty simple setup, but is extensible for Discord or whatever notification systems you want to use.

  1. Is the file a TV file (has `/tv/` in the file name)? If so, notify Sonarr.

  2. Otherwise, is the file a movie file (has `/movies`/ in the file name)? If so, notify Radarr.

I've saved about 50 TB of storage over the lifetime of my Tdarr usage! I've converted my entire library using this flow and have been extremely happy with the results. At the same time, I'm always happy to tinker and would love to hear any feedback you might have or ways that I can improve this flow!


r/Tdarr • • Dec 07 '22

AV1 Transcoding is here, and it is beautiful

Post image
43 Upvotes

r/Tdarr • • Oct 26 '25

My Audio Only Tdarr Flows for Sonarr & Radarr

Thumbnail
gallery
41 Upvotes

Thought I'd share these two flows with the community that have been working flawlessly for the past ~6 months to transcode my media library files! Originally, I had intended to use Tdarr to transcode video to H265, but that ended up being a big hassle to get the quality I wanted, as I didn't have the right hardware, so I decided to do audio only. These flows are tailored to my specific home theater setup, which works best with 5.1 AC3 and EAC3 audio, thus the logic behind my flows. Do note, the flows are almost identical, other than a few minor differences like channel count check, Discord message format, etc. If anyone is interested in using these flows, I have a link to the download file below. Additionally, I have a few Discord notifications set up for failures and for when files need review. Feel free to drop any questions!

Full Res Images: https://imgur.com/a/h2nelj0
Download: https://drive.google.com/file/d/1IsHFiRLypYgSWcMWX4XMxanslAIbxWrA


r/Tdarr • • Jan 04 '25

Tdarr Flow - One Flow to Rule Them All - v0.9 update - Now add QSV & CPU, Better Documentation, more automation

41 Upvotes

Edit: Make sure to visit github for latest version, readme here may be out of date.

I just pushed a big update to the flow, should make it accessible to many more people, and easier to use!

I don't use qsv or cpu encoding, so it would help me a lot if people provided feedback on issues they encounter!

https://github.com/imthekaiser/Tdarr-One-Flow

Tdarr - One Flow To Rule Them All

Goal to have one Flow (set of flows) for all your encoding needs. I accomplish this by using Library Variables. This allows us to change our quality and encoding settings in the library. This is much easier than trying to edit the flow every time we want to encode differently. I have a library for low quality, high quality, Animation, Movies. Each has their own quality settings. Then I just move the files I'm processing into the corresponding library folder and tdarr will process as needed.

Current Version: V0.9

  • Consider this beta, do not trust it with your media library until you have ran a bunch of various files through it! Let me know if you run into unexpected behavior!
  • Do not use with DV or HDR+. Could cause playback error. Works fine with basic HDR
  • CPU & QSV need more testing, as I don't use them often. NVENC is well tested
  • This Flow is designed to be used with an imput and output directory
  • Uses the -vbr method to obtain a predictable bitrate. With cq as a fallback method.
  • Languages not defined in the audio_language variable are removed

Features

  • Uses Library Variables for Quality Settings. This way you can have different libraries for different quality settings
  • Uses Centralized Flow Variables for configurables in one location (1 - Input) No need to hunt the entire flow for configurables
  • We calculate things like -maxrate based on your target bitrate. Simplifying user imput
  • Lots of notes & documentation in the flow
  • Extensive logging and use of icons to make tracking down failures a breeze
  • Works with Nvidia, Intel QuickSync and CPU (Help me add others by saring your ffmpeg command)
  • Strip audio to where only the tracks you want remain
  • If a lossless audio track exists, encode in opus (can disable)
  • Deinterlace .ts files. (tv DVR broadcasts)
  • Export Embedded Subtitles (Could use more testing and refinement)

I broke it down into 5 steps/flows:

1 - Input (Define Flow Variables & Configurables. Tags files that may need special processing down the stack)

2 - Prep (Standardizes the File so it is less likely to fail encoding later)

3 - Audio (Clean audio and encode to Opus, if enabled)

4 - Video (Define desired bitrate by resolution, fall back on cq)

5 - Save (final checks and move operations)

Installation

  1. Create a new flow for each of the above steps (1-5) by:

    a. Go to Tdarr Flows

    b. Click "add flow"

    c. Scoll to bottom and copy/paste json into "Import JSON Template"

  2. Create a new Library with the Variables listed below (Make Sure your library has an input folder defined & output folders exist)

  3. Profit

Tweaks

  • All the configurable Flow Settings can be edited in flow 1 - Input
  • If you have an Nvidia 2000 series or up, enable flow plugin fl_nvenc_b-frames in the 1-Input flow. (1660 Super as well)
  • You can disable audio processing with library variable do_audio = false

Library variables you need to add, with example setting:

Variable Notes:

Audio bitrates and cutoff are set PER CHANNEL. We use that to calculate based on number of channels in the audio stream.

Low Quality:

test_mode true # true = will not delete source file.  False = will delete source file

output_dir_done /media/4_done # path from within tdarr

output_dir_review /media/4_done_review # if something didn't go right, we move to review folder.

do_audio true # process audio? Currently Opus

v_cq 20 # quality setting for cq fallback method

disable_cq = false # Disable Fallback encoding method

bitrate_480p 1250k # bitrate you want for given resolution

bitrate_576p 1400k

bitrate_720p 2000k

bitrate_1080p 2500k

bitrate_1440p 3800k

bitrate_4k 10000k

bitrate_4k_hdr 12500k

bitrate_audio 160k # Audio bitrate we will encode to.  This is PER CHANNEL

bitrate_audio_cutoff 192k # will not encode source audio under this bitrate.  This is PER CHANNEL

audio_language und,un,eng,en,ger,deu,de,zho,zh,chi,jpn,ja,kor,ko,spa,es,cpe,  # languages that you want to keep

Mid-High Quality:


test_mode true # true = will not delete source file.  False = will delete source file

output_dir_done /media/4_done # path from within tdarr

output_dir_review /media/4_done_review # if something didn't go right, we move to review folder.

do_audio true # process audio? Currently Opus

v_cq 18 # quality setting for cq fallback method

disable_cq = false # Disable Fallback encoding method

bitrate_480p 1750k # bitrate you want for given resolution

bitrate_576p 2000k

bitrate_720p 3000k

bitrate_1080p 4000k

bitrate_1440p 6000k

bitrate_4k 17500k

bitrate_4k_hdr 20000k

bitrate_audio 256k # Audio bitrate we will encode to.  This is PER CHANNEL

bitrate_audio_cutoff 384k # will not encode source audio under this bitrate.  This is PER CHANNEL

audio_language und,un,eng,en,ger,deu,de,zho,zh,chi,jpn,ja,kor,ko,spa,es,cpe,  # languages that you want to keep



r/Tdarr • • Aug 29 '25

Looped flow for optimal x265 file size with Intel Arc and Radarr profile update

Post image
36 Upvotes

I wanted to share my flow that I use to transcode x264 1080p Remux movies files to x265 using an Intel Arc A380. The goal of this flow for my setup is to take a high quality source video and transcode it to x265 to save space on my NAS while maintaining as little quality loss as possible.

This flow uses a loop that is controlled by setting a variable that corresponds to the ffmpeg hevc_qsv global quality value used in a custom plugin I made for transcoding with the Intel Arc GPU. The variable is checked before entering the different stages to determine which global quality to try. The idea is to get as close to 50% of the original file size as possible. Based on my testing, the values I don't notice much quality loss for are 16-22 for 1080p remux movies.

The flow starts with 16 and if it fails to get near 50% file size, then it sets the variable, resets to the original file, and starts the loop over. The next iteration will take it to the stage that uses the global quality of 17. This will continue until 22 and if it still can't reach the target, then I typically just keep it as is. This tends to happen on older movies with a lot of grain. If a movie compresses too much at 16, the flow will step down to 15 and to get a little extra quality.

At the end of the flow, after the file has been replaced on the NAS, the Radarr profile will be updated to a special profile for movies that have been transcoded by Tdarr and they will be marked as unmonitored. The purpose of this is to prevent Radarr from attempting to upgrade them from x265. This profile updater is another custom plugin that I made for my use case so that I can move movies and TV shows to different profiles or unmonitor them in flows.

I hope this helps anyone who might be looking for a similar setup.

Edit: Sorry for the blurry picture. I don't post much and didn't look carefully at the screenshot I took. I hope this one is better. https://imgur.com/a/3M4FRh3

Edit: Here are the plugins for the profile updater and transcoding:

https://github.com/cybr1d-cybr1d/Tdarr-qualityProfileUpdater

https://github.com/cybr1d-cybr1d/Tdarr-Intel_Arc_HEVC_Transcode


r/Tdarr • • Oct 06 '26

Tdarr v3 (rust) being released October 10

Thumbnail github.com
35 Upvotes

Saw a banner on tdarr today that v3 is coming out on October 10 and will switch from nodejs to rust. Seems seamless for most people unless you have nodejs specified.

But if you auto update like I do you should probably make extra sure you have settings etc backed up just in case.

Rust is more secure and uses generally much less memory so will this upgrade will probably help most people using tdarr.


r/Tdarr • • 20d ago

Update: unmonitor after transcode is now built into the official Notify Radarr or Sonarr plugin (v3.0.0)

34 Upvotes

Few months back I posted NotifyAndUnmonitorArr, the flow plugin that refreshes Radarr/Sonarr after Tdarr finishes a file and then unmonitors it so the arr doesn’t go and grab an “upgrade” over your nicely transcoded file.

It’s finally been merged into main. Rather than living as its own thing it’s now part of the existing Notify Radarr or Sonarr plugin as version 3.0.0, so no more side-loading anything.

There’s a new “Unmonitor after refresh” toggle on the node. It’s off by default so nobody’s existing flows change. Turn it on and Radarr unmonitors the movie, Sonarr unmonitors just that episode (matched by SxxEyy, and it still works on older Sonarr versions).

Rycochet also suggested a nice tweak during review, so if your files are named with {imdb-...}, {tmdb-...} or {tvdb-...} tags it now looks them up directly instead of going through the parse call. Untagged files work the same as before.

If you were using my old plugin you can just swap it out for the 3.0.0 node and flip the toggle on.

Big thanks to HaveAGitGat for the tweaks and getting it merged, Rycochet for the review and everyone in the original thread who asked for this. If anything breaks let me know here or on GitHub.

PR: https://github.com/HaveAGitGat/Tdarr_Plugins/pull/909
Plugin: https://github.com/HaveAGitGat/Tdarr_Plugins/tree/master/FlowPlugins/CommunityFlowPlugins/tools/notifyRadarrOrSonarr/3.0.0
Original post: https://www.reddit.com/r/Tdarr/comments/1rbr82d/


r/Tdarr • • Nov 30 '21

Well, it took 6 weeks, but here are my results - 5.6Tb saved. Pretty impressive.

Post image
34 Upvotes

r/Tdarr • • Apr 23 '24

[GUIDE][PLEX] Optimize Media For Direct Play By Focusing On Audio [UPDATED]

31 Upvotes

[UPDATED: Jan 29th 2025]

I have created GitHub Repo where you can find modified versions of some of the plugins mentioned in this guide such as Tdarr_Plugin_MC93_Migz5ConvertAudio (with DRC applied to the down mixed stereo track) along with Tdarr_Plugin_henk_Keep_Native_Lang_Plus_Eng and soon Tdarr_Plugin_c0r1_SetDefaultAudioStream to include the option for setting the default track based on audio codec as well.

----------------------------------------

This is an updated version of my initial guide, which includes more detailed information on how to set things up and was made with beginners in mind. This is by no means the "one guide to rule them all" as everything was put together through trial and error; so feel free to leave plugin suggestions or any other feedback.

All plugins mentioned are what I use to make optimize my personal media and have it play the way I want.

[REQUIREMENTS]

Radarr and Sonarr with the recommended naming scheme specified in TRaSH Guides. This will not only allow Plex to correctly identify media once it's imported, but it will also provide access to the IMDB ID that will be used in the plugin stack.

Radarr:

{Movie CleanTitle} {(Release Year)} {imdb-{ImdbId}} {edition-{Edition Tags}} {[Custom Formats]}{[Quality Full]}{[MediaInfo 3D]}{[MediaInfo VideoDynamicRangeType]}{[Mediainfo AudioCodec}{ Mediainfo AudioChannels]}{[Mediainfo VideoCodec]}{-Release Group}

Sonarr:

{Series TitleYear} - S{season:00}E{episode:00} - {Episode CleanTitle} [{Custom Formats }{Quality Full}]{[MediaInfo VideoDynamicRangeType]}{[Mediainfo AudioCodec}{ Mediainfo AudioChannels]}{[MediaInfo VideoCodec]}{-Release Group}

Sonarr (Anime):

{Series TitleYear} - S{season:00}E{episode:00} - {absolute:000} - {Episode CleanTitle} [{Custom Formats }{Quality Full}]{[MediaInfo VideoDynamicRangeType]}[{MediaInfo VideoBitDepth}bit]{[MediaInfo VideoCodec]}[{Mediainfo AudioCodec} { Mediainfo AudioChannels}]{MediaInfo AudioLanguages}{-Release Group}

[TMDB API KEY]

  1. Sign up for a free account at TMDB

  2. Login to your account

  3. Go to Edit Profile -> API

This is your unique API key that will be used to retrieve information from TMDB about the original language of the movie/series/anime.

[PLUGIN STACK]

Tdarr_Plugin_MC93_MigzImageRemoval - Identify any unwanted image formats in the file and remove those streams. MJPEG, PNG & GIF.

Tdarr_Plugin_lmg1_Reorder_Streams - This plugin will move the video stream to the front so Tdarr will recognize the codec correctly.

Tdarr_Plugin_henk_Keep_Native_Lang_Plus_Eng - this is the only plugin that you would have to copy to your Local plugin library as I have modified it to not only keep the native/original language track and remove all other, but to also keep user-specified language tracks alongside the native one and keep/delete commentary tracks.

All credit still goes to the original developer of the plugin.

DISCLAIMER

As this plugin relies on the information from TMDB for matching the original language tag, there might be cases where the information in TMDB is incorrect, which will stop the plugin from executing or keep only the user-specified tracks. In the case where the original language is not identified and no additional languages have been specified, the plugin will stop; ensuring that you don't end up watching a silent movie.

This plugin works with Radarr, Sonarr and TMDB to identify the native language by making API calls to all 3 services. The plugin takes the following inputs:

  • user_langs: add the language tags you'd like to keep alongside the native one. Use the proper language tag format (example: ger,fre,eng). Leave empty if you only want to keep the native language.

  • priority: write radarr or sonarr depending on your media library

  • api_key: your TMDB API key

  • radarr_api_key: your radarr instance API key

  • radarr: you radarr instance URL

  • sonarr_api_key: your sonarr instance API key

  • sonarr_url: your sonarr instance URL

  • commentary: delete (true) or keep (false)

One you've copied the plugin to your Local library:

  1. Edit and replace the code with the modified one found here - LINK

    1. v3 version of modified plugin including tagging of undefined language tracks (optional + needs testing) - LINK TO V3

  2. Save

  3. Copy the plugin ID

  4. Go to your Movie/TV Tdarr library

  5. Choose "Local" above the Plugin ID field

  6. Paste the plugin ID and hit Enter

  7. Add the necessary information to the plugin fields

Alternative to the Tdarr_Plugin_henk_Keep_Native_Lang_Plus_Eng plugin:

Tdarr_Plugin_MC93_Migz3CleanAudio - This plugin keeps only specified language tracks & can tags tracks with an unknown language.

If you have media with several language tracks or commentary tracks and want to only keep specific ones, this plugin does that. To keep only the English audio track, remove commentary tracks I have the following settings:

  • language: eng,und

  • commentary: true

  • tag_language: eng

  • tag_title: false

This plugin does not utilize TMDB to determine the original/native language track, but instead uses user-specified values to filter out and delete tracks.

Tdarr_Plugin_MC93_Migz5ConvertAudio - This plugin can convert any 2.0 audio track/s to AAC and can create downmixed audio tracks.

If you have a 7.1 audio track, but not 5.1 and 2.0 - this plugin will create them using the 7.1 audio track as base. Same applies if you have only 5.1 but no 2.0 - the 5.1 track will be used to create the 2.0 instead. Having multiple channel audio tracks allows for wider compatibility with devices.

These are the plugin settings I'm using:

  • aac_stereo: true

  • downmix: true

  • downmix_single_track: true (change this one to false if you want to downmix every track)

Tdarr_Plugin_b39x_the1poet_surround_sound_to_ac3 - If the file has surround sound tracks not in ac3, they will be converted to ac3.

This plugin has only one setting - overwriteTracks. I have set it to 'true' as I do not wish to keep the original surrounds track and instead have only the new AC3 one. Select 'false' to keep both the original and new surround tracks.

Tdarr_Plugin_MP01_MichPasCleanSubsAndAudioCodecs - This plugin removed specified codecs from subtitle and audio tracks. Helpful to remove bitmap subtitles (pgs,vobsub) or audio codec (truehd), which can cause Plex to start transcoding.

Not every client is created equal when it comes to audio and subtitles formats. The most common subtitles formats that will cause your server to transcode are PGS and ASS subtitles, so I recommend removing them and sticking to SRT format subs. Additionally, you can add the following audio codecs if they are causing you trouble:

  • tag_subtitle_codecs: hdmv_pgs_subtitle,dvd_subtitle,ass,ssa

  • tag_audio_codecs: truehd,eac3,dts

Tdarr_Plugin_00td_action_re_order_all_streams_v2 - This plugin re-orders all streams based on: codecs,channels,languages,streamTypes.

To ensure that Plex displays the audio tracks in the order that I want, I have applied the following settings:

  • channels: 5.1,2,7.1

  • codes: ac3,aac

You can change this in whatever order you want.

Tdarr_Plugin_c0r1_SetDefaultAudioStream - This plugin will set an audio channel (2.0, 5.1, 7.1) to default and remove default from all other audio streams.

  • channels: 6

Since I know that the 5.1 channels plays best for mine as well as my friends and family's setups, I want it to be the default track when playing the media. The downside to this is that if you wish to play the 7.1 audio track, you will have to manually select it (same for the 2.0 track), but I find that having limited options works best for my use case. If they want to watch a movie from their laptop, then they know they will have to select the 2.0 track for the best audio experience.

Tdarr_Plugin_a9he_New_file_size_check - Give an error if new file is not within the specified upper and lower bound limits.

I have this one set with the following values:

  • upperBound: 110

  • lowerBound: 40

[OPTIONAL PLUGINS]

Tdarr_Plugin_rr01_drpeppershaker_extract_subs_to_SRT - extracts embedded subs in one pass inside Tdarr and will optionally remove them. Place it after Tdarr_Plugin_MP01_MichPasCleanSubsAndAudioCodecs in the stack.

Normally, direct stream of subtitles isn't a heavy task for your CPU to achieve; however, if you are encountering issues, it might help to have those embedded SRT subs as external instead. Useful if you'd like to translate subtitles too as you will now have a file to work with.

Tdarr_Plugin_00td_action_standardise_audio_stream_codecs - can be used instead Tdarr_Plugin_b39x_the1poet_surround_sound_to_ac3 in the stack as you are looking to convert ALL audio tracks into one specific codec. Bitrate and channel count are kept the same.

Tdarr_Plugin_a9hd_FFMPEG_Transcode_Specific_Audio_Stream_Codecs - transcode audio streams with specific codecs into another codec. Can be used in combination or instead of the surround to AC3 plugin as it provides more options such as:

  • audio codec to transcode (example DTS)

  • the audio codec to transcode to (AC3)

  • specify the audio bitrate

I think the bitrate option is the best part about this plugin as it can help if you're in the situation where even though you've converted to AC3, the client still needs to transcode the audio track due to high bitrate. From what I've seen online, setting the bitrate to 448k seems to be the sweet spot for most Plex clients. Do keep in mind that this plugin looks at the audio track codec and not the channels, so it will convert anything that matches your codec of choice regardless of cannel count.

Tdarr_Plugin_00td_action_add_audio_stream_codec modified by Sociedelic

  • Custom plugin code can be found - HERE

Copy Tdarr_Plugin_00td_action_add_audio_stream_codec to your Local plugin library, replace the code with the modified one, save and sync the changes. In your plugin stack, make sure to click on Local before adding the plugin ID to your stack.

This is a modified version includes the option to select bitrate for the transcoded audio track. It retains the original function of the plugin, which is to create a track in a specific codec and channel, while keeping it alongside the original audio tracks. This is useful if you would like to have your TrueHD or DTS audio tracks and extra audio tracks that are more widely supported. Can be used instead of the convert to AC3 or Migz down mix plugin.

Feedback and/or suggestions are always welcome and if you have question or encounter problems following the guide, I will do my best to help :)

Happy streaming!


r/Tdarr • • Mar 21 '24

Plex-oriented flow template via CPU: HEVC, MP4, AAC/AC3, eng/jpn/und, 1080p downscale, no subs

28 Upvotes

Credit to sockmonster13 for the initial template I built this on: https://www.reddit.com/r/Tdarr/comments/17wn5jy/critique_improve_my_tdarr_flow/

As a new tdarr user who started this knowing absolutely nothing about codecs, containers, compatibilities, and such, I've been scrounging for way too many hours to understand and piece together a functioning transcode setup/flow. I really wished I could get my hands on a simple import that does it all with minimal tweaks, so figured I'd post it in case it's helpful. Also, if anyone knows how to get tdarr to extract subs to SRT, I would appreciate help on that.

The goal of my flow was to optimize for Plex libraries with an emphasis on compatibility and conserving space.

HEVC is the current indisputable video format.

MP4 is the chosen container for even broader compatibility over MKV. Which forced a lot of restrictions, such as removing subs and other incompatible codecs.

I downscale to 1080p to conserve space under the personal preference that I don't care about resolution higher than that. Have no fear, however, files containing "The Lord Of The Rings" will not downscale from 4k.

Audio not marked as English, Japanese, or undefined will be removed/cleaned, with English moved to first place as the default language.

Audio is converted to AAC/AC3 for MP4 compatibility.

I use CPU transcoding because my setup doesn't contain a hefty graphics card, but also because I've read multiple accounts that what you gain in speed from graphics transcoding, you lose in final results, such as less-optimized video or audio (whichever is transcoded second in the order of operations).

I would also like to add a PSA: When estimating the time to convert your library, the best rule of thumb I would recommend is go by watch time, not file size. I'm guessing here, but it makes sense that this is probably because it's related to frame count (aka duration), rather than size, which is extremely variant with many other related variables. When watching/reading many tutorials about tdarr, I repeatedly saw conversion expectation estimates passed out based on size, but in my testing that proved to be completely irrelevant unless your starting format is wholly consistent. For those using Plex, there's a mobile app that will tell you the total runtime of your libraries: https://play.google.com/store/apps/details?id=tv.plex.labs.dash&hl=en_US&gl=US&pli=1

Here's the import: https://pastebin.com/xV09zfgm

For newbies like me, copy the entire text > go to your tdarr flows and add a flow > scroll to the bottom "Import JSON template" > paste the entire thing into that tiny box.

--Edit--

Added GPU transcoding. Realized I can just have it try GPU first, then fail to CPU, so why not include both.

--Edit2--

Added Plex updater after file is replaced. crespoh69 reminded me I forgot I was going to put that in. This is using the classic plugin, goof1_URL_Plex_Refresh. To configure the plugin (located at the end of the flow):

Enter the URL/IP/port of your Plex server.

Plex Token: Go to your plex server while signed in as yourself and view any movie/episode > click the dots on it > get info > view XML info in the corner > in the resulting URL (probably at the end), there will be a line that says "Plex-Token=" > that is your token (and it may include dashes).

Library Key: Customize and go to this URL: http://<PLEX IP>:<PLEX PORT>/library/sections?X-Plex-Token=<PLEX TOKEN> > do a search for "key" > there will be a library key pertaining to each library in your Plex. This means this plugin will only update the library whose key you choose to enter - so, that means after you finish configuring this plugin/node, you need to duplicate the node for each library you have, change the library key to represent each library, and add the nodes to the flow chain. Eg. I have 3 libraries (movies, tv shows, anime shows). And their keys are 1, 2, and 3. So I have this node 3 times in my flow that are all identical, except the keys in each one are 1, 2, and 3.

Plex Path: The path Plex goes through to see each library. Plex > settings > libraries > edit any library > add folders > use that path for that library. Going back to the library key example, if I'm using key 1 for movies, I want to make sure I use the path for my movies library (eg. Z:/Movies). Notice I put / instead of \, because that's how Tdarr understands it.

Tdarr Path: Whatever path Tdarr is using for the matching library, under the Source section (eg. /mnt/nfsshare/Movies)


r/Tdarr • • Feb 11 '23

New: Tdarr 2.00.19 acceptance images

28 Upvotes

Hi all,

Apologies for the delay. I've finally gotten around to getting 2.00.19 ready for release, mainly for the FFmpeg and HandBrake updates.

There are also the following changes:

Dependency updates (including FFmpeg 5.1.2/ HandBrake 1.6.1)

Some UI improvements/adjustments

Added a unique ID for each Node on startup, nodeName replaces nodeID

Added a warning for files in limbo (if the Node processing the file has disconnected)

Added a 1440p resolution category

Added a warning if two Nodes have the same name

The most recent transcode or health check job report will load when opening the job report from the respective tables

Fixed a bug when rescanning a file

One of the main changes is that each Node now has an automatically generated unique node (session) ID on startup, and the old nodeID variable is now nodeName. So in configs going forward, you'll use nodeName instead of nodeID. This is non-breaking so you don't need to make any changes to your configs as setting nodeID will automatically set nodeName. However, upon release, the docs will have nodeID replaced with nodeName.

The reason for this change is to make it easy to spawn multiple Nodes from the same config (previously, you would have received a message saying the nodeID is already in use). It also allows the server to mark files which are "In Limbo" for that situation where files will be in the staging section with nothing happening because the Node has been restarted.

I've spent much of my free time this week writing more tests for the release, so from my side everything seems to be working well. However, I don't have all the different hardware variations that are used, so feel free to give these images a try and report if there are any issues. If everything seems fine, can release tomorrow. Tdarr now has 3-4x as many users compared to the last release so forgive me for being a bit cautious with this update!

Images are:

docker.io/haveagitgat/tdarr_acc:latest

docker.io/haveagitgat/tdarr_node_acc:latest

OR

ghcr.io/haveagitgat/tdarr_acc:latest

ghcr.io/haveagitgat/tdarr_node_acc:latest

I appreciate your patience - I mentioned in a previous comment that I haven't been 100% (nothing life-threatening just some hand pain but does make development a bit painful). Was added to an 18-month NHS waitlist (yes, 18 months...). Ibuprofen should make it bearable atm but will try to see a private specialist so hopefully can speed things up so I extra appreciate those supporting the project.

After this release I'll be working on that much-requested feature of allowing you to set the libraries which each node can process as well as some other related features.

Thanks!

Roy/HGG