Package elisa :: Package core :: Module metadata_manager
[hide private]
[frames] | no frames]

Source Code for Module elisa.core.metadata_manager

  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 
 28   
29 -class MetadataManager(manager.Manager):
30 """ 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 """
35 - def __init__(self):
36 manager.Manager.__init__(self) 37 self._sorted_providers = []
38
39 - def register_component(self, provider):
40 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)
52
53 - def unregister_component(self, provider):
54 manager.Manager.unregister_component(self, provider) 55 56 self._sorted_providers.remove(provider)
57
58 - def stop(self):
59 manager.Manager.stop(self) 60 61 self._sorted_providers = []
62
63 - def get_metadata(self, metadata, low_priority=False):
64 """ 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 result
88 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
95 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 122