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 if new_items is not None:
111 self.new_items.extend(new_items)
113 # Start Timer so we can either fetch next feed or show new_items
116 def singlePoll(self, id, callback = False, errorback = None):
117 getPage(self.feeds[id].uri).addCallback(self._gotPage, id, callback, errorback).addErrback(errorback)
120 # Reloading, reschedule
122 print "[SimpleRSS] timer triggered while reloading, rescheduling"
123 self.poll_timer.start(10000, 1)
125 elif len(self.feeds) <= self.current_feed:
127 if len(self.new_items):
128 print "[SimpleRSS] got", len(self.new_items), "new items"
129 print "[SimpleRSS] calling back"
132 if config.plugins.simpleRSS.show_new.value:
133 self.session.open(RSSFeedView, self.new_items, newItems=True)
136 print "[SimpleRSS] no new items"
137 self.current_feed = 0
138 self.poll_timer.startLongTimer(config.plugins.simpleRSS.interval.value*60)
141 # Id is 0 -> empty out new items
142 if self.current_feed == 0:
144 # Feed supposed to autoupdate
145 feed = self.feeds[self.current_feed]
147 getPage(feed.uri).addCallback(self._gotPage).addErrback(self.error)
150 print "[SimpleRSS] passing feed"
154 self.current_feed += 1
155 self.poll_timer.start(1000, 1)
158 self.poll_timer.timeout.get().remove(self.poll)
159 self.poll_timer = None
161 def triggerReload(self):
162 self.reloading = True
166 for i in range(0, config.plugins.simpleRSS.feedcount.value):
167 for feed in self.feeds:
168 if config.plugins.simpleRSS.feed[i].uri.value == feed.uri:
169 # Update possibly different autoupdate value
170 feed.autoupdate = config.plugins.simpleRSS.feed[i].autoupdate.value
171 newfeeds.append(feed) # Append to new Feeds
172 self.feeds.remove(feed) # Remove from old Feeds
178 config.plugins.simpleRSS.feed[i].uri.value,
179 config.plugins.simpleRSS.feed[i].autoupdate.value
183 self.feeds = newfeeds
185 self.reloading = False