Newer
Older
color-subs / fix-sub-color.sh
# 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[@]}