#!/bin/bash # example: radar=00004 I=10 bomsnarf # example: path=/gms/IDE00035.radar. I=60 ext=.jpg start='-5 hours -35 minutes' debug=1 bomsnarf # defaults to Melbourne 512km and 6 minute interval mkdir -p imgs ; cd imgs : ${I:=6} : ${radar:=021} : ${count:=10} : ${site:=http://www.bom.gov.au} : ${path:=/radar/IDR${radar}.T.} : ${pre:="$site$path"} : ${ext:=.png} : ${start:=now} : ${debug:=} Z=$[$I * 60 - 60] w=${pre##*/} w=${w%.} dt() { f="%Y/%m/%d %H:%M" if [ "$sec" = 1 -o "$nano" = 1 ]; then f="$f:%S"; fi if [ "$nano" = 1 ]; then f="$f.%N"; fi if [ "$zone" = 1 ]; then f="$f %z"; fi if [ "$day" != 0 ]; then f="$f %a"; fi date +"$f" -d "${*:-now}" } dated() { N="$1" ; Z="$2" ; shift 2 [ -n "$Z" ] || . usage "date zone [opt ...]" date -d "`echo "$N" | perl -ne ' chomp; s/\D//g; BEGIN { @c=qw(4 / 2 / 2 _ 2 : 2 : 2 .) } @a=@c; $c = -1; while(@a) { ($n, $s) = splice @a,0,2; $c += 1 + $n; last if $c >= length($_); $_ = substr($_,0,$c).$s.substr($_,$c); # warn "$n $c $s $_\n"; } s/_/ /g; print "$_\n"; '` $Z" "$@" } dtu() { TZ=GMT day="${day:-0}" dt "$@"; } date2secs() { dated "$1" UTC -u +%s; } secs2ndate() { date -d "$1 secs 1970/01/01 UTC" -u +%Y%m%d%H%M; } secs2date() { date -d "$1 secs 1970/01/01 UTC" -u +"%Y/%m/%d %H:%M"; } D=`dtu -d "$start"` S=`date2secs "$D"` get() { N=`secs2ndate "$S"` D=`secs2date "$S"` U="$pre$N$ext" F=${U##*/} already=0 if [ -n "$debug" ]; then printf "%-10s %-s $U " "$w" "$D" else printf "%-10s %-s " "$w" "$D" fi [ -e "$F" ] && { echo got; already=1; return 0; } wget -c -q "$U" && { echo "^_^"; return 0; } echo "0_o" return 1 } while true; do while true; do get && break S=$[$S-60] done # TODO detect I if not specified? if [ $already = 0 ]; then S0="$S" while true; do S=$[$S-$I*60] get || break [ $already = 1 ] && break done S="$S0" fi while true; do S=$[$S+$[$I*60]] failed=0 ; resync=0 ; maxfail=3 while true; do get "$N" && break failed=$[$failed+1] if [ $failed -gt $maxfail ]; then resync=1 break fi sleep $Z done if [ $resync = 1 ]; then break; fi sleep $Z done done