#!/bin/bash paths=(/home/pub/video/anime $HOME/dc/autodl/cur) function findcurep { if [ -r badlist ]; then echo badlist `head -n 1 badlist` return 0 fi if [ -r curep ]; then if [ -r maxep ]; then if [ "`cat curep`" -le "`cat maxep`" ]; then echo curep `cat curep` return 0 fi else echo curep `cat curep` return 0 fi fi echo none return 1 } function getnext { cd "$1/.autodl/" tag="$2" echo "checking $tag" sexpr="`cat sexpr`" unset badsizes epinfo=(`findcurep`) if [ "${epinfo[0]}" = none ]; then echo "no available episode of $tag" >&2 echo "$tag" >>"$HOME/dc/autodl/faulty" touch disabled return 1 fi epfrom="${epinfo[0]}" curep="${epinfo[1]}" unset badsizesl if [ -r badsizes ]; then badsizesl="$(sed -n "s/^0*$curep \([^#]*\)\( *#.*\)\?$/\1/p" badsizes)" fi if [ -n "$badsizesl" ]; then read -d/ -a badsizes <<<"$badsizesl" unset badsizesl echo "found bad size list: ${badsizes[@]}" fi unset args fsexpr="`printf "$sexpr" "$curep"`" if [ "${#badsizes[@]}" -gt 0 ]; then for badsize in "${badsizes[@]}"; do fsexpr="$fsexpr & ! S=$badsize" done fi infofile=rtinfo estatfile=estat args=(-e "$fsexpr" -t "$tag $curep" -I "$infofile" -E "$estatfile" -x "curep=$curep") if [ -e wait ]; then args=("${args[@]}" -w) fi if [ -r uarg ]; then uarg="`cat uarg`" elif [ -e autouarg ]; then uarg="rename:$tag - %02i.ext:move:../autodl/cur/$tag" fi if [ -n "$uarg" ]; then fuarg="`printf "$uarg" "$curep"`" args=("${args[@]}" -a "$fuarg") fi outfile=output 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 [ -r "$estatfile" ]; then estat=(`cat "$estatfile"`) rm -f "$estatfile" fi if [ "$intr" = y ]; then echo "$tag interrupted" else if [ "$stat" -ne 0 ]; then if [ "$stat" -eq 1 ]; then echo "Failure for $tag" >>"$HOME/dc/autodl/errorlog" tail -n 20 "$outfile" >>"$HOME/dc/autodl/errorlog" elif [ "$stat" -eq 2 ]; then echo "Connection error on $tag" elif [ "$stat" -eq 3 ]; then echo "Configuration error, disabling $tag" cp "$outfile" conferr touch disabled echo "$tag" >>"$HOME/dc/autodl/faulty" fi else echo "episode $curep of $tag done (estat: \"$estat\")" case "$epfrom" in badlist) echo -en "${tag}\n${curep}\n" >>"$HOME/dc/autodl/baddone" egrep -v "^$curep( |\$)" badlist >newbadlist mv -f newbadlist badlist if [ `wc -l >"$HOME/dc/autodl/badmaxed" fi ;; curep) if [ "$estat" = dbl ]; then echo -en "${tag}\n${curep}\n" >>"$HOME/dc/autodl/done" echo -en "${tag}\n$((${curep} + 1))\n" >>"$HOME/dc/autodl/done" let "nextep=curep+2" else echo -en "${tag}\n${curep}\n" >>"$HOME/dc/autodl/done" let "nextep=curep+1" fi echo "$nextep" >curep if [ -r maxep ]; then if [ "$nextep" -gt "`cat maxep`" ]; then echo "$tag has reached max" echo "$tag" >>"$HOME/dc/autodl/maxed" fi fi ;; esac if [ "$estat" = bad ]; then echo "episode reported as bad, adding to badlist" echo "$curep" >>badlist elif [ "${estat[0]}" = badsize ]; then echo "size reported as bad" echo "$curep" >>badlist echo "$curep ${estat[1]}" >>badsizes fi if ! findcurep; then echo "no more episodes to download from $tag" touch disabled fi 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 start=y if [ -e "$d/.autodl/disable" ]; then echo "disabling $tag per user request" start=n 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 fi if [ -e "$d/.autodl/restart" ]; then echo "restarting $tag per user request" rm -f "$d/.autodl/restart" if [ -r "$HOME/dc/autodl/run/$tag" ]; then pid="`cat "$HOME/dc/autodl/run/$tag"`" echo "sending SIGUSR1 to $pid" kill -USR1 "$pid" while [ -e "$HOME/dc/autodl/run/$tag" ]; do echo "waiting for it to exit" sleep 1 done else echo "could not find pid for $tag" fi fi if [ $start = y ]; then if [ ! -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 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"