# Author: Alan J. Pippin (apippin@pippins.net)
# Date: 05/17/2009
#
- REV=2.4
+ REV=2.5
#
# Description: This script wraps a number of linux utilities to
# create a recipe for ripping protected DVDs, circumventing
typeset -i invalid_feature_title=0
typeset -i feature_title_override=0
typeset -i mplayer_dumpstream_incompatibility=0
+typeset -i lsdvd_incompatibility=0
typeset -i custom_video_bitrate=0
typeset -i custom_audio_bitrate=0
typeset -i custom_audio_2ch=0
typeset -i custom_audio_6ch=0
typeset -i minimum_feature_title_length=10
+typeset -i lsdvd_timeout=10
##############################################################################
# Local Machine Settings:
# processing functions
##############################################################################################
+function alarm() { perl -e 'alarm shift; exec @ARGV' "$@"; }
+
+function lsdvd_longest_title {
+ dev="$1"
+
+ # Only use lsdvd to extract the longest feature title if we didn't detect an incompatibility earlier
+ if [ $lsdvd_incompatibility -eq 1 ]; then
+ invalid_feature_title=1
+ return
+ fi
+
+ # Try the normal lsdvd command to see if it works
+ alarm $lsdvd_timeout lsdvd $dev >> "$logfile" 2>&1
+ if [ $? != 0 ]; then
+ # lsdvd didn't work
+ invalid_feature_title=1
+ lsdvd_incompatibility=1
+ return
+ fi
+
+ # lsdvd is good to go, use it
+ feature_title=`lsdvd $dev 2>/dev/null | awk '/Longest/ { print $NF }'`
+}
+
+function lsdvd_css {
+ dev="$1"
+
+ # Try the normal lsdvd command to see if it works
+ alarm $lsdvd_timeout lsdvd $dev >> "$logfile" 2>&1
+
+ if [ $? != 0 ]; then
+ # lsdvd didn't work. Try VLC.
+ lsdvd_incompatibility=1
+ if [[ -x `which cvlc` ]]; then
+ echo "-> lsdvd failed to DeCSS the DVD. Trying VLC: $dev" | tee -a "$logfile"
+ alarm $lsdvd_timeout cvlc --no-video --no-audio $dev >> "$logfile" 2>&1
+ # Once you get a DVD that VLC can't handle, figure out how
+ # to detect that here and abort.
+ #if [ $? != 1 ]; then
+ # echo "-> VLC failed to decss the DVD."
+ # return 1
+ #fi
+ else
+ fatal_and_exit "-E- lsdvd failed to DeCSS the DVD. VLC not found, but required to rip this DVD."
+ fi
+ fi
+ return 0
+}
+
# encode the vob file into a compressed file format using handbrake
function encode_vob_file_handbrake {
# check to see if we have a dvdpath to rip from instead of $dev
if [ -z "$dvdpath" ]; then
# load the CSS codes in the DVD drive
- lsdvd $dev >> "$logfile"
+ lsdvd_css "$dev"
if [ $? != 0 ]; then
fatal_and_exit "-E- lsdvd $dev failed"
fi
fi
# otherwise, use lsdvd to figure it out
if [ $ripdvd -eq 1 ]; then
- feature_title=`lsdvd $dev | awk '/Longest/ { print $NF }'`
+ lsdvd_longest_title "$dev"
else
- feature_title=`lsdvd "$source" 2>/dev/null | awk '/Longest/ { print $NF }'`
+ lsdvd_longest_title "$source"
fi
}
echo "-> Checking for mplayer dumpstream incompatibilities" | tee -a "$logfile"
+ # Check to see if the DVD had any lsdvd incompatibilities
+ if [ $lsdvd_incompatibility -eq 1 ]; then
+ invalid_feature_title=1
+ echo "-E- Unable to determine the feature title due to an lsdvd inability to DeCSS" | tee -a "$logfile"
+ echo " You will need to determine this yourself and rerun the script with the -t option" | tee -a "$logfile"
+ echo " You can google this DVD to find out what it's feature title is, or you can play it in a conventional DVD player to find it." | tee -a "$logfile"
+ return
+ fi
+
if [ ! -e "$vobfile" ]; then
# mplayer dumpstream does not work on DVDs that obscure the feature title.
# A DVD that has 99 titles, where the longest title isn't the main feature
# out what the feature title is. This script will run through that flow if we
# set use_mplayer_dumpstream to 0. Check for this here.
if [ $ripdvd -eq 1 ]; then
- lsdvd $dev | grep -q "Title: 99"
+ alarm $lsdvd_timeout lsdvd $dev | grep -q "Title: 99"
else
- lsdvd "$isofile" | grep -q "Title: 99"
+ alarm $lsdvd_timeout lsdvd "$isofile" | grep -q "Title: 99"
fi
# If we have 99 titles and a feature title wasn't given on the command line, switch modes.
if [ $? == 0 ] && [ $feature_title_override -eq 0 ]; then
# The resulting VOB file looks complete, but has something in it that causes mplayer/mencoder
# to be unable to encode it since it thinks the entire VOB is only a few minutes long in length.
# Using HandBrake with an MP4 type profile can work around this, but mencoder or Handbrake with XVID profile won't.
- vob_length=`mplayer -identify -v "$vobfile" -endpos 0 2>&1 | grep ID_LENGTH | awk -F '=' '{ print $2 }' | awk -F '.' '{ print $1 }'`
- ((min_length = minimum_feature_title_length * 60))
- if [[ $vob_length -lt $min_length ]]; then
- if [[ $encoder -ne "handbrake" ]] || [[ "$profile" =~ "xvid" ]]; then
- echo "-E- The main feature title that was ripped from the DVD has an invalid movie length." | tee -a "$logfile"
- echo " You'll need rip this DVD with the handbrake encoder and an MP4 type profile instead." | tee -a "$logfile"
- mplayer_dumpstream_incompatibility=1
+ if [ -e "$vobfile" ]; then
+ vob_length=`mplayer -identify -v "$vobfile" -endpos 0 2>&1 | grep ID_LENGTH | awk -F '=' '{ print $2 }' | awk -F '.' '{ print $1 }'`
+ ((min_length = minimum_feature_title_length * 60))
+ if [[ $vob_length -lt $min_length ]]; then
+ if [[ $encoder -ne "handbrake" ]] || [[ "$profile" =~ "xvid" ]]; then
+ echo "-E- The main feature title that was ripped from the DVD has an invalid movie length." | tee -a "$logfile"
+ echo " You'll need rip this DVD with the handbrake encoder and an MP4 type profile instead." | tee -a "$logfile"
+ mplayer_dumpstream_incompatibility=1
+ fatal_and_exit "-E- Aborting encoding step due to invalid movie length."
+ fi
fi
fi
}