summaryrefslogtreecommitdiffstats
path: root/burncd
diff options
context:
space:
mode:
Diffstat (limited to 'burncd')
-rwxr-xr-xburncd447
1 files changed, 447 insertions, 0 deletions
diff --git a/burncd b/burncd
new file mode 100755
index 0000000..e8d503f
--- /dev/null
+++ b/burncd
@@ -0,0 +1,447 @@
+#! /bin/bash
+
+CYAN="\033[3;36m"
+RED="\033[3;31m"
+RESET="\033[0m"
+
+READ_SPEED=52
+WRITE_SPEED=40
+MOUNT='/media/cd'
+# DEVICES=`ls -1l /dev/cdr* | gawk '{ print $8; }'`
+DEVICE='/dev/cdrom'
+WAV_TMP='WAV_tmp'
+ISO_TMP='ISO_tmp'
+NBR=1
+DVD=0
+VERIFY=0
+VERSION="1.1"
+
+# set files and directory mode to usuall values
+# allow full 31 characters filename
+# Generate Joliet directory records
+ISO_OPTS='-input-charset iso8859-15 -r -l -J'
+
+# Disk At Once == Session At Once
+BURN_WAV_OPTS='-v -eject -pad -dao -audio *.wav'
+BURN_ISO_OPTS='-v -eject -dao -data '
+
+
+# TODO MOUNT && DEVICE
+#
+# cdrecord -scanbus
+#
+# doesn't work => multi lines ...
+# `cat /etc/fstab | grep cdrom | awk '{ if ($1 != "") print $2; else print "N" }'`
+#
+# catch trap SIGINT => clean
+#
+
+BIN=`basename $0`
+
+REC=0
+REC_2=1
+MP3=2
+MP3_2=3
+MPC=4
+MPC_2=5
+OGG=6
+CD2W=7
+MKISO=8
+SOX=9
+CMP=10
+MY_BIN=(
+ `which cdrecord 2>/dev/null || echo 'N'`
+ `which dvdrecord 2>/dev/null || echo 'N'`
+ `which mpg321 2>/dev/null || echo 'N'`
+ `which mpg123 2>/dev/null || echo 'N'`
+ `which mppdec 2>/dev/null || echo 'N'`
+ `which mppdec-static 2>/dev/null || echo 'N'`
+ `which oggdec 2>/dev/null || echo 'N'`
+ `which cdda2wav 2>/dev/null || echo 'N'`
+ `which mkisofs 2>/dev/null || echo 'N'`
+ `which sox 2>/dev/null || echo 'N'`
+ `which cmp 2>/dev/null || echo 'N'`
+)
+
+verify() {
+ if [ "${MY_BIN[$1]}" = "N" ]; then return 1; fi
+}
+
+error() {
+ echo -e "${RED}$@ => exit 1${RESET} (temporary files may still exists)." && exit 1;
+}
+
+
+mktmp() {
+ if test -d $1; then error "$1 already exists"; fi
+ echo "mkdir $1" && mkdir $1 2>/dev/null || error "unable to mkdir $1"
+}
+
+need_one() {
+ GET=""
+ if verify $1 ; then
+ GET=$1
+ else
+ if ! verify $2 ; then error $3; fi
+ GET=$2
+ fi
+ GET=${MY_BIN[$GET]}
+}
+
+mp3_to_wav() {
+ need_one $MP3 $MP3_2 "neither mpg321 nore mpg123 are available"
+ for i in *.MP3; do mv $i `basename $i .MP3`.mp3 2>/dev/null; done
+ for i in *.mp3; do mv $i `echo $i | tr ' ' '_'` 2>/dev/null; done
+ if verify $SOX; then # convert to 44100 signed linear 16-bit double channel wav file
+ #for i in *.mp3; do ${GET} -s $i | ${MY_BIN[$SOX]} -t raw -r 44100 -u -c 2 - -t wav ${WAV_TMP}/`basename $i .mp3`.wav || error; done
+ for i in *.mp3; do ${MY_BIN[$SOX]} ${i} ${WAV_TMP}/`basename $i .mp3`.wav || error; done
+ else
+ for i in *.mp3; do ${GET} -w ${WAV_TMP}/`basename $i .mp3`.wav $i || error; done
+ fi
+ #for i in *.mp3; do mplayer -vo null -ao pcm:file=${WAV_TMP}/`basename $i .mp3`.wav $i || error; done
+}
+
+mpc_to_wav() {
+ need_one $MPC $MPC_2 "neither mppcdec nore mppcdec-static are available"
+ for i in *.MPC; do mv $i `basename $i .MPC`.mpc 2>/dev/null; done
+ for i in *.mpc; do mv $i `echo $i | tr ' ' '_'` 2>/dev/null; done
+ for i in *.mpc; do ${GET} $i ${WAV_TMP}/`basename $i .mpc`.wav || error; done
+}
+
+ogg_to_wav() {
+ if ! verify $OGG ; then error "oggdec unavailable"; fi
+ for i in *.OGG; do mv $i `basename $i .OGG`.ogg 2>/dev/null; done
+ for i in *.ogg; do mv $i `echo $i | tr ' ' '_'` 2>/dev/null; done
+ for i in *.ogg; do ${MY_BIN[${OGG}]} $i -o ${WAV_TMP}/`basename $i .ogg`.wav || error; done
+}
+
+
+cd_to_wav() {
+ if ! verify $CD2W ; then error "cdda2wav unavailable"; fi
+ # -P 0 : initial number of overlap sectors for jitter correction
+ # -n 75 : read 75 sectors per request
+ # -B copy each track info in a separate file
+ ${MY_BIN[$CD2W]} dev=${DEVICE} speed=${READ_SPEED} -v all cddb=0 -P 0 -n 75 -B -O wav || error "cdda2wav failure"
+}
+
+iso_from_cd() {
+ if ! verify $MKISO ; then error "mkisofs unavailable"; fi
+ mount -t iso9660 -o ro ${DEVICE} ${MOUNT} || error "unable to mount ${DEVICE} on ${MOUNT}"
+ ${MY_BIN[$MKISO]} ${ISO_OPTS} -o ${ISO_TMP} ${MOUNT} || error "mkisofs failure"
+ umount ${MOUNT}
+}
+
+iso_from_files() {
+ echo "${MY_BIN[$MKISO]} ${ISO_OPTS} -o ${ISO_TMP} $@"
+ ${MY_BIN[$MKISO]} ${ISO_OPTS} -o ${ISO_TMP} $@ || error "mkisofs failure"
+}
+
+burn_wav() {
+ if [ $DVD -eq 1 ]; then
+ need_one $REC_2 $REC_2 "dvdrecord is not available"
+ else
+ need_one $REC $REC_2 "neighter cdrecord or dvdrecord is available"
+ fi
+ while [ $NBR -gt 0 ]; do
+ need_cd
+ echo "$GET dev=${DEVICE} speed=${WRITE_SPEED} ${OVERBURN} ${BURN_WAV_OPTS} ${INFO}"
+ $GET dev=${DEVICE} speed=${WRITE_SPEED} ${OVERBURN} ${BURN_WAV_OPTS} ${INFO} || error "cdrecord failure"
+ let NBR--
+ done
+}
+
+burn_iso() {
+ if [ $DVD -eq 1 ]; then
+ need_one $REC_2 $REC_2 "dvdrecord is not available"
+ else
+ need_one $REC $REC_2 "neighter cdrecord or dvdrecord is available"
+ fi
+ while [ $NBR -gt 0 ]; do
+ need_cd
+ echo "$GET dev=${DEVICE} speed=${WRITE_SPEED} ${OVERBURN} ${BURN_ISO_OPTS} ${ISO_TMP}"
+ $GET dev=${DEVICE} speed=${WRITE_SPEED} ${OVERBURN} ${BURN_ISO_OPTS} ${ISO_TMP} || error "cdrecord failure"
+ let NBR--
+ done
+}
+
+eject() {
+ need_one $REC $REC_2 "neighter cdrecord or dvdrecord is available"
+ $GET dev=${DEVICE} -eject
+}
+
+clean() {
+ echo "cleanning" && rm -fr ${ISO_TMP} ${WAV_TMP} 2>/dev/null
+}
+
+need_cd() {
+ echo ""
+ echo "would you please insert one of those marvelous recordable compat discs and hit ENTER, thanks a lot !"
+ echo ""
+ read NOPE
+}
+
+usage (){
+ echo "usage : $BIN (3|w|m|o|a|c|f|i|I|V) [-Od:D:r:w:t:i:n:]"
+ echo " burn from :"
+ echo " 3 => mp3 files"
+ echo " w => wav files"
+ echo " m => mpc files"
+ echo " o => ogg files"
+ echo " a => audio cd"
+ echo " c => data cd"
+ echo " f => files"
+ echo " i => iso file"
+ echo " I => create iso from CD/DVD"
+ echo " V => print version and exit"
+ echo ""
+ echo " options :"
+ echo " d => burn a dvd"
+ echo " o => overburn"
+ echo " m => cdrom mounting moint - default : ${MOUNT}"
+ echo " e => cdrom device - default : ${DEVICE}"
+ echo " r => reading speed - default : ${READ_SPEED}"
+ echo " w => writing speed - default : ${WRITE_SPEED}"
+ echo " t => temporary directory - default : ${WAV_TMP}"
+ echo " i => temporary iso file - default : ${ISO_TMP}"
+ echo " n => n copies - default : 1"
+ echo " v => verify burned files - default : 0"
+ exit 1
+}
+version () {
+ echo " $BIN $VERSION"
+ echo ""
+ echo " Copyright (C) Jeremy Zurcher 2004-2007"
+ echo " This is free software; There is NO warranty; "
+ echo " not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+ exit 0
+}
+
+with_options() {
+ OPTERR=1
+ while [ 1 ]; do
+ getopts "dom:e:r:w:t:i:n:v" OPT
+ if test $? -eq 1; then break; fi
+ case $OPT in
+ d)
+ DVD=1
+ ;;
+ o)
+ OVERBURN="-overburn"
+ ;;
+ m)
+ MOUNT=$OPTARG
+ ;;
+ e)
+ DEVICE=$OPTARG
+ ;;
+ r)
+ READ_SPEED=$OPTARG
+ ;;
+ w)
+ WRITE_SPEED=$OPTARG
+ ;;
+ t)
+ WAV_TMP=$OPTARG
+ ;;
+ i)
+ ISO_TMP=$OPTARG
+ ;;
+ n)
+ NBR=$OPTARG
+ ;;
+ v)
+ VERIFY=1
+ ;;
+ *)
+ exit 1
+ ;;
+ esac
+ done
+}
+
+change_option() {
+ echo -n "new value for $1 : "
+ read RET
+}
+
+interactive() {
+ OPTIONS="mp3 mpc ogg wav files audio_cd data_cd iso ISO quit"
+ select opt in $OPTIONS; do
+ if [ "$opt" = mp3 ]; then choice="3" && break; fi
+ if [ "$opt" = mpc ]; then choice="m" && break; fi
+ if [ "$opt" = ogg ]; then choice="o" && break; fi
+ if [ "$opt" = wav ]; then choice="w" && break; fi
+ if [ "$opt" = files ]; then choice="f" && break; fi
+ if [ "$opt" = audio_cd ]; then choice="a" && break; fi
+ if [ "$opt" = data_cd ]; then choice="c" && break; fi
+ if [ "$opt" = iso ]; then choice="i" && break; fi
+ if [ "$opt" = ISO ]; then choice="I" && break; fi
+ if [ "$opt" = quit ]; then exit 0; fi
+ done
+ OPTIONS="dvd overburn mount_point device read_speed write_speed wav_tmp iso_tmp copies verify done quit"
+ while [ 1 ]; do
+ echo
+ echo -e "${RED}OPTIONS : ${RESET}"
+ echo " burnd a dvd : $DVD"
+ echo " overburn : $OVERBURN"
+ echo " mount_point : $MOUNT"
+ echo " device : $DEVICE"
+ echo " read_speed : $READ_SPEED"
+ echo " write_speed : $WRITE_SPEED"
+ echo " wav_tmp : $WAV_TMP"
+ echo " iso_tmp : $ISO_TMP"
+ echo " copies : $NBR"
+ echo " verify : $VERIFY"
+ echo
+ echo -e "${CYAN}which options do you want to change ?${RESET}"
+ select opt in $OPTIONS; do
+ if [ "$opt" = overburn ]; then
+ if [ "$OVERBURN" = " -overburn" ]; then
+ OVERBURN="";
+ else
+ OVERBURN=" -overburn";
+ fi
+ break;
+ fi
+ if [ "$opt" = dvd ]; then DVD=1 && break; fi
+ if [ "$opt" = mount_point ]; then change_option "mount_point" && MOUNT=$RET && break; fi
+ if [ "$opt" = device ]; then change_option "device" && DEVICE=$RET && break; fi
+ if [ "$opt" = read_speed ]; then change_option "read_speed" && READ_SPEED=$RET && break; fi
+ if [ "$opt" = write_speed ]; then change_option "write_speed" && WRITE_SPEED=$RET && break; fi
+ if [ "$opt" = wav_tmp ]; then change_option "wav_tmp" && WAV_TMP=$RET && break; fi
+ if [ "$opt" = iso_tmp ]; then change_option "iso_tmp" && ISO_TMP=$RET && break; fi
+ if [ "$opt" = copies ]; then change_option "copies" && NBR=$RET && break; fi
+ if [ "$opt" = verify ]; then
+ if test "$VERIFY" == "1" ; then
+ VERIFY=0
+ else
+ VERIFY=1
+ fi
+ break
+ fi
+ if [ "$opt" = done ]; then break; fi
+ if [ "$opt" = quit ]; then exit 0; fi
+ done
+ if [ "$opt" = done ]; then break; fi
+ done
+}
+
+int_handler () {
+ echo "SIGINT caught !!"
+ echo "cleaning..."
+ clean
+ exit 1
+}
+
+if [ ${UID} -ne 0 ]; then
+ if [ "$1" = "V" ]; then
+ version
+ fi
+ echo "$BIN says : you must be root" && exit 1;
+fi
+
+trap int_handler SIGINT
+
+need_one $REC $REC_2 "neighter cdrecord or dvdrecord is available"
+
+if [ "${0##*/}" = "burncdi" ]; then
+ interactive
+else
+ if [ $# -lt 1 ]; then usage; fi
+ choice=$1; shift;
+ with_options $@
+ let OPTIND-- # eat choice
+ # eat options
+ while [ $OPTIND -gt 0 ]; do
+ let OPTIND--
+ shift;
+ done
+fi
+
+case $choice in
+
+ 3)
+ #echo "burn mp3 files"
+ mktmp $WAV_TMP
+ mp3_to_wav
+ cd $WAV_TMP
+ burn_wav
+ cd ..
+ ;;
+
+ m)
+ #echo "burn mpc files"
+ mktmp $WAV_TMP
+ mpc_to_wav
+ cd $WAV_TMP
+ burn_wav
+ cd ..
+ ;;
+
+ o)
+ #echo "burn ogg files"
+ mktmp $WAV_TMP
+ ogg_to_wav
+ cd $WAV_TMP
+ burn_wav
+ cd ..
+ ;;
+
+ w)
+ #echo "burn wav files"
+ burn_wav
+ ;;
+
+ f)
+ #echo "burn data files"
+ if [ $# -lt 1 ]; then error "file missing"; fi
+ iso_from_files $@
+ burn_iso
+ # TODO VERIFY files
+ ;;
+
+ a)
+ #echo "copy audio cd"
+ mktmp $WAV_TMP
+ cd $WAV_TMP
+ cd_to_wav
+ eject
+ INFO=" -useinfo -text *.inf"
+ burn_wav
+ cd ..
+ ;;
+
+ c)
+ #echo "copy data cd"
+ iso_from_cd
+ eject
+ burn_iso
+ # TODO VERIFY files
+ ;;
+
+ i)
+ #echo "burn an iso"
+ if [ $# -lt 1 ]; then error "file missing"; fi
+ ISO_TMP=$1
+ burn_iso
+ # TODO VERIFY files
+ exit 0 # don't remove ISO file
+ ;;
+
+ I)
+ #echo "copy data cd"
+ iso_from_cd
+ eject
+ exit 0 # don't remove ISO file
+ ;;
+
+ V)
+ version
+ ;;
+
+ *)
+ usage
+ ;;
+esac
+
+clean