FLAC-to-MP3 Mass Converter
#! /bin/bash | |
# | |
# flac2mp3 — Convert FLAC files to MP3. | |
# | |
# Author: Micah Elliott <mde MicahElliott com> | |
# Date: Feb 2008 (not sure if any util has obviated this) | |
# | |
# Many people store their music collections in FLAC format these days | |
# since it’s nice to have lossless compressed copies, and disks are | |
# cheap. But people also need to convert their FLAC collections into | |
# MP3 whenever they load music onto their MP3 players (for | |
# FLAC-unequipped players or any time you want to maximize your | |
# space). So this tool is needed for generation of (typically) | |
# temporary MP3 files. | |
# | |
# I wanted to use soundconverter to perform conversion operations, but | |
# it is lacking the abililty to retain the tag information. | |
# | |
# Ideas from thread | |
# (http://www.linuxtutorialblog.com/post/solution-converting-flac-to-mp3) | |
# and soundconverter (http://soundconverter.berlios.de/) | |
# | |
# Features to consider: | |
# * Detection of already-existing output files | |
# * Resume from interrupted conversion | |
# * Envar to locate the mp3 storage area | |
# * Maintain dir structure of source | |
# * Creation of a link-farm | |
# * Timing of each file conversion | |
# * Spinner/percentage indicator | |
# * Speed up the conversion process | |
# * Multiple output formats (mp3 or ogg) | |
# * Some sort of interactive selection facility | |
# | |
# Options: | |
# -w overWrite (default to skip existing .mp3) | |
# -o Outdir | |
# -b Base-depth[=0] | |
usage() { | |
echo "ERROR: $1" 1>&2 | |
echo | |
exit 1 | |
} | |
msg() { | |
test -n "$quiet" || | |
echo "$1" | |
} | |
prog=$(basename $0) | |
version="0.1" | |
usagetxt="\ | |
usage: $prog [OPTS] DIR … | |
or: $prog [OPTS] FILE … | |
Convert FLAC files to MP3. | |
-o DIR Output DIR to hold MP3s | |
-w overWrite any pre-existing files | |
-b Base depth | |
-q try to be Quiet | |
-h print this Help message | |
-v print Version | |
Report bugs to <mde@micahelliott.com>" | |
# Parse optional behavior | |
outdir="./mp3" | |
overwrite= | |
while getopts ":hwo:b:qv" opt; do | |
case $opt in | |
w ) overwrite=1;; | |
o ) outdir="$OPTARG" ;; | |
b ) basedepth=1 ;; | |
q ) quiet=1 ;; | |
h ) echo "$usagetxt"; exit 0; ;; | |
v ) echo "$version"; exit 0; ;; | |
\? ) usage "Illegal option — $OPTARG";; | |
esac | |
done | |
shift $(($OPTIND - 1)) | |
test ! -d $outdir && { | |
mkdir -p $outdir || | |
usage "Cannot create output dir $output." | |
} | |
requirements="flac metaflac id3v2 lame" | |
for r in $requirements ; do | |
which $r &>/dev/null || | |
usage "This script requires: $requirements" | |
done | |
# Modify the lame options to your preference | |
lameopts=" --vbr-new -B 256 " | |
infiles="" indirs="" | |
for a in $@ ; do | |
test -f $a && infiles="$infiles $a" | |
test -d $a && indirs="$indirs $a" | |
done | |
test -n "$infiles" -a -n "$indirs" && | |
usage "Can’t specify dirs AND files." | |
test -n "$indirs" && | |
flacfiles="$(find -L $indirs -type f -name '*.flac')" || | |
flacfiles="$infiles" | |
test -z "$flacfiles" && | |
usage "Did not find any .flac files." | |
tomp3() { | |
unset ARTIST ALBUM TITLE COMMENT GENRE DATE TRACKNUMBER | |
# Use metaflac to extract tags, then use sed to add double-quoting | |
# to field values to make them usable as bash vars. | |
eval $(metaflac --export-tags-to=- "$flacfile" | sed 's/=\(.*\)/="\1"/') | |
msg "Converting to MP3 format: $flacfile" | |
flac --silent -c -d "$flacfile" | lame --quiet $lameopts - $outdir/"$mp3file" | |
id3v2 \ | |
-a "$ARTIST" \ | |
-A "$ALBUM" \ | |
-t "$TITLE" \ | |
-c "$COMMENT" \ | |
-g "$GENRE" \ | |
-y "$DATE" \ | |
-T "$TRACKNUMBER" \ | |
"$outdir/$mp3file" | |
} | |
for flacfile in $flacfiles ; do | |
# Convert the filename suffix. | |
mp3file=$(basename "${flacfile%.flac}.mp3") | |
if [ ! -f "$outdir/$mp3file" ] ; then | |
tomp3 "$flacfile" | |
elif [ -z "$overwrite" ]; then | |
tomp3 "$flacfile" | |
else | |
echo "Skipping already existing $mp3file" || | |
tomp3 "$flacfile" | |
fi | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment