]> kaliko git repositories - mpd-sima.git/blob - sima/lib/meta.py
Some clean-up (pylint audit)
[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 from .track import Track
26
27 class MetaException(Exception):
28     """Generic Meta Exception"""
29     pass
30
31 class NotSameArtist(MetaException):
32     pass
33
34
35 class Meta:
36     """Generic Class for Meta object"""
37
38     def __init__(self, **kwargs):
39         self.name = None
40         self.mbid = None
41         if 'name' not in kwargs:
42             raise MetaException('need at least a "name" argument')
43         self.__dict__.update(kwargs)
44
45     def __repr__(self):
46         fmt = '{0}(name="{1.name}", mbid="{1.mbid}")'
47         return fmt.format(self.__class__.__name__, self)
48
49     def __str__(self):
50         return str(self.name)
51
52     def __eq__(self, other):
53         """
54         Perform mbid equality test if present,
55         else fallback on fuzzy equality
56         """
57         if hasattr(other, 'mbid'):
58             if other.mbid and self.mbid:
59                 return self.mbid == other.mbid
60         return SimaStr(str(self)) == SimaStr(str(other))
61
62     def __hash__(self):
63         if self.mbid is not None:
64             return hash(self.mbid)
65         else:
66             return id(self)
67
68
69 class Album(Meta):
70     __hash__ = Meta.__hash__
71
72     def __init__(self, **kwargs):
73         super().__init__(**kwargs)
74
75     def __eq__(self, other):
76         """
77         Perform mbid equality test if present,
78         else fallback on self.name equality
79         """
80         if hasattr(other, 'mbid'):
81             if other.mbid and self.mbid:
82                 return self.mbid == other.mbid
83         return str(self) == str(other)
84
85     @property
86     def album(self):
87         return self.name
88
89
90 class Artist(Meta):
91
92     def __init__(self, **kwargs):
93         self._aliases = []
94         super().__init__(**kwargs)
95
96     def append(self, name):
97         self._aliases.append(name)
98
99     @property
100     def names(self):
101         return self._aliases + [self.name]
102
103     def __add__(self, other):
104         if isinstance(other, Artist):
105             if self.mbid == other.mbid:
106                 res = Artist(**self.__dict__)
107                 res._aliases.extend(other.names)
108                 return res
109             else:
110                 raise NotSameArtist('different mbids: {0} and {1}'.format(self, other))
111
112
113 class TrackMB(Track):
114
115     def __init__(self, **kwargs):
116         super().__init__(**kwargs)
117         if hasattr(self, 'musicbrainz_artistid'):
118             self.artist = Artist(mbid=self.musicbrainz_artistid,
119                                  name=self.artist)
120
121 # vim: ai ts=4 sw=4 sts=4 expandtab
122