| 54 except: |
54 except: |
| 55 item['date'] = self.date = time.ctime() |
55 item['date'] = self.date = time.ctime() |
| 56 self.date_parsed = feedparser._parse_date(self.date) |
56 self.date_parsed = feedparser._parse_date(self.date) |
| 57 |
57 |
| 58 self.title = item['title'] |
58 self.title = item['title'] |
| 59 self.summary = item['summary'] |
59 sum = item['summary'] |
| |
60 self.summary = item['summary'].encode('utf8') |
| 60 self.link = item['link'] |
61 self.link = item['link'] |
| 61 self.parent = parent |
62 self.parent = parent |
| 62 self.unread = True |
63 self.unread = True |
| 63 |
64 |
| 64 def remove(self): |
65 def remove(self): |
| 109 } |
110 } |
| 110 __gsignals__ = { |
111 __gsignals__ = { |
| 111 'added' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_OBJECT,)) |
112 'added' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_OBJECT,)) |
| 112 } |
113 } |
| 113 |
114 |
| 114 def __init__(self, url): |
115 def __init__(self, feed): |
| 115 self.__gobject_init__() |
116 self.__gobject_init__() |
| |
117 url = feed['link'] |
| |
118 name = feed['name'] |
| 116 self.url = url # The url of the feed itself |
119 self.url = url # The url of the feed itself |
| 117 self.link = url # The web page associated with the feed |
120 self.link = url # The web page associated with the feed |
| 118 self.desc = url |
121 self.desc = url |
| 119 self.title = url |
122 self.title = (name, url)[not name] |
| |
123 self.customtitle = name |
| 120 self.unread = 0 |
124 self.unread = 0 |
| 121 self.items = [] |
125 self.items = [] |
| 122 self.hash = {} |
126 self.hash = {} |
| 123 self.pending = False |
127 self.pending = False |
| |
128 self._refresh = {'time' : 30, 'id' : 0} |
| 124 |
129 |
| 125 def do_set_property(self, property, value): |
130 def do_set_property(self, property, value): |
| 126 if property.name == 'link': |
131 if property.name == 'link': |
| 127 self.link = value |
132 self.link = value |
| 128 elif property.name == 'desc': |
133 elif property.name == 'desc': |
| 160 self.items.append(itm) |
165 self.items.append(itm) |
| 161 self.emit('added', itm) |
166 self.emit('added', itm) |
| 162 self.hash[item_hash(item)] = itm |
167 self.hash[item_hash(item)] = itm |
| 163 unread = unread + 1 |
168 unread = unread + 1 |
| 164 |
169 |
| |
170 if unread != self.unread: |
| |
171 self.set_property('unread', unread) |
| |
172 |
| 165 for hv in tmp: |
173 for hv in tmp: |
| 166 tmp[hv].remove() |
174 tmp[hv].remove() |
| 167 |
175 "Also notify the UI about the count change" |
| 168 if unread != self.unread: |
176 |
| 169 self.set_property('unread', unread) |
|
| 170 self.pending = False |
177 self.pending = False |
| 171 return False |
178 return False |
| 172 |
179 |
| 173 def refresh(self): |
180 def refresh(self): |
| 174 if self.pending: |
181 if self.pending: |
| 175 return |
182 return |
| 176 self.pending = True |
183 self.pending = True |
| 177 FeedReader(self).run() |
184 FeedReader(self).run() |
| |
185 return True |
| 178 |
186 |
| 179 def mark_read(self): |
187 def mark_read(self): |
| 180 for item in self.items: |
188 for item in self.items: |
| 181 item.mark_unread(False) |
189 item.mark_unread(False) |
| |
190 |
| |
191 def set_auto_refresh(self, auto): |
| |
192 if auto: |
| |
193 if self._refresh['id']: |
| |
194 return |
| |
195 if self._refresh['time'] < 1: |
| |
196 self._refresh['time'] = 1 |
| |
197 self.id = gobject.timeout_add(self._refresh['time'] * 1000 * 60, self.refresh) |
| |
198 else: |
| |
199 if not self._refresh['id']: |
| |
200 return |
| |
201 gobject.source_remove(self._refresh['id']) |
| |
202 self._refresh['id'] = 0 |
| 182 |
203 |
| 183 gobject.type_register(Feed) |
204 gobject.type_register(Feed) |
| 184 |
205 |
| 185 """ |
206 """ |
| 186 The FeedReader updates a Feed. It fork()s off a child to avoid blocking. |
207 The FeedReader updates a Feed. It fork()s off a child to avoid blocking. |
| 206 # Do NOT close tmpfile here |
227 # Do NOT close tmpfile here |
| 207 os._exit(os.EX_OK) |
228 os._exit(os.EX_OK) |
| 208 gobject.child_watch_add(self.pid, self.reap_child) |
229 gobject.child_watch_add(self.pid, self.reap_child) |
| 209 |
230 |
| 210 feeds = [] |
231 feeds = [] |
| 211 urls = ("http://rss.slashdot.org/Slashdot/slashdot", |
232 urls = ( |
| 212 "http://kerneltrap.org/node/feed", |
233 {'name': '/.', |
| 213 "http://pidgin.im/rss.php", |
234 'link': "http://rss.slashdot.org/Slashdot/slashdot"}, |
| 214 "http://www.formula1.com/rss/news/latest.rss", |
235 {'name': 'KernelTrap', |
| 215 "http://www.pheedo.com/f/freshmeatnet_announcements_unix", |
236 'link': "http://kerneltrap.org/node/feed"}, |
| 216 "http://www.cricinfo.com/rss/livescores.xml" |
237 {'name': None, |
| 217 ) |
238 'link': "http://pidgin.im/rss.php"}, |
| |
239 {'name': "F1", |
| |
240 'link': "http://www.formula1.com/rss/news/latest.rss"}, |
| |
241 {'name': "Freshmeat", |
| |
242 'link': "http://www.pheedo.com/f/freshmeatnet_announcements_unix"}, |
| |
243 {'name': "Cricinfo", |
| |
244 'link': "http://www.cricinfo.com/rss/livescores.xml"} |
| |
245 ) |
| 218 |
246 |
| 219 for url in urls: |
247 for url in urls: |
| 220 feed = Feed(url) |
248 feed = Feed(url) |
| 221 feeds.append(feed) |
249 feeds.append(feed) |
| 222 |
250 |