#!/bin/sh

# vim:syntax=awk:

prog=`basename $0`
args=`getopt "d:etD" $*`; ecode=$?; set -- $args

enc=0
tag=0
debug=0

# Most of these are really awful...
cat > /tmp/genres <<EOT
<Blues> <Classic Rock> <Country> <Dance> <Disco> <Funk> <Grunge>
<Hip-Hop> <Jazz> <Metal> <New Age> <Oldies> <Other> <Pop> <R&B> <Rap>
<Reggae> <Rock> <Techno> <Industrial> <Alternative> <Ska> <Death Metal>
<Pranks> <Soundtrack> <Euro-Techno> <Ambient> <Trip-Hop> <Vocal>
<Jazz+Funk> <Fusion> <Trance> <Classical> <Instrumental> <Acid> <House>
<Game> <Sound Clip> <Gospel> <Noise> <Alt. Rock> <Bass> <Soul> <Punk>
<Space> <Meditative> <Instrum. Pop> <Instrum. Rock> <Ethnic> <Gothic>
<Darkwave> <Techno-Indust.> <Electronic> <Pop-Folk> <Eurodance> <Dream>
<Southern Rock> <Comedy> <Cult> <Gangsta> <Top 40> <Christian Rap>
<Pop/Funk> <Jungle> <Native American> <Cabaret> <New Wave> <Psychadelic>
<Rave> <Showtunes> <Trailer> <Lo-Fi> <Tribal> <Acid Punk> <Acid Jazz>
<Polka> <Retro> <Musical> <Rock & Roll> <Hard Rock> <Folk> <Folk/Rock>
<National Folk> <Swing> <Fusion> <Bebob> <Latin> <Revival> <Celtic>
<Bluegrass> <Avantgarde> <Gothic Rock> <Progress. Rock>
<Psychadel. Rock> <Symphonic Rock> <Slow Rock> <Big Band> <Chorus>
<Easy Listening> <Acoustic> <Humour> <Speech> <Chanson> <Opera>
<Chamber Music> <Sonata> <Symphony> <Booty Bass> <Primus> <Porn Groove>
<Satire>
EOT

for i
do
    case "$i"
    in
	-d)
	    export DISC=$2; shift;
	    shift;;
	-e)
	    enc=1
	    shift;;
	-t)
	    tag=1; enc=1
	    shift;;
	-D)
	    debug=1
	    shift;;
	--)
	    shift; break;;
    esac
done

if [ X$* != X"" -o $ecode != 0 ]; then
    echo "Usage ${prog}: [-d dev] [-et]"
    exit 64
fi

if [ ! -c $DISC ]; then
    echo "Please setenv $DISC to your CD-ROM device"
    exit 1
fi

year=0
until [ $year -gt 1800 -a $year -le `date +%Y` ]; do
    echo -n "Year [`date +%Y`]? "
    read year
    if [ X$year = X"" ]; then
	year=`date +%Y`
    fi
done

genre=""
until [ X"`fgrep "<$genre>" /tmp/genres`" != X"" ]; do
    if [ X$genre = X"?" -o X$genre != X"" ]; then
	echo "Bad Genre. Valid choices are:"
	cat /tmp/genres | tr '[<>]' '[""]'
    fi
    echo -n "Genre (\"?\" for list) [Industrial]? "
    read genre
    if [ X$genre = X"" ]; then
	genre="Industrial"
    fi
done

(cda -dev $DISC on 2> /dev/null;    \
cda -dev $DISC toc 2> /dev/null;  \
cda -dev $DISC off 2> /dev/null) | \
awk -vdev=$DISC -vyear=$year -venc=$enc -vtag=$tag -vgenre=$genre \
    -vdebug=$debug '
BEGIN {
    com = "FreeBSD is the only OS.";
}

func norm(name)
{
# Ha, I bet you wish that this was perl.
    lname = tolower(name);
    gsub(" - ", "-", lname);
    gsub("&", "+", lname);
    gsub("?", "", lname);
    gsub("'"'"'", "", lname);
    gsub("\"", "", lname);
    gsub("re-mix", "remix", lname);
    gsub(/ \(/, "-", lname);
    gsub(/\) /, "-", lname);
    gsub(/\)$/, "", lname);
    gsub(/^\(/, "", lname);
    gsub(" / ", "-", lname);
    gsub("/", "-", lname);
    gsub(" ", "_", lname);

    return lname;
}

func readtrack(tnum)
{
    if (enc)
    {
	return;
    }
    print("Reading...");
    system("dagrab -d " dev " -f "	\
	    dir "/track" tnum ".wav " int(tnum)   \
	    " | grep \"^Dumping\"");
}
    
func encwav(tnum, tlname, tname)
{
    if (tag)
    {
	return;
    }
    print("Encoding [" tname "]...");
    system("bladeenc -br 192 -progress=2 "	    \
	    dir "/track" tnum ".wav " dir "/" tnum "." tlname ".mp3");
    system("rm " dir "/track" tnum ".wav");
}

func tagmp3(tnum, tlname, tname)
{
    print("Tagging...");
    system("id3ren -quiet -tagonly -song \"" tname   \
	    "\" -artist \"" artist		    \
	    "\" -album \"" album		    \
	    "\" -year " year			    \
	    " -genre \"" genre			    \
	    "\" -comment \"" com "\" " dir "/" tnum "." tlname ".mp3");
}

/^.* \/ .*/ {
    if (!artist)
    {
	sl = index($0, "\/");
	artist = substr($0, 0, sl - 2);
	album = substr($0, sl + 2);
	print("Artist: " artist);
	print("Album: " album);
	print("Genre: " genre);
	dir = norm(album);
	gsub(" ", "_", dir);
	if (!enc)
	{
	    system("mkdir " dir);
	}
    }
}

#/^Disc ID: .* [0-9a-f]*$/ {
#    genre = toupper($3);
#}

/^ [0-9][0-9] [0-9][0-9]:[0-9][0-9]  .*$/   {
    num = $1;
    split($0, sp, "  ");
    name = sp[2];
    gsub(/\*$/, "", name);
    lname = norm(name);
    if (debug)
    {
	print(lname);
	next
    }
    readtrack(num);
    encwav(num, lname, name);
    tagmp3(num, lname, name)
}

END {print("Done [" int(num) " Track(s)].");}'

rm /tmp/genres


