1 from Screens.MessageBox import MessageBox
2 from Components.config import config
3 from enigma import eTimer
5 from RSSScreens import RSSFeedView
6 from RSSFeed import UniversalFeed
8 from twisted.web.client import getPage
9 from xml.dom.minidom import parseString as minidom_parseString
12 """Keeps all Feed and takes care of (automatic) updates"""
13 def __init__(self, session):
15 self.poll_timer = eTimer()
16 self.poll_timer.timeout.get().append(self.poll)
17 self.poll_timer.start(0, 1)
19 # Functions to call when updates happened
20 self.update_callbacks = [ ]
22 # Save Session, Initialize Var to identify triggered Reload
23 self.session = session
24 self.reloading = False
29 config.plugins.simpleRSS.feed[i].uri.value,
30 config.plugins.simpleRSS.feed[i].autoupdate.value
32 for i in range(0, config.plugins.simpleRSS.feedcount.value)
39 def addCallback(self, callback):
40 if callback not in self.update_callbacks:
41 self.update_callbacks.append(callback)
43 def removeCallback(self, callback):
44 if callback in self.update_callbacks:
45 self.update_callbacks.remove(callback)
47 def doCallback(self, id = None):
48 for callback in self.update_callbacks:
54 def error(self, error = ""):
56 print "[SimpleRSS] error polling"
60 "Sorry, failed to fetch feed.\n" + error,
61 type = MessageBox.TYPE_INFO,
64 # Assume its just a temporary failure and jump over to next feed
67 def _gotPage(self, data, id = None, callback = False, errorback = None):
68 # workaround: exceptions in gotPage-callback were ignored
70 self.gotPage(data, id)
73 except NotImplementedError, errmsg:
74 # TODO: Annoying with Multifeed?
77 "Sorry, this type of feed is unsupported.\n"+ str(errmsg),
78 type = MessageBox.TYPE_INFO,
83 traceback.print_exc(file=sys.stdout)
84 # Errorback given, call it (asumme we don't need do restart timer!)
85 if errorback is not None:
88 # Assume its just a temporary failure and jump over to next feed
91 def gotPage(self, data, id = None):
92 print "[SimpleRSS] parsing.."
94 # sometimes activates spinner :-/
95 dom = minidom_parseString(data)
97 print "[SimpleRSS] xml parsed.."
101 self.feeds[id].gotDom(dom)
102 print "[SimpleRSS] single feed parsed.."
105 new_items = self.feeds[self.current_feed].gotDom(dom)
107 print "[SimpleRSS] feed parsed.."
109 # Append new items to locally bound ones
110 self.new_items.extend(new_items)
112 # Start Timer so we can either fetch next feed or show new_items
115 def singlePoll(self, id, callback = False, errorback = None):
116 getPage(self.feeds[id].uri).addCallback(self._gotPage, id, callback, errorback).addErrback(errorback)
119 # Reloading, reschedule
121 print "[SimpleRSS] timer triggered while reloading, rescheduling"
122 self.poll_timer.start(10000, 1)
124 elif len(self.feeds) <= self.current_feed:
126 if len(self.new_items):
127 print "[SimpleRSS] got", len(self.new_items), "new items"
128 print "[SimpleRSS] calling back"
131 if config.plugins.simpleRSS.show_new.value:
132 self.session.open(RSSFeedView, self.new_items, newItems=True)
135 print "[SimpleRSS] no new items"
136 self.current_feed = 0
137 self.poll_timer.startLongTimer(config.plugins.simpleRSS.interval.value*60)
140 # Id is 0 -> empty out new items
141 if self.current_feed == 0:
143 # Feed supposed to autoupdate
144 feed = self.feeds[self.current_feed]
146 getPage(feed.uri).addCallback(self._gotPage).addErrback(self.error)
149 print "[SimpleRSS] passing feed"
153 self.current_feed += 1
154 self.poll_timer.start(1000, 1)
157 self.poll_timer.timeout.get().remove(self.poll)
158 self.poll_timer = None
160 def triggerReload(self):
161 self.reloading = True
165 for i in range(0, config.plugins.simpleRSS.feedcount.value):
166 for feed in self.feeds:
167 if config.plugins.simpleRSS.feed[i].uri.value == feed.uri:
168 # Update possibly different autoupdate value
169 feed.autoupdate = config.plugins.simpleRSS.feed[i].autoupdate.value
170 newfeeds.append(feed) # Append to new Feeds
171 self.feeds.remove(feed) # Remove from old Feeds
177 config.plugins.simpleRSS.feed[i].uri.value,
178 config.plugins.simpleRSS.feed[i].autoupdate.value
182 self.feeds = newfeeds
184 self.reloading = False