--- /dev/null
+#!/bin/bash
+
+paths=(/home/pub/video/anime $HOME/dc/autodl/cur)
+
+function getnext
+{
+ echo "checking $tag"
+ sexpr="`cat "$d/.autodl/sexpr"`"
+ unset badsizes
+ if [ -r "$d/.autodl/badlist" ]; then
+ read curep <"$d/.autodl/badlist"
+ echo "downloading bad files, curep $curep"
+ epfrom=badlist
+ badsizesl="$(sed -n "s/^$curep \(.*\)$/\1/p" "$d/.autodl/badsizes")"
+ if [ -n "$badsizesl" ]; then
+ read -a badsizes <<<"$badsizesl"
+ unset badsizesl
+ echo "found bad size list: ${badsizes[@]}"
+ fi
+ elif [ -r "$d/.autodl/curep" ]; then
+ curep="`cat "$d/.autodl/curep"`"
+ echo "downloading series, curep $curep"
+ epfrom=curep
+ else
+ echo "no available episode of $tag" >&2
+ echo "$tag" >>"$HOME/dc/autodl/faulty"
+ return 1
+ fi
+ unset args
+ fsexpr="`printf "$sexpr" "$curep"`"
+ if [ "${#badsizes[@]}" -gt 0 ]; then
+ for badsize in "${badsizes[@]}"; do
+ fsexpr="$fsexpr & ! S=$badsize"
+ done
+ fi
+ args=(-e "$fsexpr" -t "$tag $curep")
+ if [ -r "$d/.autodl/uarg" ]; then
+ uarg="`cat "$d/.autodl/uarg"`"
+ elif [ -e "$d/.autodl/autouarg" ]; then
+ uarg="rename:$tag - %02i.avi:move:../autodl/cur/$tag"
+ fi
+ if [ -n "$uarg" ]; then
+ fuarg="`printf "$uarg" "$curep"`"
+ args=("${args[@]}" -a "$fuarg")
+ fi
+ outfile="`mktemp /tmp/autodlXXXXXX`"
+ echo "trying to download -- autodl ${args[@]}"
+ intr=n
+ autodl "${args[@]}" >"$outfile" 2>&1 &
+ pid=$!
+ trap "intr=y; kill -INT $pid" USR1 INT
+ wait $pid
+ stat=$?
+ if [ "$intr" = y ]; then
+ echo "$tag interrupted"
+ else
+ if [ "$stat" -ne 0 ]; then
+ echo "Failure for $tag" >>"$HOME/dc/autodl/errorlog"
+ tail -n 20 "$outfile" >>"$HOME/dc/autodl/errorlog"
+ else
+ echo "episode $curep of $tag done"
+ case "$epfrom" in
+ badlist)
+ echo -en "${tag}\n${curep}\n" >>"$HOME/dc/autodl/baddone"
+ egrep -v "^$curep( |\$)" "$d/.autodl/badlist" >"$d/.autodl/newbadlist"
+ mv -f "$d/.autodl/newbadlist" "$d/.autodl/badlist"
+ if [ `wc -l <"$d/.autodl/badlist"` -eq 0 ]; then
+ rm "$d/.autodl/badlist"
+ if [ -r "$d/.autodl/curep" ]; then
+ if [ -r "$d/.autodl/maxep" ] && [ "`cat "$d/.autodl/curep"`" -gt "`cat "$d/.autodl/maxep"`" ]; then
+ touch "$d/.autodl/disabled"
+ fi
+ else
+ touch "$d/.autodl/disabled"
+ fi
+ echo "$tag has no more bad episodes"
+ echo "$tag" >>"$HOME/dc/autodl/badmaxed"
+ fi
+ ;;
+ curep)
+ echo -en "${tag}\n${curep}\n" >>"$HOME/dc/autodl/done"
+ let curep++
+ echo "$curep" >"$d/.autodl/curep"
+ if [ -r "$d/.autodl/maxep" ]; then
+ if [ "$curep" -gt "`cat "$d/.autodl/maxep"`" ]; then
+ touch "$d/.autodl/disabled"
+ echo "$tag has reached max"
+ echo "$tag" >>"$HOME/dc/autodl/maxed"
+ fi
+ fi
+ ;;
+ esac
+ fi
+ fi
+ rm -f "$outfile"
+ rm -f "$HOME/dc/autodl/run/$tag"
+}
+
+for dir in $HOME/dc/autodl{,/cur,/run}; do
+ if [ -e "$dir" ]; then
+ if [ ! -d "$dir" ]; then
+ echo "$dir is not a directory, please remedy and restart" >&2
+ exit 1
+ fi
+ else
+ mkdir "$dir" || exit 1
+ fi
+done
+
+while [ $# -gt 0 ]; do
+ arg="$1"
+ shift
+ case "$arg" in
+ -k)
+ pid="$(cat "$HOME/dc/autodl/run/master")"
+ if [ -z "$pid" ]; then
+ echo "autodlctl: could not read a PID from $HOME/dc/autodl/run/master" >&2
+ exit 1
+ fi
+ kill "$pid"
+ exit 0
+ ;;
+ *)
+ echo "autodlctl: unrecognized option: \"$arg\"" >&2
+ exit 1
+ ;;
+ esac
+done
+
+lastget=0
+done=n
+trap "done=y" INT QUIT TERM
+echo $$ >"$HOME/dc/autodl/run/master"
+while [ "$done" != y ]; do
+ for pidfile in $HOME/dc/autodl/run/*; do
+ if [ "$pidfile" = "$HOME/dc/autodl/run/*" ]; then break; fi
+ pid="`cat "$pidfile"`"
+ if [ -d /proc/1 -a ! -d "/proc/$pid" ]; then
+ echo "removing stale pidfile $pidfile"
+ rm -f "$pidfile"
+ fi
+ done
+ for p in "${paths[@]}"; do
+ for d in "$p"/*; do
+ if [ -d "$d/.autodl" -a ! -e "$d/.autodl/disabled" ]; then
+ if [ -r "$d/.autodl/tag" ]; then
+ tag="`cat "$d/.autodl/tag"`"
+ else
+ tag="`basename "$d"`"
+ fi
+ if [ -e "$d/.autodl/disable" ]; then
+ echo "disabling $tag per user request"
+ touch "$d/.autodl/disabled"
+ rm -f "$d/.autodl/disable"
+ if [ -r "$HOME/dc/autodl/run/$tag" ]; then
+ pid="`cat "$HOME/dc/autodl/run/$tag"`"
+ echo "sending SIGUSR1 to $pid"
+ kill -USR1 "$pid"
+ else
+ echo "could not find pid for $tag"
+ fi
+ elif [ ! -r "$d/.autodl/sexpr" ]; then
+ touch "$d/.autodl/disabled"
+ echo "$tag lacks sexpr" >&2
+ echo "$tag" >>"$HOME/dc/autodl/faulty"
+ else
+ if [ ! -e "$HOME/dc/autodl/run/$tag" ]; then
+ if [ $((`date +%s` - $lastget)) -gt 20 ]; then
+ getnext "$d" "$tag" &
+ lastget=`date +%s`
+ pid=$!
+ echo "$pid" >"$HOME/dc/autodl/run/$tag"
+ fi
+ fi
+ fi
+ fi
+ done
+ done
+ sleep 10
+done
+
+for pidfile in $HOME/dc/autodl/run/*; do
+ if [ "$pidfile" = "$HOME/dc/autodl/run/*" ]; then break; fi
+ if [ "$(basename "$pidfile")" = master ]; then continue; fi
+ pid="`cat "$pidfile"`"
+ echo "sending SIGUSR1 to $pid for `basename "$pidfile"`"
+ kill -USR1 "$pid"
+done
+
+rm -f "$HOME/dc/autodl/run/master"