+##############################################################################################
+
+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
+}
+
+# reduce the size of the mkv src file using handbrake
+function encode_mkv_file_makemkv {
+ src="$1"
+ dst="$2"
+ tmpdst=""
+
+ # Convert our ISO to a MKV if it is a real iso
+ if [[ $real_isofile -eq 1 ]]; then
+ tmpdst="$tmpdir/$dvdname.mkv"
+ make_dvd_mkv_image "$tmpdst" "iso" "$src"
+ src="$tmpdst"
+ fi
+
+ # Set a variable that we will use later to determine if we found a handler for $profile or not
+ typeset -i found_profile=0
+
+ # Globals
+ typeset quality=""
+ typeset handbrake_audio_opts=""
+ typeset handbrake_cli=""
+
+ # Predefined Handbrake Profile Handling
+ if [[ "$profile" =~ "mkvvhq" ]]; then
+ found_profile=1
+ handbrake_cli="$handbrake_mp4"
+ final_output_file="$dst"
+ quality="0.9"
+ fi
+ if [[ "$profile" =~ "mkvhq" ]]; then
+ found_profile=1
+ handbrake_cli="$handbrake_mp4"
+ final_output_file="$dst"
+ quality="0.85"
+ fi
+
+ # setup our audio option
+ if [ $audio_2ch -eq 1 ] && [ $audio_6ch -eq 1 ]; then
+ handbrake_audio_opts="-E faac,ac3 -6 dpl2,auto"
+ fi
+ if [ $audio_6ch -eq 1 ] && [ $audio_2ch -eq 0 ]; then
+ handbrake_audio_opts="-E ac3 -6 auto"
+ fi
+ if [ $audio_2ch -eq 1 ] && [ $audio_6ch -eq 0 ]; then
+ handbrake_audio_opts="-E faac -6 dpl2"
+ fi
+
+ # find out what our audio track is
+ get_audio_track_from_mkv "$src" "$handbrake_cli"
+ if [ -n "$track" ]; then
+ handbrake_audio_opts="$handbrake_audio_opts -a $track"
+ track=""
+ fi
+
+ # Execute the handbrake command to encode the video
+ echo -e "\n Encoding: $handbrake_cli -i \"$src\" -o \"$dst\" --strict-anamorphic --crop 0:0:0:0 -q $quality $handbrake_audio_opts -v 1 -m"
+ $handbrake_cli -i "$src" -o "$dst" --strict-anamorphic --crop 0:0:0:0 -q $quality $handbrake_audio_opts -v 1 | tee -a $encodelog 2>&1
+ handbrake_retval=$?
+
+ if [ $handbrake_retval != 0 ]; then
+ fatal_and_exit "-E- Unhandled handbrake error"
+ fi
+
+ # Extract the chapters from the src and apply to the dst
+ chapter_tmpfile="$tmpdir/$dvdname.xml"
+ $mkvextract chapters "$src" > "$chapter_tmpfile"
+ $mkvpropedit -c "$chapter_tmpfile" "$dst"
+
+ # find out what our default_alang subtitle track is in the src
+ get_subtitle_track_from_mkv "$src" "$handbrake_cli"
+
+ # Extract the subtitles from the src and apply to the dst
+ srt_tmpfile="$tmpdir/$dvdname.srt"
+ sub_tmpfile="$tmpdir/$dvdname.sub"
+ idx_tmpfile="$tmpdir/$dvdname.idx"
+ $mkvextract tracks "$src" $track:$srt_tmpfile
+ $mkvmerge -o "$dst.subs" "$dst" $idx_tmpfile
+ mv "$dst.subs" "$dst"
+
+ # Set the default subtitle track to "no subtitles" in the dst
+ $mkvpropedit "$dst" --edit track:s1 --set flag-default=0
+
+ # Concatenate the encode log to our main log file, greping out unwanted lines
+ cat $encodelog | grep -v "Encoding:" | grep -v "hb_demux_ps" >> "$logfile"
+ cat $encodelog | grep "Encoding:" | sed 's/\r/\n/g' | grep "Encoding:" | grep "ETA" | head -1 >> "$logfile"
+ cat $encodelog | grep "Encoding:" | sed 's/\r/\n/g' | grep "Encoding:" | grep "ETA" | tail -1 >> "$logfile"
+
+ # Remove intermediary file if we created one
+ if [ $keep_intermediate_files -eq 0 ]; then
+ [[ -e "$tmpdst" ]] && rm -f "$tmpdst"
+ rm "$chapter_tmpfile"
+ rm "$idx_tmpfile" "$sub_tmpfile"
+ else
+ echo "-> Keeping intermediate chapter file: $chapter_tmpfile" | tee -a "$logfile"
+ echo "-> Keeping intermediate subtitle files: $idx_tmpfile $sub_tmpfile" | tee -a "$logfile"
+ [[ -e "$tmpdst" ]] && echo "-> Keeping intermediate MKV file: $tmpdst" | tee -a "$logfile"
+ fi
+}
+
+# encode the vob file into a compressed file format using handbrake
+function encode_vob_file_handbrake {
+
+ # declare some globals
+ typeset handbrake_cli=""
+ typeset handbrake_video_encoder_opts=""
+ typeset filetype=""
+ typeset handbrake_audio_opts=""
+ typeset hb_profile=""
+ typeset SIZE=""
+ typeset AUDIO_BITRATE=""
+
+ # Set a variable that we will use later to determine if we found a handler for $profile or not
+ typeset -i found_profile=0
+
+ # Default is 2 pass mode. Profiles can override this. Command line can override this as well.
+ PASSES="-2"
+ if [ $force_onepass_mode -eq 1 ]; then
+ PASSES=""
+ fi
+
+ # Set our DRC option
+ DRC="-D $drc"
+
+ if [ $target_size -ne 0 ]; then
+ SIZE="-S $target_size"
+ fi
+
+ if [ $custom_audio_bitrate -eq 1 ]; then
+ AUDIO_BITRATE="-B $target_audio_bitrate"
+ fi
+
+ if [ $force_onepass_mode -eq 1 ]; then
+ PASSES=""
+ fi
+
+ # get our audio track from the vobfile (requires mp4 version of handbrake to extract)
+ if [[ "$vobfile" =~ /mkv/ ]]; then
+ get_subtitle_track_from_mkv "$vobfile" "$handbrake_mp4"
+ else
+ get_audio_track_from_vob "$vobfile" "$handbrake_mp4"
+ fi
+
+ # XVID profile
+ if [[ "$profile" =~ "xvid" ]]; then
+ found_profile=1
+ handbrake_cli="$handbrake_xvid"
+ final_output_file="$dest/$dvdname.avi"
+ filetype="avi"
+
+ # Very High Quality (16fps)
+ if [ "$profile" == "xvidvhq" ]; then
+ handbrake_opts[0]="-f avi"
+ handbrake_opts[1]="-b $target_video_bitrate"
+ handbrake_opts[2]="-e xvid"
+ handbrake_opts[3]="-T"
+ handbrake_opts[4]="-5"
+ handbrake_opts[5]="-8"
+ fi
+ # High Quality (20fps)
+ if [ "$profile" == "xvidhq" ]; then
+ handbrake_opts[0]="-f avi"
+ handbrake_opts[1]="-b $target_video_bitrate"
+ handbrake_opts[2]="-e ffmpeg"
+ handbrake_opts[3]="-T"
+ handbrake_opts[4]="-5"
+ fi
+ # Fast (28fps)
+ if [ "$profile" == "xvid" ]; then
+ handbrake_opts[0]="-f avi"
+ handbrake_opts[1]="-b $target_video_bitrate"
+ handbrake_opts[2]="-e ffmpeg"
+ handbrake_opts[3]="-T"
+ fi
+ fi
+
+ # MP4 profile
+ if [[ "$profile" =~ "mp4" ]]; then
+ found_profile=1
+ handbrake_cli="$handbrake_mp4"
+ final_output_file="$dest/$dvdname.mp4"
+ PASSES="$PASSES -T"
+
+ # Handle custom parameter overrides
+ if [ $custom_video_bitrate == 1 ]; then
+ handbrake_opts[0]="-b $target_video_bitrate"
+ fi
+ if [ $custom_audio_2ch == 0 ]; then
+ audio_2ch=0
+ fi
+ if [ $custom_audio_6ch == 0 ]; then
+ audio_6ch=0
+ fi
+
+ # Very High Quality
+ if [ "$profile" == "mp4vhq" ]; then
+ profile="hb_High_Profile"
+ fi
+ # High Quality
+ if [ "$profile" == "mp4hq" ]; then
+ profile="hb_Normal"
+ fi
+ # Fast
+ if [ "$profile" == "mp4" ]; then
+ profile="hb_Classic"
+ fi
+ fi
+
+ # MKV profile
+ if [[ "$profile" =~ "mkv" ]]; then
+ found_profile=1
+ handbrake_cli="$handbrake_mp4"
+ final_output_file="$dest/$dvdname.mkv"
+ PASSES=""
+
+ # Handle custom parameter overrides
+ if [ $custom_video_bitrate == 1 ]; then
+ handbrake_opts[0]="-b $target_video_bitrate"
+ fi
+ if [ $custom_audio_2ch == 0 ]; then
+ audio_2ch=0
+ fi
+ if [ $custom_audio_6ch == 0 ]; then
+ audio_6ch=0
+ fi
+
+ # Very High Quality
+ if [ "$profile" == "mkvvhq" ]; then
+ handbrake_opts[0]="-q 0.95"
+ fi
+ # High Quality
+ if [ "$profile" == "mkvhq" ]; then
+ handbrake_opts[0]="-q 0.90"
+ fi
+ # Fast
+ if [ "$profile" == "mkv" ]; then
+ handbrake_opts[0]="-q 0.85"
+ fi
+
+ # Common options to all profiles above
+ handbrake_opts[1]="--strict-anamorphic"
+ handbrake_opts[2]="--crop 0:0:0:0"
+
+ fi
+
+ # iphone and ipod MP4 profiles
+ if [ "$profile" == "iphone" ] || [ "$profile" == "ipod" ]; then
+ found_profile=1
+ handbrake_cli="$handbrake_mp4"
+ final_output_file="$dest/$dvdname.mp4"
+ PASSES=""
+
+ # Handle custom parameter overrides
+ if [ $custom_video_bitrate == 1 ]; then
+ handbrake_opts[0]="-b $target_video_bitrate"
+ fi
+ if [ $custom_audio_2ch == 0 ]; then
+ audio_2ch=0
+ fi
+ if [ $custom_audio_6ch == 0 ]; then
+ audio_6ch=0
+ fi
+
+ # iphone
+ if [ "$profile" == "iphone" ]; then
+ profile="hb_iPhone_&_iPod_Touch"
+ fi
+ # ipod
+ if [ "$profile" == "ipod" ]; then
+ profile="hb_iPod"
+ fi
+
+ fi
+
+ # Predefined Handbrake Profile Handling
+ if [[ "$profile" =~ "hb" ]]; then
+ found_profile=1
+ handbrake_cli="$handbrake_mp4"
+ final_output_file="$dest/$dvdname.mp4"
+
+ # Handle custom parameter overrides
+ if [ $custom_video_bitrate == 1 ]; then
+ handbrake_opts[0]="-b $target_video_bitrate"
+ fi
+ if [ $custom_audio_2ch == 0 ]; then
+ audio_2ch=0
+ fi
+ if [ $custom_audio_6ch == 0 ]; then
+ audio_6ch=0
+ fi
+
+ # extract the HandBrake Profile name from $profile
+ hb_profile=`echo "$profile" | sed 's/hb_//g' | sed 's/_/ /g'`
+ fi
+
+ # Make sure we found a handler for the given profile
+ if [ $found_profile -eq 0 ]; then
+ fatal_and_exit "-E- Unable to find a profile handler for profile: $profile"
+ fi
+
+ # setup our audio option
+ if [ $audio_2ch -eq 1 ] && [ $audio_6ch -eq 1 ]; then
+ handbrake_audio_opts="-E faac,ac3 -6 dpl2,auto"
+ fi
+ if [ $audio_6ch -eq 1 ] && [ $audio_2ch -eq 0 ]; then
+ handbrake_audio_opts="-E ac3 -6 auto"
+ fi
+ if [ $audio_2ch -eq 1 ] && [ $audio_6ch -eq 0 ]; then
+ handbrake_audio_opts="-E faac -6 dpl2"
+ fi
+ if [ -n "$track" ]; then
+ handbrake_audio_opts="$handbrake_audio_opts -a $track"
+ fi
+
+ # Convert our array of opts into a string
+ for OPTS in "${video_encoder_opts[@]}"; do
+ handbrake_video_encoder_opts="$handbrake_video_encoder_opts:$OPTS"
+ done
+ if [ -n "$handbrake_video_encoder_opts" ]; then
+ handbrake_video_encoder_opts="-x $handbrake_video_encoder_opts"
+ fi
+ for OPTS in "${handbrake_opts[@]}"; do
+ handbrake_cmd_line_opts="$handbrake_cmd_line_opts $OPTS"
+ done
+
+ # Append "global" command line options
+ handbrake_cmd_line_opts="$handbrake_cmd_line_opts -v 1 -m"
+ handbrake_cmd_line_opts="$handbrake_cmd_line_opts $PASSES"
+ handbrake_cmd_line_opts="$handbrake_cmd_line_opts $DRC"
+ handbrake_cmd_line_opts="$handbrake_cmd_line_opts $SCALE"
+ handbrake_cmd_line_opts="$handbrake_cmd_line_opts $SIZE"
+ handbrake_cmd_line_opts="$handbrake_cmd_line_opts $AUDIO_BITRATE"
+
+ # Execute the handbrake command to encode the video
+ # I have to copy-n-paste the code below to handle the 2 conditions, 1) hb_profile (mp4) 2) no hb_profile (xvid)
+ # The problem is the -Z "$hb_profile" option. I have to quote the "$hb_profile" due to spaces in it, forcing me to call it out explicity.
+ if [ -n "$hb_profile" ]; then
+ echo -e "\n Encoding: $handbrake_cli -i \"$vobfile\" -o \"$final_output_file\" -Z \"$hb_profile\" $handbrake_cmd_line_opts $handbrake_audio_opts $handbrake_video_encoder_opts >> $encodelog 2>&1" >> "$logfile"
+ $handbrake_cli -i "$vobfile" -o "$final_output_file" -Z "$hb_profile" $handbrake_cmd_line_opts $handbrake_audio_opts $handbrake_video_encoder_opts >> $encodelog 2>&1
+ handbrake_retval=$?
+ else
+ echo -e "\n Encoding: $handbrake_cli -i \"$vobfile\" -o \"$final_output_file\" $handbrake_cmd_line_opts $handbrake_audio_opts $handbrake_video_encoder_opts >> $encodelog 2>&1" >> "$logfile"
+ $handbrake_cli -i "$vobfile" -o "$final_output_file" $handbrake_cmd_line_opts $handbrake_audio_opts $handbrake_video_encoder_opts >> $encodelog 2>&1
+ handbrake_retval=$?
+ fi
+ if [ $handbrake_retval != 0 ]; then
+ fatal_and_exit "-E- Unhandled handbrake error"
+ fi
+
+
+ # SRC = ISO and FINAL = MP4
+ # Extract the chapters from the ISO/VOB so we can add them to the MP4 file.
+ # We can only do this if we have an ISO file and we made an MP4 file.
+ if [[ "$final_output_file" =~ "mp4" ]] && [[ -e "$isofile" ]]; then
+ chapter_tmpfile="$tmpdir/$dvdname.chapters"
+ $dvdxchap -t $feature_title "$isofile" > "$chapter_tmpfile"
+ $mp4box -chap "$chapter_tmpfile" "$final_output_file"
+
+ # We could also add subtitles, but we would need to follow this guide to do it:
+ # http://ubuntuforums.org/showthread.php?t=1253635
+ # http://en.gentoo-wiki.com/wiki/Ripping_DVD_to_Matroska_and_H.264
+
+ fi
+
+ # SRC = ISO and FINAL = MKV
+ if [[ "$final_output_file" =~ "mkv" ]] && [[ -e "$isofile" ]]; then
+ chapter_tmpfile="$tmpdir/$dvdname.chapters"
+ $dvdxchap -t $feature_title "$isofile" > "$chapter_tmpfile"
+ $mkvpropedit -c "$chapter_tmpfile" "$final_output_file"
+ fi
+
+ # SRC = MKV and FINAL = MP4
+ if [[ "$final_output_file" =~ "mp4" ]] && [[ "$vobfile" =~ "mkv" ]]; then
+ # Extract the chapters from the src and apply to the dst
+ chapter_tmpfile="$tmpdir/$dvdname.xml"
+ $mkvextract chapters "$vobfile" > "$chapter_tmpfile"
+ $mp4box -chap "$chapter_tmpfile" "$final_output_file"
+ fi
+
+ # SRC = MKV and FINAL = MKV
+ # If our original src file was an MKV, extract the chapters and subtitles from it
+ if [[ "$final_output_file" =~ "mkv" ]] && [[ "$vobfile" =~ "mkv" ]]; then
+ # Extract the chapters from the src and apply to the dst
+ chapter_tmpfile="$tmpdir/$dvdname.xml"
+ $mkvextract chapters "$vobfile" > "$chapter_tmpfile"
+ $mkvpropedit -c "$chapter_tmpfile" "$final_output_file"
+
+ # find out what our default_alang subtitle track is in the src
+ get_subtitle_track_from_mkv "$vobfile" "$handbrake_mp4"
+
+ # Extract the subtitles from the src and apply to the dst
+ srt_tmpfile="$tmpdir/$dvdname.srt"
+ sub_tmpfile="$tmpdir/$dvdname.sub"
+ idx_tmpfile="$tmpdir/$dvdname.idx"
+ $mkvextract tracks "$vobfile" $track:$srt_tmpfile
+ $mkvmerge -o "$final_output_file.subs" "$final_output_file" "$idx_tmpfile"
+ mv "$final_output_file.subs" "$final_output_file"
+
+ # Set the default subtitle track to "no subtitles" in the dst
+ $mkvpropedit "$final_output_file" --edit track:s1 --set flag-default=0
+ fi
+
+ # Remove intermediary file if we created one
+ if [ $keep_intermediate_files -eq 0 ]; then
+ [[ -e "$chapter_tmpfile" ]] && rm "$chapter_tmpfile"
+ [[ -e "$idx_tmpfile" ]] && rm "$idx_tmpfile"
+ [[ -e "$sub_tmpfile" ]] && rm "$sub_tmpfile"
+ else
+ [[ -e "$chapter_tmpfile" ]] && echo "-> Keeping intermediate chapter file: $chapter_tmpfile" | tee -a "$logfile"
+ [[ -e "$idx_tmpfile" ]] && echo "-> Keeping intermediate subtitle files: $idx_tmpfile $sub_tmpfile" | tee -a "$logfile"
+ fi
+
+ # Concatenate the encode log to our main log file, greping out unwanted lines
+ cat $encodelog | grep -v "Encoding:" | grep -v "hb_demux_ps" >> "$logfile"
+ cat $encodelog | grep "Encoding:" | sed 's/\r/\n/g' | grep "Encoding:" | grep "ETA" | head -1 >> "$logfile"
+ cat $encodelog | grep "Encoding:" | sed 's/\r/\n/g' | grep "Encoding:" | grep "ETA" | tail -1 >> "$logfile"
+}
+
+# encode the vob file into a compressed file format using mencoder
+function encode_vob_file_mencoder {
+
+ # Set a variable that we will use later to determine if we found a handler for $profile or not
+ typeset -i found_profile=0
+
+ # For a given profile, to override the 2 pass behavior to be single pass,
+ # simply set the PASSES variable below to "2" instead of "1 2" inside your profile handler.
+ # It indicates which PASS numbers to loop over. PASSES="2" means just do pass 2 => single pass mode.
+ PASSES="1 2"
+
+ # Declare our default 2 pass variables
+ passlogfile_opt="-passlogfile $passlogfile"
+ pass_opt="pass=%PASS"
+
+ # Check the global force_onepass_mode. If it is set, change our variables appropriately
+ # to force 1-pass encoding across all profiles.
+ if [ $force_onepass_mode -eq 1 ]; then
+ PASSES="2"
+ passlogfile_opt=""
+ pass_opt=""
+ fi
+
+ # XVID profile
+ if [[ "$profile" =~ "xvid" ]]; then
+ found_profile=1
+ final_output_file="$dest/$dvdname.avi"
+ mencoder_general_opts="$lang_opts $passlogfile_opt"
+ mencoder_output_opts="-ofps 30000/1001 -ffourcc DIVX"
+ mencoder_video_filter_opts="-vf pullup,softskip,hqdn3d=2:1:2$CROP$SCALE"
+ mencoder_video_encoder_opts="-ovc xvid -xvidencopts $pass_opt"
+
+ # Very High Quality (16fps)
+ if [ "$profile" == "xvidvhq" ]; then
+ video_encoder_opts[0]="bitrate=$target_video_bitrate"
+ video_encoder_opts[1]="threads=$mencoder_threads"
+ video_encoder_opts[2]="chroma_opt"
+ video_encoder_opts[3]="vhq=4"
+ video_encoder_opts[4]="bvhq=1"
+ video_encoder_opts[5]="quant_type=mpeg"
+ video_encoder_opts[6]="autoaspect"
+ fi
+ # High Quality (20fps)
+ if [ "$profile" == "xvidhq" ]; then
+ video_encoder_opts[0]="bitrate=$target_video_bitrate"
+ video_encoder_opts[1]="threads=$mencoder_threads"
+ video_encoder_opts[2]="chroma_opt"
+ video_encoder_opts[3]="vhq=2"
+ video_encoder_opts[4]="bvhq=1"
+ video_encoder_opts[5]="quant_type=mpeg"
+ video_encoder_opts[6]="autoaspect"
+ fi
+ # Fast (28fps)
+ if [ "$profile" == "xvid" ]; then
+ video_encoder_opts[0]="bitrate=$target_video_bitrate"
+ video_encoder_opts[1]="threads=$mencoder_threads"
+ video_encoder_opts[2]="vhq=0"
+ video_encoder_opts[3]="turbo"
+ video_encoder_opts[4]="autoaspect"
+ fi
+
+ for OPTS in "${video_encoder_opts[@]}"; do
+ mencoder_video_encoder_opts="$mencoder_video_encoder_opts:$OPTS"
+ done
+
+ if [ $audio_2ch -eq 0 ]; then
+ # These options produce good 6 channel audio for linux and windows
+ mencoder_audio_opts="-oac copy"
+ # There are 3 different ways to specify 6 channel encoding. We'll try the other ones in order if one of them fails.
+ mencoder_audioch_opts[0]="-channels 6 -af channels=6"
+ mencoder_audioch_opts[1]="-af channels=6"
+ mencoder_audioch_opts[2]=""
+ else
+ # These options produce good 2 channel audio for linux and windows (including the internal mythvideo player)
+ mencoder_audio_opts="-oac mp3lame -lameopts cbr:br=$target_audio_bitrate"
+ mencoder_audioch_opts[0]=""
+ fi
+
+ fi
+
+ # iphone and ipod MP4 profiles
+ if [ "$profile" == "iphone" ] || [ "$profile" == "ipod" ]; then
+ found_profile=1
+ if [ "$profile" == "iphone" ]; then
+ # SCALE: 480x320
+ # scale width to 480, set height appropriately, but keep a multiple of 16
+ #SCALE=",scale=480:-10"
+ # scale the video down however far is necessary to fit in 480x320
+ SCALE=",dsize=480:320:0,scale=-8:-8"
+ else
+ # SCALE: 320x240
+ # scale width to 320, set height appropriately, but keep a multiple of 16
+ #SCALE=",scale=320:-10"
+ # scale the video down however far is necessary to fit in 320x240
+ SCALE=",dsize=320:240:0,scale=-8:-8"
+ fi
+ final_output_file="$dest/$dvdname.mp4"
+ mencoder_general_opts="$lang_opts $passlogfile_opt"
+ mencoder_output_opts="-ofps 30000/1001 -sws 9 -of lavf -lavfopts format=mp4"
+ mencoder_video_filter_opts="-vf harddup$CROP$SCALE";
+ mencoder_video_encoder_opts="-ovc x264 -x264encopts $pass_opt"
+ video_encoder_opts[0]="bitrate=$target_video_bitrate"
+ video_encoder_opts[1]="threads=$mencoder_threads"
+ video_encoder_opts[2]="vbv_maxrate=1500"
+ video_encoder_opts[3]="vbv_bufsize=2000"
+ video_encoder_opts[4]="nocabac"
+ video_encoder_opts[5]="me=umh"
+ video_encoder_opts[6]="subq=6"
+ video_encoder_opts[7]="frameref=6"
+ video_encoder_opts[8]="trellis=1"
+ video_encoder_opts[9]="level_idc=30"
+ video_encoder_opts[10]="global_header"
+ video_encoder_opts[11]="bframes=0"
+ video_encoder_opts[12]="partitions=all"
+ for OPTS in "${video_encoder_opts[@]}"; do
+ mencoder_video_encoder_opts="$mencoder_video_encoder_opts:$OPTS"
+ done
+
+ mencoder_audio_opts="-oac faac -faacopts mpeg=4:object=2:br=$target_audio_bitrate:raw"
+ mencoder_audioch_opts[0]="-channels 2 -srate 48000"
+ fi
+
+ if [ $found_profile -eq 0 ]; then
+ fatal_and_exit "-E- Unable to find a profile handler for profile: $profile"
+ fi
+
+ # Do not edit this line. $mencoder_video_encoder_opts must be last
+ mencoder_opts="$mencoder_general_opts $mencoder_output_opts $mencoder_audio_opts $mencoder_video_filter_opts $mencoder_video_encoder_opts"
+ mencoder_retval=0
+
+ for PASS in $PASSES
+ do
+ # Set some options based on which pass we are in
+ mencoder_opts_for_pass=$(echo "$mencoder_opts" | sed "s,%PASS,$PASS,g")
+ [ $PASS -eq 1 ] && mencoder_opts_for_pass="$mencoder_opts_for_pass:turbo"
+ [ $PASS -eq 1 ] && output_file="/dev/null"
+ [ $PASS -eq 2 ] && output_file="$final_output_file"
+
+ # It's possible that the audio channel encoding may not work. Cycle through all our different audioch_opts until we find one that works.
+ for CH_OPTS in "${mencoder_audioch_opts[@]}";
+ do
+ echo -e " Encoding pass $PASS"
+ echo -e "\n Encoding pass $PASS: mencoder $CH_OPTS $mencoder_opts_for_pass \"$vobfile\" -o \"$output_file\" >> $encodelog 2>&1" >> "$logfile"
+ mencoder $CH_OPTS $mencoder_opts_for_pass "$vobfile" -o "$output_file" > $encodelog 2>&1
+ mencoder_retval=$?
+ grep -q "\[channels\] Invalid" $encodelog
+ if [ $? != 0 ]; then
+ break;
+ else
+ echo -e "\n-W- Audio channel encoding error. Falling back to next audio channel encoding scheme." >> "$logfile"
+ fi
+ done
+
+ if [ $mencoder_retval != 0 ]; then
+ fatal_and_exit "-E- Unhandled mencoder error"
+ fi
+
+ # Concatenate the encode log to our main log file, greping out unwanted lines
+ cat $encodelog | grep -v "^Pos:" | grep -v "duplicate" >> "$logfile"
+
+ done
+}
+
+function make_dvd_mkv_image {
+ dstmkv="$1"
+ srctype="$2"
+ srcname="$3"
+ dstdir=${dstmkv%.[^.]*}
+ ((min_length = minimum_feature_title_length * 60))
+
+ echo -e "\n Ripping: $makemkv --minlength=$min_length --decrypt --progress=-same $srctype:$srcname all $dstdir"
+ mkdir -p "$dstdir"
+ $makemkv mkv --minlength=$min_length --decrypt --progress=-same $srctype:$srcname all $dstdir 2>&1 | tee -a "$ddrescuelog"
+ makemkv_retval=$?
+
+ if [ $makemkv_retval != 0 ]; then
+ fatal_and_exit "-E- Unhandled makemkv error"
+ fi
+
+ # Move the largest created MKV file into place
+ # There might be multiple ones, so just grab the largest one
+ largest_mkv_file=`/bin/ls -rS "$dstdir"/*.mkv | head -1`
+ echo -e "\n Moving largest mkv file $largest_mkv_file -> $dstmkv\n" | tee -a "$ddrescuelog"
+ mv "$largest_mkv_file" "$dstmkv"
+
+ # Move all of the created MKV file into place
+ #echo "\n" | tee -a "$ddrescuelog"
+ #dstfile=${dstmkv%.[^.]*}
+ #typeset -i num=0
+ #for i in `/bin/ls -1 "$dstdir"/*.mkv`; do
+ #echo -e " Moving $i -> $dstfile.$num.mkv" | tee -a "$ddrescuelog"
+ #mv "$i" "$dstfile.$num.mkv"
+ #((num = num + 1 ))
+ #done
+ #echo "\n" | tee -a "$ddrescuelog"
+
+ if [ $? != 0 ]; then
+ fatal_and_exit "-E- Unhandled mv error"
+ fi
+ if [ $keep_intermediate_files -eq 0 ]; then
+ [[ -d "$dstdir" ]] && rm -rf "$dstdir"
+ fi
+
+ # Concatenate the encode log to our main log file, greping out unwanted lines
+ cat "$ddrescuelog" | grep -v "Current progress:" >> "$logfile"
+}
+
+function make_dvd_mkv_image_from_folder {
+ src="$1"
+ dst="$2"
+ handle_error=$3
+ dstdir=${dst%.[^.]*}
+ make_dvd_mkv_image "$dst" "file" "$src"
+}
+