Release 2.9.0

This commit is contained in:
TheCaptain989
2024-11-04 17:26:38 -06:00
parent 539e7f6ff8
commit 500c6e1ceb
20 changed files with 222 additions and 116 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 947 B

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 45 KiB

+1 -1
View File
@@ -22,7 +22,7 @@ jobs:
echo "MODNAME=${{ env.MODNAME }}" >> $GITHUB_OUTPUT echo "MODNAME=${{ env.MODNAME }}" >> $GITHUB_OUTPUT
echo "MULTI_ARCH=${{ env.MULTI_ARCH }}" >> $GITHUB_OUTPUT echo "MULTI_ARCH=${{ env.MULTI_ARCH }}" >> $GITHUB_OUTPUT
# **** If the mod needs to be versioned, set the versioning logic below. Otherwise leave as is. **** # **** If the mod needs to be versioned, set the versioning logic below. Otherwise leave as is. ****
MOD_VERSION="2.8.0" MOD_VERSION="2.9.0"
echo "MOD_VERSION=${MOD_VERSION}" >> $GITHUB_OUTPUT echo "MOD_VERSION=${MOD_VERSION}" >> $GITHUB_OUTPUT
outputs: outputs:
GITHUB_REPO: ${{ steps.outputs.outputs.GITHUB_REPO }} GITHUB_REPO: ${{ steps.outputs.outputs.GITHUB_REPO }}
+147 -79
View File
@@ -2,29 +2,25 @@
A [Docker Mod](https://github.com/linuxserver/docker-mods) 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. A [Docker Mod](https://github.com/linuxserver/docker-mods) 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!** **This unified script works in both Radarr and Sonarr. Use this mod in either container!**
>**NOTE:** This mod supports Linux OSes only.
>![notes] This mod supports Linux OSes only.
<!-- markdownlint-disable --> <!-- markdownlint-disable -->
Production Container info: ![Docker Image Size](https://img.shields.io/docker/image-size/linuxserver/mods/radarr-striptracks "Container Size") Production Container info: [![Docker Image Size](https://img.shields.io/docker/image-size/linuxserver/mods/radarr-striptracks)](https://hub.docker.com/r/linuxserver/mods/tags?name=radarr-striptracks "Docker image size")
[![linuxserver/docker-mods/mods/radarr-striptracks](https://img.shields.io/badge/dynamic/json?logo=github&url=https%3A%2F%2Fthecaptain989.github.io%2Fghcr-pulls%2Fradarr-striptracks.json&query=%24.pulls&label=ghcr%20pulls&color=1572A4)](https://github.com/linuxserver/docker-mods/pkgs/container/mods) [![linuxserver/docker-mods/mods/radarr-striptracks](https://img.shields.io/badge/dynamic/json?logo=github&url=https%3A%2F%2Fthecaptain989.github.io%2Fghcr-pulls%2Fradarr-striptracks.json&query=%24.pulls&label=ghcr%20pulls&color=1572A4)](https://github.com/linuxserver/docker-mods/pkgs/container/mods "GitHub package pulls")
Development Container info: Development Container info:
![Docker Image Size](https://img.shields.io/docker/image-size/thecaptain989/radarr-striptracks "Container Size") [![Docker Image Size](https://img.shields.io/docker/image-size/thecaptain989/radarr-striptracks)](https://hub.docker.com/r/thecaptain989/radarr-striptracks "Docker image size")
![Docker Pulls](https://img.shields.io/docker/pulls/thecaptain989/radarr-striptracks?logo=docker "Container Pulls") [![Docker Pulls](https://img.shields.io/docker/pulls/thecaptain989/radarr-striptracks?logo=docker)](https://hub.docker.com/r/thecaptain989/radarr-striptracks "Docker container pulls")
[![GitHub Super-Linter](https://github.com/TheCaptain989/radarr-striptracks/actions/workflows/linter.yml/badge.svg)](https://github.com/TheCaptain989/radarr-striptracks/actions/workflows/linter.yml "Linter Job") [![Build Image](https://github.com/TheCaptain989/radarr-striptracks/actions/workflows/BuildImage.yml/badge.svg)](https://github.com/TheCaptain989/radarr-striptracks/actions/workflows/BuildImage.yml "BuildImage job")
<!-- markdownlint-restore --> <!-- markdownlint-restore -->
# Installation # Installation
1. Pull your selected container ([linuxserver/radarr](https://hub.docker.com/r/linuxserver/radarr "LinuxServer.io's Radarr container") or [linuxserver/sonarr](https://hub.docker.com/r/linuxserver/sonarr "LinuxServer.io's Sonarr container")) from GitHub Container Registry or Docker Hub: 1. Configure your selected Docker container with all the port, volume, and environment settings from the *original container documentation* here:
`docker pull lscr.io/linuxserver/radarr:latest` OR **[linuxserver/radarr](https://hub.docker.com/r/linuxserver/radarr "Radarr Docker container")** OR **[linuxserver/sonarr](https://hub.docker.com/r/linuxserver/sonarr "Sonarr Docker container")**
`docker pull lscr.io/linuxserver/sonarr:latest`
2. Configure the Docker container with all the port, volume, and environment settings from the *original container documentation* here:
**[linuxserver/radarr](https://hub.docker.com/r/linuxserver/radarr "Radarr Docker container")**
**[linuxserver/sonarr](https://hub.docker.com/r/linuxserver/sonarr "Sonarr Docker container")**
1. Add the **DOCKER_MODS** environment variable to your `compose.yml` file or `docker run` command, as follows: 1. Add the **DOCKER_MODS** environment variable to your `compose.yml` file or `docker run` command, as follows:
- Stable release: `DOCKER_MODS=linuxserver/mods:radarr-striptracks` - Stable/Production release: `DOCKER_MODS=linuxserver/mods:radarr-striptracks`
- Dev/test release: `DOCKER_MODS=thecaptain989/radarr-striptracks:latest` - Dev/test release: `DOCKER_MODS=thecaptain989/radarr-striptracks:latest`
*Example Docker Compose YAML Configuration* *Example Docker Compose YAML Configuration*
```yaml ```yaml
version: "2.1" version: "2.1"
@@ -46,7 +42,8 @@ Development Container info:
restart: unless-stopped restart: unless-stopped
``` ```
*Example Docker Run Command* <details>
<summary>Example Docker Run Command</summary>
```shell ```shell
docker run -d \ docker run -d \
@@ -63,64 +60,109 @@ Development Container info:
lscr.io/linuxserver/radarr lscr.io/linuxserver/radarr
``` ```
*Example Synology Configuration* </details>
<details>
<summary>Synology Screenshot</summary>
*Example Synology Configuration*
![striptracks](.assets/striptracks-synology.png "Synology container settings") ![striptracks](.assets/striptracks-synology.png "Synology container settings")
</details>
2. Start the container. 2. Start the container.
3. Configure a custom script from Radarr's or Sonarr's *Settings* > *Connect* screen and type the following in the **Path** field: 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` `/usr/local/bin/striptracks.sh`
*Example* <details>
![striptracks v3](.assets/striptracks-v3-custom-script.png "Radarr/Sonarr custom script settings") <summary>Screenshot</summary>
*Example Custom Script*
![striptracks custom script](.assets/striptracks-v3-custom-script.png "Radarr/Sonarr custom script settings")
</details>
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. 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](./README.md#wrapper-scripts) or [Environment Variable](./README.md#environment-variable) for more details. Alternatively, a wrapper script or an environment variable may be used to more granularly define which tracks to keep. See [Wrapper Scripts](./README.md#wrapper-scripts) or [Environment Variable](./README.md#environment-variable) for more details.
# Usage >![notes] 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***":
<details>
<summary>Screenshot</summary>
*New Custom Format Example*
![add custom format](.assets/add-custom-format.png "New Custom Format")
</details>
2. Add two *Language Conditions* to the format, one for English, and one for Original:
<details>
<summary>Screenshots</summary>
*New Language Conditions Example*
![add language](.assets/add-language-condition.png "Add Language Condition")
*Custom Format Conditions Example*
![custom format](.assets/custom-format-conditions.png "Multiple Language Conditions")
</details>
3. Edit the 'Any' Quality Profile, changing the Language to "***Any***" and the *Score* to "***10***":
<details>
<summary>Screenshot</summary>
*Radarr Quality Profile Example*
![quality profile](.assets/radarr-quality-profile.png "Radarr Quality Profile Language scoring")
</details>
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](./README.md#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. 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 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`). (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.) 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 you've configured the Radarr/Sonarr **Recycle Bin** path correctly, the original video will be moved there. If you've configured the Radarr/Sonarr **Recycle Bin** path correctly, the original video will be moved there.
![danger] **NOTE:** If you have *not* configured the Recycle Bin, the original video file will be deleted/overwritten and permanently lost. >![warning] **WARNING:** If you have *not* configured the Recycle Bin, the original video file will be deleted/overwritten and permanently lost.
If the resulting video file would contain the same tracks as the original, and it's already an MKV, the remux step is skipped. If the resulting video file would contain the same tracks as the original, and it's already an MKV, the remux step is skipped.
## Automatic Language Detection ## Automatic Language Detection
Beginning with version 2.0 of this mod, the script may be called with no arguments. It will detect the language(s) configured within Radarr/Sonarr on the particular movie or TV show. Beginning with version 2.0 of this mod, the script may be called with no arguments. It will detect the language(s) configured within Radarr/Sonarr on the particular movie or TV show.
Language selection(s) may be configured in ***Quality Profiles*** (only in Radarr), ***Custom Formats*** (in Radarr v3 and higher and Sonarr v4 and higher), or ***Language Profiles*** (Sonarr v3). Example screenshots are below. 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). Example screenshots are below.
Both audio **and** subtitle tracks that match the configured language(s) are kept. Both audio **and** subtitle tracks that match the configured language(s) are kept.
The language selection **'Original'** will use the language Radarr pulled from [The Movie Database](https://www.themoviedb.org/ "TMDB") or that Sonarr pulled from [The TVDB](https://www.thetvdb.com/ "TVDB") during its last refresh. The language selection **'Original'** will use the language Radarr pulled from [The Movie Database](https://www.themoviedb.org/ "TMDB") or that Sonarr pulled from [The TVDB](https://www.thetvdb.com/ "TVDB") during its last refresh.
Selecting this language is functionally equivalent to calling the script with `--audio :org --subs :org` command-line options. See [Original language code](./README.md#original-language-code) below for more details. Selecting this language is functionally equivalent to calling the script with `--audio :org --subs :org` command-line arguments. See [Original language code](./README.md#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 options. See [Unknown language code](./README.md#unknown-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](./README.md#unknown-language-code) below for more details.
The language selection **'Any'** has two purposes (Radarr only): The language selection **'Any'** has two purposes (Radarr only):
1) It will trigger a search of languages in ***Custom Formats*** 1) It will trigger a search of languages in ***Custom Formats***
2) If none are found, it will preserve **all languages** in the video file. This is functionally equivalent to calling the script with `--audio :any --subs :any` command-line options. See [Any language code](./README.md#any-language-code) below for more details. 2) If none are found, 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](./README.md#any-language-code) below for more details.
>**Note:** When using the *Custom Format* language conditions and scoring you may not get the results you expect. >![notes] When using *Custom Format* 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. >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 *detected* by Radarr/Sonarr on the video file, only what the *scores* are in the *Quality Profile*. >The script does not care what custom format is *detected* by Radarr/Sonarr on the video file, only what the *scores* are in the *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. >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.
It is **highly recommended** to review the [TraSH Guides](https://trash-guides.info/Radarr/Tips/How-to-setup-language-custom-formats/) setup instructions for Language Custom Formats. It is **highly recommended** to review the [TraSH Guides](https://trash-guides.info/Radarr/Tips/How-to-setup-language-custom-formats/) setup instructions for Language Custom Formats.
*Radarr Quality Profile Example*
![radarr profile](.assets/radarr-quality-profile.png "Radarr Quality Profile settings")
*Custom Format Condition Example*
![custom format](.assets/custom-format-condition.png "Custom Format Language setting")
*Radarr Custom Format Language Score Example*
![custom format score](.assets/custom-format-score.png "Custom Format Language scoring")
### Language Detection Precedence ### Language Detection Precedence
The following chart represents the order of precedence that the script follows 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. 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.
```mermaid ```mermaid
graph LR graph LR
@@ -137,12 +179,13 @@ graph LR
``` ```
Descriptively, these steps are: Descriptively, these steps are:
1. Command-line options (or environment variable) override all automatic language selection. 1. Command-line arguments (or environment variable) override all automatic language selection.
2. If there are no command-line options, the video's *Quality Profile* is examined for a language configuration (only supported in Radarr). 2. If there are no command-line arguments, the video's *Quality Profile* is examined for a language configuration (only supported in Radarr).
3. 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. 3. 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.
4. If the *Custom Format* scores are zero (0) or there are none with configured language conditions, examine the *Language Profile* (only supported in Sonarr v3) All language conditions with positive scores *and* Negated conditions with negative scores *and* non-Negated Except Language conditions with negative scores are selected.
4. 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 3 above, using *Custom Formats* when 'Any' is in the *Quality Profile* is consistent with the behavior described in [TRaSH Guides](https://trash-guides.info/Radarr/Tips/How-to-setup-language-custom-formats/ "TraSH Guides: How to setup Language Custom Formats"). >![notes] For step 3 above, using *Custom Formats* when 'Any' is in the *Quality Profile* is consistent with the behavior described in [TRaSH Guides](https://trash-guides.info/Radarr/Tips/How-to-setup-language-custom-formats/ "TraSH Guides: How to setup Language Custom Formats").
## Command-Line Syntax ## Command-Line Syntax
@@ -150,20 +193,24 @@ Descriptively, these steps are:
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 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: 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>] [{-d|--debug} [<level>]]` `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>]]`
Where: <details>
<summary>Table of Command-Line Arguments</summary>
Option|Argument|Description Option|Argument|Description
---|---|--- ---|---|---
-a, --audio|<audio_languages>|Audio languages to keep<br/>ISO 639-2 code(s) prefixed with a colon (`:`) -a, --audio|<audio_languages>|Audio languages to keep<br/>ISO 639-2 code(s) prefixed with a colon (`:`)
-s, --subs|<subtitle_languages>|Subtitle languages to keep<br/>ISO 639-2 code(s) prefixed with a colon (`:`) -s, --subs|<subtitle_languages>|Subtitle languages to keep<br/>ISO 639-2 code(s) prefixed with a colon (`:`)
-f, --file|<video_file>|If included, the script enters **[Batch Mode](./README.md#batch-mode)** and converts the specified video file.<br/>Requires the `-a` option.<br/>![danger] **WARNING:** Do not use this argument when called from Radarr or Sonarr! -f, --file|<video_file>|If included, the script enters **[Batch Mode](./README.md#batch-mode)** and converts the specified video file.<br/>Requires the `-a` option.<br/>![notes] **Do not** use this argument when called from Radarr or Sonarr!
-l, --log|\<log_file\>|The log filename<br/>Default of /config/log/striptracks.txt -l, --log|\<log_file\>|The log filename<br/>Default is /config/log/striptracks.txt
-d, --debug|\[\<level\>\]|Enables debug logging. Level is optional.<br/>Default of 1 (low)<br/>2 includes JSON output<br/>3 contains even more JSON output -c, --config|\<config_file\>|Radarr/Sonarr XML configuration file<br/>Default is /config/config.xml
-d, --debug|\[\<level\>\]|Enables debug logging. Level is optional.<br/>Default is 1 (low)<br/>2 includes JSON output<br/>3 contains even more JSON output
--help| |Display help and exit. --help| |Display help and exit.
--version| |Display version and exit. --version| |Display version and exit.
</details>
The `<audio_languages>` and `<subtitle_languages>` are optional arguments that are colon (`:`) prepended language codes in [ISO 639-2](https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes "List of ISO 639-2 codes") format. The `<audio_languages>` and `<subtitle_languages>` are optional arguments that are colon (`:`) prepended language codes in [ISO 639-2](https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes "List of ISO 639-2 codes") format.
For example: For example:
@@ -175,7 +222,7 @@ For example:
Multiple codes may be concatenated, such as `:eng:spa` for both English and Spanish. Order is unimportant. Multiple codes may be concatenated, such as `:eng:spa` for both English and Spanish. Order is unimportant.
>![warning] **NOTE:** If no subtitle language is detected via Radarr/Sonarr configuration or specified on the command-line, all subtitles are removed. >![warning] **WARNING:** If no subtitle language is detected via Radarr/Sonarr configuration or specified on the command-line, all subtitles are removed.
### Any language code ### 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. 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.
@@ -185,12 +232,12 @@ The `:org` language code is a special code. When used, instead of retaining a sp
As an example, when importing "*Amores Perros (2000)*" with options `--audio :org:eng`, the Spanish and English audio tracks are preserved. 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](./README.md#included-wrapper-scripts) use this special code. Several [Included Wrapper Scripts](./README.md#included-wrapper-scripts) use this special code.
>![danger] **NOTE:** This feature relies on the 'originalLanguage' field in the Radarr/Sonarr database. The `:org` code is therefore invalid when used in Batch Mode. >![notes] 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. > 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 ### 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. 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.
>![danger] **NOTE:** It is common for M2TS and AVI files to have tracks with unknown languages! It is strongly recommended to include `:und` in most instances unless you know exactly what you're doing. >![warning] **WARNING:** It is common for M2TS and AVI files to have tracks with unknown languages! It is strongly recommended to include `:und` in most instances unless you know exactly what you're doing.
## Special Handling of Audio ## 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. 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.
@@ -201,6 +248,9 @@ There is no way to force the script to remove audio tracks with these codes.
## Examples ## Examples
<details>
<summary>Command-line Examples</summary>
```shell ```shell
-d 2 # Enable debugging level 2, audio and subtitles -d 2 # Enable debugging level 2, audio and subtitles
# languages detected from Radarr/Sonarr # languages detected from Radarr/Sonarr
@@ -209,38 +259,45 @@ There is no way to force the script to remove audio tracks with these codes.
:eng "" # Keep English audio and remove all subtitles :eng "" # 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 -d -a :eng:kor:jpn -s :eng:spa # Enable debugging level 1, keeping English, Korean, and Japanese audio, and
# English and Spanish subtitles # English and Spanish subtitles
-f "/path/to/movies/Finding Nemo (2003).mkv" -a :eng:und -s :eng -f "/movies/Finding Nemo (2003).mkv" -a :eng:und -s :eng
# Batch Mode # Batch Mode
# Keep English and Unknown audio and English subtitles, converting # Keep English and Unknown audio and English subtitles, converting
# video specified # video specified
-a :any -s "" # Keep all audio and remove all subtitles -a :any -s "" # Keep all audio and remove all subtitles
``` ```
</details>
## Wrapper Scripts ## 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](./README.md#environment-variable). 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](./README.md#environment-variable).
### Included Wrapper Scripts ### Included Wrapper Scripts
For your convenience, several wrapper scripts are included in the `/usr/local/bin/` directory. For your convenience, several wrapper scripts are included in the `/usr/local/bin/` directory.
You may use any of these scripts in place of `striptracks.sh` mentioned in the [Installation](./README.md#installation) section above. You may use any of these in place of `striptracks.sh` mentioned in the [Installation](./README.md#installation) section above.
<details>
<summary>List of scripts</summary>
```shell ```shell
striptracks-debug.sh # Use detected languages, but enable debug logging striptracks-debug.sh # Use detected languages, but enable debug logging
striptracks-debug-2.sh # Use detected languages, enable debug logging level 2 striptracks-debug-2.sh # Use detected languages, enable debug logging level 2
striptracks-debug-max.sh # Use detected languages, enable highest debug logging striptracks-debug-max.sh # Use detected languages, enable highest debug logging
striptracks-dut.sh # Keep Dutch audio and subtitles striptracks-dut.sh # Keep Dutch and Unknown audio, and Dutch subtitles
striptracks-eng.sh # Keep English and Unknown audio, and English 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-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 subtitles 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-eng-jpn.sh # Keep English, Japanese, and Unknown audio and English subtitles
striptracks-fre.sh # Keep French audio and subtitles striptracks-fre.sh # Keep French and Unknown audio, and French subtitles
striptracks-fre-debug.sh # Keep French audio and subtitles, and enable debug logging striptracks-fre-debug.sh # Keep French and Unknown audio, French subtitles, and enable debug logging
striptracks-ger.sh # Keep German audio and subtitles striptracks-ger.sh # Keep German and Unknown audio, and German subtitles
striptracks-spa.sh # Keep Spanish audio and subtitles striptracks-spa.sh # Keep Spanish and Unknown audio, and Spanish subtitles
striptracks-org-eng.sh # Keep Original, English, and Unknown audio, and English and Unknown subtitles striptracks-org-eng.sh # Keep Original, English, and Unknown audio, and Original and English subtitles
striptracks-org-ger.sh # Keep Original and German audio, and Original and German subtitles striptracks-org-ger.sh # Keep Original, German, and Unknown audio, and Original and German subtitles
striptracks-org-spa.sh # Keep Original and Spanish audio, and Original and Spanish subtitles striptracks-org-spa.sh # Keep Original, Spanish, and Unknown audio, and Original and Spanish subtitles
``` ```
</details>
### Example Wrapper Script ### Example Wrapper Script
To configure an entry from the [Examples](./README.md#examples) section above, create and save a file called `striptracks-custom.sh` to `/config` containing the following text: To configure an entry from the [Examples](./README.md#examples) section above, create and save a file called `striptracks-custom.sh` to `/config` containing the following text:
@@ -258,31 +315,36 @@ 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](./README.md#installation) section above. Then put `/config/striptracks-custom.sh` in the **Path** field in place of `/usr/local/bin/striptracks.sh` mentioned in the [Installation](./README.md#installation) section above.
>**Note:** 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. >![notes] 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.
## Environment Variable ## Environment Variable
The `striptracks.sh` script also allows the use of arguments provided by the `STRIPTRACKS_ARGS` environment variable. This allows advanced use cases without having to provide a custom script. The `striptracks.sh` script can read command-line arguments from the `STRIPTRACKS_ARGS` environment variable. This allows advanced use cases without having to provide a custom script.
For example, the following value in your `docker run` command would Keep English, Japanese, and Unknown audio and English subtitles: For example, the following lines in your `compose.yml` file would keep English, Japanese, and Unknown audio and English subtitles:
```shell
-e STRIPTRACKS_ARGS='--audio :eng:jpn:und --subs :eng'
```
In Docker Compose this will look like this:
```yaml ```yaml
environment: environment:
- STRIPTRACKS_ARGS=--audio :eng:jpn:und --subs :eng - STRIPTRACKS_ARGS=--audio :eng:jpn:und --subs :eng
``` ```
*Example Synology Configuration* In a `docker run` command, it would be:
![striptracks](.assets/striptracks-synology-2.png "Synology container settings")
>**NOTE:** The environment variable settings are *only* used when **no** command-line arguments are present. **Any** command-line argument will disable the use of the environment variable. ```shell
-e STRIPTRACKS_ARGS='--audio :eng:jpn:und --subs :eng'
```
<details>
<summary>Synology Screenshot</summary>
*Example Synology Configuration*
![synology striptracks_args](.assets/striptracks-synology-2.png "Synology container settings")
</details>
>![notes] The environment variable is *only* read when **no** command-line arguments are present. **Any** command-line argument will disable the use of the environment variable.
## Triggers ## Triggers
The only events/notification triggers that are supported are **On Import** and **On Upgrade** 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
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. 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.
@@ -290,10 +352,10 @@ Batch mode allows the script to be executed independently of Radarr or Sonarr.
Using this function, you can easily process all of your video files in any subdirectory at once. See the [Batch Example](./README.md#batch-example) below. Using this function, you can easily process all of your video files in any subdirectory at once. See the [Batch Example](./README.md#batch-example) below.
### Script Execution Differences in Batch Mode ### Script Execution Differences in Batch Mode
Because the script is not called from within Radarr or Sonarr, expect the following behavior while 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.*<br/>(The `-f` option places the script in Batch Mode) * *The filename must be specified on the command-line.*<br/>The `-f` option places the script in Batch Mode
* *No audio or subtitles language detection occurs.*<br/>Both the audio and subtitles languages must be specified on the command-line. * *No audio or subtitles language detection occurs.*<br/>Both the audio and subtitles languages must be specified on the command-line.
* *The `:org` language code is meaningless.*<br/>The original video language cannot be determined without the Radarr/Sonarr database. * *The `:org` language code is meaningless.*<br/>The original video language cannot be determined.
* *The resultant MKV embedded title attribute is set to the basename of the file minus the extension.*<br/>The canonical name of the movie/TV show cannot otherwise be determined. * *The resultant MKV embedded title attribute is set to the basename of the file minus the extension.*<br/>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.*<br/>This may require a manual rescan of converted videos. * *Radarr or Sonarr APIs are not called and their database is not updated.*<br/>This may require a manual rescan of converted videos.
* *Original video files are deleted.*<br/>The Recycle Bin function is not available. * *Original video files are deleted.*<br/>The Recycle Bin function is not available.
@@ -305,6 +367,12 @@ To keep English and Unknown audio and English subtitles on all video files endin
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 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, and Unknown languages on all video files in your `./videos` directory (requires the `file` program; testable with `file -v`):
```shell
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; fi; done
```
## Logs ## Logs
By default, a log file is created for the script activity called: By default, a log file is created for the script activity called:
@@ -315,7 +383,7 @@ This log can be inspected or downloaded from Radarr/Sonarr under *System* > *Log
Script errors will show up in both the script log and the native Radarr/Sonarr log. 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. Log rotation is performed with 5 log files of 512KB each being kept.
>![danger] **NOTE:** 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.* >![warning] **WARNING:** 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.*
# Uninstall # Uninstall
To completely remove the mod: To completely remove the mod:
@@ -342,4 +410,4 @@ Icons made by [Freepik](https://www.freepik.com) from [Flaticon](https://www.fla
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. 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.
[warning]: .assets/warning.png "Warning" [warning]: .assets/warning.png "Warning"
[danger]: .assets/danger.png "Danger" [notes]: .assets/notes.png "Note"
+2 -2
View File
@@ -6,8 +6,8 @@ Only the latest major and minor version are supported.
| Version | Supported | | Version | Supported |
| ------- | ------------------ | | ------- | ------------------ |
| 2.8.x | :heavy_check_mark: | | 2.9.x | :heavy_check_mark: |
| < 2.8 | :x: | | < 2.9 | :x: |
## Reporting a Vulnerability ## Reporting a Vulnerability
+1 -1
View File
@@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
. /usr/local/bin/striptracks.sh :nld:dut :nld:dut . /usr/local/bin/striptracks.sh :nld:dut:und :nld:dut
+1 -1
View File
@@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
. /usr/local/bin/striptracks.sh -d :fre:fra :fre:fra . /usr/local/bin/striptracks.sh -d :fre:fra:und :fre:fra
+1 -1
View File
@@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
. /usr/local/bin/striptracks.sh :fre:fra :fre:fra . /usr/local/bin/striptracks.sh :fre:fra:und :fre:fra
+1 -1
View File
@@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
. /usr/local/bin/striptracks.sh :ger:deu :ger:deu . /usr/local/bin/striptracks.sh :ger:deu:und :ger:deu
+1 -1
View File
@@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
. /usr/local/bin/striptracks.sh --audio :org:eng:und --subs :eng:und . /usr/local/bin/striptracks.sh --audio :org:eng:und --subs :org:eng
+1 -1
View File
@@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
. /usr/local/bin/striptracks.sh --audio :org:ger:deu --subs :org:ger:deu . /usr/local/bin/striptracks.sh --audio :org:ger:deu:und --subs :org:ger:deu
+1 -1
View File
@@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
. /usr/local/bin/striptracks.sh --audio :org:spa --subs :org:spa . /usr/local/bin/striptracks.sh --audio :org:spa:und --subs :org:spa
+1 -1
View File
@@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
. /usr/local/bin/striptracks.sh :spa :spa . /usr/local/bin/striptracks.sh :spa:und :spa
+64 -26
View File
@@ -12,19 +12,22 @@
# NOTE: ShellCheck linter directives appear as comments # NOTE: ShellCheck linter directives appear as comments
# Dependencies: # Dependencies: # sudo apt install mkvtoolnix jq
# mkvmerge # From mkvtoolnix:
# mkvpropedit # mkvmerge
# sed # mkvpropedit
# awk # From jq:
# curl # jq
# jq # Generally always available:
# numfmt # sed
# stat # awk
# nice # curl
# basename # numfmt
# dirname # stat
# mktemp # nice
# basename
# dirname
# mktemp
# Exit codes: # Exit codes:
# 0 - success; or test # 0 - success; or test
@@ -88,6 +91,8 @@ Options and Arguments:
from Radarr or Sonarr! from Radarr or Sonarr!
-l, --log <log_file> Log filename -l, --log <log_file> Log filename
[default: /config/log/striptracks.txt] [default: /config/log/striptracks.txt]
-c, --config <config_file> Radarr/Sonarr XML configuration file
[default: ./config/config.xml]
-d, --debug [<level>] Enable debug logging -d, --debug [<level>] Enable debug logging
level is optional, between 1-3 level is optional, between 1-3
1 is lowest, 3 is highest 1 is lowest, 3 is highest
@@ -129,6 +134,11 @@ Examples:
echo "$usage" >&2 echo "$usage" >&2
} }
# Log command-line arguments
if [ $# -ne 0 ]; then
striptracks_prelogmessagedebug="Debug|Command line arguments are '$*'"
fi
# Check for environment variable arguments # Check for environment variable arguments
if [ -n "$STRIPTRACKS_ARGS" ]; then if [ -n "$STRIPTRACKS_ARGS" ]; then
if [ $# -ne 0 ]; then if [ $# -ne 0 ]; then
@@ -205,6 +215,17 @@ while (( "$#" )); do
exit 3 exit 3
fi fi
;; ;;
-c|--config ) # *arr XML configuration file
if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
# Overrides default /config/config.xml
export striptracks_arr_config="$2"
shift 2
else
echo "Error|Invalid option: $1 requires an argument." >&2
usage
exit 1
fi
;;
-*) # Unknown option -*) # Unknown option
echo "Error|Unknown option: $1" >&2 echo "Error|Unknown option: $1" >&2
usage usage
@@ -897,18 +918,14 @@ if [ ! -w "$striptracks_log" ]; then
fi fi
# Check for required binaries # Check for required binaries
if [ ! -f "/usr/bin/mkvmerge" ]; then for striptracks_file in "/usr/bin/mkvmerge" "/usr/bin/mkvpropedit" "/usr/bin/jq"; do
striptracks_message="Error|/usr/bin/mkvmerge is required by this script" if [ ! -f "$striptracks_file" ]; then
echo "$striptracks_message" | log striptracks_message="Error|$striptracks_file is required by this script"
echo "$striptracks_message" >&2 echo "$striptracks_message" | log
end_script 4 echo "$striptracks_message" >&2
fi end_script 4
if [ ! -f "/usr/bin/mkvpropedit" ]; then fi
striptracks_message="Error|/usr/bin/mkvpropedit is required by this script" done
echo "$striptracks_message" | log
echo "$striptracks_message" >&2
end_script 4
fi
# Log Debug state # Log Debug state
if [ $striptracks_debug -ge 1 ]; then if [ $striptracks_debug -ge 1 ]; then
@@ -917,6 +934,12 @@ if [ $striptracks_debug -ge 1 ]; then
echo "$striptracks_message" >&2 echo "$striptracks_message" >&2
fi fi
# Log command line parameters
if [ -n "$striptracks_prelogmessagedebug" ]; then
# striptracks_prelogmessagedebug is set above, before argument processing
[ $striptracks_debug -ge 1 ] && echo "$striptracks_prelogmessagedebug" | log
fi
# Log STRIPTRACKS_ARGS usage # Log STRIPTRACKS_ARGS usage
if [ -n "$striptracks_prelogmessage" ]; then if [ -n "$striptracks_prelogmessage" ]; then
# striptracks_prelogmessage is set above, before argument processing # striptracks_prelogmessage is set above, before argument processing
@@ -935,6 +958,16 @@ if [[ "${!striptracks_eventtype}" =~ Grab|Rename|MovieAdded|MovieDelete|MovieFil
end_script 20 end_script 20
fi fi
# Check for WSL environment
if [ -n "$WSL_DISTRO_NAME" ]; then
[ $striptracks_debug -ge 1 ] && echo "Debug|Running in virtual WSL $WSL_DISTRO_NAME distribution." | log
# Adjust config file location to WSL default
if [ ! -f "$striptracks_arr_config" ]; then
striptracks_arr_config="/mnt/c/ProgramData/${striptracks_type^}/config.xml"
[ $striptracks_debug -ge 1 ] && echo "Debug|Will try to use the default WSL configuration file '$striptracks_arr_config'" | log
fi
fi
# Handle Test event # Handle Test event
if [[ "${!striptracks_eventtype}" = "Test" ]]; then if [[ "${!striptracks_eventtype}" = "Test" ]]; then
echo "Info|${striptracks_type^} event: ${!striptracks_eventtype}" | log echo "Info|${striptracks_type^} event: ${!striptracks_eventtype}" | log
@@ -978,6 +1011,11 @@ elif [ -f "$striptracks_arr_config" ]; then
striptracks_apikey_var="${striptracks_type^^}__AUTH__APIKEY" striptracks_apikey_var="${striptracks_type^^}__AUTH__APIKEY"
[ -n "${!striptracks_apikey_var}" ] && striptracks_apikey="${!striptracks_apikey_var}" [ -n "${!striptracks_apikey_var}" ] && striptracks_apikey="${!striptracks_apikey_var}"
# Check for WSL environment and adjust bindaddress if not otherwise specified
if [ -n "$WSL_DISTRO_NAME" -a "$striptracks_bindaddress" = "*" ]; then
striptracks_bindaddress=$(ip route show | grep -i default | awk '{ print $3}')
fi
# Check for localhost # Check for localhost
[[ $striptracks_bindaddress = "*" ]] && striptracks_bindaddress=localhost [[ $striptracks_bindaddress = "*" ]] && striptracks_bindaddress=localhost
@@ -991,7 +1029,7 @@ elif [ -f "$striptracks_arr_config" ]; then
get_version get_version
striptracks_return=$?; [ $striptracks_return -ne 0 ] && { striptracks_return=$?; [ $striptracks_return -ne 0 ] && {
# curl errored out. API calls are really broken at this point. # curl errored out. API calls are really broken at this point.
striptracks_message="Error|Unable to get ${striptracks_type^} version information. It is not safe to continue." striptracks_message="Error|[$striptracks_return] Unable to get ${striptracks_type^} version information. It is not safe to continue."
echo "$striptracks_message" | log echo "$striptracks_message" | log
echo "$striptracks_message" >&2 echo "$striptracks_message" >&2
end_script 17 end_script 17