From 22d9052c5a84fa1cd7157e7b23278ba5feb8a0dc Mon Sep 17 00:00:00 2001 From: "Alan J. Pippin" Date: Mon, 22 Feb 2010 23:24:43 -0700 Subject: [PATCH] Fixed a new issue with lsdvd unable to handle certain DVDs. Had to rewrite/rewrap the calls to lsdvd to prevent crashes with it. --- rip_dvd | 89 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 76 insertions(+), 13 deletions(-) diff --git a/rip_dvd b/rip_dvd index 4f9c968..6339d29 100755 --- a/rip_dvd +++ b/rip_dvd @@ -3,7 +3,7 @@ # 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 @@ -61,11 +61,13 @@ typeset -i audio_6ch=1 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: @@ -466,6 +468,55 @@ trap cleanup EXIT # 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 { @@ -850,7 +901,7 @@ function make_dvd_iso_image { # 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 @@ -951,9 +1002,9 @@ function get_feature_title { 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 } @@ -1322,6 +1373,15 @@ function check_for_mplayer_dumpstream_incompatibility { 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 @@ -1329,9 +1389,9 @@ function check_for_mplayer_dumpstream_incompatibility { # 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 @@ -1371,13 +1431,16 @@ function check_for_mplayer_dumpstream_incompatibility { # 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 } -- 2.34.1