Skip to content

Instantly share code, notes, and snippets.

@basdp
Created April 11, 2025 09:38

Revisions

  1. basdp created this gist Apr 11, 2025.
    57 changes: 57 additions & 0 deletions remove-foreign-langs-from-mkv.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,57 @@
    #!/bin/bash

    set -euo pipefail

    # Ensure mkvmerge is installed
    if ! command -v mkvmerge &> /dev/null; then
    echo "Error: mkvmerge is not installed. Please install it first."
    exit 1
    fi

    # Ensure jq is installed
    if ! command -v jq &> /dev/null; then
    echo "Error: jq is not installed. Please install it first."
    exit 1
    fi

    # Check if an input file is provided
    if [ "$#" -lt 1 ]; then
    echo "Usage: $0 <input.mkv>"
    exit 1
    fi

    for INPUT_FILE in "$@"; do

    #OUTPUT_FILE="filtered_${INPUT_FILE}"
    TMP_DIR="$(dirname "${INPUT_FILE}")"
    OUTPUT_FILE="$(mktemp --suffix=.mkv --tmpdir="${TMP_DIR}")"

    echo "Processing: $INPUT_FILE"

    # Get track info from mkvmerge JSON output
    TRACKS_JSON=$(mkvmerge -J "$INPUT_FILE")

    audio_tracks=($(echo "$TRACKS_JSON" | jq -r '.tracks[] | select(.type == "audio" and (.properties.language == "eng" or .properties.language == "dut")) | .id'))
    subtitle_tracks=($(echo "$TRACKS_JSON" | jq -r '.tracks[] | select(.type == "subtitles" and (.properties.language == "eng" or .properties.language == "dut")) | .id'))

    echo "Remaining audio tracks: ${audio_tracks[@]}"
    echo "Remaining subtitle tracks: ${subtitle_tracks[@]}"

    # Prepare track arguments for mkvmerge
    track_args=()
    if [ ${#audio_tracks[@]} -gt 0 ]; then
    track_args+=("-a" "$(IFS=,; echo "${audio_tracks[*]}")")
    fi
    if [ ${#subtitle_tracks[@]} -gt 0 ]; then
    track_args+=("-s" "$(IFS=,; echo "${subtitle_tracks[*]}")")
    fi

    # Run mkvmerge to create the filtered file
    mkvmerge -o "$OUTPUT_FILE" --no-attachments "${track_args[@]}" "$INPUT_FILE"

    echo "Writing merged file back to $INPUT_FILE..."
    mv --force "$OUTPUT_FILE" "$INPUT_FILE"

    echo "Finished $INPUT_FILE"

    done