SebaGeek ...so cool, dass es schon supra ist! (Science Joke)

Scripte & Zeug: xkcd downloader

Ich wollte gerne eine Offlinesammlung aller xkcd-comics haben. Leider fehlte bei den heruntergeladenen Bildern der Title-Text... und ohne Title-Text macht das ganze ja eigentlich keinen Spaß. Also hab ich mir mal ein bisschen Image Magick angeguckt um den Titletext einfach aus der HTML-Seite rauszuparsen und unter das Bild zu pappen. Dann noch ein bisschen dreckiges Rumgefrickel mit wget und bc drüberkippen und fertig ist der xkcd comic downloader ;)

v.02 kann jetzt noch ein wenig mehr. Jetzt läd es die Comics auch inkrementell runter. Soll heißen, es frischt den Comicbestand auf und läd nicht die komplette Sammlung erneut. Ausserdem kann es nun einen Bruchteil von Urlencode, wodurch die Kommentare mit ihren ' nicht mehr kaputt aussehen.

Download xkcd-dl.sh (2.04 kb)
 1 #!/bin/bash
 2 # v0.2 - written by seba (http://seba-geek.de)
 3 # Licensed under the beer- || pizzaware license ;)
 4 
 5 first=$(ls -1|grep "^[0-9]\+_.\+\.\(png\|jpg\)"|grep -o "^[0-9]\+"|grep -o "[1-9]\+[0-9]*"|sort -n|tail -n 1)
 6 if [[ $first == "" ]]; then
 7 	first=0;
 8 fi 
 9 lastnum=$(wget http://xkcd.com/ -O- 2>/dev/null|grep  -i permanent |sed -n -e 's/.*http:\/\/xkcd.com\/\([0-9]\+\).*/\1/p')
10 if [[ $lastnum == $first ]]; then
11 	echo 'You got all comics, no downloading will be done ;)'
12 	exit 0
13 fi
14 num=$(expr $lastnum - $first)
15 echo -e "$num comic$(if [[ $num != 1 ]]; then echo -n "s"; fi) will be downloaded\n"
16 first=$(expr $first + 1)
17 for i in $(seq $first $(wget http://xkcd.com/ -O- 2>/dev/null|grep  -i permanent |sed -n -e 's/.*http:\/\/xkcd.com\/\([0-9]\+\).*/\1/p')); do
18 	echo Downloading $i;
19 	srclink=$(wget -O- http://xkcd.com/$i 2>/dev/null|grep "img src=\"http://imgs.xkcd.com/comic")
20 	link=$(echo $srclink|sed -n -e 's/.*src="\([^"]*\)".*/\1/p')
21 	haslarge=$(echo $srclink|sed -n -e 's/^<a href="\([^"]\+\)">.*/\1/p')
22 	if [[ "$haslarge" != "" ]] && [[ "$haslarge"  ]]; then
23 		tmplink=$(wget -O- $haslarge 2>/dev/null|grep -o "http://imgs.xkcd.com/comics/[^\"]\+")
24 		if [[ $tmplink != "" ]]; then link=$tmplink; fi
25 	fi
26 	alttxt=$(echo $srclink|sed -n -e 's/.*title="\([^"]*\)".*/\1/p')
27 	for p in $(echo $alttxt|grep "&#[0-9]\{2,3\};" -o); do alttxt=$(echo $alttxt|sed "s/$p/"$(printf \\$(printf %03o $(echo $p|grep -o '[0-9]\+')))"/g"); done
28 	img=$(printf %03d $i)_$(echo $link|sed -e 's/http:\/\/imgs.xkcd.com\/comics\///')
29 	wget $link -O $img;
30 	echo Appending alttext...
31 	width=$(identify -format %w $img)
32 	height=$(echo "($(echo $alttxt|wc -m)*6.6666*100/$width+99)/100*15+17"|bc)
33 	convert -background 'white' -fill black -gravity center -pointsize 14 -size ${width}x$height caption:"$alttxt" $img +swap -gravity south -append $img
34 	echo Saved to $img
35 	if [[ $i != $lastnum ]]; then
36 		tim=5
37 		while [[ $tim -ge 0 ]]; do
38 			echo -en "\rWaiting ${tim}s for 'not dossing the server'";
39 			if [[ $tim -gt 0 ]]; then sleep 1s; fi;
40 			tim=$(expr $tim - 1);
41 		done;
42 		echo -e '\n';
43 	fi
44 done
π