~dosage-dev/dosage/bunch-of-comics

« back to all changes in this revision

Viewing changes to dosage/events.py

  • Committer: ns
  • Date: 2009-12-01 07:07:18 UTC
  • Revision ID: ns@ww1aviationlinks.cjb.net-20091201070718-3xoj70sz52zsq09v
Y plugin added YAFGC

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import os.path
 
2
import time
 
3
import rss
 
4
import urllib
 
5
import util
 
6
 
 
7
class EventHandler(object):
 
8
    def __init__(self, basepath, baseurl):
 
9
        self.basepath = basepath
 
10
        self.baseurl = baseurl or self.getBaseUrl()
 
11
 
 
12
    def getBaseUrl(self):
 
13
        '''Return a file: URL that probably points to the basedir.
 
14
 
 
15
        This is used as a halfway sane default when the base URL is not
 
16
        provided; not perfect, but should work in most cases.'''
 
17
        components = util.splitpath(os.path.abspath(self.basepath))
 
18
        url = '/'.join([urllib.quote(component, '') for component in components])
 
19
        return 'file:///' + url + '/'
 
20
 
 
21
    def getUrlFromFilename(self, filename):
 
22
        components = util.splitpath(util.getRelativePath(self.basepath, filename))
 
23
        url = '/'.join([urllib.quote(component, '') for component in components])
 
24
        return self.baseurl + url
 
25
 
 
26
    def start(self):
 
27
        pass
 
28
 
 
29
    def comicDownloaded(self, comic, filename):
 
30
        pass
 
31
 
 
32
    def end(self):
 
33
        pass
 
34
 
 
35
class TextEventHandler(EventHandler):
 
36
    pass
 
37
 
 
38
class RSSEventHandler(EventHandler):
 
39
    def RFC822Date(self, indate):
 
40
        return time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(indate))
 
41
 
 
42
    def getFilename(self):
 
43
        return os.path.abspath(os.path.join(self.basepath, 'dailydose.rss'))
 
44
 
 
45
    def start(self):
 
46
        today = time.time()
 
47
        yesterday = today - 86400
 
48
        today = time.localtime(today)
 
49
        yesterday = time.localtime(yesterday)
 
50
 
 
51
        link = 'http://slipgate.za.net/dosage/'
 
52
 
 
53
        self.rssfn = self.getFilename()
 
54
 
 
55
        if os.path.exists(self.rssfn):
 
56
            self.newfile = False
 
57
            self.rss = rss.parseFeed(self.rssfn, yesterday)
 
58
        else:
 
59
            self.newfile = True
 
60
            self.rss = rss.Feed('Daily Dosage', link, 'Comics for %s' % time.strftime('%Y/%m/%d', today))
 
61
 
 
62
    def comicDownloaded(self, comic, filename):
 
63
        url = self.getUrlFromFilename(filename)
 
64
        args = (
 
65
            '%s - %s' % (comic, os.path.basename(filename)),
 
66
            url,
 
67
            '<a href="%s">View Comic</a>' % (url,),
 
68
            self.RFC822Date(time.time())
 
69
        )
 
70
 
 
71
        if self.newfile:
 
72
            self.newfile = False
 
73
            self.rss.addItem(*args)
 
74
        else:
 
75
            self.rss.insertHead(*args)
 
76
 
 
77
    def end(self):
 
78
        self.rss.write(self.rssfn)
 
79
 
 
80
class HtmlEventHandler(EventHandler):
 
81
    def fnFromDate(self, date):
 
82
        fn = time.strftime('comics-%Y%m%d.html', date)
 
83
        fn = os.path.join(self.basepath, 'html', fn)
 
84
        fn = os.path.abspath(fn)
 
85
        return fn
 
86
 
 
87
    def start(self):
 
88
        today = time.time()
 
89
        yesterday = today - 86400
 
90
        tomorrow = today + 86400
 
91
        today = time.localtime(today)
 
92
        yesterday = time.localtime(yesterday)
 
93
        tomorrow = time.localtime(tomorrow)
 
94
 
 
95
        fn = self.fnFromDate(today)
 
96
        assert not os.path.exists(fn), 'Comic page for today already exists!'
 
97
 
 
98
        d = os.path.dirname(fn)
 
99
        if not os.path.isdir(d):
 
100
            os.makedirs(d)
 
101
 
 
102
        yesterdayUrl = self.getUrlFromFilename(self.fnFromDate(yesterday))
 
103
        tomorrowUrl = self.getUrlFromFilename(self.fnFromDate(tomorrow))
 
104
 
 
105
        self.html = file(fn, 'w')
 
106
        self.html.write('''<html>
 
107
<head>
 
108
<title>Comics for %s</title>
 
109
</head>
 
110
<body>
 
111
<a href="%s">Previous Day</a> | <a href="%s">Next Day</a>
 
112
<ul>
 
113
''' % (time.strftime('%Y/%m/%d', today), yesterdayUrl, tomorrowUrl))
 
114
 
 
115
        self.lastComic = None
 
116
 
 
117
    def comicDownloaded(self, comic, filename):
 
118
        if self.lastComic != comic:
 
119
            self.newComic(comic)
 
120
        url = self.getUrlFromFilename(filename)
 
121
        self.html.write('        <li><a href="%s">%s</a></li>\n' % (url, os.path.basename(filename)))
 
122
 
 
123
    def newComic(self, comic):
 
124
        if self.lastComic is not None:
 
125
            self.html.write('    </ul>\n')
 
126
        self.lastComic = comic
 
127
        self.html.write('''    <li>%s</li>
 
128
    <ul>
 
129
''' % (comic,))
 
130
 
 
131
    def end(self):
 
132
        if self.lastComic is not None:
 
133
            self.html.write('    </ul>\n')
 
134
        self.html.write('''</ul>
 
135
</body>
 
136
</html>''')
 
137
        self.html.close()
 
138
 
 
139
 
 
140
handlers = {
 
141
    'text': TextEventHandler,
 
142
    'html': HtmlEventHandler,
 
143
    'rss': RSSEventHandler,
 
144
}
 
145
 
 
146
def getHandlers():
 
147
    l = handlers.keys()
 
148
    l.sort()
 
149
    return l
 
150
 
 
151
def installHandler(name=None, basepath=None, baseurl=None):
 
152
    global handler
 
153
    if name is None:
 
154
        name = 'text'
 
155
    if basepath is None:
 
156
        basepath = '.'
 
157
    handler = handlers[name](basepath, baseurl)
 
158
 
 
159
installHandler()