Initial import.
authorfredrik@DOLDA2000.COM <fredrik@DOLDA2000.COM@959494ce-11ee-0310-bf91-de5d638817bd>
Wed, 20 Apr 2005 22:24:00 +0000 (22:24 +0000)
committerfredrik@DOLDA2000.COM <fredrik@DOLDA2000.COM@959494ce-11ee-0310-bf91-de5d638817bd>
Wed, 20 Apr 2005 22:24:00 +0000 (22:24 +0000)
git-svn-id: svn+ssh://svn.dolda2000.com/srv/svn/repos/src/utils@207 959494ce-11ee-0310-bf91-de5d638817bd

autodlctl [new file with mode: 0755]

diff --git a/autodlctl b/autodlctl
new file mode 100755 (executable)
index 0000000..38d1702
--- /dev/null
+++ b/autodlctl
@@ -0,0 +1,190 @@
+#!/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"