#!/bin/sh
# Copyright (c) 1998,1999 Robert Woodcock <rcw@debian.org>
# This code is hereby licensed for public consumption under either the
# GNU GPL v2 or greater, or Larry Wall's Artistic license - your choice.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

VERSION=0.3

# Command line options:
# -e	Edit CDDB info before continuing
# -d    CDROM device
# [0-x] Track numbers to encode (no wildcard support yet)

function usage ()
{
echo "This is cdgrab v$VERSION."
echo "Usage: cdgrab [options] [tracks]"
echo "Options:"
echo "-d    Specify CDROM device to grab"
echo "-e    Edit returned CDDB information before using"
echo "-h    This help information"
echo "Tracks is a space-delimited list of tracks to grab."
echo "No wildcards accepted yet."
}

# Builtin defaults
CDDBURL="http://cddb.cddb.com/~cddb/cddb.cgi"
HELLOINFO="`whoami`+`hostname`+cdgrab+$VERSION"
ENCODER=lamer
CDROM=/dev/cdrom
CDDISCID=cd-discid
TAGGER=id3
OUTPUTFORMAT='$ARTISTFILE/$TRACKFILE.mp3'

if [ "$OUTPUTDIR" = "" ]; then
	OUTPUTDIR=`pwd`
fi
# Load system defaults
if [ -r /etc/cdgrab.conf ]; then
	. /etc/cdgrab.conf
fi
# Load user preference defaults
if [ -r $HOME/.cdgrab.conf ]; then
	. $HOME/.cdgrab.conf
fi


# Parse command line options
while getopts d:eh opt ; do
	case "$opt" in
	d) CDROM="$OPTARG" ;;
	e) EDITCDDB="y" ;;
	h) usage; exit ;;
	esac
done

shift $(($OPTIND - 1))

while [ $# -gt 0 ]; do
	TRACKQUEUE=`echo "$TRACKQUEUE" $1`
	shift
done

# Query the CD to get the track info
echo -n "Getting CD track info... "
TRACKINFO=`$CDDISCID $CDROM`
TRACKS=`echo $TRACKINFO | cut -f2 -d' '`

if [ "$TRACKQUEUE" = "" ]; then
	echo -n "Grabbing entire CD - tracks: "
	X=0
	while [ "$X" != "$TRACKS" ]
	do
		X=`expr $X + 1`
		TRACKQUEUE=`echo "$TRACKQUEUE" $X`
	done
	echo $TRACKQUEUE
else
	TRACKQUEUE=`(for X in "$TRACKQUEUE"; do echo $X; done) | sort | uniq | xargs`
	echo Grabbing tracks: "$TRACKQUEUE"
fi

TRACKINFOPLUS=`echo $TRACKINFO | sed 's/ /+/g'`
echo -n "Looking up CD name.."
# Make CDDB query - protocol level = 4
CDINFO=`wget -O - "$CDDBURL?cmd=cddb+query+$TRACKINFOPLUS\&hello=$HELLOINFO\&proto=4" 2>/dev/null`
echo -n ".."
RESPONSECODE=`echo $CDINFO | cut -f1 -d' '`
CDDBGENRE=`echo $CDINFO | cut -f2 -d' '`
DISCID=`echo $CDINFO | cut -f3 -d' '`
# Create a tempfile
CDDBDATA=`mktemp $OUTPUTDIR/cdgrab.XXXXXX` || exit 1
# Make CDDB read - protocol level = 4
wget -O $CDDBDATA "$CDDBURL?cmd=cddb+read+$CDDBGENRE+$DISCID\&hello=$HELLOINFO\&proto=4" 2>/dev/null
echo ". done."
# Let user edit CDDB data if they requested such a thing
if [ "$EDITCDDB" = "y" ]; then
	# Try to load the preferred editor, starting with their
	# EDITOR variable
	if [ -x "$EDITOR" ]; then
		$EDITOR $CDDBDATA
	# If that fails, check for a vi
	elif [ -x /usr/bin/vi ]; then
		/usr/bin/vi $CDDBDATA
	# ae should be on all debian systems
	elif [ -x /bin/ae ]; then
		/bin/ae $CDDBDATA
	# bomb out
	else
		echo "No editor available. Check your EDITOR environment variable."
		exit 1
	fi
fi
# Get Artist and Album info from the CDDB response
DARTISTALBUM="`grep ^DTITLE= $CDDBDATA | cut -f2 -d= | sed 's- / -~-g'`"
DARTIST=`echo $DARTISTALBUM | cut -f1 -d~`
DALBUM=`echo $DARTISTALBUM | cut -f2 -d~ | tr -d \[:cntrl:\]`
echo Title: $DALBUM
echo Artist: $DARTIST
ARTISTFILE=`echo $DARTIST | sed 's- -_-g' | tr -d \'\? | tr -d \[:cntrl:\]`
TRACKNAME=foo
OUTPUTFILE=`eval echo $OUTPUTFORMAT`
if [ \! -e `dirname $OUTPUTDIR/$OUTPUTFILE` ]; then
	mkdir -p `dirname $OUTPUTDIR/$OUTPUTFILE`;
fi
# Go through the tracks and list them all
for TRACKNUM in $TRACKQUEUE
do
	CDDBTRACKNUM=`expr $TRACKNUM - 1`
	TRACKNAME=`grep ^TTITLE$CDDBTRACKNUM= $CDDBDATA | cut -f2 -d= | tr -d \[:cntrl:\]`
	echo Track $TRACKNUM: $TRACKNAME
done
# Start ripping
for TRACKNUM in $TRACKQUEUE
do
	CDDBTRACKNUM=`expr $TRACKNUM - 1`
	TRACKNAME=`grep ^TTITLE$CDDBTRACKNUM= $CDDBDATA | cut -f2 -d= | tr -d \[:cntrl:\]`
	TRACKFILE=`echo $TRACKNAME | sed 's- -_-g' | tr -d \'\?`
	echo "Grabbing track $TRACKNUM: $TRACKNAME..."
	WAVDATA=`mktemp $OUTPUTDIR/cdgrab.currenttrack.XXXXXX` || exit 1
	cdparanoia -d $CDROM -w $TRACKNUM $WAVDATA
	echo "Encoding track $TRACKNUM: $TRACKNAME..."
	OUTPUTFILE=`eval echo $OUTPUTFORMAT`
	$ENCODER $WAVDATA $OUTPUTDIR/$OUTPUTFILE
	rm -f $WAVDATA
	echo "Tagging track $TRACKNUM: $TRACKNAME..."
	$TAGGER -A "$DALBUM" -a "$DARTIST" -t "$TRACKNAME" $OUTPUTDIR/$OUTPUTFILE
done

echo
echo "Finished."
rm -f $CDDBDATA
