#!/bin/bash if [ -z "$1" ]; then echo -e "You may enter arguments in any order. The arguments are:\n" echo -e "\tdevice name - the name of the device on which the movie lives, for example,\n\t\t\tenter \"dvd\" if your device is /dev/dvd.\n" echo -e "\tmpg - use transcode to create a 4.3GB dvd." echo -e "\txvid - rips an xvid avi with a default final size of 1000MB." echo -e "\trequant - requantize a dvd to 4.3 GB." echo -e "\n\t(You can only use _one_ of the above options at a time - either mpg or avi or requant.)\n" echo -e "\tnodisc - rips from a file you supply. The NEXT argument must be the filename. \n\t\t(MANDATORY if no disc and no info files)\n" echo -e "\tsize - specify the desired finalsize (in MB) as the next argument. (OPTIONAL)\n" echo -e "\tvbr - specify the desired bitrate as the next argument. (OPTIONAL)\n" echo -e "\tsubs - include subtitles (OPTIONAL)." echo -e "\tepisodes - rips all episodes from a dvd with many episodes - like tv shows. (OPTIONAL)." echo -e "\tsync - forces extra AV sync routines in transcode. (OPTIONAL)" exit 0 ; fi FINALAVISIZE="700" ; FINALDVDSIZE="4600000000" # FUNCTIONS ################################################################### getdevice() { if [[ -n "$( echo "$@" | grep -e "nodisc" )" ]] ; then DEVICE="nodevice" ; elif [[ -n "$( echo "$@" | grep -e "dvdburner" )" ]] ; then DEVICE="dvdburner" ; elif [[ -n "$( echo "$@" | grep -e "dvd" )" ]] ; then DEVICE="dvd" ; elif [[ -n "$( echo "$@" | grep -e "dvdrw" )" ]] ; then DEVICE="dvdrw" ; elif [[ -n "$( echo "$@" | grep -e "cdrom" )" ]] ; then DEVICE="cdrom" ; elif [[ -n "$( echo "$@" | grep -e "cdrw" )" ]] ; then DEVICE="cdrw" ; elif [[ -n "$( echo "$@" | grep -e "hdc" )" ]] ; then DEVICE="hdc" ; elif [[ -n "$( echo "$@" | grep -e "hdd" )" ]] ; then DEVICE="hdd" ; else echo -e "\nWhat is the name of the device the dvd is in?\n" ; read DEVICE ; fi } getinfo() { if [[ $DEVICE == "nodevice" ]] ; then FILENAME=$( echo "$@" | awk -F'nodisc' '{print $2}' | awk '{print $1}' ) ; echo -e "\nNo device given...using the argument following the \"nodisc\" keyword as the movie name.\n" sleep 5 ; echo -e "\nFetching the length of the movie.\n" SEC=$( mencoder $FILENAME -ovc copy -nosound -o /dev/null -quiet 2>&1 | awk '/^Video stream:/{print $10+$10/$12}' | \ awk -F '.' '{print $1}' ) ; echo -e "The movie $FILENAME is $( echo "scale=2 ; $SEC / 60" | bc -l ) minutes long.\n" sleep 5 ; echo -e "Collecting movie information.\n" tcprobe -d 0 -T 1,-1 -H 500 -d 4 -i $FILENAME > $FILENAME.tcprobe.tempinfo else echo -e "\nCollecting movie information.\n" FILENAME=$(lsdvd /dev/$DEVICE | grep 'Disc Title:' | cut -c 13-) ; tcprobe -d 0 -T 1,-1 -H 500 -d 4 -i /dev/$DEVICE > $FILENAME.tcprobe.tempinfo ; SEC=$( grep -a sec $FILENAME.tcprobe.tempinfo | awk '{print $5}' ) ; lsdvd -d /dev/$DEVICE > $FILENAME.lsdvd.tempinfo ; TITLE=$(grep Longest $FILENAME.lsdvd.tempinfo | awk '{print $3}') ; echo -e "\nThe longest title on this dvd is title $TITLE.\n" echo -e "The movie $FILENAME is $( echo "scale=0 ; $SEC / 60" | bc -l ) minutes long.\n" sleep 5 ; fi } riptitle() { if [[ $DEVICE != "nodevice" ]] ; then if [[ "$2" == "mplay" ]] ; then echo -e "Ripping title $TITLE to current directory using mplayer.\n" mplayer dvd://$1 -msglevel all=0 -dvd-device /dev/$DEVICE -dumpstream -dumpfile $FILENAME ; else echo -e "Ripping title $TITLE to current directory using transcode.\n" tccat -d 0 -i /dev/$DEVICE -T $1,-1 -P > $FILENAME ; fi fi } setcrop() { if [[ -z "${TRANS}" ]] ; then if [[ "${DEVICE}" == "nodevice" ]] ; then CROP="$( mplayer $FILENAME -quiet -vf cropdetect -ss 0:10 -sstep 1 -ao null -vo null -frames 40 | \ grep "Crop area: " | tail -1 | awk -F'-vf ' '{print $2}' | awk -F')' '{print $1}' )" ; SCALE="$( mplayer -ao null -vo null -frames 1 -identify $FILENAME | grep -e "^VIDEO" | \ awk '{print $3}' | awk -F 'x' '{print $1}' )" else CROP="$( mplayer dvd://$TITLE -dvd-device /dev/$DEVICE -quiet -vf cropdetect -ss 0:10 -sstep 1 \ -ao null -vo null -frames 40 | grep "Crop area: " | tail -1 | awk -F'-vf ' '{print $2}' | awk -F')' '{print $1}' )" ; SCALE="$( mplayer -ao null -vo null -frames 1 -identify $FILENAME | grep -e "^VIDEO" | \ awk '{print $3}' | awk -F 'x' '{print $1}' )" fi MENCOPTS_1="$MENCOPTS_1 -vf "${CROP}",pullup,softskip,scale="${SCALE}":-2" MENCOPTS_2="$MENCOPTS_2 -vf "${CROP}",pullup,softskip,scale="${SCALE}":-2" fi } setavibitrate() { if [[ -n "$( echo "$@" | grep -e "vbr" )" ]] ; then BITRATE=$( echo "$@" | awk -F'vbr' '{print $2}' | awk '{print $1}' ) ; else ASIZE=$( echo "scale=0 ; 192 * $SEC / 8 / 1024" | bc -l ) ; BITRATE=$( echo " scale=0 ; ($FINALAVISIZE-$ASIZE) * 1000 / $SEC * 8" | bc -l ) ; fi } setdvdbitrate() { if [[ -n "$( echo "$@" | grep -e "vbr" )" ]] ; then BITRATE=$( echo "$@" | awk -F'vbr' '{print $2}' | awk '{print $1}' ) ; fi ASIZE=$( echo "scale=0 ; 28000 * $SEC" | bc -l ) ; ADIFF=$( echo "$FINALDVDSIZE - $ASIZE" | bc -l ) ; BYTERATE=$( echo "$ADIFF / $SEC" | bc -l ) ; BITRATE=$( echo "scale=0 ; $BYTERATE * 8 / 1000" | bc -l ) ; TRANSOPTS="$TRANSOPTS -w $BITRATE" } setaspect() { ASPECTINFO=$( grep -a "aspect ratio" $1.tcprobe.tempinfo | awk '{print $3}' | sed 's/\:/\//g' ) echo -e "aspect $ASPECTINFO\n" if [[ "$ASPECTINFO" == '16/9' ]] ; then TRANSOPTS="${TRANSOPTS} --export_asr 3" ; elif [[ "$ASPECTINFO" == '4/3' ]] ; then TRANSOPTS="${TRANSOPTS} --export_asr 2" ; else TRANSOPTS="${TRANSOPTS} --export_asr 1" ; fi } setlangtrack() { EN_TRACK=$( grep -a kHz $1.tcprobe.tempinfo | grep -a -n "ac3" | head -n 1 | awk -F ':' '{print $1}' ) ; EN_INDEX=$(($EN_TRACK-1)) ; if [[ "$SUBS" == "true" ]] || [[ $EN_INDEX -lt "0" ]] ; then EN_INDEX=0 ; fi TRANSOPTS="${TRANSOPTS} -a $EN_INDEX" ; } encode_trans() { transcode -i $FILENAME $TRANSOPTS ; echo -e "CALLED TRANSCODE\n" mplex -M -f8 -o $FILENAME.mpg $FILENAME.m2v $FILENAME.ac3 ; } encode_menc() { rm divx2pass.log* nice -+19 mencoder $FILENAME $MENCOPTS_1 nice -+19 mencoder $FILENAME $MENCOPTS_2 } requant() { tcextract -d 0 -i $1 -t vob -x mpeg2 > $1.m2v ; tcextract -d 0 -i $1 -a 0 -x ac3 -t vob > $1.ac3 ; VSIZE=$(ls -l $1.m2v | awk '{print $5}') ; ASIZE=$(ls -l $1.ac3 | awk '{print $5}') ; ADIFF=$( echo "4645000000 - $ASIZE" | bc -l ) ; FACTOR=$( echo "$VSIZE / $ADIFF" | bc -l ) ; RQFACTOR=$( echo "$FACTOR * 1.04" | bc -l ) ; TSIZE=$( echo "$VSIZE + $ASIZE" | bc -l ) ; if [[ $TSIZE -lt 4670000000 ]] ; then mplex -M -b 500 -f 8 -o $1.mpg $1.m2v $1.ac3 exit 0; else tcrequant -i $1.m2v -o $1.shrunk.m2v -f $RQFACTOR mplex -M -b 500 -f 8 -o $1.mpg $1.shrunk.m2v $1.ac3 fi exit 0; } # END OF FUNCTIONS ############################################################### if [[ -n "$( echo "$@" | grep -e "size" )" ]] ; then FINALAVISIZE=$( echo "$@" | awk -F'size' '{print $2}' | awk '{print $1}' ) ; TEMP=$( echo "$@" | awk -F'size' '{print $2}' | awk '{print $1}' ) ; FINALDVDSIZE=$( echo "scale=0 ; $TEMP * 1024 * 1024" | bc -l ) fi getdevice "$@" ; getinfo "$@" ; riptitle $TITLE mplay ; # Process args. for arg in "$@" ; do case "${arg}" in mpg) TRANS="true" setaspect $FILENAME ; setlangtrack $FILENAME ; setdvdbitrate "$@"; TRANSOPTS="${TRANSOPTS} --export_prof dvd-ntsc -y ffmpeg \ -F mpeg2video -o $FILENAME -D0 -b 224,0,5,0 -N 0x2000 -u 12,2 -s 4 \ -m $FILENAME.ac3 -J modfps=clonetype=3:mode=1 --export_fps 29.97" ;; xvid) MENC="true" ; setaspect $FILENAME ; setavibitrate "$@"; MENCOPTS_1="${MENCOPTS_1} -o /dev/null -oac copy -ffourcc DX50 \ -alang en -ovc xvid -xvidencopts turbo:pass=1:threads=2:vhq=4 -af volnorm -ofps 24000/1001" ; MENCOPTS_2="${MENCOPTS_2} -o $FILENAME.xvid.avi -oac lavc -lavcopts acodec=ac3:abitrate=192:threads=2 -ffourcc DX50 \ -alang en -ovc xvid -xvidencopts turbo:pass=2:threads=2:bitrate=${BITRATE}:vhq=4 -af volnorm -ofps 24000/1001" ; ;; subs) SUBS="true" ; # TRANSOPTS="${TRANSOPTS} -J extsub=0:0:0:0:0:0:255" ; # TRANSOPTS="${TRANSOPTS} -J extsub=track=00=ca=3=cb=2" ; TRANSOPTS="${TRANSOPTS} -J extsub" ; MENCOPTS_1="${MENCOPTS_1} -sid 0" ; MENCOPTS_2="${MENCOPTS_2} -sid 0" ; ;; sync) TRANSOPTS="${TRANSOPTS} -M 2" ; ;; crop) setcrop ; ;; episodes) # EPISODES="true" ; for TITLE in $( grep "^Title:" $FILENAME.lsdvd.tempinfo | awk '{print $2}' | awk -F ',' '{print $1}' ) do tccat -i /dev/$DEVICE -T $TITLE,-1 -P > $FILENAME-$TITLE ; done if [[ -n "$( echo "$@" | grep -e "xvid" )" ]] ; then BITRATE="1200" ; for EPISODE in $FILENAME-* do # setcrop $EPISODE ; # setaspect $EPISODE ; rm divx2pass.log* # nice -+19 mencoder $EPISODE -o /dev/null -oac lavc -lavcopts acodec=ac3:abitrate=128:threads=2 -ffourcc xvid -aid 128 \ # -ovc xvid -xvidencopts turbo:pass=1:threads=2:nointerlacing -af volnorm -ofps 23.976 -vf pullup,softskip,${CROP},scale=640:-2 # nice -+19 mencoder $EPISODE -o ${EPISODE/episode/avi} -oac lavc -lavcopts acodec=ac3:abitrate=128:threads=2 -ffourcc xvid -aid 128 \ # -ovc xvid -xvidencopts turbo:pass=2:threads=2:nointerlacing:bitrate=1000 -af volnorm -ofps 23.976 -vf pullup,softskip,${CROP},scale=640:-2 MENCOPTS_1="-o /dev/null -oac copy -ffourcc DX50 \ -alang en -ovc xvid -xvidencopts turbo:pass=1:threads=2:vhq=4 -af volnorm -ofps 24000/1001" ; MENCOPTS_2="-o $EPISODE.xvid.avi -oac lavc -lavcopts acodec=ac3:abitrate=192:threads=2 -ffourcc DX50 \ -alang en -ovc xvid -xvidencopts turbo:pass=2:threads=2:bitrate=${BITRATE}:vhq=4 -af volnorm -ofps 24000/1001" ; FILENAME="${EPISODE}" encode_menc ; done # else # for EPISODE in $FILENAME-* # do # done fi exit 0 ; ;; requant) REQUANT="true" ; ;; esac done if [[ ${TRANS} == "true" ]] ; then echo "Device: $DEVICE" ; echo "Filename: $FILENAME" ; echo "SEC: $SEC" ; echo "Video bitrate: $BITRATE" ; echo "EN_INDEX: $EN_INDEX" ; echo "TRANSOPTS: $( echo "${TRANSOPTS}" | sed -e "s/\t//g" )" ; sleep 15 ; echo -e "CALLING ENCODE_TRANS\n" encode_trans ; fi if [[ ${MENC} == "true" ]] ; then echo "Device: $DEVICE" ; echo "Filename: $FILENAME" ; echo "SEC: $SEC" ; echo "Video bitrate: $BITRATE" ; echo "MENCOPTS_1: $( echo "${MENCOPTS_1}" | sed -e "s/\t//g" )" ; echo "MENCOPTS_2: $( echo "${MENCOPTS_2}" | sed -e "s/\t//g" )" ; echo "AVI: ${MENC}" ; echo "Crop: $CROP" ; echo "ASPECT: $ASPECT" echo "Subs: $SUBS" sleep 15 ; encode_menc ; fi if [[ ${REQUANT} == "true" ]] ; then requant $FILENAME ; fi exit # works for the philips: # mencoder Dune -oac copy -aid 128 -ovc xvid -alang en -ofps 23.976 -xvidencopts pass=1 -vf pullup,softskip,crop=720:352:0:66,scale=640:-2 -o /dev/null # mencoder Dune -oac copy -aid 128 -ovc xvid -alang en -ofps 23.976 -xvidencopts pass=2:bitrate=800 -vf pullup,softskip,crop=720:352:0:66,scale=640:-2 -o Dune.avi