#!/bin/bash # mkvdts2ac3.sh - add an AC3 track to an MKV from its DTS track # Author: Jake Wharton # Chris Hoekstra # 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 and" echo " Chris Hoekstra " 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] " 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 '';; red|RED) echo -n '';; yellow|YELLOW) echo -n '';; green|GREEN) echo -n '';; blue|BLUE) echo -n '';; 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