Home | Trees | Indices | Help |
---|
|
1 # -*- coding: utf-8 -*- 2 # Elisa - Home multimedia server 3 # Copyright (C) 2006-2008 Fluendo Embedded S.L. (www.fluendo.com). 4 # All rights reserved. 5 # 6 # This file is available under one of two license agreements. 7 # 8 # This file is licensed under the GPL version 3. 9 # See "LICENSE.GPL" in the root of this distribution including a special 10 # exception to use Elisa with Fluendo's plugins. 11 # 12 # The GPL part of Elisa is also available under a commercial licensing 13 # agreement from Fluendo. 14 # See "LICENSE.Elisa" in the root directory of this distribution package 15 # for details on that license. 16 17 """ 18 Metadata parsing of medias using metadata_provider components 19 """ 20 21 __maintainer__ = 'Philippe Normand <philippe@fluendo.com>' 22 __maintainer2__ = 'Benjamin Kampmann <benjamin@fluendo.com>' 23 24 from elisa.core import common 25 from elisa.core import manager 26 from elisa.base_components import metadata_provider 27 from twisted.internet import defer, task, threads 2830 """ 31 This manager is responsible for media metadata parsing. It creates 32 and handles the L{elisa.base_components.metadata_provider.MetadataProvider} 33 components. 34 """ 3895 96 def metadata_providers_iter(metadata): 97 for provider in self._sorted_providers: 98 if None not in metadata.values(): 99 # all metadata keys filled 100 break 101 102 if not provider.able_to_handle(metadata): 103 self.log('%s not able to handle %r', 104 provider.name, metadata) 105 continue 106 107 self.log('Using metadata provider %s', provider.name) 108 dfr = provider.get_metadata(metadata, low_priority) 109 dfr.addCallbacks(get_metadata_done, get_metadata_failure, 110 callbackArgs=(provider,), errbackArgs=(provider,)) 111 yield dfr 112 113 def metadata_providers_iter_done(iterator, metadata): 114 self.log('got metadata %r' % metadata) 115 116 return metadata 117 118 dfr = task.coiterate(metadata_providers_iter(metadata)) 119 dfr.addCallback(metadata_providers_iter_done, metadata) 120 121 return dfr 12240 manager.Manager.register_component(self, provider) 41 42 # insertion sort: sorted insertion in the list of already sorted 43 # MetadataProviders; the key is the rank 44 rank = provider.get_rank() 45 for i in range(len(self._sorted_providers)): 46 current_rank = self._sorted_providers[i].get_rank() 47 if rank <= current_rank: 48 self._sorted_providers.insert(i, provider) 49 return 50 51 self._sorted_providers.append(provider)5254 manager.Manager.unregister_component(self, provider) 55 56 self._sorted_providers.remove(provider)57 6264 """ Retrieve the metadata of the media located at given URI. 65 66 Metadata is returned as a dictionnary mapping keys depending 67 on the content type (example: artist, album, track for 'audio' 68 content-type) to actual metadata values. 69 If you do a request for metadata, the value of this has to be a None 70 Object. 71 72 @param metadata: a dicitionary containing the already known 73 metadata and empty values for the requested tags 74 @type metadata: dict 75 @rtype: L{twisted.internet.defer.Deferred} 76 """ 77 self.debug("Looking for metadata %s in providers %s", 78 metadata, self._sorted_providers) 79 80 if self._components == []: 81 self.warning("No metadata provider available") 82 return defer.succeed(metadata) 83 84 def get_metadata_done(result, provider): 85 self.log('done using metadata provider %s', provider.name) 86 87 return result88 89 def get_metadata_failure(failure, provider): 90 self.warning('failure using metadata provider %s: %s', 91 provider.name, failure.getBriefTraceback()) 92 93 # eat the error and continue 94 return None
Home | Trees | Indices | Help |
---|
Generated by Epydoc 3.0beta1 on Wed Jan 16 19:10:30 2008 | http://epydoc.sourceforge.net |