# =============================================================================
# MOUvie Converter                           Date: 2009-06-22    Version: 0.0.4
# -----------------------------------------------------------------------------
# DVD Backup Functions
# -----------------------------------------------------------------------------
# Created by Marc Ulfig                            mail: m.ulfig@googlemail.com
#                                                  web :    http://marculfig.de
#                                                  Movie Converter home:
# Main Project Page: http://sourceforge.net/projects/mouvieconverter/
# or
# http://www.gnome-look.org/content/show.php/MOUvie+Converter?content=100060
# =============================================================================


# -----------------------------------------------------------------------------
# selects the video_ts folder
# -----------------------------------------------------------------------------
Select_DVD_DIR ()
{
    echo -e "${CONFIG_TXT_COLOR}Select_DVD_DIR ()${CONFIG_TXT_NORMAL}"
#echo "Marc: Achtung Überbrückung."
#SELECT_DVD_DIR="/media/WD Passport/filme/video_ts_2"
#return

    # be sure to select a DVD dir
    local check=FALSE
    while [ $check != TRUE ] ; do
        SELECT_DVD_DIR=`zenity --file-selection --directory --title="$Lang_PRG_Name - $Lang_Select_DVD_Title_Dir"`

        if [ ! "$SELECT_DVD_DIR" ] ; then
            Message_Info "$Lang_Error_No_User_Abort"
        fi

        DVD_DIR_FILES=`ls "$SELECT_DVD_DIR" | grep -i ".ifo" || echo "FALSE"`

        if [ "$DVD_DIR_FILES" = FALSE ] ; then
            Message_Info_No_Exit "$Lang_Error_NO_DVD_Titles_Found_Title\n\n$Lang_Error_NO_DVD_Titles_Found_Text"
        else
            check=TRUE
        fi
    done

    # Logfile Output
    if [ "$LOGFILE" = "yes" ] ; then
        echo "Select_DVD_DIR () : VIDEO_TS Folder: $SELECT_DVD_DIR" >> "$LOG_FILE"
    fi
}


# -----------------------------------------------------------------------------
# reads DVD informations
# -----------------------------------------------------------------------------
Read_DVD_DIR ()
{
    echo -e "${CONFIG_TXT_COLOR}Read_DVD_DIR ()${CONFIG_TXT_NORMAL}"

    ( zenity --progress --pulsate --auto-close --width="421" --height="122" --title="$Lang_PRG_Name - $Lang_Reading_DVD_Data" --text="<b><big>$Lang_Please_Wait</big>\n\t\t\t$Lang_Reading_DVD_Data</b>" ) &

    local DVD_INFO=`lsdvd -a "$SELECT_DVD_DIR" | tr -d " " | sed 's/Chapters/,Chapters/' | sed 's/,,/,/'`

    DVD_INFO_DISK_LABEL=`echo -e "$DVD_INFO" | grep -i "^DiscTitle:" | sed -e 's/DiscTitle://'`

    local tmp=`echo -e "$DVD_INFO" | grep -i "^Title:" | awk -F "," '{print $1}' | sed -e 's/Title://'`
    for i in $tmp ; do
        DVD_INFO_TRACK_COUNT=$i
    done
    DVD_INFO_LONGEST_TRACK=`echo -e "$DVD_INFO" | grep -i "^Longesttrack:" | sed -e 's/Longesttrack://'`
    DVD_INFO_LONGEST_TRACK=`expr $DVD_INFO_LONGEST_TRACK + 1 - 1`

    local counter=0
    for i in $DVD_INFO
    do
        local tmp_title_info=`echo "$i" | grep -i "^Title:" || echo "FALSE"`
        local tmp_audio_info=`echo "$i" | grep -i "^Audio:" || echo "FALSE"`

        if [ $tmp_title_info != FALSE ] ; then
            counter=`expr $counter + 1`
        fi

        if [ $tmp_title_info != FALSE ] || [ $tmp_audio_info != FALSE ] ; then
            if [ $tmp_title_info != FALSE ] ; then
                local tmp_audio_count=`echo "$i" | awk -F "," '{print $5}' | sed -e 's/Audiostreams://'`
                DVD_INFO_TRACK_COUNT_AUDIO[$counter]=`expr $tmp_audio_count + 1 - 1`
                local tmp_length=`echo "$i" | awk -F "," '{print $2}' | sed -e 's/Length://'`
                local tmp_h=`echo "$i" | awk -F "," '{print $2}' | sed -e 's/Length://' | awk -F ":" '{print $1}'`
                local tmp_m=`echo "$i" | awk -F "," '{print $2}' | sed -e 's/Length://' | awk -F ":" '{print $2}'`
                local tmp_s=`echo "$i" | awk -F "," '{print $2}' | sed -e 's/Length://' | awk -F ":" '{print $3}'`
                DVD_INFO_TRACK_LENGTH[$counter]="$tmp_h $tmp_m $tmp_s"
                DVD_INFO_TRACK_LENGTH_MS[$counter]=$(echo "scale=0; ( ( $tmp_h * 60 * 60 ) + ( $tmp_m * 60 ) + $tmp_s ) * 1000 " | bc)
                DVD_INFO_TRACK_LENGTH_MS[$counter]=`echo "${DVD_INFO_TRACK_LENGTH_MS[$counter]}" | awk -F "." '{print $1}'`
                DVD_INFO_TRACK_LENGTH_MIN[$counter]=$(echo "scale=0; ${DVD_INFO_TRACK_LENGTH_MS[$counter]} / 1000 / 60" | bc)
                local counter_audio=1
            fi

            if [ $tmp_audio_info != FALSE ] ; then
                local tmp_audio_lang=`echo "$i" | awk -F "," '{print $2}' | sed -e 's/Language://' | awk -F "-" '{print $2}'`
                DVD_INFO_TRACK_LANG[$counter]="${DVD_INFO_TRACK_LANG[$counter]}$tmp_audio_lang"

                local tmp_audio_ch=`echo "$i" | awk -F "," '{print $6}' | sed -e 's/Channels://'`
                DVD_INFO_TRACK_CHANNEL[$counter]="${DVD_INFO_TRACK_CHANNEL[$counter]}$tmp_audio_ch"

                local tmp_audio_ch=`echo "$i" | awk -F "," '{print $3}' | sed -e 's/Format://'`
                DVD_INFO_TRACK_ASYSTEM[$counter]="${DVD_INFO_TRACK_ASYSTEM[$counter]}$tmp_audio_ch"

                if [ $counter_audio -lt $tmp_audio_count ] ; then
                    DVD_INFO_TRACK_LANG[$counter]="${DVD_INFO_TRACK_LANG[$counter]}|"
                    DVD_INFO_TRACK_CHANNEL[$counter]="${DVD_INFO_TRACK_CHANNEL[$counter]}|"
                    DVD_INFO_TRACK_ASYSTEM[$counter]="${DVD_INFO_TRACK_ASYSTEM[$counter]}|"
                fi

                counter_audio=`expr $counter_audio + 1`
            fi
        fi
    done

    local check_zenity=`ps -ef | grep "zenity"`
    local check_zenity=`echo "$check_zenity" | grep "zenity --progress --pulsate --auto-close --width=421 --height=122"`
    local check_zenity_count=`echo "$check_zenity" | grep -c "zenity --progress --pulsate --auto-close --width=421 --height=122"`
    if [ $check_zenity_count -gt 0 ] ; then
        local pidID=`echo "$check_zenity" | awk '{print $2}'`
        kill $pidID 
    fi

    # Logfile Output
    if [ "$LOGFILE" = "yes" ] ; then
        (
        echo "Read_DVD_DIR() :"
        echo "        DVD_INFO_DISK_LABEL : $DVD_INFO_DISK_LABEL"
        echo "        DVD_INFO_TRACK_COUNT: $DVD_INFO_TRACK_COUNT"
        local counter=1
        while [ $counter -le $DVD_INFO_TRACK_COUNT ] ; do
            echo "        Track: $counter"
            echo "            DVD_INFO_TRACK_LENGTH_MS:   ${DVD_INFO_TRACK_LENGTH_MS[$counter]}"
            echo "            DVD_INFO_TRACK_LENGTH_MIN:  ${DVD_INFO_TRACK_LENGTH_MIN[$counter]}"
            echo "            DVD_INFO_TRACK_COUNT_AUDIO: ${DVD_INFO_TRACK_COUNT_AUDIO[$counter]}"
            echo "            DVD_INFO_TRACK_LANG  :      ${DVD_INFO_TRACK_LANG[$counter]}"
            echo "            DVD_INFO_TRACK_CHANNEL:     ${DVD_INFO_TRACK_CHANNEL[$counter]}"
            echo "            DVD_INFO_TRACK_ASYSTEM:     ${DVD_INFO_TRACK_ASYSTEM[$counter]}"
            counter=`expr $counter + 1`
        done
        ) >> "$LOG_FILE"
    fi
#exit
}


# -----------------------------------------------------------------------------
# Select DVD title
# -----------------------------------------------------------------------------
Select_DVD_Title ()
{
    echo -e "${CONFIG_TXT_COLOR}Select_DVD_Title ()${CONFIG_TXT_NORMAL}"

    DVD_TITLE_TO_CONVERT=$((
    local count_a=1
    while [ $count_a -le $DVD_INFO_TRACK_COUNT ] ; do
        if [ $count_a = $DVD_INFO_LONGEST_TRACK ] ; then local TRUE_FALSE="TRUE" ; else local TRUE_FALSE="FALSE" ; fi

        echo "$TRUE_FALSE"
        echo "$count_a"
        echo "${DVD_INFO_TRACK_LENGTH_MIN[$count_a]} $Lang_MIN"

        local count_audio=1
        local languages=''
        while [ $count_audio -le ${DVD_INFO_TRACK_COUNT_AUDIO[$count_a]} ] ; do

            local languages_1=`echo "${DVD_INFO_TRACK_LANG[$count_a]}" | awk -F "|" "{print $"$count_audio"}"`
            local languages_2=`echo "${DVD_INFO_TRACK_CHANNEL[$count_a]}" | awk -F "|" "{print $"$count_audio"}"`
            local languages_3=`echo "${DVD_INFO_TRACK_ASYSTEM[$count_a]}" | awk -F "|" "{print $"$count_audio"}"`

            local languages="${languages}${languages_1} (ch:${languages_2}, ${languages_3})"

            if [ $count_audio -lt ${DVD_INFO_TRACK_COUNT_AUDIO[$count_a]} ] ; then
                local languages="${languages} / "
            fi

            count_audio=`expr $count_audio + 1`
        done

        echo "${languages}"
        count_a=`expr $count_a + 1`
    done
    ) \
    | zenity --list --radiolist --width="550" --height="400" --title="$Lang_PRG_Name - $Lang_Select_DVD_Title" --text="<b>DVD Name: $DVD_INFO_DISK_LABEL\n\t</b>$Lang_Select_DVD_Text" \
    --column="" --column="$Lang_Title_Nr" --column="$Lang_PlayTime" --column="$Lang_Languages" )


    #user must select an aspect ratio
    if [ ! "$DVD_TITLE_TO_CONVERT" ]; then
        Message_Info "$Lang_Error_No_User_Abort"
    fi             

    # Logfile Output
    if [ "$LOGFILE" = "yes" ] ; then
        echo "Select_DVD_Title() : $DVD_TITLE_TO_CONVERT" >> "$LOG_FILE"
    fi
}


# -----------------------------------------------------------------------------
# Selection DVD Title informations
# -----------------------------------------------------------------------------
Get_DVD_Title_Informations ()
{
    echo -e "${CONFIG_TXT_COLOR}Get_DVD_Title_Informations ()${CONFIG_TXT_NORMAL}"

    IN_PLAYTIME="${DVD_INFO_TRACK_LENGTH_MS[$DVD_TITLE_TO_CONVERT]}"
    IN_PLAYTIME2="$DVD_INFO_TRACK_LENGTH"

    IN_TOTAL_FRAMES=$(echo "scale=0; $IN_PLAYTIME * $IN_FPS / 1000" | bc)
    IN_AUDIO_COUNT=${DVD_INFO_TRACK_COUNT_AUDIO[$DVD_TITLE_TO_CONVERT]}
    local count_audio=0
    local audio_langs=${DVD_INFO_TRACK_LANG[$DVD_TITLE_TO_CONVERT]//|/ }
    for i in ${audio_langs} ; do
        IN_AUDIO_LANGUAGE[$count_audio]="$i"
        count_audio=`expr $count_audio + 1`
    done
}


# -----------------------------------------------------------------------------
# copy dvd track to hdd first. nessessary for converting
# -----------------------------------------------------------------------------
COPY_DVD_TITLE_TO_DISK ()
{
    echo -e "${CONFIG_TXT_COLOR}COPY_DVD_TITLE_TO_DISK ()${CONFIG_TXT_NORMAL}"

    SAVE_PATH=`dirname "$SAVE_FILE_TO"`

    if [ -f "$SAVE_PATH/$CONFIG_TMP_VOB" ] ; then
        rm "$SAVE_PATH/$CONFIG_TMP_VOB"
    fi

    echo "(mplayer -forceidx dvd://$DVD_TITLE_TO_CONVERT -dvd-device \"$SELECT_DVD_DIR\" -dumpstream -dumpfile \"$SAVE_PATH/$CONFIG_TMP_VOB\")"

    echo "" > "$SAVE_PATH/$CONFIG_TMP_VOB"

    (mplayer -forceidx dvd://$DVD_TITLE_TO_CONVERT -dvd-device "$SELECT_DVD_DIR" -dumpstream -dumpfile "$SAVE_PATH/$CONFIG_TMP_VOB") &

    exec 3> >(zenity --progress --title="$Lang_PRG_Name - $Lang_MSG_Copy_File_Title" --pulsate --auto-close --width=450  --title="$Lang_PRG_Name - $Lang_Copy_Title")
    echo "# $Lang_MSG_Copy_File_Text_1\n\n\t$Lang_MSG_Copy_File_Text_2 $DVD_TITLE_TO_CONVERT ...\n\t\t$Lang_Please_Wait" >&3
    sleep 5

    local MPlayer_Running=TRUE
    while [ $MPlayer_Running != FALSE ]
    do
            sleep 1
            filesize_dest=`du "$SAVE_PATH/$CONFIG_TMP_VOB" | awk '{print $1}'`
            if [ ! $filesize_dest ] ; then
                filesize_dest=0
            fi
            local filesize_dest_MB=$(echo "scale=2; $filesize_dest / 1024" | bc)
            echo "# $Lang_MSG_Copy_File_Text_3 $DVD_TITLE_TO_CONVERT ...\t\t\t($Lang_Copied: $filesize_dest_MB MB)\n\n\t\t$Lang_Please_Wait" >&3
            #echo "Copy DVD title no. $DVD_TITLE_TO_CONVERT ...    (copied: $filesize_dest MB)"

            local check_mplayer=`ps -ef | grep "mplayer"`
            #echo "check_mplayer: $check_mplayer"
            local check_mplayer=`echo "$check_mplayer" | grep -c "mplayer -forceidx dvd://$DVD_TITLE_TO_CONVERT -dvd-device $SELECT_DVD_DIR -dumpstream -dumpfile $SAVE_PATH/$CONFIG_TMP_VOB"`
            #echo "check_mplayer: $check_mplayer"
            if [ $check_mplayer -lt 1 ] ; then
                echo "No Mplayer running!"
                MPlayer_Running=FALSE
                sleep 1
            fi
    done
    exec 3>&-

    # prüfen ob mplayer noch arbeitet, wenn ja, dann PULSE_RATE prozess balken anzeigen, wenn nein, dann weiter
    wait

    # Logfile Output
    if [ "$LOGFILE" = "yes" ] ; then
        echo "COPY_DVD_TITLE_TO_DISK() : $SAVE_PATH/$CONFIG_TMP_VOB" >> "$LOG_FILE"
    fi

#exit
}


# -----------------------------------------------------------------------------
# create temorary file to get correct Framesize and playtime
# -----------------------------------------------------------------------------
Recreate_IDX ()
{
    echo -e "${CONFIG_TXT_COLOR}Recreate_IDX ()${CONFIG_TXT_NORMAL}"

    echo "mencoder -forceidx \"$SAVE_PATH/$CONFIG_TMP_VOB\" -ovc copy -oac copy -o \"$SAVE_PATH/$CONFIG_TMP2_VOB\""

    mencoder -idx "$SAVE_PATH/$CONFIG_TMP_VOB" -ovc copy -oac copy -o "$SAVE_PATH/$CONFIG_TMP2_VOB" 2>&1  \
    | awk -vRS='\r' '$1 ~ /Pos/ {gsub(/\:/," ");gsub(/s/,"s ");gsub(/f/,"f ");gsub(/%)/,"%) ");gsub(/\(/,"");gsub(/%\)/,""); if ($4>0 && $4<100) print $4-1; fflush();}' \
    | Message_File_Prossing2
#exit
}


# -----------------------------------------------------------------------------
# copy dvd track to hdd first. nessessary for converting to TS
# -----------------------------------------------------------------------------
FFMPEG_COPY_DVD_TITLE_TO_DISK ()
{
    echo -e "${CONFIG_TXT_COLOR}FFMPEG_COPY_DVD_TITLE_TO_DISK ()${CONFIG_TXT_NORMAL}"
# "$DVD_TITLE_TO_CONVERT" "$SAVE_PATH"
    filesize_src=${VOB_FILE_SIZE[$DVD_TITLE_TO_CONVERT]}
    filesize_dest=0


    if [ -f "$SAVE_PATH/.tmp_vob_file.vob" ] ; then
        rm "$SAVE_PATH/.tmp_vob_file.vob"
    fi

    (mplayer dvd://$DVD_TITLE_TO_CONVERT -dumpstream -dumpfile "$SAVE_PATH/.tmp_vob_file.vob") &

    exec 3> >(zenity --progress --title="Sicherung" --percentage=0 --auto-close --width=450  --title="$Lang_PRG_Name - $Lang_Copy_Title")
    echo "# For converting to TS we need to copy the DVD title to HDD first\n\n\tPreparing to copy DVD title no. $DVD_TITLE_TO_CONVERT ...\n\t\tPlease Wait ..." >&3
    sleep 5

    while [ $filesize_src != $filesize_dest ]
    do
            sleep 1
            filesize_dest=`du "$SAVE_PATH/.tmp_vob_file.vob" | awk '{print $1}'`
            if [ ! $filesize_dest ] ; then
                filesize_dest=0
            fi
            echo $(($filesize_dest*100/$filesize_src)) >&3;
            local filesize_src_MB=$(echo "scale=2; $filesize_src / 1024" | bc)
            local filesize_dest_MB=$(echo "scale=2; $filesize_dest / 1024" | bc)
            echo "# Copy DVD title no. $DVD_TITLE_TO_CONVERT ...\t\t\t($filesize_dest_MB MB / $filesize_src_MB MB)\n\n" >&3
            #echo "Copy DVD title no. $DVD_TITLE_TO_CONVERT ...    ($filesize_dest / $filesize_src)"

            local check_mplayer=`ps -ef | grep "mplayer"`
            local check_mplayer=`echo "$check_mplayer" | grep -c "mplayer dvd://$DVD_TITLE_TO_CONVERT -dumpstream -dumpfile $SAVE_PATH/.tmp_vob_file.vob"`
            #echo "check_mplayer: $check_mplayer"
            if [ $check_mplayer -lt 1 ] ; then
                echo "No Mplayer running!"
                filesize_dest=$filesize_src
                sleep 1
            fi
    done

    #echo Fertig.
    exec 3>&-

#exit
}

