Newer
Older
Import / code / Scripts / ripDVD.sh
#!/bin/bash


BITRATE="1300"
TWO_PASS=
CROP=
FPS=
#MENCODER_OPTS=hqdn3d


INTERLACE_TOLERANCE=5 # if less than 5% is interlaced, than the video was likely edited after it was telecined. Perform IVTC and encode CFR.
X264_OPTIONS="keyint=120:keyint_min=1:frameref=16:bframes=16:b_pyramid:direct_pred=auto:weight_b:partitions=all:8x8dct:subq=9:chroma_me:mixed_refs:nofast_pskip:threads=0:nointerlaced"
X264_BITRATE="50%" # this can also be an integer like "2048". Measured in Kb.


FOUND_OVERVIEW=0
FOUND_DETAILS=0
FOUND_PLOT=0
FOUND_SYNOPSIS=0


function detect_identical_tracks
{
  lsdvd -x -t $TRACK "./" | sed "s/Title: $TRACK/Title: XX/" > $TRACK.info
  for OTHER in *.info
  do
    if [ "$OTHER" != "$TRACK.info" ]
    then
      if [ "`diff "$OTHER" "$TRACK.info" | wc -l`" = "0" ]
      then
	echo "Track $TRACK appears to be identical to another track"
      fi
    fi
  done
}


function abdvde_detect_crop
{
	CROP=`mplayer -dvd-device ./ dvd://$TRACK -vf cropdetect -sb 9000000 -sstep 10 -vo null -ao null -frames 100 -benchmark 2> /dev/null < /dev/null | grep "\[CROP\]" | tail -n 1`
    	CROP=`echo $CROP | cut -d '(' -f 2 | cut -d ')' -f 1 | cut -d ' ' -f 2`
    	echo "Detected crop of \"$CROP\""
	if [ `echo $CROP | grep -c "^crop="` = 1 ]
	then
	    CROP="$CROP"
	else
	    CROP=
	fi
}


function abdvde_detect_telecine
{
	mplayer -dvd-device ./ -msglevel identify=6 -frames 0 dvd://$TRACK 2>/dev/null < /dev/null > "./tmp_$TRACK.info"
	T=`grep ID_DVD_CURRENT_TITLE "./tmp_$TRACK.info" | sed -r "s/ID_DVD_CURRENT_TITLE=([0-9]+)(\\..*)?/\\1/"`
	LENGTH=`grep ID_DVD_TITLE_${T}_LENGTH "./tmp_$TRACK.info" | sed -r "s/ID_DVD_TITLE_${T}_LENGTH=([0-9]+)(\\..*)?/\\1/"`
	
	unset TELECINE_METHOD
	echo "Length: $LENGTH seconds"
	echo "Format: $FORMAT"
	echo "Detecting telecine method: "
	# format and framerate
	case "$FORMAT" in
		"NTSC")
			mplayer -dvd-device ./ dvd://${TRACK} -vo null -nosound -quiet -benchmark 2> "./mplayer_output_2" > "./mplayer_output_1"  < /dev/null
			DEMUX_MPG_COUNT=`grep "demux_mpg" "./mplayer_output_1" | wc -l`
			echo "Demux count: -$DEMUX_MPG_COUNT-"
			if [ "$DEMUX_MPG_COUNT" = "0" ]; then
				# FRAMES=$(( `printf "$LENGTH" | tr -d .` * 30000 / 1001000 ))
				FRAMES=$(( `printf "$LENGTH" | tr -d .` * 30000 / 1001 ))
				INPUT_FRAMERATE="30000/1001"
			elif [ "$DEMUX_MPG_COUNT" = "1" ]; then
				# FRAMES=$(( `printf "$LENGTH" | tr -d .` * 24000 / 1001000 ))
				FRAMES=$(( `printf "$LENGTH" | tr -d .` * 24000 / 1001 ))
				INPUT_FRAMERATE="24000/1001"
			else
				# FRAMES=$(( `printf "$LENGTH" | tr -d .` * 30000 / 1001000 ))
				FRAMES=$(( `printf "$LENGTH" | tr -d .` * 30000 / 1001 ))
				INPUT_FRAMERATE="VFR"
			fi
			;;
		"PAL")
			FRAMES=$(( `printf "$LENGTH" | tr -d .` * 25 ))
			INPUT_FRAMERATE="25"
			;;
	esac
	echo "Input framerate is $INPUT_FRAMERATE"
	#detect telecine method
	case "$INPUT_FRAMERATE" in
		"24000/1001")
			TELECINE_METHOD="24000/1001p soft telecined to 30000/1001t"
			PROGRESSIVE_PERCENTAGE=100
			printf "${TELECINE_METHOD}. Input is ${PROGRESSIVE_PERCENTAGE}%% progressive\n"
			;;
		"25")
			TELECINE_METHOD="25p telecined to 25i"
			PROGRESSIVE_PERCENTAGE="unknown"
			printf "Unknown. Assuming ${TELECINE_METHOD}\n"
			;;
		"30000/1001")
			# look for 24000/1001
			mencoder dvd://$TRACK -dvd-device ./ -fps 30000/1001 -vf pullup,softskip,decimate -ofps 24000/1001 -nosound -ovc raw -of avi -o /dev/null 2> "./temp" > /dev/null < /dev/null
			SKIPPED_FRAMES=`grep "Skipping frame" "./temp" | wc -l`
			if [ $SKIPPED_FRAMES -eq 0 ]; then
				TELECINE_METHOD="24000/1001p hard telecined to 30000/1001t"
				PROGRESSIVE_PERCENTAGE=100
				printf "${TELECINE_METHOD}. Input is ${PROGRESSIVE_PERCENTAGE}%% progressive\n"
			# if less than $INTERLACE_TOLERANCE% is interlaced, than the video was likely edited after it was telecined
			elif [ $SKIPPED_FRAMES -lt $(( $FRAMES * $INTERLACE_TOLERANCE / 100 )) ]; then
				TELECINE_METHOD="24000/1001p hard telecined to 30000/1001t"
				PROGRESSIVE_PERCENTAGE=$(( ( $FRAMES - $SKIPPED_FRAMES ) * 100 / $FRAMES ))
				printf "${TELECINE_METHOD}. Input is ${PROGRESSIVE_PERCENTAGE}%% progressive\n"
			# look for 30000/1001. $SKIPPED_FRAMES should equal $FRAMES / 5
			elif [ $(( $SKIPPED_FRAMES * 500 / $FRAMES )) -gt $(( 100 - $INTERLACE_TOLERANCE )) ]; then
				# is it 30000/1001i or 60000/1001f, hard to tell...
				TELECINE_METHOD="30000/1001p telecined to 30000/1001i"
				PROGRESSIVE_PERCENTAGE="unknown"
				printf "Unknown. Assuming ${TELECINE_METHOD}\n"
			fi
			;;
		"VFR")
			# look for 24000/1001
			mencoder dvd://$TRACK -dvd-device ./ -fps 30000/1001 -vf pullup,softskip,decimate -ofps 24000/1001 -nosound -ovc raw -of avi -o /dev/null 2> "./temp" > /dev/null < /dev/null
			SKIPPED_FRAMES=`grep "Skipping frame" "./temp" | wc -l`
			if [ $SKIPPED_FRAMES -eq 0 ]; then
				TELECINE_METHOD="24000/1001p randomly soft and hard telecined to 30000/1001t"
				PROGRESSIVE_PERCENTAGE=100
				printf "${TELECINE_METHOD}. Input is ${PROGRESSIVE_PERCENTAGE}%% progressive\n"
			# if less than $INTERLACE_TOLERANCE% is interlaced, than the video was likely edited after it was telecined
			elif [ $SKIPPED_FRAMES -lt $(( $FRAMES * $INTERLACE_TOLERANCE / 100 )) ]; then
				TELECINE_METHOD="24000/1001p randomly soft and hard telecined to 30000/1001t"
				PROGRESSIVE_PERCENTAGE=$(( ( $FRAMES - $SKIPPED_FRAMES ) * 100 / $FRAMES ))
				printf "${TELECINE_METHOD}. Input is ${PROGRESSIVE_PERCENTAGE}%% progressive\n"
			fi
			;;
	esac
	if [ "$TELECINE_METHOD" = "" ]; then
		TELECINE_METHOD="unknown"
		PROGRESSIVE_PERCENTAGE=$(( ( $FRAMES - $SKIPPED_FRAMES ) * 100 / $FRAMES ))
		printf "Unknown. Assuming VFR. ${PROGRESSIVE_PERCENTAGE}%% is progressive material\n"
	fi
	# inverse telecine
	case "$TELECINE_METHOD" in
		"24000/1001p soft telecined to 30000/1001t")
			# 300.1
			# ALPHA_DOG.1
			# AUSTIN_POWERS_2.1
			# BALLISTIC_ECKS_VS_SEVER.1
			# BIGMAMA.1
			# BIG_BULLY.1
			# BLACKSHEEP.1
			# BODY_OF_LIES.1
			# BRAVHART.1
			# CAPN_CORELLIS_MANDOLIN.1
			# CONSTANTINE_DISC_1.1
			# TIM_BURTONS_CORPSE_BRIDE.1
			INPUT_FRAMERATE=""
			MENCODER_FILTERS=""
			OUTPUT_FRAMERATE="24000/1001"
			;;
		"24000/1001p hard telecined to 30000/1001t")
			INPUT_FRAMERATE=""
			MENCODER_FILTERS="filmdint=io=5:4:fast=0,softskip"
			OUTPUT_FRAMERATE="24000/1001"
			;;
		"24000/1001p randomly soft and hard telecined to 30000/1001t")
			# ALIEN_VS_PREDATOR.1
			# AUSTIN_WS.1
			# A_BEAUTIFUL_MIND.1
			# BOOGEYMAN.1
			# CABIN_FEVER.1
			# CHEAPER_BY_THE_DOZEN.1
			# CHILDREN_OF_MEN.1
			# CHRISTMAS_WITH_THE_KRANKS.1
			# FARSCAPE_S2_V1D1.5
			# FARSCAPE_S2_V1D1.10
			# GOLDMEMBER.2
			# TEENAGE_DRAMA_QUEEN.1
			INPUT_FRAMERATE=""
			MENCODER_FILTERS="filmdint=io=5:4:fast=0,softskip"
			OUTPUT_FRAMERATE="24000/1001"
			;;
		"25p telecined to 25i")
			# RICHMAN_POORMAN_DISC1.3
			# RICHMAN_POORMAN_DISC1.4
			INPUT_FRAMERATE=""
			#MENCODER_FILTERS="pullup,softskip" # this works much better
			#MENCODER_FILTERS="tfields"
			#OUTPUT_FRAMERATE="50"
			MENCODER_FILTERS="phase,softskip" # this works best, PAL guys have it easy!
			OUTPUT_FRAMERATE="25"
			;;
		"30000/1001p telecined to 30000/1001i")
			INPUT_FRAMERATE=""
			MENCODER_FILTERS="filmdint=io=1:1:fast=0,softskip"
			OUTPUT_FRAMERATE="30000/1001"
			;;
		"60000/1001f") # not currently used
			echo "If you see this, it is not expected"
			INPUT_FRAMERATE=""
			MENCODER_FILTERS=""
			OUTPUT_FRAMERATE=""
			;;
		*)
			INPUT_FRAMERATE=""
			MENCODER_FILTERS="filmdint=io=1:4:=fast=0,softskip"
			OUTPUT_FRAMERATE="120000/1001"
			;;
	esac
}


function abdvde_encode_video
{
	MENCODER_FILTERS=""
	abdvde_detect_telecine
#	if [ "25p telecined to 25i" != "$TELECINE_METHOD" ]
#	then
	abdvde_detect_crop
#	fi

	# crop
	if [ "$MENCODER_FILTERS" = "" ]; then
		MENCODER_FILTERS="${CROP}"
	else
		if [ "$CROP" != "" ]; then
			MENCODER_FILTERS="${MENCODER_FILTERS},${CROP}"
		fi
	fi
	# scale
	if [ "$MENCODER_FILTERS" = "" ]; then
		MENCODER_FILTERS="hqdn3d=2:1:2,scale=-9:-9,harddup"
	else
		MENCODER_FILTERS="${MENCODER_FILTERS},hqdn3d=2:1:2,scale=-9:-9,harddup"
	fi

        echo "Transcoding \"$DISC\" title $TRACK to \"$TARGET\""
	if [ "$INPUT_FRAMERATE" != "" ]; then
		echo "Didnt expect INPUT_FRAMERATE still set: $INPUT_FRAMERATE"
	fi
        /usr/bin/time \
        mencoder -dvd-device ./ dvd://$TRACK -quiet -vf ${MENCODER_FILTERS} -nosound -ovc x264 \
	    -x264encopts crf=22:qcomp=0.7:subq=5:8x8dct:frameref=3:bframes=2:b_pyramid:weight_b:threads=auto:chroma_me:mixed_refs:nointerlaced \
	    -ofps $OUTPUT_FRAMERATE -sws 9 -mc 0 \
	    -of rawvideo -o "$TARGET" < /dev/null
# 2>&1 | grep "user.*system.*elapsed" | sed "s/.*system\(.*elapsed\).*/\1/"

# h264 Options:
#   crf=22:qcomp=0.7:subq=6:8x8dct:frameref=4:bframes=4:b_pyramid:weight_b:threads=auto:chroma_me:mixed_refs:nofast_pskip:nointerlaced

	echo "Finished transcoding \"$DISC\" title $TRACK to \"$TARGET\""
}


function lookup_title
{
	wget "http://www.imdb.com/find?s=all&q=$1" -O - 2> /dev/null > tmp.p
	if [ x`grep -c "<title>IMDb Search</title>" tmp.p` = x1 ]
	then
	    grep "Titles.*<a href=\"/title/" tmp.p | perl -pe 's|(.*?<a href=\"/title/)||' | cut -d '/' -f 1 > tmp.1
	    while read IMDB_TITLE
	    do
		echo "$IMDB_TITLE"
		break 1
	    done < tmp.1
	else
	    grep "\<link rel=\"canonical\" href=\"http://www\.imdb\.com/title/" tmp.p | sed "s/.*\"http:\/\/www\.imdb\.com\/title\/\([a-z0-9]*\)\/.*/\1/"
	fi
}


function get_basic_details
{
	echo "<html><head><title>$1 (IMDB)</title>"
	echo "<link href=\"../style.css\" rel=\"stylesheet\" type=\"text/css\" />"
#	echo "<style>"
#	echo "body { font: 13px Gill Sans, sans-serif; } .info { margin-left: 10em; margin-bottom: 1em; } hr { border: 1px #999; height: 1px; border-style: dotted none none none; clear: none; margin-left: 0px; } .info h5 { margin-top: 0; position: absolute; margin-left: -10em; } .headerinline { margin-top: 0px; margin-bottom: 6px; }"
#	echo "td { font: 12px Arial; } #Cast .info { margin-left: 3em; font: 10px Arial; } .cast * { font: 10px Arial; } .odd * { background-color: #efefff; } table.cast { border-collapse: collapse; } table.cast td { height: 36px; border-top: 1px dotted #999; border-bottom: 1px dotted #999; vertical-align: middle; padding-left: 0.5em; padding-right: 0.5em; } table tr.odd { background: #fafafa; } table tr.even { background: #f0f1f7; }"
#	echo "#Cast { float: right; width: 295px; top: 0; } #Overview { float: left; width: 295px; }"
#	echo ".break { clear: both; padding-top: 1px; }"
#	echo "h1, h5 { color: darkorange; }"
#	echo "#Photo, #Fun, #Cast, #Details, #Plot, #Synopsis, #Overview { background: #f8f8f8; margin: 6px; padding: 4px; }"
#	echo "body table { background: #e0e8f0; }"
#	echo "h3 { color: darkblue; }"
#	echo "#Title h1 { font: 25px Gill Sans, sans-serif; color: #ffffff; padding-left: 12px; padding-top: 9px; margin: 0px; }"
#	echo "#Photo { float: right; width: 295px; }"
#	echo "#Photo img {  margin-left: 24px; margin-bottom: 10px; width: 250px; }"
#	echo "#Overview { float: left; width: 295px; }"
#	echo "#Cast { float: right; width: 295px; }"
#	echo "#Details { float: left; width: 295px; }"
#	echo "</style>"
	echo "</head><body>"
	echo "<center><table><tr><td width=630>"
	echo "<div id=\"Title\"><h1>$1</h1></div>"
	echo "<hr/>"
	echo "<!-- looking up overview for \"$1\" which is \"$2\" in IMDB -->"

	wget "http://www.imdb.com/title/$2/" -O - 2> /dev/null > tmp.2
	while read LINE
	do
		PHOTO=`echo "$LINE" | grep -c "<div class=\"photo\">"`
		BEGIN1=`echo "$LINE" | grep -c "<h5>Director"`
		END1=`echo "$LINE" | grep -c "<h3>Cast</h3>"`
		BEGIN2=`echo "$LINE" | grep -c "<h3>Additional Details</h3>"`
		END2=`echo "$LINE" | grep -c "<h3>FAQ</h3>"`

		if [ x"$PHOTO" = x"1" ]
		then
			read LINE
			IMG=`echo "$LINE" | sed "s/.*src\=\"\(http:\/\/ia.media-imdb.com\/.*@@\).*/\1/"`
			wget "$IMG" -O "$1 - Title Cover.jpg" > /dev/null 2>&1
			echo "<div id=\"Photo\"><h3>Photo</h3><img src=\"$1 - Title Cover.jpg\" width=250></div>"
		fi

		if [ x"$FOUND_OVERVIEW" = x"1" ]
		then
			if [ x"$END1" = x"1" ]
			then
				echo "</div>"
				echo "<div id=\"Cast\">"
				echo "$LINE" | sed "s/\(.*\)<div><form.*<\/form><\/div>\(.*\)/\1\2/"
				echo "</div>"
				echo "<!-- Got to end of overview data -->"
				echo "<div id=\"Details\">"
				FOUND_OVERVIEW=2
			else
				if [ "$LINE" != "<hr/>" ]
				then
					echo "$LINE"
				fi
			fi
		fi
		if [ x"$BEGIN1" = x"1" ]
		then
			echo "<div id=\"Overview\">"
			echo "<h3>Overview</h3>"
			echo "<div class=\"info\">"
			echo "$LINE"
			FOUND_OVERVIEW=1
		fi

		if [ x"$FOUND_DETAILS" = x"1" ]
		then
			if [ x"$END2" = x"1" ]
			then
				echo "</div>"
				echo "<!-- Got to end of details data -->"
				echo "<div class=\"break\"><hr/></div>"
				FOUND_DETAILS=2
				break 
			else
				if [ "$LINE" = "<h3>Fun Stuff</h3>" ]
				then
					echo "</div><div class=\"break\"><hr/></div><div id=\"Fun\">"
				fi
				if [ "$LINE" != "<hr/>" ]
				then
					echo "$LINE"
				fi
			fi
		fi
		if [ x"$BEGIN2" = x"1" ]
		then
			echo "$LINE"
			FOUND_DETAILS=1
		fi
	done < tmp.2
}


function get_more_details
{
	echo "<!-- looking up plot for \"$1\" which is \"$2\" in IMDB -->"
	echo "<div id=\"Plot\">"
	echo "<h3>Plot</h3>"
	echo "<div class=\"info\">"
	wget "http://www.imdb.com/title/$2/plotsummary" -O - 2> /dev/null > tmp.2
	while read LINE
	do
		BEGIN=`echo "$LINE" | grep -c "<p class=\"plotpar\">"`
		END=`echo "$LINE" | grep -c "<div class=\"info\">"`
		if [ x"$FOUND_PLOT" = x"1" ]
		then
			if [ x"$END" = x"1" ]
			then
				echo "<!-- Got to end of plot data -->"
				break 1
			else
				if [ "$LINE" != "<hr/>" ]
				then
					echo "$LINE"
				fi
			fi
		fi
		if [ x"$BEGIN" = x"1" ]
		then
			FOUND_PLOT=1
		fi
	done < tmp.2
	echo "</div>"
	echo "</div>"

	echo "<!-- looking up synopsis for \"$1\" which is \"$2\" in IMDB -->"
	echo "<div class=\"break\"><hr/></div>"
	echo "<div id=\"Synopsis\">"
	echo "<h3>Synopsis</h3>"
	echo "<div class=\"info\">"
	wget "http://www.imdb.com/title/$2/synopsis" -O - 2> /dev/null > tmp.2
	while read LINE
	do
		BEGIN=`echo "$LINE" | grep -c "<div id=\"swiki\.2\.1\">"`
		END=`echo "$LINE" | grep -c "</div>"`
		if [ x"$FOUND_SYNOPSIS" = x"1" ]
		then
			if [ x"$END" = x"1" ]
			then
				echo "<!-- Got to end of synopsis data -->"
				break 1
			else
				echo "$LINE"
			fi
		fi
		if [ x"$BEGIN" = x"1" ]
		then
			FOUND_SYNOPSIS=1
		fi
	done < tmp.2
	echo "</div>"
	echo "</div>"
}



function lookupIMDB
{
    DISC_LNK="$DISC - Title Info.desktop"
    IMDB_TITLE=Unknown
    if [ ! -f "$DISC_LNK" ]
    then
        IMDB_TITLE=`lookup_title "$1"`
        echo "[Desktop Entry]" > "$DISC_LNK"
        echo "Encoding=UTF-8" >> "$DISC_LNK"
        echo "Name=$1 - Title Info" >> "$DISC_LNK"
        echo "Type=Link" >> "$DISC_LNK"
        echo "URL=http://www.imdb.com/title/$IMDB_TITLE/" >> "$DISC_LNK"
        echo "Icon=gnome-fs-bookmark" >> "$DISC_LNK"
    else
	IMDB_TITLE=`grep "URL=" "$DISC_LNK" | sed "s/URL=http:\/\/www\.imdb\.com\/title\/\(.*\)\//\1/"`
    fi
    get_basic_details "$1" "$IMDB_TITLE" | sed "s/href=\"\//href=\"http:\/\/www.imdb.com\//g"
    get_more_details "$1" "$IMDB_TITLE" | sed "s/href=\"\//href=\"http:\/\/www.imdb.com\//g"
    echo "</td></tr></table></center>"
    echo "</body></html>"
    rm tmp.1 tmp.2 2> /dev/null > /dev/null
}



# Crop detection
function crop_detection
{
  if [ -f "$VIDEO" ]
  then
    V_SIZE=`ls -s --block-size=1 "$VIDEO" | cut -d ' ' -f 1`
    if [ $V_SIZE -gt "500000000" ]	# Video over 500 MB we take more care with
    then
	TWO_PASS=0 # 1
	CROP=`mplayer "$VIDEO" -vf cropdetect -sb 10000000 -sstep 60 -vo null -ao null 2>&1 < /dev/null | grep "[CROP]" | tail -n 1`
        # output:
   	#    [CROP] Crop area: X: 0..719  Y: 56..422  (-vf crop=720:352:0:64).0
    	CROP=`echo $CROP | cut -d '(' -f 2 | cut -d ')' -f 1 | cut -d ' ' -f 2`
    	echo "Detected crop of \"$CROP\""
	if [ `echo $CROP | grep -c "^crop="` = 1 ]
	then
	    CROP="$CROP"
	else
	    CROP=
	fi
    else
	TWO_PASS=0
	CROP=
    fi
  else
    echo "transcode.sh error: \"$VIDEO\" does not exist"
    exit
  fi
}


# Transcode
function encode_video
{
  crop_detection
  echo "Transcoding \"$VIDEO\" to \"$TARGET\""
  if [ "$TWO_PASS" == "1" ]
  then
    #mencoder -really-quiet "$VIDEO" -vf pullup,softskip,${CROP},harddup -nosound -ovc x264 \
    /usr/bin/time \
    mencoder -really-quiet "$VIDEO" -vf kerndeint,${CROP},scale -nosound -ovc x264 \
	-x264encopts bitrate=${BITRATE}:qcomp=0.7:subq=1:frameref=1:bframes=3:b_pyramid:weight_b:turbo=1:threads=auto:pass=1 \
	-of rawvideo -o /dev/null < /dev/null 2>&1 | grep "user.*system.*elapsed" | sed "s/.*system\(.*elapsed\).*/\1/"
    echo "Finished pass one"
    #mencoder -really-quiet "$VIDEO" -vf pullup,softski,p${CROP},harddup -nosound -ovc x264 \
    /usr/bin/time \
    mencoder -really-quiet "$VIDEO" -vf kerndeint,${CROP},scale -nosound -ovc x264 \
	-x264encopts bitrate=${BITRATE}:qcomp=0.7:subq=5:8x8dct:frameref=3:bframes=3:b_pyramid:weight_b:threads=auto:pass=2 \
	-of rawvideo -o "$TARGET" < /dev/null 2>&1 | grep "user.*system.*elapsed" | sed "s/.*system\(.*elapsed\).*/\1/"
  else
    #mencoder -really-quiet "$VIDEO" -vf pullup,softskip,harddup -nosound -ovc x264 \
    #/usr/bin/time \
# yadif=0
    #mencoder -really-quiet "$VIDEO" -vf kerndeint,scale -nosound -ovc x264 \
#	-x264encopts bitrate=${BITRATE}:qcomp=0.7:subq=5:8x8dct:frameref=3:bframes=3:b_pyramid:weight_b:threads=auto \
#	-of rawvideo -o "$TARGET" < /dev/null 2>&1 | grep "user.*system.*elapsed" | sed "s/.*system\(.*elapsed\).*/\1/"
    /usr/bin/time \
    mencoder -quiet "$VIDEO" -vf pullup,softskip,${CROP},harddup -nosound -ovc x264 \
	-x264encopts crf=24:qcomp=0.7:subq=5:8x8dct:frameref=3:bframes=3:b_pyramid:weight_b:threads=auto \
	-of rawvideo -o "$TARGET" < /dev/null
# 2>&1 | grep "user.*system.*elapsed" | sed "s/.*system\(.*elapsed\).*/\1/"
  fi
  if [ -f "$TARGET" ]
  then
    V_SIZE=`ls -s --block-size=1 "$TARGET" | cut -d ' ' -f 1`
    if [ $V_SIZE != "0" ]
    then
      rm -rf "$VIDEO"
    fi
  fi
  echo "Finished transcoding \"$VIDEO\" to \"$TARGET\""
}


function input_fps
{
  FPS=`mplayer "$VIDEO" -vo null -ao null -frames 1 < /dev/null 2>&1 | grep "VIDEO:" | cut -d ' ' -f 10`
  #  echo "Input video FPS is -$FPS-"
}


function lookup_mkv_lang_code
{
    mkvmerge --list-languages | while read line ; do if [ `echo $line | cut -d '|' -f 3 | grep -c " $1"` = '1' ] ; then echo $line ; fi ; done | cut -d '|' -f 2 | tr -d ' '  | head -n 1
}


function lookup_mkv_lang_name
{
   mkvmerge --list-languages | while read line
   do
     if [ `echo $line | cut -d '|' -f 1 | tr -d ' '` = "$1" ]
     then
       echo $line | cut -d '|' -f 2 | tr -d ' '
     fi
   done
}


if [ "$1" = "--setup" ]
then
    wget http://download.videolan.org/pub/libdvdcss/1.2.9/deb/libdvdcss2_1.2.9-1_i386.deb
    sudo dpkg --install libdvdcss2_1.2.9-1_i386.deb
    rm libdvdcss2_1.2.9-1_i386.deb
    sudo apt-get install mplayer transcode subtitleripper ffmpeg mencoder mkvtoolnix gpac ogmtools acidrip
    wget http://www.robelix.com/sub2srt/download/sub2srt-0.5.3.tar.gz
    tar zxf sub2srt-0.5.3.tar.gz
    rm -rf sub2srt-0.5.3.tar.gz
    mv sub2srt-0.5.3/sub2srt ./
    rm -rf sub2srt-0.5.3
fi


# Download subtitles
function download_subtitles
{
    echo "Downloading Subtitles for $DISC"
    mkdir -p OnlineSubtitles
    cd OnlineSubtitles
    wget "http://divxtitles.com/$DISC/English/any/1" -O - 2> /dev/null | grep "window.location='http://divxtitles\.com" | sed s/.*window\.location.*divxtitles\.com\.subtitles\.//g | cut -d '/' -f 1 > tmp.1
    while read SUB_ID
    do
        wget --post-data subtitle_id=$SUB_ID http://divxtitles.com/download_subtitle.php -O "$DISC - $SUB_ID.zip" 2> /dev/null
        unzip "$DISC - $SUB_ID.zip" < /dev/null > /dev/null 2> /dev/null
        for SUB in *.sub
        do
	    if [ -f "$SUB" ]
	    then
                rm "$SUB.srt" 2> /dev/null > /dev/null
                sub2srt "$SUB" "$SUB.srt" < /dev/null 2> /dev/null > /dev/null
                rm "$SUB"
	    fi
        done
        rm -rf "$DISC - $SUB_ID.zip" 2> /dev/null > /dev/null
    done < tmp.1
    rm tmp.1
    # Remove duplicates
    for SUB1 in *.srt
    do
        for SUB2 in *.srt
        do
	    if [ "$SUB1" != "$SUB2" ]
	    then
		if [ -f "$SUB1" -a -f "$SUB2" ]
		then
		if [ "`diff -q "$SUB1" "$SUB2"`" = "" ]
		then
		    rm -rf "$SUB2" 2> /dev/null > /dev/null
		fi
		fi
	    fi
	done
    done
    cd - > /dev/null
}


DISC=`basename "$1"`
cd "$1"
if [ ! -d "OnlineSubtitles" ]
then
    download_subtitles
fi
DISC_HTML="$DISC - Title Info.html"
if [ ! -f "$DISC_HTML" ]
then
    lookupIMDB "$DISC" > "$DISC_HTML"
fi


if [ -d "./VIDEO_TS" -o -d "./video_ts" ]
then
    echo "Getting disc info for $DISC"
    lsdvd ./ -x -Oh 2> /dev/null | sed "s/Pan&Scan/Pan\&amp;Scan/g" > "$DISC - Title Info.ifo"
    lsdvd ./ -x -Ox 2> /dev/null | sed "s/Pan&Scan/Pan\&amp;Scan/g" > "$DISC - Title Info.xml"

    lsdvd ./ 2> /dev/null | grep "^Title:" > tmp.1
    while read TITLE
    do
        TRACK=`echo "$TITLE" | cut -d ' ' -f 2 | cut -d ',' -f 1`
	OUTPUT_FILE="$DISC - Title $TRACK.mkv"

	DUPLICATE=`detect_identical_tracks`
	if [ "$DUPLICATE" != "" ]
	then
	    echo "$DUPLICATE"
	    touch "$OUTPUT_FILE"
	fi

if [ ! -f "$OUTPUT_FILE" ]
then
	VIDEO_INFO=`lsdvd ./ -t $TRACK -x 2> /dev/null | grep VTS`
	VTS=`echo $VIDEO_INFO | cut -d ' ' -f 2 | cut -d ',' -f 1`
	FORMAT=`echo $VIDEO_INFO | sed "s/.*Format: \([A-Z]*\).*/\1/"`
	INPUT_FILES=


#	if [ "$TRACK" != "08" ]
#	then
#		echo "Skip track $TRACK"
#		continue
#	fi
#	if [ "$TRACK" = "02" ]
#	then
#		exit
#		continue
#	fi


	MERGE_CMD_LINE=" --chapters \"$DISC - Title $TRACK - Chapters.txt\""
	INPUT_FILES="\"$DISC - Title $TRACK - Chapters.txt\""
        if [ ! -f "$DISC - Title $TRACK - Chapters.txt" ]
	then
            dvdxchap ./ -t $TRACK 2> /dev/null > "$DISC - Title $TRACK - Chapters.txt"
	fi


	# Video Track
	VIDEO="./$DISC - Title $TRACK - Video.mpeg2"
	TARGET="./$DISC - Title $TRACK - Video.h264"
	INPUT_FILES="${INPUT_FILES} \"$TARGET\" \"$VIDEO\""
	if [ ! -f "$TARGET" ]
	then
#	    if [ ! -f "$VIDEO" ]
#  	    then
#	        echo "Ripping video track $TRACK (vts: $VTS) of $DISC"
#	        #mplayer -dvd-device ./ dvd://$TRACK -dumpvideo -dumpfile "./$DISC - Title $TRACK - Video.mpeg2" < /dev/null
#	        tccat -i ./ -T $TRACK -L 2> /dev/null | tcextract -x mpeg2 -t vob > "$VIDEO"
#	    fi
	    # Transcode
	    #encode_video
	    abdvde_encode_video
	    rm -rf divx2pass.log 2> /dev/null > /dev/null
	    # echo "Results: TWO_PASS=$TWO_PASS, CROP=$CROP, FPS=$FPS"
	else
	    # work out again the output FPS
	    abdvde_detect_telecine
	fi
	V_TRACK_COUNT=0
	V_SIZE=`ls -s --block-size=1 "$TARGET" | cut -d ' ' -f 1`
	if [ "$V_SIZE" != "0" ]
	then
  	    #FPS=`mplayer -dvd-device ./ dvd://$TRACK -vo null -ao null -frames 1 < /dev/null 2>&1 | grep "VIDEO:" | cut -d ' ' -f 10`
  	    # FPS=`echo "2 * $FPS" | bc`
	    # MERGE_CMD_LINE="${MERGE_CMD_LINE} --default-duration 0:${FPS}fps --track-name 0:'Track 1' --language 0:eng \"$TARGET\""
	    MERGE_CMD_LINE="${MERGE_CMD_LINE} --default-duration 0:${OUTPUT_FRAMERATE}fps --track-name 0:'Track 1' --language 0:eng \"$TARGET\""
	    V_TRACK_COUNT=1
	fi


	# Audio Tracks
	A_TRACK_COUNT=0
	lsdvd ./ -t $TRACK -a 2> /dev/null | grep "^	Audio:" > tmp.2
	while read AUDIO
    	do
		A_TRACK=`echo "$AUDIO" | cut -d ' ' -f 2 | cut -d ',' -f 1`

		# Use mplayer to detect instead
		A_ID=`mplayer -dvd-device ./ dvd://$TRACK -frames 0 2>&1 | grep "audio stream: $A_TRACK_COUNT" | sed "s/.*aid: \([0-9]*\)\./\1/"`

		#echo "A_ID = -$A_ID-"
		if [ x"$A_ID" = x"" ]
		then
		    # Seems like lsdvd gets the track ids wrong
		    # However fallback to lsdvd if mplayer doesn't know about this audio track
		    echo "Using lsdvd to find A_ID"
		    HEX_A_ID=`echo "$AUDIO" | cut -d ' ' -f 21 | cut -d ',' -f 1 | sed "s/0x\([0-9|a-f]*\)/\1/"`
		    # Convert hex to decimal
		    D1=`echo $HEX_A_ID | cut -b 1`
		    D1=$((`echo $D1 | grep -c "[a-f]"` * 10 + `echo $D1 | tr "0123456789abcdef" "0123456789012345"`))
		    D2=`echo $HEX_A_ID | cut -b 2`
		    D2=$((`echo $D2 | grep -c "[a-f]"` * 10 + `echo $D2 | tr "0123456789abcdef" "0123456789012345"`))
		    A_ID=$(($D1 * 16 + $D2))
		fi
		#echo "A_ID = -$A_ID-"

		A_LANG=`echo "$AUDIO" | cut -d ' ' -f 4,5,6`
		A_LANG_CODE=`echo "$A_LANG" | cut -d ' ' -f 1`
		A_LANG_NAME=`echo "$A_LANG" | cut -d ' ' -f 3 | cut -d ',' -f 1`
		A_FILE="./$DISC - Title $TRACK - $A_LANG_NAME Audio ($A_ID).ac3"
	    	INPUT_FILES="${INPUT_FILES} \"$A_FILE\""
		if [ ! -f "$A_FILE" ]
		then
		    echo "Ripping audio track $A_TRACK ($A_ID $A_LANG_NAME) from track $TRACK of $DISC"
		    #mplayer -dvd-device ./ dvd://$TRACK -aid $A_ID -dumpaudio -dumpfile "$A_FILE"
		    tccat -i ./ -T $TRACK -L 2> /dev/null | tcextract -x ac3 -t vob -a `expr $A_ID - 128` > "$A_FILE"
		fi
		A_SIZE=`ls -s --block-size=1 "$A_FILE" | cut -d ' ' -f 1`
		if [ "$A_SIZE" != "0" ]
		then
		    MERGE_CMD_LINE="${MERGE_CMD_LINE} --track-name 0:\"Track $A_TRACK\""
  		    MKV_LANG_CODE=`lookup_mkv_lang_code $A_LANG_CODE`
		    echo "Got --$MKV_LANG_CODE-- for --$A_LANG_CODE--"
		    if [ "$MKV_LANG_CODE" = "" -o "$A_LANG_CODE" = "xx" ]
		    then
		        MKV_LANG_CODE=`lookup_mkv_lang_name $S_LANG_NAME | head -n 1`
		        echo "Got --$MKV_LANG_CODE-- for --$A_LANG_NAME--"
		    fi
		    if [ "$MKV_LANG_CODE" != "" ]
		    then
		        MERGE_CMD_LINE="${MERGE_CMD_LINE} --language 0:$MKV_LANG_CODE"
		    fi
		    MERGE_CMD_LINE="${MERGE_CMD_LINE} \"$A_FILE\""
		    A_TRACK_COUNT=`expr $A_TRACK_COUNT + 1`
		fi
        done < tmp.2


	# Soundtrack test
	SOUNDTRACK=0
	if [ "$A_TRACK_COUNT" = "1" ]
	then
	    if [ -f "./$DISC - Title $TRACK - Unknown Audio (0x80).ac3" ]
	    then
		A_SIZE=`ls -s --block-size=1 "./$DISC - Title $TRACK - Unknown Audio (0x80).ac3" | cut -d ' ' -f 1`
		if [ -f "./$DISC - Title $TRACK - Video.mpeg2" ]
		then
			V_SIZE=`ls -s --block-size=1 "$TARGET" | cut -d ' ' -f 1`
			if [ $A_SIZE -gt $V_SIZE ]
			then
				echo "Appears that track $TRACK of $DISC is a soundtrack"
				SOUNDTRACK=1
			fi
		fi
	    fi
#	else
#	    echo "atracks -$A_TRACK_COUNT-"
	fi


	# Subtitles
	S_TRACK_COUNT=0
	S_TRACK_CMD_LINE=
	if [ ! -f "./$DISC - Title $TRACK - Subtitles.ifo" ]
	then
	if [ ! -f "./$DISC - Title $TRACK - Subtitles.sub" ]
	then
	if [ -f ./tmp-sub.sub ]
        then
	    rm -rf ./tmp-sub.sub ./tmp-sub.idx
        fi
    	lsdvd ./ -t $TRACK -s 2> /dev/null | grep "^	Subtitle:" > tmp.2
	while read SUBTITLE
    	do
		S_TRACK=`echo $SUBTITLE | cut -d ' ' -f 2 | cut -d ',' -f 1`
		S_ID=`echo $SUBTITLE | cut -d ' ' -f 11 | cut -d ',' -f 1`
		S_LANG=`echo $SUBTITLE | cut -d ' ' -f 4,5,6`
		S_LANG_CODE=`echo $S_LANG | cut -d ' ' -f 1`
		S_LANG_NAME=`echo $S_LANG | cut -d ' ' -f 3 | cut -d ',' -f 1`

		if [ $S_TRACK_COUNT -gt 7 -a "$S_LANG_CODE" = "xx" -a "$S_LANG_NAME" = "Unknown" ]
	 	then
		    echo "Skipping subtitle track $S_TRACK ($S_ID $S_LANG) from track $TRACK of $DISC"
		else

		echo "Ripping subtitle track $S_TRACK ($S_ID $S_LANG) from track $TRACK of $DISC"
		tccat -i ./ -T $TRACK -L 2> /dev/null | tcextract -x ps1 -t vob -a $S_ID > tmp.sub
		S_SIZE=`ls -s --block-size=1 "./tmp.sub" | cut -d ' ' -f 1`
		if [ "$S_SIZE" != "0" ]
		then
	            if [ -f "VIDEO_TS/VTS_${VTS}_0.IFO" ]
	            then
		        if [ -f ./tmp-sub.sub ]
		        then
		            cat tmp.sub | subtitle2vobsub -i "VIDEO_TS/VTS_${VTS}_0.IFO" -o "./tmp-sub" -a `expr $S_TRACK - 1`,$SUB_LANG_CODE
		        else
		            cat tmp.sub | subtitle2vobsub -i "VIDEO_TS/VTS_${VTS}_0.IFO" -o "./tmp-sub"
		        fi
	            else
	                echo "Error with finding \"$1/VIDEO_TS/VTS_${VTS}_0.IFO\" for converting subtitle track $S_TRACK ($S_ID $S_LANG) from track $TRACK of $DISC."
  	            fi

		    S_TRACK=`expr $S_TRACK_COUNT + 1`
		    S_TRACK_CMD_LINE="${S_TRACK_CMD_LINE} --track-name $S_TRACK_COUNT:\"Track $S_TRACK\""
  		    MKV_LANG_CODE=`lookup_mkv_lang_code $S_LANG_CODE`
		    if [ "$MKV_LANG_CODE" = "" -o "$S_LANG_CODE" = "xx" ]
		    then
		        MKV_LANG_CODE=`lookup_mkv_lang_name $S_LANG_NAME | head -n 1`
		    fi
		    if [ "$MKV_LANG_CODE" != "" ]
		    then
		        S_TRACK_CMD_LINE="${S_TRACK_CMD_LINE} --language $S_TRACK_COUNT:$MKV_LANG_CODE"
		    fi
		    S_TRACK_COUNT=`expr $S_TRACK_COUNT + 1`
  	        fi

		rm tmp.sub

  	        fi
        done < tmp.2
	if [ -f ./tmp-sub.sub ]
        then
	    mv ./tmp-sub.sub "./$DISC - Title $TRACK - Subtitles.sub"
	    mv ./tmp-sub.idx "./$DISC - Title $TRACK - Subtitles.idx"
	    INPUT_FILES="${INPUT_FILES} \"$DISC - Title $TRACK - Subtitles.idx\" \"$DISC - Title $TRACK - Subtitles.sub\""
        fi #  -f ./tmp-sub.sub
        fi #  ! -f "./$DISC - Title $TRACK - Subtitles.sub"
	else
	    . "./$DISC - Title $TRACK - Subtitles.ifo"
        fi #  ! -f "./$DISC - Title $TRACK - Subtitles.ifo"
	if [ "$S_TRACK_COUNT" != "0" ]
	then
	  S_SIZE=`ls -s --block-size=1 "./$DISC - Title $TRACK - Subtitles.sub" | cut -d ' ' -f 1`
	  if [ "$S_SIZE" != "0" ]
	  then
	    MERGE_CMD_LINE="${MERGE_CMD_LINE} ${S_TRACK_CMD_LINE} \"$DISC - Title $TRACK - Subtitles.idx\""
	  else
	    S_TRACK_COUNT=0
	  fi
	fi


	TRACK_COUNT=`expr $V_TRACK_COUNT + $A_TRACK_COUNT + $S_TRACK_COUNT`

	if [ ! -f "$OUTPUT_FILE" ]
	then
	    if [ "$TRACK_COUNT" != "0" ]
	    then
		# echo "merge cmdline:  `echo $MERGE_CMD_LINE`"
		echo "mkvmerge --title \"$DISC - Title $TRACK\" -o \"$OUTPUT_FILE\" $MERGE_CMD_LINE"
		eval "mkvmerge --title \"$DISC - Title $TRACK\" -o \"$OUTPUT_FILE\" $MERGE_CMD_LINE"
		# 2>&1 > /dev/null
	    else
		echo "All tracks for $DISC - title $TRACK are empty or missing, nothing to do for this title"
	    fi
	fi

	if [ "$SOUNDTRACK" = "1" ]
	then
		echo "Perhaps $DISC title $TITLE is a soundtrack"
#		mv "./$DISC - Title $TRACK - Unknown Audio (0x80).ac3" "./$DISC - Title $TRACK - Soundtrack.ac3"
#		mv "./$DISC - Title $TRACK - Video.h264" "./$DISC - Title $TRACK - Soundtrack.h264"
	else
		echo "could free up space from the vobs here"
	fi

	# Cleanup
	if [ -f "$OUTPUT_FILE" ]
	then
	    eval "rm -rf $INPUT_FILES"
	    # 2>&1 > /dev/null
	fi
fi
    done < tmp.1

    rm tmp.1 tmp.2 *.info
else
    echo "ripDVD.sh error: $DISC did not contain a VIDEO_TS directory, ignoring."
fi



echo "Did everything for $DISC"