# get the extension... ext="${1##*.}" # ...and verify it's an mkv movie if [[ "$ext" != "mkv" ]] then echo "Not an mkv" exit -1 fi # get the base name without extension base="${1%.$ext}" # ids of sub tracks subIds=() # language ids langs=() # build up params to mkvmerge params=() # files to delete del=() # get track info with mkvmerge -i and jq to parse (see 'here' string below), then read id... while read i do # ...and language (strip quote) read l l=${l:1: -1} subIds+=("$i") langs+=("$l") params+=(--language "0:$l" "subs$i.idx") del+=("subs$i.idx" "subs$i.sub") # extract subs... mkvextract "$1" tracks "$i:subs$i" # ...and replace colors sed -i -e 's/^palette:.*$/palette: 000000, FFFFFF, FF0000, 00FF00, 0000FF, FFFF00, FF00FF, 00FFFF, FF8800, 88FF00, FF0088, 8800FF, 00FF88, 0088FF, 333333, 999999/' "subs$i.idx" done <<< $( mkvmerge -F json -i "$1" | jq '.tracks[] | select(.codec == "VobSub") | .id, .properties.language' ) function join_by { local d=$1; shift; local f=$1; shift; printf %s "$f" "${@/#/$d}"; } # store a backup mv "$1" "${base}_OLD_SUBS.$ext.SKIP" # merge the sub tracks back in mkvmerge -o "$1" -s '!'"$(join_by "," ${subIds[@]})" "${base}_OLD_SUBS.$ext.SKIP" ${params[@]} # delete tmp files rm ${del[@]}