dvdrip: Add `-r' option to retry the failed blocks.
authorMark Wooding <mdw@distorted.org.uk>
Thu, 24 Feb 2022 17:02:51 +0000 (17:02 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Thu, 24 Feb 2022 17:02:51 +0000 (17:02 +0000)
dvdrip

diff --git a/dvdrip b/dvdrip
index ad7a280..c64487f 100755 (executable)
--- a/dvdrip
+++ b/dvdrip
@@ -6,14 +6,15 @@ tmp=${DVDRIP_TMPDIR-${HOME?}/tmp/dvdrip}
 archive=${DVDRIP_ARCHIVE-jem.distorted.org.uk:/mnt/dvd/archive}
 : ${DVD_SECTOR_COPY=dvd-sector-copy}
 : ${DVDRIP_UPLOAD=dvdrip-upload}
-backup=nil eject=nil force=nil verbose=nil bogus=nil; unset dir sub n label
+backup=nil eject=nil force=nil retry=nil verbose=nil bogus=nil
+unset dir sub n label
 usage () {
   cat <<EOF
-usage: $prog [-befv] [-D DEV] [-a ARCH] [-d DIR]
+usage: $prog [-befrv] [-D DEV] [-a ARCH] [-d DIR]
        [-l LABEL] [-n N] [-s SUB] [-t TMP] TITLE
 EOF
 }
-while getopts "hD:a:bd:efl:n:s:t:v" opt; do
+while getopts "hD:a:bd:efl:n:rs:t:v" opt; do
   case $opt in
     h) usage; exit 0 ;;
     D) dev=$OPTARG ;;
@@ -24,6 +25,7 @@ while getopts "hD:a:bd:efl:n:s:t:v" opt; do
     f) force=t ;;
     l) label=$OPTARG ;;
     n) n=$OPTARG ;;
+    r) retry=t ;;
     s) sub=$OPTARG ;;
     t) tmp=$OPTARG ;;
     v) verbose=t ;;
@@ -127,6 +129,7 @@ accumulate_badblocks () {
   fi
 }
 
+set --
 mkdir -p "$tmp/$tag"
 any=nil
 for i in "$tmp/$tag/dest.new" "$tmp/$tag/dest" "$tmp/$tag/dest.seen"; do
@@ -149,19 +152,35 @@ case $backup in
     fi
     ;;
   nil)
+    accumulate_badblocks
+    case $retry in
+      t)
+       if [ -f "$tmp/$tag/badblocks.retry" ]; then
+         :
+       elif [ -f "$tmp/$tag/badblocks" ]; then
+         run mv "$tmp/$tag/badblocks" "$tmp/$tag/badblocks.retry"
+       else
+         fail "no blocks to retry"
+       fi
+       set -- "$@" -R"$tmp/$tag/badblocks.retry"
+       if [ -f "$tmp/$tag/iso" ]; then
+         mv "$tmp/$tag/iso" "$tmp/$tag/iso.new"
+       fi
+       ;;
+    esac
     if [ ! -f "$tmp/$tag/iso" ]; then
-      accumulate_badblocks
-      run "$DVD_SECTOR_COPY" -c -b"$tmp/$tag/badblocks.new" \
+      run "$DVD_SECTOR_COPY" -c -b"$tmp/$tag/badblocks.new" "$@" \
          "$dev" "$tmp/$tag/iso.new"
       run mv "$tmp/$tag/iso.new" "$tmp/$tag/iso"
       accumulate_badblocks
+      case $retry in t) rm -f "$tmp/$tag/badblocks.retry" ;; esac
       if [ -f "$tmp/$tag/badblocks" ]; then
        fail "bad sectors found: check \`$tmp/$tag/iso', run again if ok"
       fi
     fi
     ;;
 esac
-mv "$tmp/$tag/dest.new" "$tmp/$tag/dest"
+run mv "$tmp/$tag/dest.new" "$tmp/$tag/dest"
 run "$DVDRIP_UPLOAD"
 case $eject in t) run eject "$dev" ;; esac
 printf "\a"