]> kaliko git repositories - mpd-sima.git/blob - sima/lib/meta.py
Fixed type issue with depth/recursion
[mpd-sima.git] / sima / lib / meta.py
1 # -*- coding: utf-8 -*-
2 # Copyright (c) 2013, 2014 Jack Kaliko <kaliko@azylum.org>
3 #
4 #  This file is part of sima
5 #
6 #  sima is free software: you can redistribute it and/or modify
7 #  it under the terms of the GNU General Public License as published by
8 #  the Free Software Foundation, either version 3 of the License, or
9 #  (at your option) any later version.
10 #
11 #  sima is distributed in the hope that it will be useful,
12 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 #  GNU General Public License for more details.
15 #
16 #  You should have received a copy of the GNU General Public License
17 #  along with sima.  If not, see <http://www.gnu.org/licenses/>.
18 #
19 #
20 """
21 Defines some object to handle audio file metadata
22 """
23
24 from .simastr import SimaStr
25
26 class MetaException(Exception):
27     """Generic Meta Exception"""
28     pass
29
30 class NotSameArtist(MetaException):
31     pass
32
33
34 class Meta:
35     """Generic Class for Meta object"""
36
37     def __init__(self, **kwargs):
38         self.name = None
39         self.mbid = None
40         if 'name' not in kwargs:
41             raise MetaException('need at least a "name" argument')
42         self.__dict__.update(kwargs)
43
44     def __repr__(self):
45         fmt = '{0}(name="{1.name}", mbid="{1.mbid}")'
46         return fmt.format(self.__class__.__name__, self)
47
48     def __str__(self):
49         return str(self.name)
50
51     def __eq__(self, other):
52         """
53         Perform mbid equality test if present,
54         else fallback on fuzzy equality
55         """
56         if hasattr(other, 'mbid'):
57             if other.mbid and self.mbid:
58                 return self.mbid == other.mbid
59         return SimaStr(str(self)) == SimaStr(str(other))
60
61     def __hash__(self):
62         if self.mbid is not None:
63             return hash(self.mbid)
64         else:
65             return id(self)
66
67
68 class Album(Meta):
69     __hash__ = Meta.__hash__
70
71     def __init__(self, **kwargs):
72         super().__init__(**kwargs)
73
74     def __eq__(self, other):
75         """
76         Perform mbid equality test if present,
77         else fallback on self.name equality
78         """
79         if hasattr(other, 'mbid'):
80             if other.mbid and self.mbid:
81                 return self.mbid == other.mbid
82         return str(self) == str(other)
83
84     @property
85     def album(self):
86         return self.name
87
88
89 class Artist(Meta):
90
91     def __init__(self, **kwargs):
92         self._aliases = []
93         super().__init__(**kwargs)
94
95     def append(self, name):
96         self._aliases.append(name)
97
98     @property
99     def names(self):
100         return self._aliases + [self.name]
101
102     def __add__(self, other):
103         if isinstance(other, Artist):
104             if self.mbid == other.mbid:
105                 res = Artist(**self.__dict__)
106                 res._aliases.extend(other.names)
107                 return res
108             else:
109                 raise NotSameArtist('different mbids: {0} and {1}'.format(self, other))
110
111 # vim: ai ts=4 sw=4 sts=4 expandtab
112