dvd-cache-keys.c: Pass index and titleness as unsigned.
[dvdrip] / dvdrip
CommitLineData
7fbe0fb9
MW
1#! /bin/bash -e
2
3prog=${0##*/}
4dev=${DVDRIP_DEVICE-/dev/dvd}
5tmp=${DVDRIP_TMPDIR-${HOME?}/tmp/dvdrip}
6archive=${DVDRIP_ARCHIVE-jem.distorted.org.uk:/mnt/dvd/archive}
f49b5c86
MW
7: ${DVD_SECTOR_COPY=dvd-sector-copy}
8: ${DVDRIP_UPLOAD=dvdrip-upload}
dc53ebfa
MW
9backup=nil ding=nil eject=nil force=nil retry=nil verbose=nil bogus=nil
10unset params
7fbe0fb9
MW
11usage () {
12 cat <<EOF
dc53ebfa 13usage: $prog [-defrv] [-D DEV] [-a ARCH] [-t TMP] TITLE
7fbe0fb9
MW
14EOF
15}
dc53ebfa 16while getopts "hB:D:a:defrt:v" opt; do
7fbe0fb9
MW
17 case $opt in
18 h) usage; exit 0 ;;
dc53ebfa 19 B) params=${params+$params,}$OPTARG ;;
7fbe0fb9
MW
20 D) dev=$OPTARG ;;
21 a) archive=$OPTARG ;;
dc53ebfa 22 d) ding=t ;;
7fbe0fb9
MW
23 e) eject=t ;;
24 f) force=t ;;
192df729 25 r) retry=t ;;
7fbe0fb9
MW
26 t) tmp=$OPTARG ;;
27 v) verbose=t ;;
28 *) bogus=t ;;
29 esac
30done
31shift $(( $OPTIND - 1 ))
822ac8a8 32case $# in 1) title=$1 ;; *) bogus=t ;; esac
7fbe0fb9
MW
33case $bogus in t) usage >&2; exit 2 ;; esac
34case $verbose in t) set -x ;; esac
35case $archive in
36 *:*) archhost=${archive%%:*} archpath=${archive#*:} ;;
37 *) unset archhost; archpath=$archive ;;
38esac
39
40notify () {
41 colour=$1 message=$2
42 echo "$(tput bold; tput setaf $colour)$message$(tput sgr0; tput op)"
43}
44fail () { notify 1 "!!! $*"; exit 2; }
45warn () { notify 5 "??? $*"; }
46info () { notify 6 "--- $*"; }
47run_setrc () {
48 notify 2 "+++ $*";
49 set +e; nice "$@"; rc=$?; set -e
50}
51run () { run_setrc "$@"; case $rc in 0) ;; *) fail "$1: exit $rc" ;; esac; }
52
53archdo () {
54 op=$1; shift
55 case ${archhost+t} in
56 t)
57 qq=
58 for a in "$@"; do
59 qq="${qq:+$qq }'${a//\'/"'\\''"}'" #" # emacs is confused
60 done
61 "$op" ssh "$archhost" "$qq"
62 ;;
63 *)
64 "$op" "$@"
65 ;;
66 esac
67}
68archrun () { archdo run "$@"; }
69
59f1250f 70tag=${title//\//_}
7fbe0fb9 71
59f1250f 72archdo run_setrc test -f "$archpath/$title.iso"
7fbe0fb9
MW
73case $rc,$force in
74 0,nil) fail "output file already exists" ;;
75 0,t) warn "output file already exists; will overwrite" ;;
76esac
77
dc53ebfa
MW
78mkdir -p "$tmp/$tag"
79
80discid=$(dvd-id "$dev")
81if [ -f "$tmp/$tag/discid" ]; then
82 read oldid <"$tmp/$tag/discid"
83 case $force,$oldid in
84 t,"$discid" | nil,"$discid")
85 ;;
86 nil,*)
87 fail "discid mismatch: expected \`$oldid' but drive has \`$discid'"
88 ;;
89 t,*)
90 warn "discid mismatch: expected \`$oldid' but drive has \`$discid'; continuing anway"
91 ;;
92 esac
93fi
94info "copying \`$discid'"
95echo "$discid" >"$tmp/$tag/discid.new"
96mv "$tmp/$tag/discid.new" "$tmp/$tag/discid"
97
b1a4618a
MW
98accumulate_badblocks () {
99 if [ -f "$tmp/$tag/badblocks.new" ]; then
100 if [ ! -f "$tmp/$tag/badblocks" ]; then
101 { echo "## bad-blocks region map"; echo; } >"$tmp/$tag/badblocks"
102 fi
103 sed -n "/^[^#]/p" "$tmp/$tag/badblocks.new" >>"$tmp/$tag/badblocks"
104 rm "$tmp/$tag/badblocks.new"
105 fi
106}
107
192df729 108set --
861c3824
MW
109any=nil
110for i in "$tmp/$tag/dest.new" "$tmp/$tag/dest" "$tmp/$tag/dest.seen"; do
111 if [ -f "$tmp/$tag/dest.new" ]; then any=t; fi
112done
113case $any in
59f1250f 114 nil) printf "%s\n" "$title.iso" >"$tmp/$tag/dest.new" ;;
861c3824 115esac
dc53ebfa
MW
116case $eject in
117 t) touch "$tmp/$tag/eject" ;;
118 nil) rm -f "$tmp/$tag/eject" ;;
119esac
120case $ding in
121 t) touch "$tmp/$tag/ding" ;;
122 nil) rm -f "$tmp/$tag/ding" ;;
123esac
59f1250f
MW
124
125accumulate_badblocks
126case $retry in
7fbe0fb9 127 t)
59f1250f
MW
128 if [ -f "$tmp/$tag/badblocks.retry" ]; then
129 :
130 elif [ -f "$tmp/$tag/badblocks" ]; then
131 run mv "$tmp/$tag/badblocks" "$tmp/$tag/badblocks.retry"
132 else
133 fail "no blocks to retry"
7fbe0fb9 134 fi
59f1250f
MW
135 set -- "$@" -R"$tmp/$tag/badblocks.retry"
136 if [ -f "$tmp/$tag/iso" ]; then
137 mv "$tmp/$tag/iso" "$tmp/$tag/iso.new"
7fbe0fb9
MW
138 fi
139 ;;
140esac
59f1250f 141if [ ! -f "$tmp/$tag/iso" ]; then
dc53ebfa
MW
142 run "$DVD_SECTOR_COPY" -cs ${params+"-B$params"} \
143 -b"$tmp/$tag/badblocks.new" "$@" "$dev" "$tmp/$tag/iso.new"
59f1250f
MW
144 run mv "$tmp/$tag/iso.new" "$tmp/$tag/iso"
145 accumulate_badblocks
146 case $retry in t) rm -f "$tmp/$tag/badblocks.retry" ;; esac
147 if [ -f "$tmp/$tag/badblocks" ]; then
148 fail "bad sectors found: check \`$tmp/$tag/iso', run again if ok"
149 fi
150fi
151
192df729 152run mv "$tmp/$tag/dest.new" "$tmp/$tag/dest"
dc53ebfa
MW
153if [ -f "$tmp/$tag/eject" ]; then eject=t; else eject=nil; fi
154if [ -f "$tmp/$tag/ding" ]; then ding=t; else ding=nil; fi
7fbe0fb9
MW
155run "$DVDRIP_UPLOAD"
156case $eject in t) run eject "$dev" ;; esac
dc53ebfa
MW
157case $ding in
158 t)
159 if [ -t 1 ]; then exec 3>&1
160 elif [ -t 2 ]; then exec 3>&2
161 else exec 3>/dev/tty
162 fi
163 printf "\a" >&3
164 exec 3>&-
165 ;;
166esac