1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 __maintainer__ = 'Benjamin Kampmann <benjamin@fluendo.com>'
19
20 from menu_entry_builder import MenuEntryBuilder
21 from elisa.core.observers.list import ListObserver, ListObservable
22 from elisa.core.observers.dict import DictObserver, DictObservable
23 from elisa.core.media_uri import MediaUri
24 from elisa.core.media_manager import MediaProviderNotFound
25 from elisa.core import common
26
27 from Queue import Queue
28
29 from weakref import ref
30
31 from twisted.internet import defer, reactor
32 from twisted.internet.error import AlreadyCalled
33
36
48
50
51 - def __init__(self, model, config, first_element_dfr):
52 ListObserver.__init__(self)
53 self._model = ref(model)
54 self._config = config
55 self._queue = Queue()
56 self._observers = []
57 self.running = False
58 self.check_on_empty = False
59 self._first_element_dfr = first_element_dfr
60 self._queue_delayed_call = None
61
63 """
64 clean up all references and stop the process of running
65 """
66 self.running = False
67 try:
68 self._first_element_dfr.errback(DeferredCanceled)
69 except defer.AlreadyCalledError:
70 pass
71
72 if self._queue_delayed_call and self._queue_delayed_call.active():
73 self._queue_delayed_call.cancel()
74 model = self._model()
75 if model:
76 model.loading = False
77 self._observers[:] = []
78
94
99
100 if not self._queue.empty():
101 uri, metadata, model, index = self._queue.get()
102 if self.running:
103 dfr = self._process_model(uri, metadata, model, index)
104 dfr.addBoth(delay_call)
105 else:
106 self.running = False
107 model = self._model()
108 if model and self.check_on_empty and len(model.children) == 0:
109 try:
110 self._first_element_dfr.errback(Exception)
111 except defer.AlreadyCalledError:
112 pass
113 model = self._model()
114 if model:
115 model.loading = False
116
142
143 def insert_model(new_model, index):
144 model = self._model()
145 if not model:
146 return
147 new_model.activity = model.activity
148 model.children.insert(index, new_model)
149 model.has_children = True
150 try:
151 model.loading = False
152 self._first_element_dfr.callback(model.children)
153 except AlreadyCalled:
154
155
156 pass
157
158 def set_play_action(uri, model, file_type):
159 action = registry.create_component('xmlmenu:play_action')
160 action.player_model = model.activity.activity.player_model
161 action.model = ref(model)
162 model.activate_action = action
163
164 def set_videoplay_action(uri, model):
165 action = registry.create_component('xmlmenu:videoplay_action')
166 action.player_model = model.activity.activity.player_model
167 action.model = ref(model)
168 model.activate_action = action
169
170 def set_view_image_action(uri, model):
171 registry = common.application.plugin_registry
172 action = registry.create_component('xmlmenu:viewimage_action')
173 action.uri = uri
174 action.parent_model = self._model
175 action.slideshow_model = model.activity.activity.slideshow_model
176 model.activate_action = action
177
178 def set_enqueue_action(model):
179 registry = common.application.plugin_registry
180 action = registry.create_component('xmlmenu:enqueue_action')
181 action.parent_model = model
182
183 action.playlist_model = model.activity.activity.player_model.playlist
184 model.children = registry.create_component('base:list_model')
185 new_model = registry.create_component('base:menu_node_model')
186 new_model.text = 'Enqueue'
187 new_model.activate_action = action
188 model.children.append(new_model)
189
190 def set_thumbnail_source(uri, metadata, model, file_type):
191 if metadata.has_key('default_image'):
192 model.thumbnail_source = metadata['default_image']
193 else:
194
195
196 if file_type == "image" or file_type == "video":
197 model.thumbnail_source = uri
198 else:
199 model.thumbnail_source = None
200
201 def got_media_type(media_type):
202 file_type = media_type['file_type']
203 if file_type == "directory":
204 model.has_children = True
205
206
207
208 if uri.scheme == 'elisa' and uri.path.find('/albums/') != -1:
209 theme_icon = 'audio_album_icon'
210 else:
211 theme_icon = self._config['DefaultDirsIcon']
212
213 model.theme_icon = theme_icon
214
215
216 else:
217
218 model.has_children = False
219 model.theme_icon = self._config['DefaultFilesIcon']
220 if file_type == "image":
221 set_view_image_action(uri, model)
222 elif file_type == "video":
223 set_videoplay_action(uri, model)
224 elif file_type == "audio":
225 set_play_action(uri, model, file_type)
226
227 file_filter = self._config['MediaFilter']
228
229 if file_filter.lower() == 'any' or \
230 file_type == 'directory' or \
231 file_type == file_filter:
232
233
234 if metadata.has_key('artist'):
235 model.sub_text = metadata['artist']
236
237 modified_metadata = observe_metadata(metadata, model)
238 metadata_manager.get_metadata(modified_metadata)
239 set_thumbnail_source(uri, modified_metadata, model, file_type)
240 insert_model(model, index)
241
242 dfr = media_manager.get_media_type(uri)
243 dfr.addCallback(got_media_type)
244 return dfr
245
246 - def removed(self, elements, position):
258
355
356 first_element_dfr = defer.Deferred()
357 if uri:
358 children = ListObservable()
359 uri_observer = UriObserver(model, config, first_element_dfr)
360 children.add_observer(uri_observer)
361 self._observers[id(model.children)] = uri_observer
362
363 model.has_children = False
364 model.loading = True
365 media_manager = common.application.media_manager
366 try:
367 dfr = media_manager.get_direct_children(uri, children)
368 except MediaProviderNotFound, exc:
369
370 self.warning("No Media provider found for %s" % uri)
371 model.loading = False
372 return defer.fail(exc)
373
374 if dfr != None:
375 dfr.addCallback(got_children, uri, model,
376 first_element_dfr,
377 uri_observer)
378 dfr.addErrback(erroneous_get_children, uri, model)
379 else:
380 model.has_children = False
381 model.loading = False
382 else:
383 self.debug("No URI for %r", model)
384 return defer.fail(None)
385 return first_element_dfr
386
397