JakeWharton/mkvdts2ac3

Evaluate User Contribution

Opened this issue · 0 comments

Email:

Hi Jake,

thanks for your work on mkvdts2ac3.
I have found a bug, if the mkv file contains spaces, the cleanup doesn't work.

Additional to the bug fixes I included a additional switch:
--no-old-audio Remove all old audio tracks, keep only the converted AC3
track."

#!/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.1
# 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.1 - 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)
NOOLDAUDIO=0

# 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 "     --no-old-audio   Remove all old audio tracks, keep only the converted AC3 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"
}

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

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

# Usage: cleanup file
cleanup() {
    if [ -f "$1" ]; then
        rm "$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
            NOOLDAUDIO=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
        ;;
        "--no-old-audio" ) # Only allow this if we aren't making the file external
            if [ -z $EXTERNAL ]; then
                NODTS=1
                NOOLDAUDIO=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

# Added check to see if AC3 track exists.  If so, no need to continue
if [ "$(mkvmerge -i "$MKVFILE" | grep -i "A_AC3")" ]; then
    echo $"AC3 track already exists in '$MKVFILE'."
    if [ $FORCE = 0 ]; then
        echo $"Use -f or --force argument to bypass this check."
        exit 1
    fi
    echo $"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 \"audio (A_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 "audio (A_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 $"Checking to see if DTS track specified via arguments is valid."
    doprint "> mkvmerge -i \"$MKVFILE\" | grep \"Track ID $DTSTRACK: audio (A_DTS)\""
    dopause
    if [ $EXECUTE = 1 ]; then
        VALID=$(mkvmerge -i "$MKVFILE" | grep "Track ID $DTSTRACK: audio (A_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=$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)
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:DTSLANG=$DTSLANG"
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
        if [ $NOOLDAUDIO = 1 ]; then
            # If all old audio tracks should removed then drop all audio tracks
            CMD="$CMD -A"
        else
            # Count the number of audio tracks in the file
            AUDIOTRACKS=$(mkvmerge -i "$MKVFILE" | grep "audio (A_" | wc -l)
            if [ $AUDIOTRACKS -eq 1 ]; then
                # If there is only the DTS audio track or all old audio tracks should removed then drop all audio tracks
                CMD="$CMD -A"
            else
                # Get a list of all the other audio tracks
                SAVETRACKS=$(mkvmerge -i "$MKVFILE" | grep "audio (A_" | 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
    fi

    # Get track ID of video track
    VIDEOTRACK=$(mkvmerge -i "$MKVFILE" | grep -m 1 "video (V_" | 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 ""
    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
            color YELLOW; echo $"MOVING new file over old file. DO NOT KILL THIS PROCESS OR YOU WILL EXPERIENCE DATA LOSS!"; color OFF
            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'."
        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
        color YELLOW; echo $"Moving new file over old file. DO NOT KILL THIS PROCESS OR YOU WILL EXPERIENCE DATA LOSS!"; color OFF
        $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