Fixed default 6ch audio option. It wasn't truly the default before.
[rip_dvd/.git] / rip_dvd
diff --git a/rip_dvd b/rip_dvd
index 879920bc1785ef8712e46ab7de79907181bdc903..ae6f9500d0131638c870321f27ea94f474e10354 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.3
+  REV=2.5
 #
 # Description: This script wraps a number of linux utilities to
 # create a recipe for ripping protected DVDs, circumventing 
@@ -57,14 +57,17 @@ typeset -i target_video_bitrate=2000
 typeset -i target_audio_bitrate=224
 typeset -i target_size=0
 typeset -i audio_2ch=0
-typeset -i audio_6ch=1
+typeset -i audio_6ch=0
 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:
@@ -229,6 +232,12 @@ if [ $mirror_mode -eq 1 ]; then
   fi
 fi
 
+# If audio channel requirements weren't given, assume a default value of 6channel audio
+if [ $audio_2ch -eq 0 ] && [ $audio_6ch -eq 0 ]; then
+  audio_6ch=1
+  custom_audio_6ch=1
+fi
+
 # Make handbrake the default encoder if not specified and we can find it
 if [ -z "$encoder" ]; then
   encoder="mencoder"; # If we can't find handbrake, set mencoder as the default
@@ -465,6 +474,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 {
   
@@ -849,7 +907,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
@@ -950,9 +1008,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
 }
 
@@ -985,7 +1043,7 @@ function create_main_vob_with_mplayer {
   # check to make sure we didn't detect an mplayer dumpstream incompatibility earlier
   if [ $mplayer_dumpstream_incompatibility -eq 1 ]; then
     msg="-E- We detected an mplayer dumpstream incompatibility earlier."
-    msg="$msg We also detected another condition that requires us to use dumpstream. "
+    msg="$msg We also detected a condition that may require you to use dumpstream. "
     msg="$msg\n    Unable to rip this DVD in the mode you requested."
     fatal_and_exit "$msg"
   fi
@@ -1249,9 +1307,21 @@ function calculate_bitrate_from_target_size {
   # determine what our bitrate needs to be if a target size was specified instead
   if [ $target_size -ne 0 ] && [ $custom_video_bitrate -eq 0 ]; then
     vob_length=`mplayer -identify -v "$vobfile" -endpos 0 2>&1 | grep ID_LENGTH | awk -F '=' '{ print $2 }' | awk -F '.' '{ print $1 }'`
-    ((target_video_bitrate = (target_size * 1024 * 8) / vob_length ))
-    custom_video_bitrate=1
-    echo "   With a given target size of $target_size MB, the estimated bit rate will need to be $target_video_bitrate kbits/sec" | tee -a "$logfile"
+    ((min_length = minimum_feature_title_length * 60))
+    if [[ $vob_length -gt $min_length ]]; then 
+      ((target_video_bitrate = (target_size * 1024 * 8) / vob_length ))
+      custom_video_bitrate=1
+      echo "   With a given target size of $target_size MB, the estimated bit rate will need to be $target_video_bitrate kbits/sec" | tee -a "$logfile"
+    else
+      echo "-W- Unable to determine the real length of this DVD feature title." | tee -a "$logfile"
+      echo "    A target bitrate from the target_size requested will not be set." | tee -a "$logfile"
+      echo "    If using handbrake, only the target_size will be passed to the encoder." | tee -a "$logfile" 
+      echo "    If using mencoder, the target_size will be entirely disregarded." | tee -a "$logfile"
+      echo "    You may need to rerun with the -b option with a target bitrate to get the desired size." | tee -a "$logfile"
+      if [[ $encoder -ne "handbrake" ]] || [[ "$profile" =~ "xvid" ]]; then
+        fatal_and_exit "-E- You'll need rip this DVD with the handbrake encoder and an MP4 type profile to get a good rip."
+      fi
+    fi
   fi
 }
 
@@ -1309,6 +1379,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
@@ -1316,9 +1395,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
@@ -1353,6 +1432,23 @@ function check_for_mplayer_dumpstream_incompatibility {
     fi
     [[ -e "$dumplog" ]] && rm -f $dumplog
   fi
+
+  # There is another form of protection that causes the mplayer dumpstream to fail.
+  # 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.
+  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
 }
 
 function fill_mythvideo_metadata {