#!/bin/bash

usage()
{
	echo "makecd v0.1.4 (part of dvdrtools)"
	[ -n "$1" ] && echo $1
	cat <<EOF
Usage:
makecd [-b] [-d device] [-f format] [-s standard] file1 [file2] ...
	-b:          Blank CD-RW first
	-d device:   Use specified device [default: 0,0,0]
	-f format:   Use specified format:
	             data: Normal data CD/DVD
	             dvd: Video DVD
	             audio: Audio CD
                     mp3: MP3 CD (for HW MP3 players)
	             mpeg4: MPEG4 CD/DVD
	-s standard: TV standard (for video DVD)
	             ntsc: NTSC (720x480, 29.970 fps)
	             pal: NTSC (720x576, 25 fps)
EOF
	exit 0
}

# Parse arguments
FORMAT="data"
STANDARD=""
DEVICE="dev=0,0,0"
while [ "`echo $1 |cut -b1`" = "-" ]; do
	case $1 in
	-b)
		# Start blanking right away - maybe we're done by the time
		# we actually write something...
		dvdrecord $DEVICE blank=fast -v &>/tmp/dvdblank.log &
		;;
	-d)
		shift
		DEVICE="dev=$1"
		;;
	-f|--format)
		shift
		FORMAT=`echo $1 |tr A-Z a-z`
		if ! echo $FORMAT |grep -qE '(data|dvd|audio|mp3|mpeg4|vcd|svcd)'; then
			usage "Unknown format $1"
		fi
		;;
	-s|--standard)
		shift
		STANDARD=`echo $1 |tr A-Z a-z`
		if [ "$STANDARD" != "pal" -a "$STANDARD" != "ntsc" ]; then
			usage "Unknown standard $1"
		fi
		;;
	*)
		usage "Unknown flag $1"
	esac
	shift
done

# Generate image...
ISO_FILE=`mktemp /tmp/isoXXXXXX`
# trap "rm -rf $ISO_FILE" `seq 0 31`
case $FORMAT in
data)
	mkisofs -f -v -J -r -o $ISO_FILE "$@" 2>&1
	FILES="-dao $ISO_FILE"
	;;
dvd)
	if [ -z "$STANDARD" ]; then
		# Check if we're supposed to resize things, and
		# decide on PAL vs. NTSC
		# (Majority decision w/ frame rates)
		NTSC=0
		PAL=0
		for i in "$@"; do
			INFO=`mktemp /tmp/transcodeXXXXXX`
			LANG=C LC_MESSAGES=C tcprobe -i "$i" >$INFO
			FR=`cat $INFO |grep "frame rate:"`
			if [ -n "$FR" ]; then
				FR=`echo $FR |sed -e "s,.*-f ,,;s, .*,,"`
				if [ "$FR" = "25.000" ]; then
					PAL=$(( $PAL + 1))
				elif [ "$FR" = "29.970" -o "$FR" = "30.000" ]; then
					NTSC=$(( $NTSC + 1 ))
				fi
			fi
			rm $INFO
		done
		if [ "$PAL" -ge "$NTSC" ]; then
			STANDARD="pal"
		else
			STANDARD="ntsc"
		fi
	fi
	dvdgen -o $ISO_FILE -r $STANDARD "$@"
	FILES="-dao $ISO_FILE"
	;;
vcd|svcd)
	WORK="`mktemp -d /tmp/vcdXXXXXX`"
	VCD_FILES=""
	t=0
	pushd "$WORK"
	for i in "$@"; do
		EXTENSION="`echo $i |sed -e 's,.*\.,,'`"
		case $EXTENSION in
		mpg|mpeg|mp1|mp2)
			dvb-mplex -t `echo $FORMAT |tr a-z A-Z` -o track$t.mpg "$i"
			;;
		avi|dv|divx)
			transcode -V -x mplayer -y mpeg -o tmp$t -N 0x50 -i "$i"
			tcmplex -o "track$t-temp.mpg" -i tmp$t.m2v -p tmp$t.mpa
			rm -f tmp$t.m2v tmp$t.mpa
			dvb-mplex -t `echo $FORMAT |tr a-z A-Z` -o track$t.mpg track$t-temp.mpg
			rm track$t-temp.mpg
			;;
		esac
		VCD_FILES="$VCD_FILES track$t.mpg"
		t=$(( $t + 1 ))
	done
	if [ "$FORMAT" = "vcd" ]; then
		FORMAT="vcd11"
	fi
	vcdimager -t $FORMAT $VCD_FILES

	# We can't handle bin/cue files ATM --> use cdrdao for now
	# Unfortunately this means we can't write VCD/SVCD format data to
	# DVDs for now.
	# Wait until blanking is done...
	while [ -n "`/sbin/pidof dvdrecord`" ]; do
		sleep 1s
	done
	cdrdao write `echo $DEVICE |sed -e "s,^dev=,--device ,"` --driver generic-mmc --overburn videocd.cue
	# rm -f videocd.bin videocd.cue
	popd
	rm -f $ISO_FILE
	;;
audio)
	rm $ISO_FILE
	mkdir -p $ISO_FILE
	TRACK=1
	FILES="-audio -pad"
	for i in "$@"; do
		EXTENSION="`echo $i |sed -e 's,.*\.,,'`"
		case $EXTENSION in
		ogg)
			oggdec -o "$ISO_FILE/track-$TRACK.tmp.wav" "$i"
			;;
		mp1|mp2|mp3)
			lame --decode "$i" "$ISO_FILE/track-$TRACK.tmp.wav"
			;;
		avi|mpg|dv)
			# Hmm... A video. Probably we want the soundtrack.
			rm -f stream.yuv # Workaround for transcode bug
			transcode -x mplayer -y null,wav -o /dev/null -m "$ISO_FILE/track-$TRACK.tmp.wav" -i "$i"
			;;
		*)
			# Phew... Let's hope the best
			cp "$i" "$ISO_FILE/track-$TRACK.tmp.wav"
			;;
		esac
		sox "$ISO_FILE/track-$TRACK.tmp.wav" -r 44100 -c 2 -w "$ISO_FILE/track-$TRACK.wav" resample || mv -f "$ISO_FILE/track-$TRACK.tmp.wav" "$ISO_FILE/track-$TRACK.wav"
		rm -f "$ISO_FILE/track-$TRACK.tmp.wav"
		FILES="$FILES $ISO_FILE/track-$TRACK.wav"
		TRACK=$(( $TRACK + 1 ))
	done
	;;
mp3)
	TMP=`mktemp -d /tmp/mp3cdXXXXXX`
	for i in "$@"; do
		EXTENSION="`echo $i |sed -e 's,.*\.,,'`"
		TARGET="`basename \"$i\" |sed -e \"s,$EXTENSION,mp3,\"`"
		case $EXTENSION in
		ogg)
			oggdec -o "$TMP/track-$TRACK.tmp.wav" "$i"
			lame "$i" "$TMP/$TARGET"
			;;
		mp1|mp2|mp3)
			ln "$i" "$TMP/$TARGET" || cp "$i" "$TMP/$TARGET"
			;;
		avi|mpg|dv)
			# Hmm... A video. Probably we want the soundtrack.
			rm -f stream.yuv # Workaround for transcode bug
			transcode -x mplayer -y null,wav -o /dev/null -m "$TMP/$TARGET.wav" -i "$i"
			lame "$TMP/$TARGET.wav" "$TMP/$TARGET"
			rm -f "$TMP/$TARGET.wav"
			;;
		*)
			# Phew... Let's hope the best
			lame "$i" "$TMP/$TARGET"
			;;
		esac
	done
	pushd $TMP
	mkisofs -f -v -J -r -o $ISO_FILE . 2>&1
	popd
	rm -rf $TMP
	;;
mpeg4)
	TMP=`mktemp -d /tmp/mp4cdXXXXXX`
	for i in "$@"; do
		EXTENSION="`echo $i |sed -e 's,.*\.,,'`"
		TARGET="`basename \"$i\" |sed -e \"s,$EXTENSION,avi,\"`"
		mencoder "$i" -ovc lavc -lavcopts vcodec=mpeg4:vhq:vqmin=2:vqmax=4:lumi_mask=0.05:dark_mask=0.01 -vop pp=de/lb -oac mp3lame -lameopts vbr=0:aq=0:br=128 -sws 2 -o "$TMP/$TARGET"
	done
	pushd $TMP
	mkisofs -f -v -J -r -o $ISO_FILE . 2>&1
	popd
	rm -rf $TMP
	;;
esac
if [ -z "$FILES" ]; then
	if [ -e "$ISO_FILE" ]; then
		FILES="-data $ISO_FILE"
	else
		# We can't write VCDs yet, so we left it to cdrdao...
		exit 0
	fi
fi
# Wait until blanking is done...
while [ -n "`/sbin/pidof dvdrecord`" ]; do
	sleep 1s
done
dvdrecord $DEVICE -gui -delay 1 -eject -v $FILES 2>&1
