X-Git-Url: http://git.kaliko.me/?a=blobdiff_plain;f=sima%2Flib%2Fmeta.py;h=44369a272e8cc51f1313d9b60519e0e59ac4589f;hb=41048503e9b3cf0fdc58e14f35f483889a0b05ae;hp=32bb883dca5dd861a0b1f21b9fec89055edfc3c7;hpb=1b5cfb4c9187df891bd840b51c044d72ad0077d5;p=mpd-sima.git diff --git a/sima/lib/meta.py b/sima/lib/meta.py index 32bb883..44369a2 100644 --- a/sima/lib/meta.py +++ b/sima/lib/meta.py @@ -21,6 +21,7 @@ Defines some object to handle audio file metadata """ +import logging import re UUID_RE = r'^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$' @@ -38,24 +39,40 @@ class MetaException(Exception): class WrongUUID4(MetaException): pass +def mbidfilter(func): + def wrapper(*args, **kwargs): + cls = args[0] + if not cls.use_mbid: + kwargs.pop('mbid', None) + kwargs.pop('musicbrainz_artistid', None) + kwargs.pop('musicbrainz_albumartistid', None) + func(*args, **kwargs) + return wrapper + class Meta: """Generic Class for Meta object Meta(name=[, mbid=UUID4]) """ + use_mbid = True def __init__(self, **kwargs): self.__name = None #TODO: should be immutable self.__mbid = None self.__aliases = set() + self.log = logging.getLogger(__name__) if 'name' not in kwargs or not kwargs.get('name'): raise MetaException('Need a "name" argument') else: self.__name = kwargs.pop('name') if 'mbid' in kwargs and kwargs.get('mbid'): - is_uuid4(kwargs.get('mbid')) + try: + is_uuid4(kwargs.get('mbid')) + self.__mbid = kwargs.pop('mbid') + except WrongUUID4: + self.log.warning('Wrong mbid {}:{}'.format(self.__name, + kwargs.get('mbid'))) # mbid immutable as hash rests on - self.__mbid = kwargs.pop('mbid') self.__dict__.update(**kwargs) def __repr__(self): @@ -73,9 +90,11 @@ class Meta: if isinstance(other, Meta) and self.mbid and other.mbid: if self.mbid and other.mbid: return self.mbid == other.mbid - else: - return (other.__str__() == self.__str__() or - other.__str__() in self.__aliases) + elif isinstance(other, Meta): + return bool(self.names & other.names) + elif getattr(other, '__str__', None): + # is other.__str__() in self.__name or self.__aliases + return other.__str__() in self.names return False def __hash__(self): @@ -85,10 +104,11 @@ class Meta: def add_alias(self, other): if getattr(other, '__str__', None): - if callable(other.__str__): + if callable(other.__str__) and other.__str__() != self.name: self.__aliases |= {other.__str__()} elif isinstance(other, Meta): - self.__aliases |= other.__aliases + if other.name != self.name: + self.__aliases |= other.__aliases else: raise MetaException('No __str__ method found in {!r}'.format(other)) @@ -117,6 +137,7 @@ class Album(Meta): class Artist(Meta): + @mbidfilter def __init__(self, name=None, mbid=None, **kwargs): """Artist object built from a mapping dict containing at least an "artist" entry: