]> kaliko git repositories - mpd-sima.git/blob - sima/lib/track.py
Fixed Track's pos attribute type
[mpd-sima.git] / sima / lib / track.py
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2009, 2010, 2011, 2013 Jack Kaliko <kaliko@azylum.org>
4 # Copyright (c) 2009 J. Alexander Treuman (Tag collapse method)
5 # Copyright (c) 2008 Rick van Hattem
6 #
7 #  This file is part of sima
8 #
9 #  sima is free software: you can redistribute it and/or modify
10 #  it under the terms of the GNU General Public License as published by
11 #  the Free Software Foundation, either version 3 of the License, or
12 #  (at your option) any later version.
13 #
14 #  sima is distributed in the hope that it will be useful,
15 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 #  GNU General Public License for more details.
18 #
19 #  You should have received a copy of the GNU General Public License
20 #  along with sima.  If not, see <http://www.gnu.org/licenses/>.
21 #
22 #
23
24 import time
25
26
27 class Track(object):
28     """
29     Track object.
30     Instanciate with Player replies.
31     """
32
33     def __init__(self, file=None, time=0, pos=-1, **kwargs):
34         self.title = self.artist = self.album = self.albumartist = ''
35         self.pos = int(pos)
36         self._empty = False
37         self._file = file
38         if not kwargs:
39             self._empty = True
40         self.time = time
41         self.__dict__.update(**kwargs)
42         self.tags_to_collapse = ['artist', 'album', 'title', 'date',
43                                  'genre', 'albumartist']
44         #  have tags been collapsed?
45         self.collapse_tags_bool = False
46         self.collapsed_tags = list()
47         # Needed for multiple tags which returns a list instead of a string
48         self.collapse_tags()
49
50     def collapse_tags(self):
51         """
52         Necessary to deal with tags defined multiple times.
53         These entries are set as lists instead of strings.
54         """
55         for tag, value in self.__dict__.items():
56             if tag not in self.tags_to_collapse:
57                 continue
58             if isinstance(value, list):
59                 self.collapse_tags_bool = True
60                 self.collapsed_tags.append(tag)
61                 self.__dict__.update({tag: ', '.join(set(value))})
62
63     def __repr__(self):
64         return '%s(artist="%s", album="%s", title="%s", filename="%s")' % (
65             self.__class__.__name__,
66             self.artist,
67             self.album,
68             self.title,
69             self.file,
70         )
71
72     def __str__(self):
73         return '{artist} - {album} - {title} ({duration})'.format(
74                 duration=self.duration,
75                 **self.__dict__
76                 )
77
78     def __int__(self):
79         return self.time
80
81     def __add__(self, other):
82         return Track(time=self.time + other.time)
83
84     def __sub__(self, other):
85         return Track(time=self.time - other.time)
86
87     def __hash__(self):
88         if self.file:
89             return hash(self.file)
90         else:
91             return id(self)
92
93     def __eq__(self, other):
94         return hash(self) == hash(other)
95
96     def __ne__(self, other):
97         return hash(self) != hash(other)
98
99     def __bool__(self):
100         return not self._empty
101
102     @property
103     def file(self):
104         """file is an immutable attribute that's used for the hash method"""
105         return self._file
106
107     def get_time(self):
108         """get time property"""
109         return self._time
110
111     def set_time(self, value):
112         """set time property"""
113         self._time = int(value)
114
115     time = property(get_time, set_time, doc='song duration in seconds')
116
117     @property
118     def duration(self):
119         """Compute fancy duration"""
120         temps = time.gmtime(int(self.time))
121         if temps.tm_hour:
122             fmt = '%H:%M:%S'
123         else:
124             fmt = '%M:%S'
125         return time.strftime(fmt, temps)
126
127
128 def main():
129     pass
130
131 # Script starts here
132 if __name__ == '__main__':
133     main()
134
135 # VIM MODLINE
136 # vim: ai ts=4 sw=4 sts=4 expandtab