X-Git-Url: https://git.kaliko.me/?a=blobdiff_plain;f=sima%2Flib%2Fmeta.py;h=26da9ca66efc05918a9c45b87a8de39ea08a345b;hb=b93b19e230fd0753d190f3107da50b78c719bf7f;hp=2877b2fa833f7239d392c8cee9c110119360412d;hpb=031f1da47546ebf12f6e74467fcf4824ea4a26a3;p=mpd-sima.git diff --git a/sima/lib/meta.py b/sima/lib/meta.py index 2877b2f..26da9ca 100644 --- a/sima/lib/meta.py +++ b/sima/lib/meta.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2013, 2014, 2015 Jack Kaliko +# Copyright (c) 2013, 2014, 2015, 2021 kaliko # # This file is part of sima # @@ -21,10 +21,8 @@ Defines some object to handle audio file metadata """ -try: - from collections.abc import Set # python >= 3.3 -except ImportError: - from collections import Set # python 3.2 + +from collections.abc import Set import logging import re @@ -46,7 +44,7 @@ def is_uuid4(uuid): class MetaException(Exception): """Generic Meta Exception""" - pass + def mbidfilter(func): def wrapper(*args, **kwargs): @@ -58,6 +56,14 @@ def mbidfilter(func): func(*args, **kwargs) return wrapper +def serialize(func): + def wrapper(*args, **kwargs): + ans = func(*args, **kwargs) + if isinstance(ans, set): + return {s.replace("'", r"\'") for s in ans} + return ans.replace("'", r"\'") + return wrapper + class Meta: """ @@ -77,13 +83,13 @@ class Meta: def __init__(self, **kwargs): """Meta(name=[, mbid=UUID4])""" - self.__name = None #TODO: should be immutable + 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 (str type)') - elif not isinstance(kwargs.get('name'), str): + if not isinstance(kwargs.get('name'), str): raise MetaException('"name" argument not a string') else: self.__name = kwargs.pop('name') @@ -110,9 +116,9 @@ class Meta: #if hasattr(other, 'mbid'): # better isinstance? if isinstance(other, Meta) and self.mbid and other.mbid: return self.mbid == other.mbid - elif isinstance(other, Meta): + if isinstance(other, Meta): return bool(self.names & other.names) - elif getattr(other, '__str__', None): + if getattr(other, '__str__', None): # is other.__str__() in self.__name or self.__aliases return other.__str__() in self.names return False @@ -142,6 +148,11 @@ class Meta: def name(self): return self.__name + @property + @serialize + def name_sz(self): + return self.name + @property def mbid(self): return self.__mbid @@ -150,19 +161,34 @@ class Meta: def aliases(self): return self.__aliases + @property + @serialize + def aliases_sz(self): + return self.aliases + @property def names(self): """aliases + name""" return self.__aliases | {self.__name,} + @property + @serialize + def names_sz(self): + return self.names + class Album(Meta): """Album object""" + @mbidfilter + def __init__(self, name=None, mbid=None, **kwargs): + super().__init__(name=name, mbid=mbid, **kwargs) + @property def album(self): return self.name + class Artist(Meta): """Artist object deriving from :class:`Meta`.