Commit | Line | Data |
---|---|---|
aba77738 DC |
1 | #!/bin/bash |
2 | ||
3 | paths=(/home/pub/video/anime $HOME/dc/autodl/cur) | |
4 | ||
3266af74 | 5 | function findcurep |
6 | { | |
7 | if [ -r badlist ]; then | |
c8522c34 | 8 | echo badlist `head -n 1 badlist` |
3266af74 | 9 | return 0 |
10 | fi | |
11 | if [ -r curep ]; then | |
12 | if [ -r maxep ]; then | |
13 | if [ "`cat curep`" -le "`cat maxep`" ]; then | |
14 | echo curep `cat curep` | |
f8416d8d | 15 | return 0 |
3266af74 | 16 | fi |
17 | else | |
18 | echo curep `cat curep` | |
f8416d8d | 19 | return 0 |
3266af74 | 20 | fi |
3266af74 | 21 | fi |
22 | echo none | |
23 | return 1 | |
24 | } | |
25 | ||
aba77738 DC |
26 | function getnext |
27 | { | |
3bf0176f | 28 | cd "$1/.autodl/" |
29 | tag="$2" | |
aba77738 | 30 | echo "checking $tag" |
3bf0176f | 31 | sexpr="`cat sexpr`" |
aba77738 | 32 | unset badsizes |
3266af74 | 33 | epinfo=(`findcurep`) |
34 | if [ "${epinfo[0]}" = none ]; then | |
aba77738 DC |
35 | echo "no available episode of $tag" >&2 |
36 | echo "$tag" >>"$HOME/dc/autodl/faulty" | |
3bf0176f | 37 | touch disabled |
aba77738 DC |
38 | return 1 |
39 | fi | |
3266af74 | 40 | epfrom="${epinfo[0]}" |
41 | curep="${epinfo[1]}" | |
6c554f39 | 42 | unset badsizesl |
3bf0176f | 43 | if [ -r badsizes ]; then |
44 | badsizesl="$(sed -n "s/^0*$curep \([^#]*\)\( *#.*\)\?$/\1/p" badsizes)" | |
6c554f39 | 45 | fi |
45f2d3f3 DC |
46 | if [ -n "$badsizesl" ]; then |
47 | read -a badsizes <<<"$badsizesl" | |
48 | unset badsizesl | |
49 | echo "found bad size list: ${badsizes[@]}" | |
50 | fi | |
aba77738 DC |
51 | unset args |
52 | fsexpr="`printf "$sexpr" "$curep"`" | |
53 | if [ "${#badsizes[@]}" -gt 0 ]; then | |
54 | for badsize in "${badsizes[@]}"; do | |
55 | fsexpr="$fsexpr & ! S=$badsize" | |
56 | done | |
57 | fi | |
3bf0176f | 58 | infofile=rtinfo |
59 | estatfile=estat | |
32dd9fcf | 60 | args=(-e "$fsexpr" -t "$tag $curep" -I "$infofile" -E "$estatfile" -x "curep=$curep") |
3bf0176f | 61 | if [ -e wait ]; then |
9151870a | 62 | args=("${args[@]}" -w) |
63 | fi | |
3bf0176f | 64 | if [ -r uarg ]; then |
65 | uarg="`cat uarg`" | |
66 | elif [ -e autouarg ]; then | |
67 | uarg="rename:$tag - %02i.ext:move:../autodl/cur/$tag" | |
aba77738 DC |
68 | fi |
69 | if [ -n "$uarg" ]; then | |
70 | fuarg="`printf "$uarg" "$curep"`" | |
71 | args=("${args[@]}" -a "$fuarg") | |
72 | fi | |
3bf0176f | 73 | outfile=output |
aba77738 DC |
74 | echo "trying to download -- autodl ${args[@]}" |
75 | intr=n | |
76 | autodl "${args[@]}" >"$outfile" 2>&1 & | |
77 | pid=$! | |
78 | trap "intr=y; kill -INT $pid" USR1 INT | |
79 | wait $pid | |
80 | stat=$? | |
8c73da68 | 81 | if [ -r "$estatfile" ]; then |
82 | estat="`cat "$estatfile"`" | |
83 | rm -f "$estatfile" | |
84 | fi | |
aba77738 DC |
85 | if [ "$intr" = y ]; then |
86 | echo "$tag interrupted" | |
87 | else | |
88 | if [ "$stat" -ne 0 ]; then | |
58a2c684 | 89 | if [ "$stat" -eq 1 ]; then |
90 | echo "Failure for $tag" >>"$HOME/dc/autodl/errorlog" | |
91 | tail -n 20 "$outfile" >>"$HOME/dc/autodl/errorlog" | |
92 | elif [ "$stat" -eq 2 ]; then | |
93 | echo "Connection error on $tag" | |
94 | elif [ "$stat" -eq 3 ]; then | |
95 | echo "Configuration error, disabling $tag" | |
3bf0176f | 96 | cp "$outfile" conferr |
97 | touch disabled | |
07878795 | 98 | echo "$tag" >>"$HOME/dc/autodl/faulty" |
58a2c684 | 99 | fi |
aba77738 | 100 | else |
8c73da68 | 101 | echo "episode $curep of $tag done (estat: \"$estat\")" |
aba77738 DC |
102 | case "$epfrom" in |
103 | badlist) | |
104 | echo -en "${tag}\n${curep}\n" >>"$HOME/dc/autodl/baddone" | |
3bf0176f | 105 | egrep -v "^$curep( |\$)" badlist >newbadlist |
106 | mv -f newbadlist badlist | |
107 | if [ `wc -l <badlist` -eq 0 ]; then | |
108 | rm badlist | |
aba77738 DC |
109 | echo "$tag has no more bad episodes" |
110 | echo "$tag" >>"$HOME/dc/autodl/badmaxed" | |
111 | fi | |
112 | ;; | |
113 | curep) | |
8c73da68 | 114 | if [ "$estat" = dbl ]; then |
115 | echo -en "${tag}\n${curep}\n" >>"$HOME/dc/autodl/done" | |
116 | echo -en "${tag}\n$((${curep} + 1))\n" >>"$HOME/dc/autodl/done" | |
46b10ab7 | 117 | let "nextep=curep+2" |
8c73da68 | 118 | else |
119 | echo -en "${tag}\n${curep}\n" >>"$HOME/dc/autodl/done" | |
46b10ab7 | 120 | let "nextep=curep+1" |
8c73da68 | 121 | fi |
46b10ab7 | 122 | echo "$nextep" >curep |
3bf0176f | 123 | if [ -r maxep ]; then |
46b10ab7 | 124 | if [ "$nextep" -gt "`cat maxep`" ]; then |
aba77738 DC |
125 | echo "$tag has reached max" |
126 | echo "$tag" >>"$HOME/dc/autodl/maxed" | |
127 | fi | |
128 | fi | |
129 | ;; | |
130 | esac | |
79d4ee97 | 131 | if [ "$estat" = bad ]; then |
132 | echo "episode reported as bad, adding to badlist" | |
133 | echo "$curep" >>badlist | |
134 | fi | |
3266af74 | 135 | if ! findcurep; then |
136 | echo "no more episodes to download from $tag" | |
137 | touch disabled | |
138 | fi | |
aba77738 DC |
139 | fi |
140 | fi | |
141 | rm -f "$outfile" | |
142 | rm -f "$HOME/dc/autodl/run/$tag" | |
143 | } | |
144 | ||
145 | for dir in $HOME/dc/autodl{,/cur,/run}; do | |
146 | if [ -e "$dir" ]; then | |
147 | if [ ! -d "$dir" ]; then | |
148 | echo "$dir is not a directory, please remedy and restart" >&2 | |
149 | exit 1 | |
150 | fi | |
151 | else | |
152 | mkdir "$dir" || exit 1 | |
153 | fi | |
154 | done | |
155 | ||
156 | while [ $# -gt 0 ]; do | |
157 | arg="$1" | |
158 | shift | |
159 | case "$arg" in | |
160 | -k) | |
161 | pid="$(cat "$HOME/dc/autodl/run/master")" | |
162 | if [ -z "$pid" ]; then | |
163 | echo "autodlctl: could not read a PID from $HOME/dc/autodl/run/master" >&2 | |
164 | exit 1 | |
165 | fi | |
166 | kill "$pid" | |
167 | exit 0 | |
168 | ;; | |
169 | *) | |
170 | echo "autodlctl: unrecognized option: \"$arg\"" >&2 | |
171 | exit 1 | |
172 | ;; | |
173 | esac | |
174 | done | |
175 | ||
176 | lastget=0 | |
177 | done=n | |
178 | trap "done=y" INT QUIT TERM | |
179 | echo $$ >"$HOME/dc/autodl/run/master" | |
180 | while [ "$done" != y ]; do | |
181 | for pidfile in $HOME/dc/autodl/run/*; do | |
182 | if [ "$pidfile" = "$HOME/dc/autodl/run/*" ]; then break; fi | |
183 | pid="`cat "$pidfile"`" | |
184 | if [ -d /proc/1 -a ! -d "/proc/$pid" ]; then | |
185 | echo "removing stale pidfile $pidfile" | |
186 | rm -f "$pidfile" | |
187 | fi | |
188 | done | |
189 | for p in "${paths[@]}"; do | |
190 | for d in "$p"/*; do | |
191 | if [ -d "$d/.autodl" -a ! -e "$d/.autodl/disabled" ]; then | |
192 | if [ -r "$d/.autodl/tag" ]; then | |
193 | tag="`cat "$d/.autodl/tag"`" | |
194 | else | |
195 | tag="`basename "$d"`" | |
196 | fi | |
07878795 | 197 | start=y |
aba77738 DC |
198 | if [ -e "$d/.autodl/disable" ]; then |
199 | echo "disabling $tag per user request" | |
07878795 | 200 | start=n |
aba77738 DC |
201 | touch "$d/.autodl/disabled" |
202 | rm -f "$d/.autodl/disable" | |
203 | if [ -r "$HOME/dc/autodl/run/$tag" ]; then | |
204 | pid="`cat "$HOME/dc/autodl/run/$tag"`" | |
205 | echo "sending SIGUSR1 to $pid" | |
206 | kill -USR1 "$pid" | |
207 | else | |
208 | echo "could not find pid for $tag" | |
209 | fi | |
07878795 | 210 | fi |
211 | if [ -e "$d/.autodl/restart" ]; then | |
212 | echo "restarting $tag per user request" | |
213 | rm -f "$d/.autodl/restart" | |
214 | if [ -r "$HOME/dc/autodl/run/$tag" ]; then | |
215 | pid="`cat "$HOME/dc/autodl/run/$tag"`" | |
216 | echo "sending SIGUSR1 to $pid" | |
217 | kill -USR1 "$pid" | |
ccc141a3 | 218 | while [ -e "$HOME/dc/autodl/run/$tag" ]; do |
219 | echo "waiting for it to exit" | |
220 | sleep 1 | |
221 | done | |
07878795 | 222 | else |
223 | echo "could not find pid for $tag" | |
224 | fi | |
225 | fi | |
226 | if [ $start = y ]; then | |
227 | if [ ! -r "$d/.autodl/sexpr" ]; then | |
228 | touch "$d/.autodl/disabled" | |
229 | echo "$tag lacks sexpr" >&2 | |
230 | echo "$tag" >>"$HOME/dc/autodl/faulty" | |
231 | else | |
232 | if [ ! -e "$HOME/dc/autodl/run/$tag" ]; then | |
233 | if [ $((`date +%s` - $lastget)) -gt 20 ]; then | |
234 | getnext "$d" "$tag" & | |
235 | lastget=`date +%s` | |
236 | pid=$! | |
237 | echo "$pid" >"$HOME/dc/autodl/run/$tag" | |
238 | fi | |
aba77738 DC |
239 | fi |
240 | fi | |
241 | fi | |
242 | fi | |
243 | done | |
244 | done | |
245 | sleep 10 | |
246 | done | |
247 | ||
248 | for pidfile in $HOME/dc/autodl/run/*; do | |
249 | if [ "$pidfile" = "$HOME/dc/autodl/run/*" ]; then break; fi | |
250 | if [ "$(basename "$pidfile")" = master ]; then continue; fi | |
251 | pid="`cat "$pidfile"`" | |
252 | echo "sending SIGUSR1 to $pid for `basename "$pidfile"`" | |
253 | kill -USR1 "$pid" | |
254 | done | |
255 | ||
256 | rm -f "$HOME/dc/autodl/run/master" |