Skip to content

Instantly share code, notes, and snippets.

@nickrw
Last active December 19, 2017 12:05
Show Gist options
  • Save nickrw/f8987245ee35aa7fe327 to your computer and use it in GitHub Desktop.
Save nickrw/f8987245ee35aa7fe327 to your computer and use it in GitHub Desktop.
#!/bin/bash
# usage: ./remove-mkv-subtitles.sh [--no-dry] [path(s)]
# Script to find MKV files in the given paths and remove subtitle tracks from them. Dry run by default.
# (usually) non-default dependencies: mkvtoolnix, dc
remvsub(){
set -e
orig="$1"
temp="$2"
# Copy from $orig path to $temp path, excluding subtitles (-S)
# This requires no transcoding by mkvmerge, so it is relatively
# quick, bottlenecked on disk io.
mkvmerge -q -o "$temp" -S "$orig"
mv "$temp" "$orig"
}
scanmkv(){
mkv="$1"
dryrun="$2"
nicepath="$(basename "$mkv")"
echo -en "[\e[0;34mSCAN\e[m] $nicepath"
# Check if we need to bother
mkvinfo "$mkv" | grep -q 'Track type: subtitles'
ret=$?
if [ $ret -ne 0 ]; then
echo -e "\e[0K\r[\e[0;33mSKIP\e[m] $nicepath"
exit
fi
if $dryrun; then
echo -e "\e[0K\r[\e[0;32mNOOP\e[m] $nicepath"
exit
fi
of="$mkv"
nf="$mkv.nosubs"
ofs=$(stat -c%s "$of")
touch "$nf" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo -e "\e[0K\r[\e[0;31mPERM\e[m] $nicepath"
exit
fi
# Execute the removal in the background, so we can
# display a nice progress meter inline
remvsub "$of" "$nf" > /dev/null 2>&1 &
# progress counter, will advance after background
# remvsub function finishes running
while ps -p $! > /dev/null 2>&1; do
sleep 0.5
if [ -e "$nf" ]; then
nfs=$(stat -c%s "$nf")
pc=$(echo "2k $nfs $ofs / 100 * p" | dc)
pad_pc=$(printf "%03.f" $pc)
echo -en "\e[0K\r[\e[0;32m$pad_pc%\e[m] $nicepath"
fi
done
# If the new (temporary) file still exists after our
# background job exited we know the process failed.
if [ -e "$nf" ]; then
echo -e "\e[0K\r[\e[0;31mFAIL\e[m] $nicepath"
else
echo -e "\e[0K\r[\e[0;32mDONE\e[m] $nicepath"
fi
}
if [ "$1" = '--no-dry' ]; then
shift
dryrun=false
else
dryrun=true
echo "Dry-run mode. 'NOOP' means this file would have its subtitles removed"
echo "To act on these files run: $0 --no-dry $@"
fi
defpath=.
if [ ! -z "$@" ]; then
defpath="$@"
fi
export -f scanmkv remvsub
find $path "$defpath" -name '*.mkv' -type f -print0 | xargs -0 -IARG bash -c "scanmkv \"ARG\" $dryrun"
@nickrw
Copy link
Author

nickrw commented Aug 17, 2014

Made this waaaaay more elaborate than it needed to be

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment