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):
125 raise NotImplementedError("On %s" % type(self))
128 raise NotImplementedError("")
130 def _get_children(self, on_success, on_error):
131 raise NotImplementedError("")
134 class ParentNode(Node):
136 def __init__(self, connection, parent, data):
137 Node.__init__(self, connection, parent, data)
143 def _get_children(self, on_success, on_error):
144 assert self._request is None
145 assert self._children is None
146 self._request = on_success, on_error
148 func, args, kwds = self._get_func()
150 self._connection.download(
159 raise NotImplementedError()
161 def _create_child(self, data):
162 raise NotImplementedError()
164 @misc_utils.log_exception(_moduleLogger)
165 def _on_success(self, data):
170 self._create_child(child)
174 _moduleLogger.exception("Translating error")
175 self._children = None
180 @misc_utils.log_exception(_moduleLogger)
181 def _on_error(self, error):
187 class LeafNode(Node):
189 def __init__(self, connection, parent, data):
190 Node.__init__(self, connection, parent, data)
196 def can_navigate(self):
197 raise NotImplementedError("On %s" % type(self))
201 raise NotImplementedError("On %s" % type(self))
205 raise NotImplementedError("On %s" % type(self))
207 def _get_children(self, on_success, on_error):
208 raise RuntimeError("Not is a leaf")
211 class RadioNode(ParentNode):
213 def __init__(self, connection):
214 ParentNode.__init__(self, connection, None, {})
221 return "get_radio_channels", (), {}
223 def _create_child(self, data):
224 return RadioChannelNode(self._connection, self, data)
227 class RadioChannelNode(LeafNode):
229 def __init__(self, connection, parent, data):
230 LeafNode.__init__(self, connection, parent, data)
231 self._extendedData = {}
235 def can_navigate(self):
248 return self._data["url"]
250 def get_programming(self, date, on_success, on_error):
251 date = date.strftime("%Y-%m-%d")
253 programming = self._extendedData[date]
255 self._get_programming(date, on_success, on_error)
257 on_success(programming)
259 def _get_programming(self, date, on_success, on_error):
260 assert self._request is None
261 assert date not in self._extendedData
262 self._request = on_success, on_error, date
264 self._connection.download(
265 "get_radio_channel_programming",
268 (self._data["id"], date),
272 @misc_utils.log_exception(_moduleLogger)
273 def _on_success(self, data):
278 self._extendedData[date] = [
283 _moduleLogger.exception("Translating error")
284 del self._extendedData[date]
287 r[0](self._extendedData[date])
289 @misc_utils.log_exception(_moduleLogger)
290 def _on_error(self, error):
296 class ConferencesNode(ParentNode):
298 def __init__(self, connection, langId):
299 ParentNode.__init__(self, connection, None, {})
300 self._langId = langId
307 return "get_conferences", (self._langId, ), {}
309 def _create_child(self, data):
310 return ConferenceNode(self._connection, self, data)
313 class ConferenceNode(ParentNode):
315 def __init__(self, connection, parent, data):
316 ParentNode.__init__(self, connection, parent, data)
320 return self._data["title"]
323 return "get_conference_sessions", (self._data["id"], ), {}
325 def _create_child(self, data):
326 return SessionNode(self._connection, self, data)
329 class SessionNode(ParentNode):
331 def __init__(self, connection, parent, data):
332 ParentNode.__init__(self, connection, parent, data)
336 return self._data["title"]
339 return "get_conference_talks", (self._data["id"], ), {}
341 def _create_child(self, data):
342 return TalkNode(self._connection, self, data)
345 class TalkNode(LeafNode):
347 def __init__(self, connection, parent, data):
348 LeafNode.__init__(self, connection, parent, data)
351 def can_navigate(self):
356 return self._data["title"]
360 return self._data["speaker"]
364 return self._data["url"]