Skip to content

TheCaptain989/radarr-striptracks

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Development Repository

This is a development and test repository. Visit the production repository and branch for stable/production releases.

About

A Docker Mod for the LinuxServer.io Radarr/Sonarr v3 or higher Docker containers that adds a script to automatically strip out unwanted audio and subtitle tracks, keeping only the desired languages.

This unified script works in both Radarr and Sonarr. Use this mod in either container!

Note

This mod supports Linux OSes only.

Production Container info: Docker Image Size linuxserver/docker-mods/mods/radarr-striptracks
Development Container info: Docker Image Size Docker Pulls Build Image

Features Only Available In This Repository

The following features are only available from this repository. These are either not related to Linuxserver.io's images or not related to Docker at all, so they are not published as part of the official Linuxserver.io Docker Mod package.

  • Works in hotio containers. See HOTIO.md for more details.
  • Works in Windows by using WSL. See the WSL.md file for more details.

Installation

  1. Configure your selected Docker container with all the port, volume, and environment settings from the original container documentation here:
    linuxserver/radarr OR linuxserver/sonarr

    1. Add the DOCKER_MODS environment variable to your compose.yml file or docker run command, as follows:

      • Stable/Production release: DOCKER_MODS=linuxserver/mods:radarr-striptracks
      • Dev/test release: DOCKER_MODS=thecaptain989/radarr-striptracks:latest

      Example Docker Compose YAML Configuration

      version: "2.1"
      services:
        radarr:
          image: lscr.io/linuxserver/radarr
          container_name: radarr
          environment:
            - PUID=1000
            - PGID=1000
            - TZ=America/Chicago
            - DOCKER_MODS=linuxserver/mods:radarr-striptracks
          volumes:
            - /path/to/data:/config
            - /path/to/movies:/movies
            - /path/to/downloadclient-downloads:/downloads
          ports:
            - 7878:7878
          restart: unless-stopped
      Example Docker Run Command
      docker run -d \
        --name=radarr \
        -e PUID=1000 \
        -e PGID=1000 \
        -e TZ=America/Chicago \
        -e DOCKER_MODS=linuxserver/mods:radarr-striptracks \
        -p 7878:7878 \
        -v /path/to/data:/config \
        -v /path/to/movies:/movies \
        -v /path/to/downloadclient-downloads:/downloads \
        --restart unless-stopped \
        lscr.io/linuxserver/radarr
      Synology Screenshot

      Example Synology Configuration
      striptracks

    2. Start the container.

  2. Configure a custom script from Radarr's or Sonarr's Settings > Connect screen and type the following in the Path field:
    /usr/local/bin/striptracks.sh

    Screenshot

    Example Custom Script
    striptracks custom script

    The script will detect the language(s) defined in Radarr/Sonarr for the movie or TV show and only keep the audio and subtitles selected.
    Alternatively, a wrapper script or an environment variable may be used to more granularly define which tracks to keep. See Wrapper Scripts or Environment Variable for more details.

Important

You must configure language(s) in Radarr/Sonarr or pass command-line arguments for the script to do anything! See the next section for an example.

Radarr Configuration Example

The following is a simplified example and steps to configure Radarr so the script will keep Original and English languages of an imported movie.

  1. Create a new Custom Format called "My Languages":

    Screenshot

    New Custom Format Example
    add custom format

  2. Add two Language Conditions to the format, one for English, and one for Original:

    Screenshots

    New Language Conditions Example
    add language

    Custom Format Conditions Example
    custom format

  1. Edit the 'Any' Quality Profile, changing the Language to "Any" and the Score to "10":

    Screenshot

    Radarr Quality Profile Example
    quality profile

Now, when Radarr imports a movie with the 'Any' Quality Profile, the script will keep only Original and English languages. This is equivalent to calling the script with --audio :org:eng --subs :org:eng command-line arguments. See Automatic Language Detection for more details.

Usage Details

The source video can be any mkvtoolnix supported video format. The output is an MKV file with the same name and the same permissions. Owner is preserved if the script is executed as root.
Chapters, if they exist, are preserved. The Title attribute in the MKV is set to the movie title plus year
(ex: The Sting (1973)) or the series title plus episode information (ex: Happy! 01x01 - What Smiles Are For).
The language of the video file will be updated in the Radarr or Sonarr database to reflect the actual languages preserved in the remuxed video, and the video will be renamed according to the Radarr/Sonarr rules if needed (for example, if a removed track would trigger a name change.)

If the resulting video file would contain the same tracks as the original, and it's already an MKV, the remux step is skipped.

Tip

If you've configured the Radarr/Sonarr Recycle Bin path correctly, the original video will be moved there.

Caution

If you have not configured the Recycle Bin, the original video file will be deleted/overwritten and permanently lost.

Automatic Language Detection

When the script is called with no arguments, it will attempt to detect the language(s) configured within Radarr/Sonarr on the particular movie or TV show.
Language selection(s) may be configured in:

  • Custom Formats (in Radarr v3 and higher and Sonarr v4 and higher),
  • Quality Profiles (only in Radarr), or
  • Language Profiles (Sonarr v3)

Both audio and subtitle tracks that match the configured language(s) are kept.

Tip

It is highly recommended to review the TraSH Guides setup instructions for Language Custom Formats.

Special Language Selections

The language selection 'Original' will use the language Radarr pulled from The Movie Database or that Sonarr pulled from The TVDB during its last refresh. Selecting this language is functionally equivalent to calling the script with --audio :org --subs :org command-line arguments. See Original language code below for more details.

The language selection 'Unknown' will match tracks with no configured language in the video file. Selecting this language is functionally equivalent to calling the script with --audio :und --subs :und command-line arguments. See Unknown language code below for more details.

The language selection 'Any' has two purposes:

  1. In Radarr only, when set on a Quality Profile, it will trigger a search of languages in Custom Formats
  2. If languages are not configured in a Custom Format, or if you're using Sonarr, it will preserve all languages in the video file. This is functionally equivalent to calling the script with --audio :any --subs :any command-line arguments. See Any language code below for more details.

Important

When using Custom Formats language conditions and scoring you may not get the results you expect. This can be non-intuitive configuration, especially when using negative scoring, the 'Negate' option, and the 'Except Language' option. The script does not care what custom format is applied by Radarr/Sonarr on the video file, only what the custom format conditions are and the scores are in the corresponding Quality Profile. If you choose to use Custom Formats, it is highly recommended to first run the script with the debug option -d, perform some test downloads and script runs, and then examine your results and the script logs closely to be sure things are working the way you want them to.

Language Detection Precedence

The following chart represents the order of precedence that the script uses to decide which language(s) to select when there are multiple settings configured. Moving left to right, it will stop when it finds a configured language.

graph LR
  A[Command-Line]
  B["Environment
  Variable"]
  C["Quality
  Profile"] 
  D["Custom
  Formats"]
  E["Language Profile
  (Sonarr only)"]
  A-->B
  B-->C
  C-- 'Any' -->D
  D-->E
Loading

Descriptively, these steps are:

  1. Command-line arguments override all automatic language selection.
  2. Environment variable is checked for arguments.
  3. If there are no command-line or environment variable arguments, the video's Quality Profile is examined for a language configuration (only supported in Radarr).
  4. If there is no Quality Profile language or it is set to 'Any', then examine the Custom Formats and scores associated with the quality profile.
    All language conditions with positive scores and Negated conditions with negative scores and non-Negated Except Language conditions with negative scores are selected.
  5. If the Custom Format scores are zero (0) or there are none with configured language conditions, use the Language Profile (only supported in Sonarr v3)

Note

For step 4 above, using Custom Formats when 'Any' is in the Quality Profile is consistent with the behavior described in TRaSH Guides.

Command-Line Syntax

Options and Arguments

The script also supports command-line arguments that will override the automatic language detection. More granular control can therefore be exerted or extended using tagging and defining multiple Connect scripts (this is native Radarr/Sonarr functionality outside the scope of this documentation).

The syntax for the command-line is:
striptracks.sh [{-a|--audio} <audio_languages> [{-s|--subs} <subtitle_languages>] [{-f|--file} <video_file>]] [{-l|--log} <log_file>] [{-c|--config} <config_file>] [{-d|--debug} [<level>]]

Table of Command-Line Arguments
Option Argument Description
-a, --audio <audio_languages> Audio languages to keep
ISO 639-2 code(s) prefixed with a colon (:)
Each code may optionally be followed by a plus (+) and one or more modifiers.
-s, --subs <subtitle_languages> Subtitle languages to keep
ISO 639-2 code(s) prefixed with a colon (:)
Each code may optionally be followed by a plus (+) and one or more modifiers.
-f, --file <video_file> If included, the script enters Batch Mode and converts the specified video file.
Requires the -a option.
notes Do not use this argument when called from Radarr or Sonarr!
-l, --log <log_file> The log filename
Default is /config/log/striptracks.txt
-c, --config <config_file> Radarr/Sonarr XML configuration file
Default is /config/config.xml
-d, --debug [<level>] Enables debug logging. Level is optional.
Default is 1 (low)
2 includes JSON output
3 contains even more JSON output
--help Display help and exit.
--version Display version and exit.

The <audio_languages> and <subtitle_languages> are optional arguments that are colon (:) prepended language codes in ISO 639-2 format.
For example:

  • :eng
  • :fre
  • :spa

...etc.

Multiple codes may be concatenated, such as :eng:spa for both English and Spanish. Order is unimportant.

Warning

If no subtitle language is detected via Radarr/Sonarr configuration or specified on the command-line, all subtitles are removed.

Language Code Modifiers

Each language code can optionally be followed by a plus (+) and one or more modifier characters. Supported modifiers are:

Modifier Function
f Selects only tracks with the forced flag set
d Selects only tracks with the default flag set

These modifiers must be applied to each language code you wish. They may be applied to either audio or subtitles codes.
For example, the following options, --audio :org:any+d --subs :eng:any+f would keep:

  • All original language audio tracks, and all Default audio tracks regardless of language
  • All English language subtitles tracks, and all Forced subtitles tracks regardless of language

Modifiers can be combined, such as :any+fd to keep all forced and all default tracks.

Any language code

The :any language code is a special code. When used, the script will preserve all language tracks, regardless of how they are tagged in the source video.

Original language code

The :org language code is a special code. When used, instead of retaining a specific language, the script substitutes the original movie or TV show language as specified in its The Movie Database or The TVDB entry.
As an example, when importing "Amores Perros (2000)" with options --audio :org:eng, the Spanish and English audio tracks are preserved.
Several Included Wrapper Scripts use this special code.

Note

This feature relies on the 'originalLanguage' field in the Radarr/Sonarr database. The :org code is therefore invalid when used in Batch Mode.
The script will log a warning if it detects the use of :org in an invalid way, though it will continue to execute.

Unknown language code

The :und language code is a special code. When used, the script will match on any track that has a null or blank language attribute. If not included, tracks with no language attribute will be removed.

Tip

It is common for M2TS and AVI files to have tracks with unknown languages! It is recommended to include :und in most instances unless you know exactly what you're doing.

Special Handling of Audio

The script is smart enough to not remove the last audio track. There is in fact no way to force the script to remove all audio. This way you don't have to specify every possible language if you are importing a foreign film, for example.

Additionally, two ISO 639-2 language codes are handled specially: the "Uncoded languages" code of mis and the "No linguistic content" code of zxx.
Tracks with either of these codes are always retained as they are often used for instrumental tracks in silent films.
There is no way to force the script to remove audio tracks with these codes.

Examples

Command-line Examples
-d 2                              # Enable debugging level 2, audio and subtitles
                                  # languages detected from Radarr/Sonarr
-a :eng:und -s :eng               # Keep English and Unknown audio, and English subtitles
-a :org:eng -s :any+f:eng         # Keep English and Original audio, and all forced or English subtitles
-a :eng -s ""                     # Keep English audio and remove all subtitles
-d -a :eng:kor:jpn -s :eng:spa    # Enable debugging level 1, keeping English, Korean, and Japanese audio, and
                                  # English and Spanish subtitles
-f "/movies/Finding Nemo (2003).mkv" -a :eng:und -s :eng
                                  # Batch Mode
                                  # Keep English and Unknown audio and English subtitles, converting
                                  # video specified
-a :any -s ""                     # Keep all audio and remove all subtitles

Wrapper Scripts

To supply arguments to the script, you must either use one of the included wrapper scripts, create a custom wrapper script, or set the STRIPTRACKS_ARGS environment variable.

Tip

If you followed the Linuxserver.io recommendations when configuring your container, the /config directory will be mapped to an external storage location. It is therefore recommended to place custom scripts in the /config directory so they will survive container updates, but they may be placed anywhere that is accessible by Radarr or Sonarr.

Included Wrapper Scripts

For your convenience, several wrapper scripts are included in the /usr/local/bin/ directory.
You may use any of these in place of striptracks.sh mentioned in the Installation section above.

List of scripts
striptracks-debug.sh       # Use detected languages, but enable debug logging
striptracks-debug-2.sh     # Use detected languages, enable debug logging level 2
striptracks-debug-max.sh   # Use detected languages, enable highest debug logging
striptracks-dut.sh         # Keep Dutch and Unknown audio, and Dutch subtitles
striptracks-eng.sh         # Keep English and Unknown audio, and English subtitles
striptracks-eng-debug.sh   # Keep English and Unknown audio, and English subtitles, and enable debug logging
striptracks-eng-fre.sh     # Keep English, French, and Unknown audio, and English and French subtitles
striptracks-eng-jpn.sh     # Keep English, Japanese, and Unknown audio and English subtitles
striptracks-fre.sh         # Keep French and Unknown audio, and French subtitles
striptracks-ger.sh         # Keep German and Unknown audio, and German subtitles
striptracks-spa.sh         # Keep Spanish and Unknown audio, and Spanish subtitles
striptracks-org-eng.sh     # Keep Original, English, Unknown, and forced audio, and Original, English, and forced subtitles
striptracks-org-ger.sh     # Keep Original, German, and Unknown audio, and Original and German subtitles
striptracks-org-spa.sh     # Keep Original, Spanish, and Unknown audio, and Original and Spanish subtitles

Example Wrapper Script

Example Script

To configure an entry from the Examples section above, create and save a file called striptracks-custom.sh to /config containing the following text:

#!/bin/bash

. /usr/local/bin/striptracks.sh -d -a :eng:kor:jpn -s :eng:spa

Make it executable:

chmod +x /config/striptracks-custom.sh

Then put /config/striptracks-custom.sh in the Path field in place of /usr/local/bin/striptracks.sh mentioned in the Installation section above.

Environment Variable

The script can also read arguments from the STRIPTRACKS_ARGS environment variable. This allows advanced use cases without having to provide a custom wrapper script.

Note

The environment variable is only used when no command-line arguments are present. Any command-line argument will disable the use of the environment variable.

Example Docker Compose

For example, the following lines in your compose.yml file would keep English, Japanese, and Unknown audio and English subtitles:

environment:
  - STRIPTRACKS_ARGS=--audio :eng:jpn:und --subs :eng
Example Docker Run Command

In a docker run command, it would be:

-e STRIPTRACKS_ARGS='--audio :eng:jpn:und --subs :eng'
Synology Screenshot

Example Synology Configuration
synology striptracks_args

Triggers

The only events/notification triggers that are supported are On Import and On Upgrade. The script will log an error if executed by any other trigger.

Batch Mode

Batch mode allows the script to be executed independently of Radarr or Sonarr. It converts the file specified on the command-line and ignores any environment variables that are normally expected to be set by the video management program.

Using this function, you can easily process all of your video files in any subdirectory at once. See the Batch Example below.

Script Execution Differences in Batch Mode

Because the script is not called from within Radarr or Sonarr, their database is unavailable to the script. Therefore, expect the following behavior while in Batch Mode:

  • The filename must be specified on the command-line.
    The -f option places the script in Batch Mode
  • No audio or subtitles language detection occurs.
    Both the audio and subtitles languages must be specified on the command-line.
  • The :org language code is meaningless.
    The original video language cannot be determined.
  • The resultant MKV embedded title attribute is set to the basename of the file minus the extension.
    The canonical name of the movie/TV show cannot otherwise be determined.
  • Radarr or Sonarr APIs are not called and their database is not updated.
    This may require a manual rescan of converted videos.
  • Original video files are deleted.
    The Recycle Bin function is not available.

Batch Example

Batch Mode Example

To keep English and Unknown audio and English subtitles on all video files ending in .MKV, .AVI, or .MP4 in the /movies directory, enter the following at the Linux command-line:

find /movies/ -type f \( -name "*.mkv" -o -name "*.avi" -o -name "*.mp4" \) | while read file; do /usr/local/bin/striptracks.sh -f "$file" -a :eng:und -s :eng; done

Here's another example to keep English, Danish, Unknown languages, and all forced subtitles on all video files in your ./videos directory (requires the file program; testable with file -v):

find ./videos/ -type f | while read filename; do if file -i "$filename" | grep -q video; then /usr/local/bin/striptracks.sh -f "$filename" --audio :eng:dan:und --subs :eng:dan:und:any+f; fi; done

Logs

By default, a log file is created for the script activity called:

/config/logs/striptracks.txt

This log can be inspected or downloaded from Radarr/Sonarr under System > Logs > Files. The log filename can be modified with the --log command-line option.

Script errors will show up in both the script log and the native Radarr/Sonarr log.

Log rotation is performed with 5 log files of 512KB each being kept.

Caution

If debug logging is enabled with a level above 1, the log file can grow very large very quickly. Do not leave high-level debug logging enabled permanently.

Limitations

It should be noted that this script's core functionality nulifies some of the benefits of hardlinks. However, hardlinks are still recommended.

Hardlink Limitations

Radarr Hardlinks Configuration Screenshot radarr-enable-hardlinks

The purpose of a hardlink is to:

  • Allow instant file moves from the download client to Radarr or Sonarr
  • Reduce duplicate storage space
  • Allow torrent seeding after download

Because the script creates a brand-new video file that includes only the selected streams and deletes the original, the concept of a hardlink doesn't make sense. Instant file moves from your download client should continue to work, but the new file will consume additional space, and the original file will be deleted by the script which will likely prevent torrent seeding.

Note that the script does not always create a new file. If there are no streams removed, the original video file is not deleted and therefore any hardlinks are preserved. It is therefore still recommended to enable and use hardlinks in Radarr and Sonarr.

Uninstall

To completely remove the mod:

  1. Delete the custom script from Radarr's or Sonarr's Settings > Connect screen that you created in the Installation section above.
  2. Stop and delete the Radarr/Sonarr container.
  3. Remove the DOCKER_MODS environment variable from your compose.yaml file or exclude it from the docker run command when re-creating the Radarr/Sonarr container.

Credits

This would not be possible without the following:

Radarr
Sonarr
LinuxServer.io Radarr container
LinuxServer.io Sonarr container
LinuxServer.io Docker Mods project
MKVToolNix by Moritz Bunkus
The AWK script parsing mkvmerge output is adapted from Endoro's post on VideoHelp.
Icons made by Freepik from Flaticon

Legacy Change Notes

Beginning with version 2.0 of this mod, it only supports v3 or later of Radarr/Sonarr. For legacy Radarr/Sonarr v2 please use mod release 1.3 or earlier.
Version 2.0 of this mod introduced automatic language detection.