Notes to Self

Alex Sokolsky's Notes on Computers and Programming

MKVToolNix on Linux Mint

mkvtoolnix. See also mkvtool.

Install

Identify the code-name of Ubuntu I am running:

> cat /etc/os-release|grep -i ubuntu
ID_LIKE="ubuntu debian"
UBUNTU_CODENAME=noble

The follow the recommendations for ubuntu:

sudo wget -O /etc/apt/keyrings/gpg-pub-moritzbunkus.gpg https://mkvtoolnix.download/gpg-pub-moritzbunkus.gpg

Edit the file:

sudo emacs /etc/apt/sources.list.d/mkvtoolnix.download.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/gpg-pub-moritzbunkus.gpg] https://mkvtoolnix.download/ubuntu/ noble main
deb-src [arch=amd64 signed-by=/etc/apt/keyrings/gpg-pub-moritzbunkus.gpg] https://mkvtoolnix.download/ubuntu/ noble main

Finally:

sudo apt install mkvtoolnix mkvtoolnix-gui

CLI

mkvmerge

man page.

List tracks:

mkvmerge S01E01.mkv -J|jq .tracks

List IDs of the English audio tracks:

mkvmerge S01E01.mkv -J|jq -r '.tracks|map(select(.type=="audio" and .properties.language=="eng"))|.[].id'

Strip all non-English soundtracks

#!/usr/bin/env bash
# Exit on error. Append "|| true" if you expect an error.
set -o errexit
# Exit on error inside any functions or subshells.
set -o errtrace
# Do not allow use of undefined vars. Use ${VAR:-} to use an undefined VAR
set -o nounset
# Catch the error in case mysqldump fails (but gzip succeeds) in `mysqldump |gzip`
set -o pipefail
# Turn on traces, useful while debugging but commented out by default
#set -o xtrace

#
# The file to strip non-english audio tracks
#
#FILE_PATH="/path/to/my_document.pdf"
FILE_PATH="${1}"
#echo "Path: $FILE_PATH"
DIRNAME=$(dirname "$FILE_PATH")
FILE_WITH_EXT=$(basename "$FILE_PATH")
BASE_NAME="${FILE_WITH_EXT%.*}"
#echo "BASE_NAME: $BASE_NAME"
EXTENSION="${FILE_WITH_EXT##*.}"
#echo "EXTENSION: $EXTENSION"
OUT_FILE="${DIRNAME}/${BASE_NAME}.1.${EXTENSION}"
#echo "OUT_FILE: $OUT_FILE"

if [[ -e "$OUT_FILE" ]]; then
    echo "Error: $OUT_FILE already exists."
    exit 1
fi

ENGLISH_AUDIO_TRACKS=`mkvmerge $FILE_PATH -J|jq -r '.tracks|map(select(.type=="audio" and .properties.language=="eng"))|.[].id'|paste -s -d ','`
echo "ENGLISH_AUDIO_TRACKS: $ENGLISH_AUDIO_TRACKS"

# --subtitle-tracks
mkvmerge --output $OUT_FILE --audio-tracks $ENGLISH_AUDIO_TRACKS $FILE_PATH