#!/bin/bash
# =============================================================================
# MOUvie Converter                           Date: 2009-06-22    Version: 0.0.4
# -----------------------------------------------------------------------------
# @DESCRIPTION@
# -----------------------------------------------------------------------------
# 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
# =============================================================================



# PLEASE! DO NOT EDIT ANYTHING BELOW - Let me know if you have any improvements



# =============================================================================
# Configuration Options.
# -----------------------------------------------------------------------------
# configuration can be found in ~/.mou_mc_setting
# =============================================================================


# =============================================================================
# Histoy
# -----------------------------------------------------------------------------
# see file ~/.mou_includes/history_mc
# =============================================================================


# =============================================================================
# Spezial Thanks:
# -----------------------------------------------------------------------------
# - First of all to Craig Szymanski who had written the Nautilus Video Convertor
#   script and inpired me to start with mine.
# - "zenitram" for coding the great  MediaInfo program that this script uses to
#   identify the Movie parameters.             http://mediainfo.sourceforge.net
# - To all developer of MPlayer/MEncoder and FFmpeg for there great work.
#                                     MPlayer/MEncoder: http://www.mplayerhq.hu
#                                               FFMpeg:       http://ffmpeg.org
# And to all other Developer around the world...
# =============================================================================


# =============================================================================
# License:
# -----------------------------------------------------------------------------
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  
# USA
# =============================================================================


# -----------------------------------------------------------------------------
# Preset basic variables
# -----------------------------------------------------------------------------
INCLUDE_PATH="$HOME/.mou_includes/"
LAST_PROFILE_FILE="${INCLUDE_PATH}last_mc_profile"
MC_CONFIG_FILE="$HOME/.mou_mc_config"
TOTAL_FILES=$#
USE_LAST_PROFILE=''
RIPDVD=FALSE


# -----------------------------------------------------------------------------
# Include Language File
# -----------------------------------------------------------------------------
. ${INCLUDE_PATH}mou_mc_lang_en
case $LANG in
	de* )
        . ${INCLUDE_PATH}mou_mc_lang_de
esac


# -----------------------------------------------------------------------------
# Check Configuration
# -----------------------------------------------------------------------------
if [ ! -f $MC_CONFIG_FILE ] ; then
	. ${INCLUDE_PATH}mou_mc_config
	Create_Configuration_File
fi


# -----------------------------------------------------------------------------
# Includes
# -----------------------------------------------------------------------------
. $MC_CONFIG_FILE
#. ${INCLUDE_PATH}mou_mc_lang_en
. ${INCLUDE_PATH}mou_mc_settings
. ${INCLUDE_PATH}mou_mc_checks
. ${INCLUDE_PATH}mou_mc_messages
. ${INCLUDE_PATH}mou_mc_convert
. ${INCLUDE_PATH}mou_mc_dvdfunctions

# -----------------------------------------------------------------------------
# Check Basic Variables
# -----------------------------------------------------------------------------
Check_Basic_Variables
Check_Set_LogFile

# -----------------------------------------------------------------------------
# Start logfile output
# -----------------------------------------------------------------------------
if [ "$LOGFILE" = "yes" ] ; then
    LOG_HEADER
fi


# -----------------------------------------------------------------------------
# Check for required software
# -----------------------------------------------------------------------------
Check_Required_Software


# -----------------------------------------------------------------------------
# Check for file was selected - if none was selected open DVD selection
# -----------------------------------------------------------------------------
if [ $# -eq 0 ]; then
    Select_DVD_DIR
    Read_DVD_DIR
    Select_DVD_Title
    Select_Output_Folder_and_Name
    COPY_DVD_TITLE_TO_DISK

    RIPDVD=TRUE
    TOTAL_FILES=1
fi


# -----------------------------------------------------------------------------
# Check for valid video input types
# -----------------------------------------------------------------------------
OLDIFS="$IFS"
IFS='
'
if [ $RIPDVD = FALSE ] ; then
    (
	echo "# Checking Input File...\t\t\t\t\n\n\t"
	sleep 1
	p_satz=$(echo "scale=3; 1 * 100 / $TOTAL_FILES " | bc)
	c=1
    for tmp in $* ; do
        IFS="$OLDIFS"
		p_wert=$(echo "scale=0; ( $p_satz * $c ) - 1" | bc)
		p_wert2=$(echo "$p_wert" | awk -F "." '{print $1}')
		if [ "$p_wert2" = "-" ] || [ "$p_wert2" = "" ] ; then p_wert2=1 ; fi
		if [ "$p_wert2" -ge 100 ] ; then p_wert=99 ; fi
		if [ "$p_wert2" -le 0 ] ; then p_wert=1 ; fi
		echo $p_wert
		echo "# Checking Input File...\t\t\t\t($c/$TOTAL_FILES)\n\n\t$tmp"

        Check_Valid_Video_Input_Files "$tmp"
IFS='
'
		sleep 0.3
		c=`expr $c + 1`
    done
	) | zenity --progress --percentage=0 --width=360 --auto-close  --title "MOUvie Converter 0.0.4" --text=""
fi

IFS="$OLDIFS"
p_satz=""
p_wert=""
p_wert2=""


# -----------------------------------------------------------------------------
# Find last used profile
# -----------------------------------------------------------------------------
if [ -f "$LAST_PROFILE_FILE" ] ; then
    . $LAST_PROFILE_FILE
    Message_Last_Profile
    ret=$?
    if [ $ret = 1 ] ; then
        USE_LAST_PROFILE=TRUE

        # Correct some settings
        Correct_Convert_Settings
    fi
fi


# -----------------------------------------------------------------------------
# Main menu selection
# -----------------------------------------------------------------------------
if [ ! $USE_LAST_PROFILE ] ; then
    QUICK_MAIN_SELECTION=''
    MANUAL_MAIN_SELECTION=''
    Select_Main
fi

# -----------------------------------------------------------------------------
# Quick Selection Menu
# -----------------------------------------------------------------------------
if [ "$MAIN_SELECTION" = "DVDBAK" ] && [ ! $USE_LAST_PROFILE ] ; then
	    Select_DVD_DIR
	    Read_DVD_DIR
	    Select_DVD_Title
	    Select_Output_Folder_and_Name
	    COPY_DVD_TITLE_TO_DISK

    	RIPDVD=TRUE
	    TOTAL_FILES=1

	    QUICK_MAIN_SELECTION=''
	    MANUAL_MAIN_SELECTION=''
	    Select_Main_2
fi

if [ "$MAIN_SELECTION" = "QUICK" ] || [ "$MAIN_SELECTION" = "GC" ] || [ "$MAIN_SELECTION" = "DVDBAK" ] && [ ! $USE_LAST_PROFILE ] ; then

    if [ "$MAIN_SELECTION" = "GC" ] ; then
        Select_Main_Quick_Settings_GC
    else
        Select_Main_Quick_Settings
    fi

    QUICK_MAIN_SELECTION="${QUICK_MAIN_SELECTION//-/_}"

    Select_PAL_or_NTSC

    # Getting the output settings for converting
    GET_VIDEO_OUTPUT_SETTINGS $QUICK_MAIN_SELECTION $VIDEO_OUT_SYSTEM

    # Correct some settings
    Correct_Convert_Settings
fi


# -----------------------------------------------------------------------------
# Quick Selection Menu
# -----------------------------------------------------------------------------
if [ "$MAIN_SELECTION" = "MANUAL" ] && [ ! $USE_LAST_PROFILE ] ; then
    Select_Main_Manual_Settings
    MANUAL_MAIN_SELECTION="${MANUAL_MAIN_SELECTION//-/_}"
    TARGET_CD_SIZE=''

    Select_PAL_or_NTSC


    # Getting the output settings for converting
    GET_VIDEO_OUTPUT_SETTINGS $MANUAL_MAIN_SELECTION $VIDEO_OUT_SYSTEM

    # Correct some settings
    Correct_Convert_Settings

    # Display only when DVD type is selected
    if echo "$MANUAL_MAIN_SELECTION" | grep "DVD" ; then
        Select_DVD_Resolution
        Select_Video_Out_Quality
        Select_Video_Out_Max_Bitrate
        Select_Video_Out_Average_Bitrate
        Select_Video_Passes_Mode 3
        Select_Quantization_Matrix
        Select_DVD_Audio_Format
        Select_Audio_Out_Bitrate
    fi

    # Display only when VCD type is selected
    if [ "$MANUAL_MAIN_SELECTION" = "M_VCD" ] ; then
        Select_Target_CD_Size
		if [ $TARGET_CD_SIZE = FALSE ] ; then Select_Video_Out_Average_Bitrate ; fi
        Select_Video_Out_Quality
        Select_Video_Passes_Mode 3
        Select_Quantization_Matrix
        Select_Audio_Out_Bitrate
        Select_Audio_Resample
    fi

    # Display only when SVCD type is selected
    if [ "$MANUAL_MAIN_SELECTION" = "M_SVCD" ] ; then
        Select_Target_CD_Size
		if [ $TARGET_CD_SIZE = FALSE ] ; then Select_Video_Out_Average_Bitrate ; fi
        Select_Video_Out_Quality
        Select_Video_Passes_Mode 3
        Select_Quantization_Matrix
        Select_Audio_Out_Bitrate
        Select_Audio_Resample
    fi

    # Display only when MPEG4 type is selected
    if echo "$MANUAL_MAIN_SELECTION" | grep "MP4" ; then
        Select_Target_CD_Size
		if [ $TARGET_CD_SIZE = FALSE ] ; then Select_Video_Out_Average_Bitrate ; fi
        Select_DVD_Resolution
        Select_Video_Out_Quality
        Select_Video_Passes_Mode 3
        Select_Audio_Out_Bitrate
        Select_Audio_Resample
    fi

    # Display only when XVID4 type is selected
    if echo "$MANUAL_MAIN_SELECTION" | grep "XVID" ; then
        Select_Target_CD_Size
		if [ $TARGET_CD_SIZE = FALSE ] ; then Select_Video_Out_Average_Bitrate ; fi
        Select_DVD_Resolution
        Select_Video_Out_Quality
        Select_Video_Passes_Mode 2
        Select_Quantization_Matrix
        Select_Audio_Out_Bitrate
        Select_Audio_Resample
    fi

    # Display only when WMV type is selected
    if echo "$MANUAL_MAIN_SELECTION" | grep "WMV" ; then
        Select_DVD_Resolution
#        Select_Video_Out_Quality
        Select_Video_Out_Average_Bitrate
#        Select_Video_Passes_Mode 2
#        Select_Quantization_Matrix
        Select_Audio_Out_Bitrate
        Select_Audio_Resample
    fi

    # Display only when TS type is selected
    if echo "$MANUAL_MAIN_SELECTION" | grep "TS" ; then
        Select_DVD_Resolution
        Select_Video_Out_Average_Bitrate
        Select_Video_Passes_Mode 2
        Select_DVD_Audio_Format
        Select_Audio_Out_Bitrate
        Select_Audio_Resample
    fi

    #Correct_Quality_Settings
fi


# -----------------------------------------------------------------------------
# Start DVD converting
# -----------------------------------------------------------------------------
if [ $RIPDVD = TRUE ] ; then
    SAVE_FILENAME_TO=${SAVE_FILE_TO/$SAVE_PATH\//}

    if [ ! "$DVD_INFO_DISK_LABEL" ] || [ "$DVD_INFO_DISK_LABEL" = "unknown" ]; then
        file_prename=""
    else
#        file_prename="${VIDEO_OUT_TYPE}-${VIDEO_OUT_SYSTEM}_"
        file_prename="${VIDEO_OUT_TYPE}_"
    fi

    # Logfile Output
    if [ "$LOGFILE" = "yes" ] ; then
        LOG_NEW_CONVERT_START "$1" 1
    fi

    Check_Source_Video_Information "$SAVE_PATH/$CONFIG_TMP_VOB"
    Get_DVD_Title_Informations
    Check_Different_TV_Sytems
    Check_Multiple_Audio_Tracks

    case "$VIDEO_OUT_TYPE"
    in
        "DVD" | "VCD" | "SVCD" | "M_VCD" | "M_SVCD" )
            target_extension=".mpg"
            ;;
        "TS" )
            target_extension=".ts"
            ;;
        "MP4" | "XVID" )
            target_extension=".avi"
            ;;
        "WMV")
            target_extension=".wmv"
            ;;
        "PSP")
            target_extension=".psp"
            ;;
        "PS3" | "XBOX360" | "IPOD" | "IPHONE" )
            target_extension=".mp4"
            ;;
    esac

    FIN_FILE_LIST="${file_prename}${SAVE_FILENAME_TO}${target_extension}"

    case "$VIDEO_OUT_TYPE"
    in
        "VCD" | "SVCD" | "M_VCD" | "M_SVCD" | "DVD" | "MP4" | "XVID" | "WMV" | "PSP" )
            MENCODER_TO_ALL "$CONFIG_TMP_VOB" "${file_prename}${SAVE_FILENAME_TO}${target_extension}" "$SAVE_PATH" 1
            ;;
        "TS" | "PS3" | "XBOX360" | "IPOD" | "IPHONE" )
            FFMPEG_TO_ALL "$CONFIG_TMP_VOB" "${file_prename}${SAVE_FILENAME_TO}${target_extension}" "$SAVE_PATH" 1
            ;;
    esac

    # Splitt output file
    Split_Files "${file_prename}${SAVE_FILENAME_TO}${target_extension}" "${SAVE_FILENAME_TO}" "${target_extension}" "$SAVE_PATH"

    # Logfile Output
    if [ "$LOGFILE" = "yes" ] ; then
        LOG_VARIABLES
    fi

    # delete temprary vob file no. 1
    if [ -f "$SAVE_PATH/$CONFIG_TMP_VOB" ] ; then
        rm "$SAVE_PATH/$CONFIG_TMP_VOB"
    fi

    sleep 1

else
# -----------------------------------------------------------------------------
# Start converting the movie
# -----------------------------------------------------------------------------
#file_prename=`echo ${VIDEO_OUT_TYPE}_${VIDEO_OUT_SYSTEM} | tr "[:upper:]" "[:lower:]"`
#file_prename="${VIDEO_OUT_TYPE}-${VIDEO_OUT_SYSTEM}"
file_prename="${VIDEO_OUT_TYPE}"
file_counter=0
Pfad=`pwd`
FIN_FILE_LIST="<b><u>Save Path:</u></b>\n$Pfad/\n\n<b><u>File Names:</u></b>"
while [ $# -gt 0 ]; do
    file_counter=`expr $file_counter + 1`

    # Logfile Output
    if [ "$LOGFILE" = "yes" ] ; then
        LOG_NEW_CONVERT_START "$1" $file_counter
    fi

    # check the input movie data
    Check_Source_Video_Information "$1"

    # check for different tv-systems e.g. input is PAL and ouput is NTSC or convert 29.79fps to 23.796 (telecine)
    # if different set/change settings
    Check_Different_TV_Sytems
    # check for multiple Audio Tracks
    Check_Multiple_Audio_Tracks

    
    target_filename="${1//./_}"
    target_filename="${target_filename//-/_}"
    target_filename="${target_filename// /_}"
    target_filename="${target_filename//___/_}"
    target_filename="${target_filename//__/_}"
    target_filename="${file_prename}_${target_filename}"

    case "$VIDEO_OUT_TYPE"
    in
        "DVD" | "VCD" | "SVCD" | "M_VCD" | "M_SVCD" )
            target_extension=".mpg"
            ;;
        "TS" )
            target_extension=".ts"
            ;;
        "MP4" | "XVID" )
            target_extension=".avi"
            ;;
        "WMV")
            target_extension=".wmv"
            ;;
        "PSP")
            target_extension=".psp"
            ;;
        "PS3" | "XBOX360" | "IPOD" | "IPHONE" )
            target_extension=".mp4"
            ;;
    esac

    FIN_FILE_LIST="$FIN_FILE_LIST\n$file_counter : ${target_filename}${target_extension}"

    case "$VIDEO_OUT_TYPE"
    in
        "VCD" | "SVCD" | "M_VCD" | "M_SVCD" | "DVD" | "MP4" | "XVID" | "WMV" | "PSP" )
            MENCODER_TO_ALL "$1" "${target_filename}${target_extension}" "$Pfad" $file_counter
            ;;
        "TS" | "PS3" | "XBOX360" | "IPOD" | "IPHONE" )
            FFMPEG_TO_ALL "$1" "${target_filename}${target_extension}" "$Pfad" $file_counter
            ;;
    esac

    # Splitt output file
    Split_Files "${target_filename}${target_extension}" "${target_filename}" "${target_extension}" "$Pfad"

    # Logfile Output
    if [ "$LOGFILE" = "yes" ] ; then
        LOG_VARIABLES
    fi

    sleep 1
    shift
done
fi
SAVE_LAST_PROFILE
Message_WORK_DONE
exit 0

