rendered paste body# TODO: Check for required tools# TODO: Automate -ofps & -vf for interlaced, telecined, progressive, ... etc.# TODO: Handle automatic detection failure# TODO: Rip subtitlesDVD_DEVICE=/home/ahmad/downloads/mov/isoOUTPUT_FILE_BASE=piratesTITLE="Pirates of the Caribbean"YEAR=2003# Compression QualityCQ=0.16#SCALE=688:384FPS=24000/1001SS=50FRAMES=1000# To rip a short sample clip rather than the whole title,# uncomment the following line:DURATION_OPTS="-ss $SS -frames $FRAMES"AUDIO_FILE_BASE=`if [ "$DURATION_OPTS" ] ; then echo part; else echo audio; fi`echoecho "############################################################"echoif [ "$DURATION_OPTS" ] ; then echo "Ripping a $FRAMES frames sample starting at $SS seconds"else echo "Ripping the whole title"fiechoecho "############################################################"function CALCULATE_RESOLUTION() { Y=$(($Y_FACTOR * 16)) echo -e "Y_FACTOR = $Y_FACTOR\tY = $Y" X_FACTOR=`echo "($Y * $AR / 16)" | bc -l | cut -d. -f1` X=$(($X_FACTOR * 16)) echo -e "X_FACTOR = $X_FACTOR\tX = $X"}function ADJUST_X() { RATIO_1=`echo "$X/$Y/$AR" | bc -l` if [[ $RATIO_1 > 1 ]]; then X_2=$(($X - 16)); RATIO_2=`echo "$AR/$X_2*$Y" | bc -l` else X_2=$(($X + 16)); RATIO_1=`echo "$AR/$X*$Y" | bc -l` RATIO_2=`echo "$X_2/$Y/$AR" | bc -l` fi echo -e "X = $X\tY=$Y\tAspect ratio error = $RATIO_1" echo -e "X = $X_2\tY=$Y\tAspect ratio error = $RATIO_2" if [[ $RATIO_2 < $RATIO_1 ]]; then X=$X_2; fi}# Extract chaptersechosleep 3;echo "Extracting chapters.."echo "====================="sleep 1;dvdxchap $DVD_DEVICE > chapters.txtechoecho "Done extracting chapters"echoecho "############################################################"# Test for existing audio file for complete ripsif [[ ! "$DURATION_OPTS" && -f audio.ogg ]] ; then echo "############################################################" echo echo "audio.ogg found.. Not ripping audio" echo echo "############################################################"else # Rip audio to WAVechosleep 3;echo "Extracting audio.."echo "=================="sleep 1;mplayer dvd://1 \-dvd-device $DVD_DEVICE \-ao pcm:file=$AUDIO_FILE_BASE.wav:fast \-vc null \-vo null \-alang en \$DURATION_OPTS 2>/dev/nullechoecho "Done extracting aduio"echoecho "############################################################"# Normalize audioechosleep 3;echo "Normalizing audio.."echo "==================="sleep 1;normalize-audio $AUDIO_FILE_BASE.wavechoecho "Done normalizing audio"echoecho "############################################################"# Encode audioechosleep 3;echo "Encoding audio.."echo "================"sleep 1;oggenc -q4 $AUDIO_FILE_BASE.wav -o $AUDIO_FILE_BASE.ogg#lame --vbr-new -h -m j $AUDIO_FILE_BASE.wav $AUDIO_FILE_BASE.mp3#lame --preset fast medium $AUDIO_FILE_BASE.wav $AUDIO_FILE_BASE.mp3rm $AUDIO_FILE_BASE.wavechoecho "Done encoding audio"echoecho "############################################################"fi# Continue here if audio.ogg was found# Detect crop parametersechoecho "Detecting crop parameters.."echo "==========================="sleep 1;CROP=`mplayer dvd://1 \-dvd-device $DVD_DEVICE \-vf cropdetect \-nosound \-benchmark \-ss 200 \-frames 300 \2>/dev/null \| awk -F'[=)]' '\/-vf crop=/ \{ \if (crop == $2) count++; \else count = 1; \crop = $2 \} \END \{ if (count > 200) print crop; else print UNKNOWN}'`if [ $CROP == UNKNOWN ] ;then echo "Cannot determine crop parameters.. Exiting"; exit;else echo "Using crop=$CROP";fiechoecho "Done detecting crop parameters"echoecho "############################################################"# Calculate bitrateechosleep 3;echo "Calculating bitrate.."echo "====================="sleep 1;if [ -f audio.ogg ]; then LENGTH=`mplayer -dvd-device $DVD_DEVICE dvd://1 -identify -frames 0 2>/dev/null | awk -F'[=.]' '/ID_LENGTH=/ {print $2}'` echo "Movie length: $LENGTH seconds" AUDIO_SIZE=`ls -l audio.ogg | awk '{print $5}'` echo "Audio size: $(($AUDIO_SIZE/1024/1024)) MB" BITRATE=$(((700*1024*1024-$AUDIO_SIZE)*8/1000/$LENGTH))else echo "audio.ogg not found.. Using default bitrate" BITRATE=1000fiecho "Using bitrate=$BITRATE kb/s"echoecho "Done calculating bitrate"echoecho "############################################################"# Calculate resolutionechosleep 3echo "Calculating resolution.."echo "========================"sleep 1;if [ $SCALE ] ; then echo "Using preset SCALE=$SCALE";else WIDTH=`echo $CROP | cut -d: -f1` HEIGHT=`echo $CROP | cut -d: -f2` AR=`echo "($WIDTH * (16/9 / 1.5)) / $HEIGHT" | bc -l` Y_FACTOR=`echo "sqrt(1000*$BITRATE/25/$AR/$CQ)/16" | bc -l | cut -d. -f1` CALCULATE_RESOLUTION; while [[ $X > $WIDTH ]] ; do echo "X too big"; Y_FACTOR=$(($Y_FACTOR - 1)) CALCULATE_RESOLUTION; done ADJUST_X; SCALE=$X:$Y echo "Using scale=$SCALE"fiechoecho "Done calculating resolution"echoecho "############################################################"# Encode video - first passechosleep 3;echo "Encoding video - first pass.."echo "============================="sleep 1;rm -f *.logmencoder dvd://1 \-dvd-device $DVD_DEVICE \-ofps $FPS \-alang en \-oac copy \-o /dev/null \-vf pp=ac,crop=$CROP,scale=$SCALE,hqdn3d=2:1:2 \-ovc x264 \-x264encopts bitrate=$BITRATE:pass=1:subq=7:frameref=8:4x4mv:bframes=4:weight_b:b_pyramid:mixed_refs:nofast_pskip:brdo:bime:direct_pred=3:trellis=2:me=3:cqm=jvt \$DURATION_OPTSechoecho "Done encoding video - first pass"echoecho "############################################################"# Encode video - second passechosleep 3;echo "Encoding video - second pass.."echo "=============================="sleep 1;mencoder dvd://1 \-dvd-device $DVD_DEVICE \-ofps $FPS \-alang en \-oac copy \-info name="$TITLE" \-o $OUTPUT_FILE_BASE-ac3.avi \-vf pp=ac,crop=$CROP,scale=$SCALE,hqdn3d=2:1:2 \-ovc x264 \-x264encopts bitrate=$BITRATE:pass=2:subq=7:frameref=8:4x4mv:bframes=4:weight_b:b_pyramid:mixed_refs:nofast_pskip:brdo:bime:direct_pred=3:trellis=2:me=3:cqm=jvt \$DURATION_OPTSechoecho "Done encoding video - second pass"echoecho "############################################################"# Mux audio and videoechosleep 3;echo "Muxing audio & video.."echo "======================"sleep 1;#mencoder \#-oac copy \#-ovc copy \#-o $OUTPUT_FILE_BASE-mp3.avi \#-audiofile $AUDIO_FILE_BASE.mp3 \#$OUTPUT_FILE_BASE-ac3.aviogmmerge -o $OUTPUT_FILE_BASE.ogg chapters.txt -c "LANGUAGE=English" $AUDIO_FILE_BASE.ogg -c "TITLE=$TITLE" -c "YEAR=$YEAR" --noaudio $OUTPUT_FILE_BASE-ac3.avi#mkvmerge --default-language eng --chapters chapters.txt --title $TITLE -o $OUTPUT_FILE_BASE.mkv --noaudio $OUTPUT_FILE_BASE.avi $AUDIO_FILE_BASE.ogg#rm $OUTPUT_FILE_BASE-ac3.aviechoecho "############################################################"echoecho "Done! Enjoy"echoecho "############################################################"