dvd-sector-copy.c: Truncate the event list before processing a lost `stop'.
[dvdrip] / dvdrip
diff --git a/dvdrip b/dvdrip
index 4137495..9634fe0 100755 (executable)
--- a/dvdrip
+++ b/dvdrip
@@ -5,18 +5,22 @@ dev=${DVDRIP_DEVICE-/dev/dvd}
 tmp=${DVDRIP_TMPDIR-${HOME?}/tmp/dvdrip}
 archive=${DVDRIP_ARCHIVE-jem.distorted.org.uk:/mnt/dvd/archive}
 : ${DVD_SECTOR_COPY=dvd-sector-copy}
+: ${DVD_ID=dvd-id}
 : ${DVDRIP_UPLOAD=dvdrip-upload}
-backup=nil eject=nil force=nil retry=nil verbose=nil bogus=nil
+backup=nil ding=nil eject=nil force=nil retry=nil verbose=nil bogus=nil
+unset params
 usage () {
   cat <<EOF
-usage: $prog [-efrv] [-D DEV] [-a ARCH] [-t TMP] TITLE
+usage: $prog [-defrv] [-D DEV] [-a ARCH] [-t TMP] TITLE
 EOF
 }
-while getopts "hD:a:efrt:v" opt; do
+while getopts "hB:D:a:defrt:v" opt; do
   case $opt in
     h) usage; exit 0 ;;
+    B) params=${params+$params,}$OPTARG ;;
     D) dev=$OPTARG ;;
     a) archive=$OPTARG ;;
+    d) ding=t ;;
     e) eject=t ;;
     f) force=t ;;
     r) retry=t ;;
@@ -26,10 +30,7 @@ while getopts "hD:a:efrt:v" opt; do
   esac
 done
 shift $(( $OPTIND - 1 ))
-case $# in
-  1) title=$1 ;;
-  *) bogus=t ;;
-esac
+case $# in 1) title=$1 ;; *) bogus=t ;; esac
 case $bogus in t) usage >&2; exit 2 ;; esac
 case $verbose in t) set -x ;; esac
 case $archive in
@@ -75,6 +76,32 @@ case $rc,$force in
   0,t) warn "output file already exists; will overwrite" ;;
 esac
 
+mkdir -p "$tmp/$tag"
+
+discid=$("$DVD_ID" -I "$dev")
+if [ -f "$tmp/$tag/discid" ]; then
+  read oldid <"$tmp/$tag/discid"
+  case $force,$oldid in
+    t,"$discid" | nil,"$discid")
+      ;;
+    nil,*)
+      fail "discid mismatch: expected \`$oldid' but drive has \`$discid'"
+      ;;
+    t,*)
+      warn "discid mismatch: expected \`$oldid' but drive has \`$discid'; continuing anway"
+      ;;
+  esac
+fi
+info "copying \`$discid'"
+echo "$discid" >"$tmp/$tag/discid.new"
+mv "$tmp/$tag/discid.new" "$tmp/$tag/discid"
+
+if [ -b "$dev" ]; then msz=$(blockdev --getsize64 "$dev")
+else msz=nil; fi
+
+echo "$dev" >"$tmp/$tag/device.new"
+mv "$tmp/$tag/device.new" "$tmp/$tag/device"
+
 accumulate_badblocks () {
   if [ -f "$tmp/$tag/badblocks.new" ]; then
     if [ ! -f "$tmp/$tag/badblocks" ]; then
@@ -86,7 +113,6 @@ accumulate_badblocks () {
 }
 
 set --
-mkdir -p "$tmp/$tag"
 any=nil
 for i in "$tmp/$tag/dest.new" "$tmp/$tag/dest" "$tmp/$tag/dest.seen"; do
   if [ -f "$tmp/$tag/dest.new" ]; then any=t; fi
@@ -94,6 +120,14 @@ done
 case $any in
   nil) printf "%s\n" "$title.iso" >"$tmp/$tag/dest.new" ;;
 esac
+case $eject in
+  t) touch "$tmp/$tag/eject" ;;
+  nil) rm -f "$tmp/$tag/eject" ;;
+esac
+case $ding in
+  t) touch "$tmp/$tag/ding" ;;
+  nil) rm -f "$tmp/$tag/ding" ;;
+esac
 
 accumulate_badblocks
 case $retry in
@@ -112,17 +146,40 @@ case $retry in
     ;;
 esac
 if [ ! -f "$tmp/$tag/iso" ]; then
-  run "$DVD_SECTOR_COPY" -cs -b"$tmp/$tag/badblocks.new" "$@" \
-      "$dev" "$tmp/$tag/iso.new"
+  run "$DVD_SECTOR_COPY" -cs ${params+"-B$params"} \
+      -b"$tmp/$tag/badblocks.new" "$@" "$dev" "$tmp/$tag/iso.new"
   run mv "$tmp/$tag/iso.new" "$tmp/$tag/iso"
   accumulate_badblocks
+  rm -f "$tmp/$tag/device"
   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
+  case $msz in
+    nil) ;;
+    *)
+      newmsz=$(blockdev --getsize64 "$dev")
+      case $newmsz in
+       $msz) ;;
+       *) fail "medium size changed ($msz -> $newmsz): try again" ;;
+      esac
+      ;;
+  esac
 fi
 
+rm -f "$tmp/$tag/device"
 run mv "$tmp/$tag/dest.new" "$tmp/$tag/dest"
+if [ -f "$tmp/$tag/eject" ]; then eject=t; else eject=nil; fi
+if [ -f "$tmp/$tag/ding" ]; then ding=t; else ding=nil; fi
 run "$DVDRIP_UPLOAD"
 case $eject in t) run eject "$dev" ;; esac
-printf "\a"
+case $ding in
+  t)
+    if [ -t 1 ]; then exec 3>&1
+    elif [ -t 2 ]; then exec 3>&2
+    else exec 3>/dev/tty
+    fi
+    printf "\a" >&3
+    exec 3>&-
+    ;;
+esac