#!/bin/sh
#-------------------------------------------------------
# burncdda is a shell script for burning audio cd's with
# cdrdao and cdrecord
#
# (C) 2001 by Thorsten Muehlfelder
#-------------------------------------------------------

# SIGINT und SIGTERM abfangen, TEMPFILE entfernen
trap 'test -e $TEMPFILE && rm -f $TEMPFILE; exit 0' 2 15

# cleanup
rm -f /tmp/burncdda.??????
clear

# einige variablen
BACKTITLE="burnCDDA 1.1.2"
TEMPFILE=`mktemp /tmp/burncdda.XXXXXX`
ERROR="An error ocurred:"
STARTDIR=`pwd`
PLAYLIST=""
LINE=""
WAVNAME=""
MAINLEV="0"
LEV1="0"
TYP="mp3"
NSET="0"
EXT=""
LL="0"

# setzt integer variablen
declare -i N=0
declare -i LN=1
declare -i MAXN=0
declare -i MAXLN=1
declare -i FILESIZE=0
declare -i FILETIME=0
declare -i CDTIME=0
declare -i MINUTES=0
declare -i SECONDS=0

# beende bei -h und --help
case $1 in

	-h)
	echo "Usage: burncdda"
	echo "Try 'man burncdda' for more information!"
	exit 0
	;;

	--help)
	echo "Usage: burncdda"
	echo "Try 'man burncdda' for more information!"
	exit 0
	;;

esac

# config datei einlesen
if [ -r /etc/burncdda.conf ]; then
	source /etc/burncdda.conf
else
	dialog --backtitle "$BACKTITLE" --title "$ERROR" \
	       --msgbox "Check your installation! You dont have a config file." 6 60
	exit 1
fi
if [ -r ~/.burncdda ]; then
	source ~/.burncdda
fi

# check ob config datei konfiguriert wurde :-)
if [ $FIRSTRUN = "1" ]; then
	dialog --backtitle "$BACKTITLE" --title "$ERROR" \
	       --msgbox "Please edit the config file: /etc/burncdda.conf" 6 60
	exit 1
fi

# IMGDIR erstellen
if [ ! -e "$IMGDIR" ]; then
	echo "Creating $IMGDIR"
	mkdir "$IMGDIR"
	echo "Press Enter"
	read JUNK
fi

# funktionen
function decodenorm()
{
# beginnt die dekodierung und normalisierung
mkdir "$IMGDIR/$WAVNAME"
N=0
LN=1
clear
while [ $LN -le $MAXLN ]; do
	LINE=`head -$LN "$PLAYLIST" | tail -1`
	LINE=`echo "$LINE" | sed s/$'\r'//`
	EXT=`echo "$LINE" | head -c 1`
	if [ "$EXT" = "#" ]; then
		LN=$LN+1
		continue
	fi
	echo "File: $LINE"
	TYP=`echo "$LINE" | tail -c 4`
	TYP=`echo "$TYP" | tr "A-Z" "a-z"`
	N=$N+1
	LN=$LN+1
	if [ $N -le 9 ]; then
		LL="0"
	else
		LL=""
	fi
	if [ "$TYP" = "mp3" ]; then
		echo "mpg123..."
		mpg123 -r 44100 --stereo -q --wav "$IMGDIR/$WAVNAME/$WAVNAME.$LL$N.wav" "$LINE" || decerror
		echo "--> $WAVNAME.$LL$N.wav"
		if [ $NSET = 1 ]; then
			echo "normalize..."
			normalize -q --amplitude=$NORMAMP "$IMGDIR/$WAVNAME/$WAVNAME.$LL$N.wav"  || decerror
			echo "--> $WAVNAME.$LL$N.wav was normalized to $NORMAMP"
		fi
		timecount "$IMGDIR/$WAVNAME/$WAVNAME.$LL$N.wav"
	elif [ "$TYP" = "ogg" ]; then
		echo "ogg123..."
		ogg123 -q -d wav -f "$IMGDIR/$WAVNAME/$WAVNAME.$LL$N.wav" "$LINE" || decerror
		echo "--> $WAVNAME.$LL$N.wav"
		if [ $NSET = 1 ]; then
			echo "normalize..."
			normalize -q --amplitude=$NORMAMP "$IMGDIR/$WAVNAME/$WAVNAME.$LL$N.wav"  || decerror
			echo "--> $WAVNAME.$LL$N.wav was normalized to $NORMAMP"
		fi
		timecount "$IMGDIR/$WAVNAME/$WAVNAME.$LL$N.wav"
	elif [ "$TYP" = "wav" ]; then
		echo "sox..."
		sox "$LINE" -r 44100 -c 2 "$IMGDIR/$WAVNAME/$WAVNAME.$LL$N.wav" || decerror
		echo "--> $WAVNAME.$LL$N.wav"
		if [ $NSET = 1 ]; then
			echo "normalize..."
			normalize -q --amplitude=$NORMAMP "$IMGDIR/$WAVNAME/$WAVNAME.$LL$N.wav"  || decerror
			echo "--> $WAVNAME.$LL$N.wav was normalized to $NORMAMP"
		fi
		timecount "$IMGDIR/$WAVNAME/$WAVNAME.$LL$N.wav"
	else
		echo "Track $LL$N: $TYP is not a supportet format. Skipping!"
		decerror
	fi
	echo ""
	echo ""
done
MINUTES=($CDTIME/60)
SECONDS=`expr $CDTIME % 60`
if [ $SECONDS -le 9 ]; then
	echo "Disc Length: $MINUTES:0$SECONDS"
else
	echo "Disc Length: $MINUTES:$SECONDS"
fi
}

# zaehlt die zeilen und die dateien in der playlist
function filecount()
{
MAXLN=`awk 'END {print FNR}' "$PLAYLIST"`
LN=1
MAXN=0
echo -n "Counting Files in playlist"
while [ $LN -le $MAXLN ]; do
	LINE=`head -$LN "$PLAYLIST" | tail -1`
	EXT=`echo "$LINE" | head -c 1`
	if [ "$EXT" != "#" ]; then
		MAXN=$MAXN+1
	fi
	LN=$LN+1
	echo -n "."
done
}

# berechnet die laenge der einzel tracks und addiert sie in CDTIME
function timecount()
{
FILESIZE=`ls -l "$1" | awk '{print $5}'`
FILETIME=($FILESIZE/176400)
MINUTES=($FILETIME/60)
SECONDS=`expr $FILETIME % 60`
if [ $SECONDS -le 9 ]; then
	echo "Track Length: $MINUTES:0$SECONDS"
else
	echo "Track Length: $MINUTES:$SECONDS"
fi
CDTIME=($CDTIME+$FILETIME)
}

# gibt errormeldung aus
function decerror()
{
echo "WARNING: An error occurred!"
echo "Press Enter"
read JUNK
echo ""
continue
}

# gibt errormeldung aus
function checkerror()
{
mp3_check "$LINE"
echo ""
echo "Press Enter"
read JUNK
echo ""
continue
}

# menu beginn
while [ $MAINLEV = "0" ]; do
	LEV1="0"
	CDTIME=0
	cd "$STARTDIR"
	dialog --backtitle "$BACKTITLE" --title "Main Menu" --menu "Make your choice" 15 60 8 \
		1 "Read CD image" \
		2 "Burn CD image" \
		3 "Copy CD" \
		4 "Burn M3U playlist" \
		5 "Convert M3U playlist to WAVs" \
		6 "Burn WAVs" \
		7 "Check MP3s in M3U playlist" \
		8 "Exit"	2> $TEMPFILE

# if abfrage bricht menu bei cancel ab
	if [ $? = "1" ]; then
		MAINLEV="1"
	fi
	WAHL=`cat $TEMPFILE`
	rm -f $TEMPFILE
# menu ende (menuschleife umfasst noch case)

	case $WAHL in

		1)
		while [ $LEV1 = "0" ]; do
			dialog --backtitle "$BACKTITLE" --title "Read Audio-CD" \
			       --inputbox "Enter CD-image filename (without .bin):" 8 60 2> $TEMPFILE
			if [ $? = "1" ]; then
				LEV1="1"
				continue
			fi
			CDNAME=`cat $TEMPFILE`
			cd "$IMGDIR"
			if [ -e "$CDNAME.toc" ]; then
				dialog --backtitle "$BACKTITLE" --title "$ERROR" \
				       --msgbox "$CDNAME.toc already exists. Choose another name!" 6 60
				continue
			fi
			nice -n 14 cdrdao read-cd $DEVRDAO $DRVRDAO $PARANOIA --datafile "$CDNAME.bin" "$CDNAME.toc"
			echo ""
			echo "Press Enter"
			read JUNK
			LEV1="1"
		done
		;;

		2)
		while [ $LEV1 = "0" ]; do
			dialog --backtitle "$BACKTITLE" --title "Write Audio-CD" \
			       --inputbox "Enter CD-image filename (without .bin):" 8 60 2> $TEMPFILE
			if [ $? = "1" ]; then
				LEV1="1"
				continue
			fi
			CDNAME=`cat $TEMPFILE`
			cd "$IMGDIR"
			if [ ! -r "$CDNAME.toc" ]; then
				dialog --backtitle "$BACKTITLE" --title "$ERROR" \
				       --msgbox "$CDNAME.toc does not exist or is not readable. Choose another name!" 6 60
				continue
			fi
			cdrdao write $DEVWDAO $DRVWDAO "$CDNAME.toc"
			echo ""
			echo "Press Enter"
			read JUNK
			LEV1="1"
		done
		;;

		3)
		while [ $LEV1 = "0" ]; do
			dialog --backtitle "$BACKTITLE" --title "Copy Audio-CD" \
			       --inputbox "Enter CD-image filename (without .bin):" 8 60 2> $TEMPFILE
			if [ $? = "1" ]; then
				LEV1="1"
				continue
			fi
			CDNAME=`cat $TEMPFILE`
			cd "$IMGDIR"
			if [ -e "$CDNAME.toc" ]; then
				dialog --backtitle "$BACKTITLE" --title "$ERROR" \
				    --msgbox "$CDNAME.toc already exists. Choose another name!" 6 60
				continue
			fi
			nice -n 14 cdrdao read-cd $DEVRDAO $DRVRDAO $PARANOIA --datafile "$CDNAME.bin" "$CDNAME.toc"
			echo ""
			echo "Insert CD-R and press ENTER"
			read JUNK
			echo ""
			cdrdao write $DEVWDAO $DRVWDAO "$CDNAME.toc"
			echo ""
			echo "Press Enter"
			read JUNK
			LEV1="1"
		done
		;;

		4)
# playlist einegeben
		while [ $LEV1 = "0" ]; do
			dialog --backtitle "$BACKTITLE" --title "Burn Audio-CD from playlist" \
			       --inputbox "Enter playlist filename (without .m3u):" 8 60 2> $TEMPFILE
			if [ $? = "1" ]; then
				LEV1="1"
				continue
			fi
			PLAYLIST="`cat $TEMPFILE`.m3u"
			if [ ! -r "$PLAYLIST" ]; then
				dialog --backtitle "$BACKTITLE" --title "$ERROR" \
				    --msgbox "$PLAYLIST does not exist or is not readable" 6 60
				continue
			fi

# zaehlt die zeilen in der playlist und schreibt sie in die variable MAXLN
			filecount

# ueberprueft ob die playlist mehr als 99 dateien enthaelt; ausgabe der zeilenzahl
			if [ $MAXN -gt 99 ]; then
				dialog --backtitle "$BACKTITLE" --title "$ERROR" \
				       --msgbox "There are $MAXN files in $PLAYLIST but you cannot burn more than 99 tracks." 6 60
				LEV1="1"
				continue
			else
			dialog --backtitle "$BACKTITLE" --title "$PLAYLIST" \
			       --msgbox "There are $MAXN files in $PLAYLIST" 5 60
			fi
			echo ""

# eingabe der wav namen
			dialog --backtitle "$BACKTITLE" --title "Burn Audio-CD from playlist" \
			       --inputbox "Enter name of wav files (without .wav):" 8 60 2> $TEMPFILE
			if [ $? = "1" ]; then
				LEV1="1"
				continue
			fi
			WAVNAME=`cat $TEMPFILE`

# abfrage: normalisiern ja/nein
			dialog --backtitle "$BACKTITLE" --title "Burn Audio-CD from playlist" \
			       --yesno "Do you want to normalize the wav's to $NORMAMP?" 6 60
			if [ $? = "0" ]; then
				NSET="1"
			else
				NSET="0"
			fi

# dekodierung und normalisierung
			decodenorm
			echo ""
			echo "Insert CD-R and press Enter"
			read JUNK
			cdrecord $DEVWREC $SPEEDREC $OTHERREC "$IMGDIR/$WAVNAME/$WAVNAME".*.wav
			echo ""
			echo "Press Enter"
			read JUNK
			LEV1="1"
		done
		;;

		5)
# playlist einegeben
		while [ $LEV1 = "0" ]; do
			dialog --backtitle "$BACKTITLE" --title "Convert M3U playlist to WAVs" \
			       --inputbox "Enter playlist filename (without .m3u):" 8 60 2> $TEMPFILE
			if [ $? = "1" ]; then
				LEV1="1"
				continue
			fi
			PLAYLIST="`cat $TEMPFILE`.m3u"
			if [ ! -r "$PLAYLIST" ]; then
				dialog --backtitle "$BACKTITLE" --title "$ERROR" \
				    --msgbox "$PLAYLIST does not exist or is not readable" 6 60
				continue
			fi

# zaehlt die zeilen in der playlist und schreibt sie in die variable MAXLN
			filecount

# ueberprueft ob die playlist mehr als 99 dateien enthaelt; ausgabe der zeilenzahl
			if [ $MAXN -gt 99 ]; then
				dialog --backtitle "$BACKTITLE" --title "$ERROR" \
				       --msgbox "There are $MAXN files in $PLAYLIST but you cannot burn more than 99 tracks." 6 60
				LEV1="1"
				continue
			else
			dialog --backtitle "$BACKTITLE" --title "$PLAYLIST" \
			       --msgbox "There are $MAXN files in $PLAYLIST" 5 60
			fi
			echo ""

# eingabe der wav namen
			dialog --backtitle "$BACKTITLE" --title "Convert M3U playlist to WAVs" \
			       --inputbox "Enter name of wav files (without .wav):" 8 60 2> $TEMPFILE
			if [ $? = "1" ]; then
				LEV1="1"
				continue
			fi
			WAVNAME=`cat $TEMPFILE`

# abfrage: normalisiern ja/nein
			dialog --backtitle "$BACKTITLE" --title "Convert M3U playlist to WAVs" \
			       --yesno "Do you want to normalize the wav's to $NORMAMP?" 6 60
			if [ $? = "0" ]; then
				NSET="1"
			else
				NSET="0"
			fi

# dekodierung und normalisierung
			decodenorm
			echo ""
			echo "Press Enter"
			read JUNK
			LEV1="1"
		done
		;;

		6)
		while [ $LEV1 = "0" ]; do
			dialog --backtitle "$BACKTITLE" --title "Burn Audio-CD from wav files" \
			       --inputbox "Enter name of wav files (without .XX.wav):" 8 60 2> $TEMPFILE
			if [ $? = "1" ]; then
				LEV1="1"
				continue
			fi
			WAVNAME=`cat $TEMPFILE`
			clear
			echo "Tracklist:"
			echo ""
			find $IMGDIR/$WAVNAME/$WAVNAME.*.wav
			echo ""
			echo "Press Enter"
			read JUNK
			dialog --backtitle "$BACKTITLE" --title "Burn Audio-CD from wav files" \
			       --yesno "Do you want to burn the tracklist?" 6 60
			if [ $? = "1" ]; then
				LEV1="1"
				continue
			fi
			dialog --backtitle "$BACKTITLE" --title "Burn Audio-CD from wav files" \
			       --msgbox "                      Insert CD-R" 5 60
			if [ $? = "1" ]; then
				LEV1="1"
				continue
			fi
			cdrecord $DEVWREC $SPEEDREC $OTHERREC "$IMGDIR/$WAVNAME/$WAVNAME".*.wav
			echo ""
			echo "Press Enter"
			read JUNK
			LEV1="1"
		done
		;;

		7)
		while [ $LEV1 = "0" ]; do
			dialog --backtitle "$BACKTITLE" --title "Check MP3s in M3U playlist" \
			--inputbox "Enter playlist filename (without .m3u):" 8 60 2> $TEMPFILE
			if [ $? = "1" ]; then
				LEV1="1"
				continue
			fi
			PLAYLIST="`cat $TEMPFILE`.m3u"
			if [ ! -r "$PLAYLIST" ]; then
				dialog --backtitle "$BACKTITLE" --title "$ERROR" \
				    --msgbox "$PLAYLIST does not exist or is not readable" 6 60
				continue
			fi
			clear
			filecount
			clear
			N=0
			LN=1
			while [ $LN -le $MAXLN ]; do
				LINE=`head -$LN "$PLAYLIST" | tail -1`
				LINE=`echo "$LINE" | sed s/$'\r'//`
				EXT=`echo "$LINE" | head -c 1`
				if [ "$EXT" = "#" ]; then
					LN=$LN+1
					continue
				fi
				echo "File: $LINE"
				TYP=`echo "$LINE" | tail -c 4`
				TYP=`echo "$TYP" | tr "A-Z" "a-z"`
				N=$N+1
				LN=$LN+1
				if [ $TYP = "mp3" ]; then
					echo "mp3_check..."
					mp3_check "$LINE" > /dev/null || checkerror
					echo "OK"
				else
					echo "--> not a MP3. Skipping!"
				fi
				echo ""
				echo ""
			done
			echo ""
			echo "Press Enter"
			read JUNK
			LEV1="1"
		done
		;;

		8)
		MAINLEV="1"
		;;
	esac
done
rm -f $TEMPFILE
clear
echo "$BACKTITLE (C) 2001 by Thorsten Muehlfelder <thenktor@gmx.de>"
