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}$'
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):
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):
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))