summaryrefslogtreecommitdiff
path: root/carnoon.py
blob: 45f98aff29bfdb93a7a6aed02722acee3620c3eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#/usr/bin/python2

import urllib2
import random
import Image
import os.path
import re

class Comic(object):
    def __init__(self, comicurl, filenformat, updateurl, updatere):
        self.comicurl = comicurl
        self.filenformat = filenformat
        self.updateurl = updateurl
        self.updatere = updatere
        self.last = 0

    def update_last(self):
        opener = urllib2.build_opener()
        opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko')]

        url = opener.open(self.updateurl)
        data = url.read()
        url.close()

        result = re.search(self.updatere, data).group('link') # search for last image link

        if(not result.startswith('http')):
                result = self.comicurl + result
        
        self.last = int(re.search(r'(?P<id>\d+)\.(?i)(jpg|png|gif|bmp)$', result).group('id')) # get file name's content before '.'

    def get_link(self, number = -1):
        opener = urllib2.build_opener() # for a UA
        opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko')]

        if(number == -1):
            urlstr = self.randomurl
        else:
            urlstr = self.comicurl + (self.filenformat % number)

        filere = re.compile(r'.*?[^\s/]+\.(?i)(jpg|png|gif|bmp)$')
        if(filere.match(urlstr)):
            return urlstr

        url = opener.open(urlstr)

        data = url.read() # download web page
        url.close()

        result = re.search(self.updatere, data) # search for image link

        if(result):
            return result.group('link')
        else:
            print "Please check your regular expression: no matches found"
            return None

    def display_random(self):
        # urlstr: url
        # picstr: random number; appended to url
        # pref: prefix for file name; e.g. Comics/xkcd/
        # srcre: regular expression in case url + picstr is not a direct link

        urlstr = self.get_link(random.randrange(0, self.last)) # get direct image download link by RE

        fname = "Comics/" + self.comicurl.replace("http://", "").replace("/", "") + int(re.search(r'(?P<id>\d+)\.(?i)(jpg|png|gif|bmp)$', result).group('id'))

        opener = urllib2.build_opener() # for a UA
        opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko')]

        directory = "Comics/"
        if not os.path.exists(directory): # create subdirectory if needed
            os.makedirs(directory)

        if not os.path.isfile(fname):
            # download picture and open if not done yet
            url = opener.open(urlstr)
            data = url.read()
            url.close()

            pic = open(fname, 'w')
            pic.write(data)
            pic.close()

        Image.open(fname).show()

ruthe = Comic("http://ruthe.de/cartoons/", "strip_%d.jpg", "http://ruthe.de", r'<img src="(?P<link>.*?)" alt="Cartoon" border="0" />')
ruthe.update_last()
ruthe.display_random()

xkcd = Comic("xkcd.com", "imgs.%s.com/comics/", r'Permanent link to this comic: (?P<link>.*?)')
xkcd.update_last()
xkcd.display_random("/1/")