mkvdts2ac3.sh
#!/bin/bash
# mkvdts2ac3.sh - add an AC3 track to an MKV from its DTS track
# Author: Jake Wharton <jakewharton@gmail.com>
#         Chris Hoekstra <chris.hoekstra@gmail.com>
# Website: http://jakewharton.com
#          http://github.com/JakeWharton/mkvdts2ac3/
# Version: 1.6.0
# License:
#   Copyright 2011 Jake Wharton
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.


# Display version header
echo "mkvdts2ac3-1.6.0 - by Jake Wharton <jakewharton@gmail.com> and"
echo "                      Chris Hoekstra <chris.hoekstra@gmail.com>"
echo

# Debugging flags
# DO NOT EDIT THESE! USE --debug OR --test ARGUMENT INSTEAD.
PRINT=0
PAUSE=0
EXECUTE=1

# Default values
PRIORITY=0
FORCE=0
NOCOLOR=0
MD5=0
INITIAL=0
NEW=0
COMP="none"
WD="/tmp" # Working Directory (Use the -w/--wd argument to change)

# These are so you can make quick changes to the cmdline args without having to search and replace the entire script
DUCMD="$(which \du) -k"
RSYNCCMD="$(which \rsync) --progress -a"

# Check for a .mkvdts2ac3.rc file in user's home directory for custom defaults
if [ -f ~/.mkvdts2ac3.rc ]; then
	. ~/.mkvdts2ac3.rc
fi

# Force English output, grepping for messages may fail otherwise
export LC_MESSAGES=C

#---------- FUNCTIONS --------
displayhelp() {
# Usage: displayhelp
	echo "Usage: `basename $0` [options] <filename>"
	echo "Options:"
	echo "     -c TITLE,        Custom AC3 track title."
	echo "     --custom TITLE"
	echo "     -d, --default    Mark AC3 track as default."
	echo "     -e, --external   Leave AC3 track out of file. Does not modify the"
	echo "                      original matroska file. This overrides '-n' and"
	echo "                      '-d' arguments."
	echo "     -f, --force      Force processing when AC3 track is detected"
	echo "     -i, --initial    New AC3 track will be first in the file."
	echo "     -k, --keep-dts   Keep external DTS track (implies '-n')."
	echo "     -m, --nocolor    Do not use colors (monotone)."
	echo "     --md5            Perform MD5 comparison when copying across drives."
	echo "     -n, --no-dts     Do not retain the DTS track."
	echo "     --new            Do not copy over original. Create new adjacent file."
	echo "     -p PRIORITY      Modify niceness of executed commands."
	echo "     -s MODE,"
	echo "     --compress MODE  Apply header compression to streams (See mkvmerge's --compression)."
	echo "     -t TRACKID,"
	echo "     --track TRACKID  Specify alternate DTS track."
	echo "     -w FOLDER,"
	echo "     --wd FOLDER      Specify alternate temporary working directory."
	echo
	echo "     --test           Print commands only, execute nothing."
	echo "     --debug          Print commands and pause before executing each."
	echo
	echo "     -h, --help       Print command usage."
	echo "     -v, --verbose    Turn on verbose output"
	echo "     -V, --version    Print script version information."
}


# Usage: color shade
function color {
	# Are we in Cron?
	if [ ! -t 0 -o $NOCOLOR = 1 ]; then return 1; fi
	case $1 in
		off|OFF)       echo -n '[0m';;
		red|RED)       echo -n '[1;31m';;
		yellow|YELLOW) echo -n '[1;33m';;
		green|GREEN)   echo -n '[1;32m';;
		blue|BLUE)     echo -n '[1;34m';;
		bell|BELL)     echo -n '';;
		*)             ;;
	esac
}

# Usage: timestamp ["String to preface time display"]
timestamp() {
	CURRTIME=$(date +%s)
	secs=$(($CURRTIME - $PREVTIME))
	PREVTIME=$((CURRTIME))
	h=$(( secs / 3600 ))
	m=$(( ( secs / 60 ) % 60 ))
	s=$(( secs % 60 ))

	if [ $EXECUTE = 1 -a $PAUSE = 0 ]; then
		echo -n "$1 "
		printf "%02d:%02d:%02d " $h $m $s
		echo $"($secs seconds)"
		echo ""
	fi
}

# Usage: error "String to display"
error() {
	color BELL;color RED
	printf "%s: %s\n" $"ERROR" "$1"
	color OFF
}

# Usage: warning "String to display"
warning() {
	color YELLOW
	printf "%s: %s\n" $"WARNING" "$1"
	color OFF
}

info() {
	color BLUE
	printf "%s: %s\n" $"INFO" "$1"
	color OFF
}

# Usage: dopause
dopause() {
	if [ $PAUSE = 1 ]; then
		read
	fi
}

# Usage: checkdep appname
checkdep() {
	if [ -z "$(which $1)" -o ! -x "$(which $1)" ]; then
		error $"The program '$1' is not in the path. Is $1 installed?"
		exit 1
	fi
}

# Usage: cleanup file
cleanup() {
	if [ -f "$1" ]; then
		rm -f "$1"
		if [ $? -ne 0 ]; then
			$"There was a problem removing the file \"$1\". Please remove manually."
			return 1
		fi
	fi
}

# Usage: checkerror $? "Error message to display" [exit on error:BOOL]
checkerror() {
	if [ $1 -ne 0 ]; then
		error "$2"
		# if optional BOOL then exit, otherwise return errorcode 1
		if [ $3 -gt 0 ]; then
			# honor KEEPDTS
			if [ -z $KEEPDTS ]; then
				cleanup "$DTSFILE"
			fi

			cleanup "$AC3FILE"
			cleanup "$TCFILE"
			exit 1
		fi
		return 1
	fi
}

# Usage: doprint "String to print"
doprint() {
	if [ $PRINT = 1 ]; then
		echo -e "$1"
	fi
}

#---------- START OF PROGRAM ----------
# Start the timer and make a working copy for future timings
START=$(date +%s)
PREVTIME=$(($START))

# Parse arguments and/or filename
while [ -z "$MKVFILE" ]; do

	# If we're out of arguments no filename was passed
	if [ $# -eq 0 ]; then
		error $"You must supply a filename."
		echo ""
		displayhelp
		exit 1
	fi

	case "$1" in
		"-c" | "--custom" ) # Use custom name for AC3 track
			shift
			DTSNAME=$1
		;;
		"-d" | "--default" ) # Only allow this if we aren't making the file external
			if [ -z $EXTERNAL ]; then
				DEFAULT=1
			fi
		;;
		"-e" | "--external" ) # Don't allow -d or -n switches if they're already set
			EXTERNAL=1
			NODTS=0
			KEEPDTS=0
			DEFAULT=0
		;;
		"-f" | "--force" ) # Test for AC3 track exits immediately. Use this to continue
			FORCE=1
		;;
		"-i" | "--initial" ) # Make new AC3 track the first in the file
			INITIAL=1
		;;
		"-k" | "--keep-dts" ) # Only allow external DTS track if muxing AC3 track
			if [ -z $EXTERNAL ]; then
				KEEPDTS=1
			fi
		;;
		"-m" | "--nocolor" | "--monotone" ) # Turns off colors
			NOCOLOR=1
		;;
		"--md5" ) #Perform MD5 comparison when copying across drives
			MD5=1
		;;
		"-n" | "--no-dts" ) # Only allow this if we aren't making the file external
			if [ -z $EXTERNAL ]; then
				NODTS=1
			fi
		;;
		"--new" ) # Do not overwrite original. Create new adjacent file.
			NEW=1
		;;
		"-p" ) # Move required priority value "up"
			shift
			PRIORITY=$1
		;;
		"-s" | "--compress" )
			shift
			COMP=$1
		;;
		"-t" | "--track" ) # Move required TRACKID argument "up"
			shift
			DTSTRACK=$1
		;;
		"-w" | "--wd" ) # Specify working directory manually
			shift
			WD=$1
		;;
		"--test" ) # Echo commands and do not execute
			if [ $PAUSE = 1 ]; then
				warning $"--test overrides previous --debug flag."
			fi
			PRINT=1
			EXECUTE=0
		;;
		"--debug" ) # Echo commands and pause before executing
			if [ $EXECUTE = 0 ]; then
				error $"--debug flag not valid with --test."
				displayhelp
				exit 1
			fi
			PRINT=1
			PAUSE=1
			EXECUTE=1
		;;
		"-h" | "--help" )
			displayhelp
			exit 0
		;;
		"-v" | "--verbose" ) # Turn on verbosity
			PRINT=1
		;;
		"-V" | "--version" ) # Version information is always displayed so just exit here
			exit 0
		;;
		-* | --* )
			error $"Invalid argument '$1'."
			echo ""
			displayhelp
			exit 1
		;;
		* )
			MKVFILE=$1
			shift

			# Ensure there are no arguments after the filename
			if [ $# -ne 0 ]; then
				error $"You cannot supply any arguments after the filename. Please check the command syntax below against what has been parsed."
				echo ""
				echo $"Control Flags:"
				printf "  %s: %s" $"Strip DTS:" $NODTS
				printf "  %s: %s" $"Keep DTS: " $KEEPDTS
				printf "  %s: %s" $"Set AC3 default: " $DEFAULT
				printf "  %s: %s" $"External AC3: " $EXTERNAL
				printf "  %s: %s" $"DTS track: " $DTSTRACK
				printf "  %s: %s" $"MKV file: " $MKVFILE
				echo ""
				echo $"Debugging Flags:"
				printf "  %s: %s" $"Print commands:" $PRINT
				printf "  %s: %s" $"Pause after print:" $PAUSE
				printf "  %s: %s" $"Execute commands:" $EXECUTE
				echo ""
				displayhelp
				exit 1
			fi
		;;
	esac

	# Move arguments "up" one spot
	shift
done

# File and dependency checks
if [ $EXECUTE = 1 ]; then
	# Check the file exists and we have permissions
	if [ ! -f "$MKVFILE" ]; then
		error $"'$MKVFILE' is not a file."
		exit 1
	elif [ ! -r "$MKVFILE" ]; then
		error $"Cannot read '$MKVFILE'."
		exit 1
	elif [ -z $EXTERNAL ]; then
		if [ ! -w "$MKVFILE" ]; then
			# Only check write permission if we're not keeping the AC3 external
			error $"Cannot write '$MKVFILE'."
			exit 1
		fi
	fi

	# Check dependencies
	checkdep mkvmerge
	checkdep mkvextract
	checkdep mkvinfo
	checkdep ffmpeg
	checkdep rsync
	checkdep perl
fi

# Make some adjustments based on the version of mkvtoolnix
MKVTOOLNIXVERSION=$(mkvmerge -V | cut -d " " -f 2 | sed s/\[\^0-9\]//g)
if [ ${MKVTOOLNIXVERSION} -lt 670 ]; then
	AUDIOTRACKPREFIX="audio (A_"
	VIDEOTRACKPREFIX="video (V_"
else
	AUDIOTRACKPREFIX="audio ("
	VIDEOTRACKPREFIX="video ("
fi

# Added check to see if AC3 track exists. If so, no need to continue
if [ "$(mkvmerge -i "$MKVFILE" | grep -i "${AUDIOTRACKPREFIX}AC-3")" ]; then
	echo $"AC3 track already exists in '$MKVFILE'."
	echo ""
	if [ $FORCE = 0 ]; then
		info $"Use -f or --force argument to bypass this check."
		exit 1
	fi
	info $"Force mode is on. Continuing..."
fi

# Path to file
DEST=$(dirname "$MKVFILE")

# File name without the extension
NAME=$(basename "$MKVFILE" .mkv)

# Setup temporary files
DTSFILE="$WD/$NAME.dts"
AC3FILE="$WD/$NAME.ac3"
TCFILE="$WD/$NAME.tc"
NEWFILE="$WD/$NAME.new.mkv"

doprint $"MKV FILE: $MKVFILE"
doprint $"DTS FILE: $DTSFILE"
doprint $"AC3 FILE: $AC3FILE"
doprint $"TIMECODE: $TCFILE"
doprint $"NEW FILE: $NEWFILE"
doprint $"WORKING DIRECTORY: $WD"

# ------ GATHER DATA ------
# If the track id wasn't specified via command line then search for the first DTS audio track
if [ -z $DTSTRACK ]; then
	doprint ""
	doprint $"Find first DTS track in MKV file."
	doprint "> mkvmerge -i \"$MKVFILE\" | grep -m 1 \"${AUDIOTRACKPREFIX}DTS)\" | cut -d ":" -f 1 | cut -d \" \" -f 3"
	DTSTRACK="DTSTRACK" #Value for debugging
	dopause
	if [ $EXECUTE = 1 ]; then
		DTSTRACK=$(mkvmerge -i "$MKVFILE" | grep -m 1 "${AUDIOTRACKPREFIX}DTS)" | cut -d ":" -f 1 | cut -d " " -f 3)

		# Check to make sure there is a DTS track in the MVK
		if [ -z $DTSTRACK ]; then
			error $"There are no DTS tracks in '$MKVFILE'."
			exit 1
		fi
	fi
	doprint "RESULT:DTSTRACK=$DTSTRACK"
else
	# Checks to make sure the command line argument track id is valid
	doprint ""
	doprint $"Checking to see if DTS track specified via arguments is valid."
	doprint "> mkvmerge -i \"$MKVFILE\" | grep \"Track ID $DTSTRACK: ${AUDIOTRACKPREFIX}DTS)\""
	VALID=$"VALID" #Value for debugging
	dopause
	if [ $EXECUTE = 1 ]; then
		VALID=$(mkvmerge -i "$MKVFILE" | grep "Track ID $DTSTRACK: ${AUDIOTRACKPREFIX}DTS)")

		if [ -z "$VALID" ]; then
			error $"Track ID '$DTSTRACK' is not a DTS track and/or does not exist."
			exit 1
		else
			info $"Using alternate DTS track with ID '$DTSTRACK'."
		fi
	fi
	doprint "RESULT:VALID=$VALID"
fi
# Get the specified DTS track's information
doprint ""
doprint $"Extract track information for selected DTS track."
doprint "> mkvinfo \"$MKVFILE\""

INFO=$"INFO" #Value for debugging
dopause
if [ $EXECUTE = 1 ]; then
	INFO=$(mkvinfo "$MKVFILE")
	FIRSTLINE=$(echo "$INFO" | grep -n -m 1 "Track number: $DTSTRACK" | cut -d ":" -f 1)
	INFO=$(echo "$INFO" | tail -n +$FIRSTLINE)
	LASTLINE=$(echo "$INFO" | grep -n -m 1 "Track number: $(($DTSTRACK+1))" | cut -d ":" -f 1)
	if [ -z "$LASTLINE" ]; then
		LASTLINE=$(echo "$INFO" | grep -m 1 -n "|+" | cut -d ":" -f 1)
	fi
	if [ -z "$LASTLINE" ]; then
		LASTLINE=$(echo "$INFO" | wc -l)
	fi
	INFO=$(echo "$INFO" | head -n $LASTLINE)
fi
doprint "RESULT:INFO=\n$INFO"

#Get the language for the DTS track specified
doprint ""
doprint $"Extract language from track info."
doprint '> echo "$INFO" | grep -m 1 \"Language\" | cut -d \" \" -f 5'

DTSLANG=$"DTSLANG" #Value for debugging
dopause
if [ $EXECUTE = 1 ]; then
	DTSLANG=$(echo "$INFO" | grep -m 1 "Language" | cut -d " " -f 5)
	if [ -z "$DTSLANG" ]; then
		DTSLANG=$"eng"
	fi
fi
doprint "RESULT:DTSLANG=$DTSLANG"

# Check if a custom name was already specified
if [ -z $DTSNAME ]; then
	# Get the name for the DTS track specified
	doprint ""
	doprint $"Extract name for selected DTS track. Change DTS to AC3 and update bitrate if present."
	doprint '> echo "$INFO" | grep -m 1 "Name" | cut -d " " -f 5- | sed "s/DTS/AC3/" | awk '"'{gsub(/[0-9]+(\.[0-9]+)?(M|K)bps/,"448Kbps")}1'"''
	DTSNAME="DTSNAME" #Value for debugging
	dopause
	if [ $EXECUTE = 1 ]; then
		DTSNAME=$(echo "$INFO" | grep -m 1 "Name" | cut -d " " -f 5- | sed "s/DTS/AC3/" | awk '{gsub(/[0-9]+(\.[0-9]+)?(M|K)bps/,"448Kbps")}1')
	fi
	doprint "RESULT:DTSNAME=$DTSNAME"
fi

# ------ EXTRACTION ------
# Extract timecode information for the target track
doprint ""
doprint $"Extract timecode information for the audio track."
doprint "> mkvextract timecodes_v2 \"$MKVFILE\" $DTSTRACK:\"$TCFILE\""
doprint "> sed -n \"2p\" \"$TCFILE\""
doprint "> rm -f \"$TCFILE\""

DELAY=$"DELAY" #Value for debugging
dopause
if [ $EXECUTE = 1 ]; then
	color YELLOW; echo $"Extracting Timecodes:"; color OFF
	nice -n $PRIORITY mkvextract timecodes_v2 "$MKVFILE" $DTSTRACK:"$TCFILE"
	DELAY=$(sed -n "2p" "$TCFILE")
	cleanup "$TCFILE"
	timestamp $"Timecode extraction took:	"
fi
doprint "RESULT:DELAY=$DELAY"

# Extract the DTS track
doprint ""
doprint $"Extract DTS file from MKV."
doprint "> mkvextract tracks \"$MKVFILE\" $DTSTRACK:\"$DTSFILE\""

dopause
if [ $EXECUTE = 1 ]; then
	color YELLOW; echo $"Extracting DTS Track: "; color OFF
	nice -n $PRIORITY mkvextract tracks "$MKVFILE" $DTSTRACK:"$DTSFILE" 2>&1|perl -ne '$/="\015";next unless /Progress/;$|=1;print "%s\r",$_' #Use Perl to change EOL from \n to \r show Progress %
	checkerror $? $"Extracting DTS track failed." 1
	timestamp $"DTS track extracting took:	"
fi

# ------ CONVERSION ------
# Convert DTS to AC3
doprint $"Converting DTS to AC3."
doprint "> ffmpeg -i \"$DTSFILE\" -acodec ac3 -ac 6 -ab 448k \"$AC3FILE\""

dopause
if [ $EXECUTE = 1 ]; then
	color YELLOW; echo $"Converting DTS to AC3:"; color OFF
	DTSFILESIZE=$($DUCMD "$DTSFILE" | cut -f1) # Capture DTS filesize for end summary
	nice -n $PRIORITY ffmpeg -i "$DTSFILE" -acodec ac3 -ac 6 -ab 448k "$AC3FILE" 2>&1|perl -ne '$/="\015";next unless /size=\s*(\d+)/;$|=1;$s='$DTSFILESIZE';printf "Progress: %.0f%\r",450*$1/$s' #run ffmpeg and only show Progress %. Need perl to read \r end of lines
	checkerror $? $"Converting the DTS file to AC3 failed" 1

	# If we are keeping the DTS track external copy it back to original folder before deleting
	if [ ! -z $KEEPDTS ]; then
		color YELLOW; echo $"Moving DTS track to MKV directory."; color OFF
		$RSYNCCMD "$DTSFILE" "$DEST"
		checkerror $? $"There was an error copying the DTS track to the MKV directory. You can perform this manually from \"$DTSFILE\"." 1
	fi
	cleanup "$DTSFILE"
	echo "Progress: 100%"	#The last Progress % gets overwritten so let's put it back and make it pretty
	timestamp $"DTS track conversion took:	"
fi

# Check there is enough free space for AC3+MKV
if [ $EXECUTE = 1 ]; then
	MKVFILESIZE=$($DUCMD "$MKVFILE" | cut -f1)
	AC3FILESIZE=$($DUCMD "$AC3FILE" | cut -f1)
	WDFREESPACE=$(\df -Pk "$WD" | tail -1 | awk '{print $4}')
	if [ $(($MKVFILESIZE + $AC3FILESIZE)) -gt $WDFREESPACE ]; then
		error $"There is not enough free space on \"$WD\" to create the new file."
		exit 1
	fi
fi

if [ $EXTERNAL ]; then
	# We need to trick the rest of the script so that there isn't a lot of
	# code duplication. Basically $NEWFILE will be the AC3 track and we'll
	# change $MKVFILE to where we want the AC3 track to be so we don't
	# overwrite the MKV file only an AC3 track
	NEWFILE=$AC3FILE
	MKVFILE="$DEST/$NAME.ac3"
else
	# Start to "build" command
	CMD="nice -n $PRIORITY mkvmerge"

	# Puts the AC3 track as the second in the file if indicated as initial
	if [ $INITIAL = 1 ]; then
		CMD="$CMD --track-order 0:1,1:0"
	fi

	# Declare output file
	CMD="$CMD -o \"$NEWFILE\""

	# If user doesn't want the original DTS track drop it
	if [ $NODTS ]; then
		# Count the number of audio tracks in the file
		AUDIOTRACKS=$(mkvmerge -i "$MKVFILE" | grep "$AUDIOTRACKPREFIX" | wc -l)

		if [ $AUDIOTRACKS -eq 1 ]; then
			# If there is only the DTS audio track then drop all audio tracks
			CMD="$CMD -A"
		else
			# Get a list of all the other audio tracks
			SAVETRACKS=$(mkvmerge -i "$MKVFILE" | grep "$AUDIOTRACKPREFIX" | cut -d ":" -f 1 | grep -vx "Track ID $DTSTRACK" | cut -d " " -f 3 | awk '{ if (T == "") T=$1; else T=T","$1 } END { print T }')
			# And copy only those
			CMD="$CMD -a \"$SAVETRACKS\""

			# Set header compression scheme for all saved tracks
			while IFS="," read -ra TID; do
				for tid in "${TID[@]}"; do
					CMD="$CMD --compression $tid:$COMP"
				done
			done <<< $SAVETRACKS
		fi
	fi

	# Get track ID of video track
	VIDEOTRACK=$(mkvmerge -i "$MKVFILE" | grep -m 1 "$VIDEOTRACKPREFIX" | cut -d ":" -f 1 | cut -d " " -f 3)
	# Add original MKV file, set header compression scheme
	CMD="$CMD --compression $VIDEOTRACK:$COMP \"$MKVFILE\""


	# If user wants new AC3 as default then add appropriate arguments to command
	if [ $DEFAULT ]; then
		CMD="$CMD --default-track 0"
	fi

	# If the language was set for the original DTS track set it for the AC3
	if [ $DTSLANG ]; then
		CMD="$CMD --language 0:$DTSLANG"
	fi

	# If the name was set for the original DTS track set it for the AC3
	if [ "$DTSNAME" ]; then
		CMD="$CMD --track-name 0:\"$DTSNAME\""
	fi

	# If there was a delay on the original DTS set the delay for the new AC3
	if [ $DELAY != 0 ]; then
		CMD="$CMD --sync 0:$DELAY"
	fi

	# Set track compression scheme and append new AC3
	CMD="$CMD --compression 0:$COMP \"$AC3FILE\""

	# ------ MUXING ------
	# Run it!
	doprint $"Running main remux."
	doprint "> $CMD"
	dopause
	if [ $EXECUTE = 1 ]; then
		color YELLOW; echo $"Muxing AC3 Track in:"; color OFF
		eval $CMD 2>&1|perl -ne '$/="\015";next unless /(Progress:\s*\d+%)/;$|=1;print "\r",$1' #Use Perl to change EOL from \n to \r show Progress %
		checkerror $? $"Merging the AC3 track back into the MKV failed." 1
		echo 	#Just need a CR to undo the last \r printed
		timestamp $"Muxing AC3 track in took:	"
	fi

	# Delete AC3 file if successful
	doprint $"Removing temporary AC3 file."
	doprint "> rm -f \"$AC3FILE\""
	dopause
	cleanup "$AC3FILE"
fi

# If we are creating an adjacent file adjust the name of the original
if [ $NEW = 1 ]; then
	MKVFILE="$DEST/$NAME-AC3.mkv"
fi

# Check to see if the two files are on the same device
NEWFILEDEVICE=$(\df "$WD" | tail -1 | cut -d" " -f1)
DSTFILEDEVICE=$(\df "$DEST" | tail -1 | cut -d" " -f1)

if [ "$NEWFILEDEVICE" = "$DSTFILEDEVICE" ]; then
	# If we're working on the same device just move the file over the old one
	if [ "$NEWFILE" = "$MKVFILE" ]; then
		doprint ""
		doprint $"New file and destination are the same. No action is required."
	else
		doprint ""
		doprint $"Moving new file over old one."
		doprint "> mv \"$NEWFILE\" \"$MKVFILE\""
		dopause
		if [ $EXECUTE = 1 ]; then
			info $"Moving new file over old file. DO NOT KILL THIS PROCESS OR YOU WILL EXPERIENCE DATA LOSS!"
			echo $"NEW FILE: $NEWFILE"
			echo $"MKV FILE: $MKVFILE"
			mv "$NEWFILE" "$MKVFILE"
			checkerror $? $"There was an error copying the new MKV over the old one. You can perform this manually by moving '$NEWFILE' over '$MKVFILE'." 1
		fi
	fi
else
	doprint ""
	doprint $"Copying new file over the old one."
	doprint "> cp \"$NEWFILE\" \"$MKVFILE\""
	dopause

	# Check there is enough free space for the new file
	if [ $EXECUTE = 1 ]; then
		MKVFILEDIFF=$(($($DUCMD "$NEWFILE" | cut -f1) - $MKVFILESIZE))
		DESTFREESPACE=$(\df -k "$DEST" | tail -1 | awk '{print $4*1024}')
		if [ $MKVFILEDIFF -gt $DESTFREESPACE ]; then
			error $"There is not enough free space to copy the new MKV over the old one. Free up some space and then copy '$NEWFILE' over '$MKVFILE'."
			exit 1
		fi

		# Rsync our new MKV with the AC3 over the old one OR if we're using the -e
		# switch then this actually copies the AC3 file to the original directory
		info $"Moving new file over old file. DO NOT KILL THIS PROCESS OR YOU WILL EXPERIENCE DATA LOSS!"
		$RSYNCCMD "$NEWFILE" "$MKVFILE"
		checkerror $? $"There was an error copying the new MKV over the old one. You can perform this manually by copying '$NEWFILE' over '$MKVFILE'." 1

		if [ $MD5 = 1 ]; then
			# Check MD5s are equal to ensure the full file was copied (because du sucks across filesystems and platforms)
			OLDFILEMD5=$(md5sum "$NEWFILE" | cut -d" " -f1)
			NEWFILEMD5=$(md5sum "$MKVFILE" | cut -d" " -f1)
			if [ $OLDFILEMD5 -ne $NEWFILEMD5 ]; then
				error $"'$NEWFILE' and '$MKVFILE' files do not match. You might want to investigate!"
			fi
		fi
	fi
	# Remove new file in $WD
	doprint ""
	doprint $"Remove working file."
	doprint "> rm -f \"$NEWFILE\""
	dopause
	cleanup "$NEWFILE"
fi

timestamp $"File copy took:		 	"

# Run through the timestamp function manually to display total execution time
END=$(date +%s)
secs=$(($END - $START))
h=$(( secs / 3600 ))
m=$(( ( secs / 60 ) % 60 ))
s=$(( secs % 60 ))

if [ $EXECUTE = 1 -a $PAUSE = 0 ];then
	color GREEN
	echo -n $"Total processing time:		"
	printf "%02d:%02d:%02d " $h $m $s
	echo $"($secs seconds)"
	color OFF
	echo
fi

NEWFILESIZE=$($DUCMD "$MKVFILE" | cut -f1) # NEWFILESIZE isn't available in some circumstances so just grab it again

# Print final filesize summary
if [ $EXECUTE = 1 -a $PAUSE = 0 ];then
	color YELLOW; printf $"Filesize summary:\n"; color OFF
	printf "%23s %15d KB\n" $"Original Filesize:" $MKVFILESIZE|sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'
	printf "%23s %15d KB\n" $"Extracted DTS Filesize:" $DTSFILESIZE|sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'
	printf "%23s %15d KB\n" $"Converted AC3 Filesize:" $AC3FILESIZE|sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'
	printf "%23s %15d KB\n" $"Final Filesize:" $NEWFILESIZE|sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'
fi
