Skip to content

Instantly share code, notes, and snippets.

@rkok
Last active July 19, 2019 07:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rkok/d1d624fb9a2a458e44b928e9c1f2dbcf to your computer and use it in GitHub Desktop.
Save rkok/d1d624fb9a2a458e44b928e9c1f2dbcf to your computer and use it in GitHub Desktop.
Recursive flac to mp3 converter, with CPU and file count limiter
#!/bin/bash
#
# flac2mp3
#
# Recursively converts flac files to mp3s.
# Doesn't delete flacs after conversion but skips them on next iteration.
#
# 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 [ "$(ps aux | grep flac2mp3.sh | wc -l)" -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"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment