From: fredrik@DOLDA2000.COM Date: Wed, 20 Apr 2005 22:24:00 +0000 (+0000) Subject: Initial import. X-Git-Url: http://git.dolda2000.com/gitweb/?a=commitdiff_plain;h=aba77738f8a80e1bcee0cd8832fb8b3fadfbe2f1;p=utils.git Initial import. git-svn-id: svn+ssh://svn.dolda2000.com/srv/svn/repos/src/utils@207 959494ce-11ee-0310-bf91-de5d638817bd --- diff --git a/autodlctl b/autodlctl new file mode 100755 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"