#!/bin/sh
# January, 2007 Nathan Fisher
# Burn a directory full of music files to cd


# Determine the path to this application.
CURDIR="`pwd`"
APPDIR=`dirname "$0"`
cd "${APPDIR}"
APPDIR="`pwd`"
cd "${CURDIR}"

PROFILE=$HOME/.config/grafburnrc
. $PROFILE
if [ "$PREVAUDIODIR" = "" ];then
 PREVAUDIODIR="/root"
fi

if [ "$CDDEV" = "" ];then
  gxmessage -center -title "Grafburn: エラー" -bg "#dcdad0" -buttons \
   "GTK_STOCK_DIALOG_ERROR" -default "GTK_STOCK_DIALOG_ERROR" \
   "デフォルトのCD書き込みデバイスが設定されていません。
   設定ダイアログを起動します。"
   exec $APPDIR/set_prefs
fi

# Check for various extra programs
if [ ! `which flac` = "" ];then
  FLAC=" flac"
else
  FLAC=""
fi
if [ ! `which mac` = "" ];then
  MAC=" mac"
else
  MAC=""
fi
# faad2 used to decode mp4 and m4a formats
# currently only support decoding, requires faac
# to encode to these formats (not neccessary anyway)
if [ ! `which faad` = "" ];then
  FAAD=" faad"
else
  FAAD=""
fi

# burn_cd_audio function
burn_cd_audio() {
	DIR=$1
	if [ "$BURNRAW" = "true" ];then
	  $MODE=-raw
	else
	  $MODE=-dao
	fi
	rxvt -fg green -bg black -geometry 80x10 -title "Grafburn: burn audio cd" \
	  -e cdrecord -pad -v dev=$BURNDEV $MODE speed=$CDSPEED $DIR/*.wav
	
}

# Burn from a .cue or .toc file
burn_toc() {
# Check for cdrdao
CDRDAO="`which cdrdao`"
if [ "$CDRDAO" = "" ];then
  gxmessage -center -title "Grafburn: cdrdaoのインストール" \
   "この機能にアクセスするためにcdrdaoをインストール
しておかなければなりません。cdrdaoは、GrafpupのGpktoolか
パピーのPETgetマネージャを使ってインストールできます。"
  exit 0
fi


export MAIN_DIALOG='
  <window title="Grafburn: キューあるいはTOCファイルの選択" icon-name="document-open">
  <vbox>
    <chooser>
      <height>500</height><width>600</width>
      <variable>CHOOSER</variable>
    </chooser>
    <hbox>
      <button help>
        <action>man grafburn &</action>
      </button>
      <button cancel>
        <action>EXIT:abort</action>
      </button>
      <button ok></button>
    </hbox>
  </vbox>
  </window>
  '

RETURN="`gtkdialog3 --program=MAIN_DIALOG`"
ABORT="`echo $RETURN | grep abort`"
[ ! "$ABORT" = "" ] && exit 0
FILE="`echo $RETURN | cut -f 2 -d '"'`" #'
[ "$FILE" = "" ] && exit 1
IS_TOC_OR_CUE="`echo $FILE | grep --extended-regexp '.cue|.toc'`"
if [ "$IS_TOC_OR_CUE" = "" ];then
  gxmessage -center -title "Grafburn: エラー!" -bg red -buttons \
   "GTK_STOCK_DIALOG_ERROR" "エラー: .cue 又は .toc ファイルではありません！"
  exit 1
else
  DIRNAME="`dirname \"$FILE\"`"
  FILENAME="`basename \"$FILE\"`"
  CURDIR="`pwd`"
  gxmessage -center -title "Grafburn: キュー又はTOCファイルを焼く" -bg black -fg \
   red -buttons "GTK_STOCK_EXECUTE:10,GTK_STOCK_CANCEL:30" \
"キュー又はTOCファイル "$FILENAME\ を使ってCDを作ろうとしています"

 $CDDRIVE と表示されているCD書き込み用ドライブに空の
CDメディアを入れて「execute」を押して下さい。"
  [ ! "$?" = "10" ] && exit 0
  cd "$DIRNAME"
  echo "executing rxvt -geometry 80x10 -fg white -bg black -e cdrdao write --device $BURNDEV  \"$FILENAME\""
  rxvt -geometry 80x10 -fg white -bg black -e cdrdao write --device $BURNDEV "$FILENAME"
  cd "$CURDIR"
fi

}


# encode tracks function
encode_tracks() {
	AUDIODIR="$1"
	cd "$AUDIODIR"
	OUTPUT=`cat $HOME/.config/grafburntmp | grep OUTPUT | cut -f 2 -d '"'`
	
	# Set up the working environment
	if [ ! -d $TMPDIR/grafburn_tmp ];then
	 mkdir $TMPDIR/grafburn_tmp
	fi
	rm -f $TMPDIR/grafburn_tmp/*
	
	# Pop up a rox window in the tempdir so the user can see what's going on
	# plus a message that will go away when the process is over
	# v-0.8 don't pop the rox window up
	# rox $TMPDIR/grafburn_tmp
	gxmessage -center -bg "#dcdad0" -title "Grafburn: オーディオのエンコード" \
	-name grafburn -buttons "GTK_STOCK_OK" -default "GTK_STOCK_OK" \
"全ファイルを一時ディレクトリにコピーして
 $OUTPUT にエンコードします。

このメッセージは全て終了すると消えます。
これでディスクイメージが作成されます。
しばらくお待ち下さい。そして先に進み
別の事ができます。" &

	
	# move all files to the tempdir
	CURDIR=`pwd`
	case $ONLYAUDIO in
		false)
		cp * "$TMPDIR/grafburn_tmp"
		;;
		true)
		cp *.mp3 "$TMPDIR/grafburn_tmp"
		cp *.ogg "$TMPDIR/grafburn_tmp"
		cp *.wav "$TMPDIR/grafburn_tmp"
		cp *.wma "$TMPDIR/grafburn_tmp"
		[ ! "$FLAC" = "" ] && cp *.flac "$TMPDIR/grafburn_tmp"
		[ ! "$MAC" = "" ] && cp *.ape "$TMPDIR/grafburn_tmp"
		[ ! "FAAD" = "" ] && cp *.mp4 "$TMPDIR/grafburn_tmp" && cp *.m4a "$TMPDIR/grafburn_tmp"
		;;
	esac
	cd "$CURDIR"
	
	# remove all filename spaces from tempdir
	spacereplace -r "$TMPDIR"
	# cd into the tempdir
	cd "$TMPDIR/grafburn_tmp"
	
	# Launch the external conversion script
	rxvt -fg white -bg black -geometry 80x10 -title "Grafburn: オーディオのエンコード" \
	 -e $APPDIR/encode_tracks $OUTPUT
	
	cd "$CURDIR"
	#rox -D $TMPDIR/grafburn_tmp
	killall gxmessage
}
# End encode_tracks function


# create_image function
create_image(){
	AUDIODIR="$1"
	WAV=`ls "$AUDIODIR" | grep .wav`
	NOTWAV=`ls "$AUDIODIR" | grep -v .wav`
	if [ ! "$WAV" = "" ];then
	  if [ "$NOTWAV" = "" ];then
	    gxmessage -center -title "Grafburn: オーディオCDの作成" -buttons \
	      "GTK_STOCK_OK" -default "GTK_STOCK_OK" -bg "#dcdad0" \
	      "全ファイルがすでにWAVフォーマットに変換された事を検出しました。
	      これから先に進み標準のオーディオCDを焼きます。
	      続けるには空のCD-Rを入れて「OK」ボタンを押して下さい。"
	    burn_cd_audio $AUDIODIR
	    exit 0
	  fi
	fi
	#Set file name and volume id
	Xdialog --icon $APPDIR/icons/big/drive-optical.png --stdout \
--no-cancel --left --title \
"Grafburn: ディスクプロパティの設定" --2inputsbox "ここでディスクにISOファイル名と \
ボリュームID\nが付けられます。" 0 0 "ファイル名" grafburn.iso \
"ボリュームID" "$VOLUME" > ~/.config/grafburntmp

#file name and volume id are stored in ~/.config/grafburntmp
#read it and then discard
	NAME=`cat ~/.config/grafburntmp | cut -f 1 -d '/'`
	VOLUME=`cat ~/.config/grafburntmp | cut -f 2 -d '/'`
	#rm -f ~/.config/grafburntmp
	#create the image
	rxvt -bg black -fg green -geometry 60x8 -title "Grafburn: ISOの作成" \
	  -e mkisofs -D -J -R -o \
	"$OUTDIR/$NAME" -V "$VOLUME" "$AUDIODIR"
	#error dialog
	#if [ ! $? -eq 0 ];then
	#  gxmessage -center -buttons "GTK_STOCK_DIALOG_ERROR" -bg red \
	#  "There was an error creating the iso file, exiting."
	#  exit 1
	#fi
	#double check, make sure the iso file is there
	if [ ! -f "$OUTDIR/$NAME" ];then
	  gxmessage -center -buttons "GTK_STOCK_DIALOG_ERROR" -bg red \
	  "ISOファイルの作成中にエラーがありました。終了します。"
	  exit 1
	fi


	#everything OK, ask whether to burn or not
	Xdialog --icon $APPDIR/icons/big/drive-optical.png --stdout --left --title \
	"Grafburn: イメージを焼きますか?" --yesno "ISOファイルが作成されました。\n先に進み \
	ディスクに\n焼きますか?" 0 0
	
	if [ $? -eq 0 ];then
	  exec $APPDIR/burn_iso $OUTDIR/$NAME
	fi
}
# End create_image function



# Start up the interface here
export MAIN_DIALOG='
	<window title="Grafburn: オーディオCDの作成" icon-name="drive-cdrom" window-position="1">
	 <vbox>
	  <frame オーディオCDの作成>
	   <hbox>
	    <text>
	     <label>cdrdaoがインストールされていれば、オーディオファイルのディレクトリからオーディオCDが作れます。またキューやTOCファイルを使ってディスクを作る事もできます。</label>
	    </text>
	   </hbox>
	  </frame>
	  <hbox>
	   <button>
	    <input file stock="gtk-file"></input>
	    <label>キュー-TOC</label>
	    <action>EXIT:toc</action>
	   </button>
	   <button>
	    <input file stock="gtk-open"></input>
	    <label>ディレクトリ</label>
	    <action>EXIT:directory</action>
	   </button>
	   <button>
	    <input file stock="gtk-cancel"></input>
	    <label>キャンセル</label>
	    <action>EXIT:abort</action>
	   </button>
	  </hbox>
	 </vbox>
	</window>'

RETURN="`gtkdialog3 --program MAIN_DIALOG`"
ABORT="`echo $RETURN | grep abort`"
[ ! "$ABORT" = "" ] && exit 0
CUE_TOC="`echo $RETURN | grep toc`"
if [ ! "$CUE_TOC" = "" ];then
  burn_toc
  exit 0
fi
DIRECTORY="`echo $RETURN | grep directory`"
if [ ! "$DIRECTORY" = "" ];then
  
  # Formats we can do
  CANDO="wav mp3 ogg wma"
  [ ! "$FLAC" = "" ] && CANDO="$CANDO flac"
  [ ! "$MAC" = "" ] && CANDO="$CANDO ape"
  [ ! "$FAAD" = "" ] && CANDO="$CANDO mp4 m4a"
  for ONEFORMAT in $CANDO
  do
    FORMATS="$FORMATS<item>$ONEFORMAT</item>"
  done
  
  export AUDIODIR_DIALOG="
  <window title=\"Grafburn: オーディオディレクトリの選択\" icon-name=\"drive-cdrom\" window_position=\"1\">
   <vbox>
    <frame Settings>
     <hbox>
      <text>
       <label>オーディオディレクトリ</label>
      </text>
      <entry accept=\"directory\">
       <default>\"$PREVAUDIODIR\"</default>
       <variable>AUDIODIR</variable>
      </entry>
      <button>
       <input file stock=\"gtk-open\"></input>
       <action type=\"fileselect\">AUDIODIR</action>
      </button>
     </hbox>
     <hbox>
      <text>
       <label>もし焼く前に全オーディオトラックをWAVフォーマットにエンコードしてあれば、作成されたディスクは普通のオーディオCDプレーヤで聞くことができます。</label>
      </text>
     </hbox>
     <hbox>
      <checkbox>
       <label>オーディオトラックを別のフォーマットにエンコードしますか?</label>
       <variable>ENCODE</variable>
       <default>true</default>
      </checkbox>
     </hbox>
     <hbox>
      <text>
       <label>変換フォーマット:</label>
      </text>
      <combobox>
       <variable>OUTPUT</variable>
       $FORMATS
      </combobox>
     </hbox>
    </frame>
    <hbox>
     <button help>
      <action>defaulttexteditor $APPDIR/help.txt &</action>
     </button>
     <button ok></button>
     <button cancel>
      <action>EXIT:abort</action>
     </button>
    </hbox>
   </vbox>
  </window>
  "
  
  gtkdialog3 --program AUDIODIR_DIALOG > $HOME/.config/grafburntmp
  . $HOME/.config/grafburntmp
  [ ! "`cat $HOME/.config/grafburntmp | grep abort`" = "" ] && exit 0
  cat $HOME/.config/grafburnrc | grep -v PREVAUDIODIR > \
   $HOME/.config/grafburntmp2
  echo "PREVAUDIODIR=\"$AUDIODIR\"" >> $HOME/.config/grafburntmp2
  mv -f $HOME/.config/grafburntmp2 $HOME/.config/grafburnrc

  if [ "$ENCODE" = "false" ];then
    create_image "$AUDIODIR"
  else
    encode_tracks "$AUDIODIR"
    create_image "$TMPDIR/grafburn_tmp"
  fi
fi
