#!/bin/bash

#
# flac2mp3
#
# Recursively converts flac files to mp3s
# Will skip if mp3 with same name already exists
# Bits stolen from https://wiki.archlinux.org/index.php/Convert_Flac_to_Mp3#Without_FFmpeg
# Requires packages: lame, flac, cpulimit
#

# Limit CPU usage to percentage
CPU_LIMIT=40
# Limit amount of flacs to convert per run
MAX_CONVERT_COUNT=8
# Set newline to be the default delimiter (for flac file lists)
IFS=$'\n'
# Start timer
TIME_STARTED=`date +%s`

# Check if script isn't already running
if [ "`pgrep -c flac2mp3.sh`" -ge 2 ]; then
	echo "Error: I'm already running"
	exit 1
fi

# Determine root directory using first parameter
ROOT_DIRECTORY="$1"
if [ ! -d "$ROOT_DIRECTORY" ]; then
	echo "Usage: $0 flacdir"
	exit 1
fi

# Find flac files that have not yet been converted
FLACS_ALL=`find "$ROOT_DIRECTORY" -name "*.flac"`
FLACS=
for FLAC in $FLACS_ALL; do
	if [ ! -f "${FLAC/%flac/mp3}" ]; then
		FLACS="$FLACS$FLAC"$'\n'
	fi
done

# Convert!
CONVERTED_COUNT=0

for SOURCE_FILE in $FLACS; do
	TARGET_FILE=${SOURCE_FILE/%flac/mp3}	

	# Get flac metadata tags
	ARTIST=$(metaflac "$SOURCE_FILE" --show-tag=ARTIST | sed s/.*=//g)
	TITLE=$(metaflac "$SOURCE_FILE" --show-tag=TITLE | sed s/.*=//g)
	ALBUM=$(metaflac "$SOURCE_FILE" --show-tag=ALBUM | sed s/.*=//g)
	GENRE=$(metaflac "$SOURCE_FILE" --show-tag=GENRE | sed s/.*=//g)
	TRACKNUMBER=$(metaflac "$SOURCE_FILE" --show-tag=TRACKNUMBER | sed s/.*=//g)
	DATE=$(metaflac "$SOURCE_FILE" --show-tag=DATE | sed s/.*=//g)

	# Stream flac into the lame encoder
	flac -s -c -d "$SOURCE_FILE" | lame --silent -V0 --add-id3v2 --pad-id3v2 --ignore-tag-errors \
		--ta "$ARTIST" --tt "$TITLE" --tl "$ALBUM"  --tg "${GENRE:-12}" \
		--tn "${TRACKNUMBER:-0}" --ty "$DATE" - "$TARGET_FILE" &
	
	# Limit CPU usage for lame
	cpulimit -z -l $CPU_LIMIT -e lame > /dev/null 2>&1

	CONVERTED_COUNT=$((CONVERTED_COUNT+1))
	if [ $CONVERTED_COUNT -eq $MAX_CONVERT_COUNT ]; then
		break;
	fi
done

TIME_FINISHED=`date +%s`
TIME_ELAPSED=$((TIME_FINISHED-TIME_STARTED))

echo "Converted $CONVERTED_COUNT flac(s) in $TIME_ELAPSED s"
