Fixed a new issue with lsdvd unable to handle certain DVDs. 2_5
authorAlan J. Pippin <ajp@pippin.pippins.net>
Tue, 23 Feb 2010 06:24:43 +0000 (23:24 -0700)
committerAlan J. Pippin <ajp@pippins.net>
Tue, 23 Feb 2010 06:24:43 +0000 (23:24 -0700)
Had to rewrite/rewrap the calls to lsdvd to prevent crashes with it.

rip_dvd

diff --git a/rip_dvd b/rip_dvd
index 4f9c968d7171770750aac64483a38f165f3a5d30..6339d2925166da48276d12e21b3f253c3498923b 100755 (executable)
--- 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
 }