diff --git a/fix-sub-color.sh b/fix-sub-color.sh new file mode 100755 index 0000000..69fd70b --- /dev/null +++ b/fix-sub-color.sh @@ -0,0 +1,50 @@ +# 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[@]}