4 import util.misc as misc_utils
5 from util import go_utils
9 _moduleLogger = logging.getLogger(__name__)
12 class Connection(object):
15 self._backend = backend.Backend()
16 self._indexing = go_utils.AsyncPool()
19 self._indexing.start()
24 def download(self, func, on_success, on_error, args = None, kwds = None):
30 self._indexing.clear_tasks()
31 self._indexing.add_task(
32 getattr(self._backend, func),
40 class AudioIndex(object):
43 self._connection = Connection()
44 self._languages = None
45 self._languagesRequest = None
49 self._connection.start()
52 self._connection.stop()
54 def get_languages(self, on_success, on_error):
55 if self._languages is None:
56 assert self._languagesRequest is None
57 self._languagesRequest = on_success, on_error
58 self._connection.download(
60 self._on_get_languages,
61 self._on_languages_error
64 on_success(self._languages)
66 def get_source(self, source, langId = None):
67 key = (source, langId)
68 if key in self._sources:
69 node = self._sources[key]
72 node = RadioNode(self._connection)
73 elif source == "conferences":
74 assert langId is not None
75 node = ConferencesNode(self._connection, langId)
77 raise NotImplementedError(source)
78 self._sources[key] = node
82 @misc_utils.log_exception(_moduleLogger)
83 def _on_get_languages(self, languages):
84 assert self._languages is None
85 assert self._languagesRequest is not None
86 r = self._languagesRequest
87 self._languagesRequest = None
88 self._languages = languages
91 @misc_utils.log_exception(_moduleLogger)
92 def _on_languages_error(self, e):
93 assert self._languages is None
94 assert self._languagesRequest is not None
95 r = self._languagesRequest
96 self._languagesRequest = None
102 def __init__(self, connection, parent, data):
103 self._connection = connection
104 self._parent = weakref.ref(parent) if parent is not None else None
106 self._children = None
108 def get_children(self, on_success, on_error):
109 if self._children is None:
110 self._get_children(on_success, on_error)
112 on_success(self._children)
114 def get_parent(self):
115 if self._parent is None:
116 raise RuntimeError("")
117 parent = self._parent()
120 def get_properties(self):
124 raise NotImplementedError("")
126 def _get_children(self, on_success, on_error):
127 raise NotImplementedError("")
130 class ParentNode(Node):
132 def __init__(self, connection, parent, data):
133 Node.__init__(self, connection, parent, data)
139 def _get_children(self, on_success, on_error):
140 assert self._request is None
141 assert self._children is None
142 self._request = on_success, on_error
144 func, args, kwds = self._get_func()
146 self._connection.download(
155 raise NotImplementedError()
157 def _create_child(self, data):
158 raise NotImplementedError()
160 @misc_utils.log_exception(_moduleLogger)
161 def _on_success(self, data):
166 self._create_child(child)
170 _moduleLogger.exception("Translating error")
171 self._children = None
176 @misc_utils.log_exception(_moduleLogger)
177 def _on_error(self, error):
183 class LeafNode(Node):
185 def __init__(self, connection, parent, data):
186 Node.__init__(self, connection, parent, data)
192 def can_navigate(self):
193 raise NotImplementedError("On %s" % type(self))
197 raise NotImplementedError("On %s" % type(self))
201 raise NotImplementedError("On %s" % type(self))
203 def _get_children(self, on_success, on_error):
204 raise RuntimeError("Not is a leaf")
207 class RadioNode(ParentNode):
209 def __init__(self, connection):
210 ParentNode.__init__(self, connection, None, {})
213 return "get_radio_channels", (), {}
215 def _create_child(self, data):
216 return RadioChannelNode(self._connection, self, data)
219 class RadioChannelNode(LeafNode):
221 def __init__(self, connection, parent, data):
222 LeafNode.__init__(self, connection, parent, data)
223 self._extendedData = {}
227 def can_navigate(self):
238 def get_programming(self, date, on_success, on_error):
239 date = date.strftime("%Y-%m-%d")
241 programming = self._extendedData[date]
243 self._get_programming(date, on_success, on_error)
245 on_success(programming)
247 def _get_programming(self, date, on_success, on_error):
248 assert self._request is None
249 assert date not in self._extendedData
250 self._request = on_success, on_error, date
252 self._connection.download(
253 "get_radio_channel_programming",
256 (self._data["id"], date),
260 @misc_utils.log_exception(_moduleLogger)
261 def _on_success(self, data):
266 self._extendedData[date] = [
271 _moduleLogger.exception("Translating error")
272 del self._extendedData[date]
275 r[0](self._extendedData[date])
277 @misc_utils.log_exception(_moduleLogger)
278 def _on_error(self, error):
284 class ConferencesNode(ParentNode):
286 def __init__(self, connection, langId):
287 ParentNode.__init__(self, connection, None, {})
288 self._langId = langId
291 return "get_conferences", (self._langId, ), {}
293 def _create_child(self, data):
294 return ConferenceNode(self._connection, self, data)
297 class ConferenceNode(ParentNode):
299 def __init__(self, connection, parent, data):
300 ParentNode.__init__(self, connection, parent, data)
303 return "get_conference_sessions", (self._data["id"], ), {}
305 def _create_child(self, data):
306 return SessionNode(self._connection, self, data)
309 class SessionNode(ParentNode):
311 def __init__(self, connection, parent, data):
312 ParentNode.__init__(self, connection, parent, data)
315 return "get_conference_talks", (self._data["id"], ), {}
317 def _create_child(self, data):
318 return TalkNode(self._connection, self, data)
321 class TalkNode(LeafNode):
323 def __init__(self, connection, parent, data):
324 LeafNode.__init__(self, connection, parent, data)
327 def can_navigate(self):
332 return self._date["title"]
336 return self._date["speaker"]