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)
191 def _get_children(self, on_success, on_error):
192 raise RuntimeError("Not is a leaf")
195 class RadioNode(ParentNode):
197 def __init__(self, connection):
198 ParentNode.__init__(self, connection, None, {})
201 return "get_radio_channels", (), {}
203 def _create_child(self, data):
204 return RadioChannelNode(self._connection, self, data)
207 class RadioChannelNode(LeafNode):
209 def __init__(self, connection, parent, data):
210 LeafNode.__init__(self, connection, parent, data)
211 self._extendedData = {}
214 def get_programming(self, date, on_success, on_error):
215 date = date.strftime("%Y-%m-%d")
217 programming = self._extendedData[date]
219 self._get_programming(date, on_success, on_error)
221 on_success(programming)
223 def _get_programming(self, date, on_success, on_error):
224 assert self._request is None
225 assert date not in self._extendedData
226 self._request = on_success, on_error, date
228 self._connection.download(
229 "get_radio_channel_programming",
232 (self._data["id"], date),
236 @misc_utils.log_exception(_moduleLogger)
237 def _on_success(self, data):
242 self._extendedData[date] = [
247 _moduleLogger.exception("Translating error")
248 del self._extendedData[date]
251 r[0](self._extendedData[date])
253 @misc_utils.log_exception(_moduleLogger)
254 def _on_error(self, error):
260 class ConferencesNode(ParentNode):
262 def __init__(self, connection, langId):
263 ParentNode.__init__(self, connection, None, {})
264 self._langId = langId
267 return "get_conferences", (self._langId, ), {}
269 def _create_child(self, data):
270 return ConferenceNode(self._connection, self, data)
273 class ConferenceNode(ParentNode):
275 def __init__(self, connection, parent, data):
276 ParentNode.__init__(self, connection, parent, data)
279 return "get_conference_sessions", (self._data["id"], ), {}
281 def _create_child(self, data):
282 return SessionNode(self._connection, self, data)
285 class SessionNode(ParentNode):
287 def __init__(self, connection, parent, data):
288 ParentNode.__init__(self, connection, parent, data)
291 return "get_conference_talks", (self._data["id"], ), {}
293 def _create_child(self, data):
294 return TalkNode(self._connection, self, data)
297 class TalkNode(LeafNode):
299 def __init__(self, connection, parent, data):
300 LeafNode.__init__(self, connection, parent, data)