1 from Screens.MessageBox import MessageBox
2 from Components.config import config
3 from enigma import eTimer
5 from RSSScreens import RSSFeedView
6 from TagStrip import TagStrip
7 from RSSFeed import UniversalFeed
9 from twisted.web.client import getPage
10 from xml.dom.minidom import parseString as minidom_parseString
13 """Keeps all Feed and takes care of (automatic) updates"""
14 def __init__(self, session):
16 self.poll_timer = eTimer()
17 self.poll_timer.timeout.get().append(self.poll)
18 self.poll_timer.start(0, 1)
21 self.stripper = TagStrip()
23 # Functions to call when updates happened
24 self.update_callbacks = [ ]
26 # Save Session, Initialize Var to identify triggered Reload
27 self.session = session
28 self.reloading = False
33 config.plugins.simpleRSS.feed[i].uri.value,
34 config.plugins.simpleRSS.feed[i].autoupdate.value,
37 for i in range(0, config.plugins.simpleRSS.feedcount.value)
44 def addCallback(self, callback):
45 if callback not in self.update_callbacks:
46 self.update_callbacks.append(callback)
48 def removeCallback(self, callback):
49 if callback in self.update_callbacks:
50 self.update_callbacks.remove(callback)
52 def doCallback(self, id = None):
53 for callback in self.update_callbacks:
59 # Wrap boundFunction over real function
60 def _gotSinglePage(self, id, callback, errorback, data):
61 self._gotPage(data, id, callback, errorback)
63 def error(self, error = ""):
65 print "[SimpleRSS] error polling"
69 "Sorry, failed to fetch feed.\n" + error,
70 type = MessageBox.TYPE_INFO,
73 # Assume its just a temporary failure and jump over to next feed
76 def _gotPage(self, data, id = None, callback = False, errorback = None):
77 # workaround: exceptions in gotPage-callback were ignored
79 self.gotPage(data, id)
82 except NotImplementedError, errmsg:
83 # TODO: Annoying with Multifeed?
86 "Sorry, this type of feed is unsupported.\n"+ str(errmsg),
87 type = MessageBox.TYPE_INFO,
92 traceback.print_exc(file=sys.stdout)
93 # Errorback given, call it (asumme we don't need do restart timer!)
94 if errorback is not None:
97 # Assume its just a temporary failure and jump over to next feed
100 def gotPage(self, data, id = None):
101 print "[SimpleRSS] parsing.."
103 # sometimes activates spinner :-/
104 dom = minidom_parseString(data)
106 print "[SimpleRSS] xml parsed.."
110 self.feeds[id].gotDom(dom)
111 print "[SimpleRSS] single feed parsed.."
114 new_items = self.feeds[self.current_feed].gotDom(dom)
116 print "[SimpleRSS] feed parsed.."
118 # Append new items to locally bound ones
119 self.new_items.extend(new_items)
121 # Start Timer so we can either fetch next feed or show new_items
124 def singlePoll(self, id, callback = False, errorback = None):
125 from Tools.BoundFunction import boundFunction
126 getPage(self.feeds[id].uri).addCallback(callback=boundFunction(self._gotSinglePage, id, callback, errorback)).addErrback(errorback)
129 # Reloading, reschedule
131 print "[SimpleRSS] timer triggered while reloading, rescheduling"
132 self.poll_timer.start(10000, 1)
134 elif len(self.feeds) <= self.current_feed:
136 if len(self.new_items):
137 print "[SimpleRSS] got", len(self.new_items), "new items"
138 print "[SimpleRSS] calling back"
141 if config.plugins.simpleRSS.show_new.value:
142 self.session.open(RSSFeedView, self.new_items, newItems=True)
145 print "[SimpleRSS] no new items"
146 self.current_feed = 0
147 self.poll_timer.startLongTimer(config.plugins.simpleRSS.interval.value*60)
150 # Id is 0 -> empty out new items
151 if self.current_feed == 0:
153 # Feed supposed to autoupdate
154 feed = self.feeds[self.current_feed]
156 getPage(feed.uri).addCallback(self._gotPage).addErrback(self.error)
159 print "[SimpleRSS] passing feed"
163 self.current_feed += 1
164 self.poll_timer.start(1000, 1)
167 self.poll_timer.timeout.get().remove(self.poll)
168 self.poll_timer = None
170 def triggerReload(self):
171 self.reloading = True
175 for i in range(0, config.plugins.simpleRSS.feedcount.value):
176 for feed in self.feeds:
177 if config.plugins.simpleRSS.feed[i].uri.value == feed.uri:
178 # Update possibly different autoupdate value
179 feed.autoupdate = config.plugins.simpleRSS.feed[i].autoupdate.value
180 newfeeds.append(feed) # Append to new Feeds
181 self.feeds.remove(feed) # Remove from old Feeds
187 config.plugins.simpleRSS.feed[i].uri.value,
188 config.plugins.simpleRSS.feed[i].autoupdate.value,
193 self.feeds = newfeeds
195 self.reloading = False