X-Git-Url: https://git.kaliko.me/?a=blobdiff_plain;f=sima%2Flib%2Ftrack.py;h=f6385d38a6b613fe7b2cd45257b40f164a105c5c;hb=refs%2Fheads%2Ftrack_equality;hp=a774a4ceafdceeb7ec7c0c5c57d819c20a35d378;hpb=e5ac6da78e3433a1b94676f6523e358d6089f263;p=mpd-sima.git diff --git a/sima/lib/track.py b/sima/lib/track.py index a774a4c..f6385d3 100644 --- a/sima/lib/track.py +++ b/sima/lib/track.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2009, 2010, 2011, 2013, 2014, 2015 Jack Kaliko +# Copyright (c) 2009, 2010, 2011, 2013, 2014, 2015, 2016, 2017 Jack Kaliko # Copyright (c) 2009 J. Alexander Treuman (Tag collapse method) # Copyright (c) 2008 Rick van Hattem # @@ -28,7 +28,14 @@ from .meta import Artist, SEPARATOR class Track: """ Track object. - Instanciate with Player replies. + Instantiate with Player replies. + + :param str file: media file, defaults to ``None`` + :param int time: duration in second, defaults to 0 + :param int pos: position in queue, defaults to -1 + :param str title|artist|album: defaults to "" + :param str musicbrainz_artistid: MusicBrainz IDs, defaults to ``None`` + :param str musicbrainz_albumartistid: MusicBrainz IDs, defaults to ``None`` """ def __init__(self, file=None, time=0, pos=-1, **kwargs): @@ -48,9 +55,9 @@ class Track: # have tags been collapsed? self.collapsed_tags = list() # Needed for multiple tags which returns a list instead of a string - self.collapse_tags() + self._collapse_tags() - def collapse_tags(self): + def _collapse_tags(self): """ Necessary to deal with tags defined multiple times. These entries are set as lists instead of strings. @@ -72,8 +79,8 @@ class Track: ) def __str__(self): - return '{artist} - {album} - {title} ({duration})'.format( - duration=self.duration, + return '{artist} - {album} - {title} ({length})'.format( + length=self.length, **self.__dict__ ) @@ -87,6 +94,10 @@ class Track: return Track(time=self.time - other.time) def __hash__(self): + if self.musicbrainz_artistid and self.title: + return hash(self.musicbrainz_artistid + self.title) + if self.artist and self.title: + return hash(self.artist + self.title) if self.file: return hash(self.file) else: @@ -116,12 +127,12 @@ class Track: """set time property""" self._time = int(value) - time = property(get_time, set_time, doc='song duration in seconds') + time = property(get_time, set_time, doc='song duration in seconds (use :attr:`length` for human readable time)') @property - def duration(self): - """Compute fancy duration""" - temps = time.gmtime(int(self.time)) + def length(self): + """Get a fancy duration as ``%H:%M:%S`` (use :attr:`time` to get duration in second only)""" + temps = time.gmtime(int(self.time)) #TODO: returns a date not a duration if temps.tm_hour: fmt = '%H:%M:%S' else: @@ -130,7 +141,7 @@ class Track: @property def Artist(self): - """Get artist object from track""" + """Get the :class:`sima.lib.meta.Artist` associated to this track""" if not self.artist: if not self.musicbrainz_artistid: return Artist(name='[unknown]',