# TODO: Check for required tools # TODO: Automate -ofps & -vf for interlaced, telecined, progressive, ... etc. # TODO: Handle automatic detection failure # TODO: Rip subtitles DVD_DEVICE=/home/ahmad/downloads/mov/iso OUTPUT_FILE_BASE=pirates TITLE="Pirates of the Caribbean" YEAR=2003 # Compression Quality CQ=0.16 #SCALE=688:384 FPS=24000/1001 SS=50 FRAMES=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` echo echo "############################################################" echo if [ "$DURATION_OPTS" ] ; then echo "Ripping a $FRAMES frames sample starting at $SS seconds" else echo "Ripping the whole title" fi echo echo "############################################################" 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 chapters echo sleep 3; echo "Extracting chapters.." echo "=====================" sleep 1; dvdxchap $DVD_DEVICE > chapters.txt echo echo "Done extracting chapters" echo echo "############################################################" # Test for existing audio file for complete rips if [[ ! "$DURATION_OPTS" && -f audio.ogg ]] ; then echo "############################################################" echo echo "audio.ogg found.. Not ripping audio" echo echo "############################################################" else # Rip audio to WAV echo sleep 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/null echo echo "Done extracting aduio" echo echo "############################################################" # Normalize audio echo sleep 3; echo "Normalizing audio.." echo "===================" sleep 1; normalize-audio $AUDIO_FILE_BASE.wav echo echo "Done normalizing audio" echo echo "############################################################" # Encode audio echo sleep 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.mp3 rm $AUDIO_FILE_BASE.wav echo echo "Done encoding audio" echo echo "############################################################" fi # Continue here if audio.ogg was found # Detect crop parameters echo echo "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"; fi echo echo "Done detecting crop parameters" echo echo "############################################################" # Calculate bitrate echo sleep 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=1000 fi echo "Using bitrate=$BITRATE kb/s" echo echo "Done calculating bitrate" echo echo "############################################################" # Calculate resolution echo sleep 3 echo "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" fi echo echo "Done calculating resolution" echo echo "############################################################" # Encode video - first pass echo sleep 3; echo "Encoding video - first pass.." echo "=============================" sleep 1; rm -f *.log mencoder 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_OPTS echo echo "Done encoding video - first pass" echo echo "############################################################" # Encode video - second pass echo sleep 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_OPTS echo echo "Done encoding video - second pass" echo echo "############################################################" # Mux audio and video echo sleep 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.avi ogmmerge -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.avi echo echo "############################################################" echo echo "Done! Enjoy" echo echo "############################################################"