Batch Convert Lossless Audio to AAC Shell Script

Warning: This script could screw things up. If you don’t feel comfortable with shell scripts, this might not be for you.

#!/bin/bash

set -e # exit script if control-c is used

USAGE="Usage: convert_music.sh source_dir destination_dir"

# --- Options processing -------------------------------------------
if [ $# == 0 ] ; then
    echo $USAGE
    exit 1;
fi

# Convert relative path to absolute. Also remove trailing slash

SOURCE_DIR="$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"
SOURCE_DIR=$(dirname "$SOURCE_DIR/temp") # this fixes . and ./
DESTINATION_DIR="$(cd "$(dirname "$2")"; pwd)/$(basename "$2")"
DESTINATION_DIR=$(dirname "$DESTINATION_DIR/temp") # this fixes . and ./

find "$SOURCE_DIR" \( -iname '*.flac' -or -iname '*.m4a' \) -type f -print | while read -r FILE
do
	ORIG_DIR=$(dirname "$FILE")
	# Get basename and remove extension
	BASE=$(basename "$FILE") # get filename
	BASE=${BASE%.*} # remove extension from filename
	NEW_DIR=${ORIG_DIR/$SOURCE_DIR/$DESTINATION_DIR}

	mkdir -p "$NEW_DIR"
	NEW_FILE="$NEW_DIR/$BASE.m4a"

	if [ ! -f "$NEW_FILE" ]; then
		echo "Converting $FILE to $NEW_FILE"

		# </dev/null added so ffmpeg doesn't read input
		ffmpeg -hide_banner -i "$FILE" -c:a aac -b:a 192k "$NEW_FILE" </dev/null # standard aac
		# Use the following line on Synology NAS. Comment out line above.
		#ffmpeg -hide_banner -i "$FILE" -c:a libfaac -b:a 160k "$NEW_FILE" </dev/null
	fi

done