]> kaliko git repositories - mpd-sima.git/blobdiff - sima/lib/track.py
Changed tracks equality test
[mpd-sima.git] / sima / lib / track.py
index a938c2791776e912cc2991befeb9bb5dc45cd706..f6385d38a6b613fe7b2cd45257b40f164a105c5c 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Copyright (c) 2009, 2010, 2011, 2013, 2014 Jack Kaliko <kaliko@azylum.org>
+# Copyright (c) 2009, 2010, 2011, 2013, 2014, 2015, 2016, 2017 Jack Kaliko <kaliko@azylum.org>
 # Copyright (c) 2009 J. Alexander Treuman (Tag collapse method)
 # Copyright (c) 2008 Rick van Hattem
 #
 
 import time
 
-from .meta import Artist
+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):
         self.title = self.artist = self.album = self.albumartist = ''
-        self.musicbrainz_artistid = None
+        self.musicbrainz_artistid = self.musicbrainz_albumartistid = None
         self.pos = int(pos)
-        self._empty = False
         self._file = file
+        self._empty = False
+        self._time = time
         if not kwargs:
             self._empty = True
-        self._time = time
         self.__dict__.update(**kwargs)
         self.tags_to_collapse = ['artist', 'album', 'title', 'date',
-                                 'genre', 'albumartist']
+                                 'genre', 'albumartist',
+                                 'musicbrainz_artistid',
+                                 'musicbrainz_albumartistid']
         #  have tags been collapsed?
-        self.collapse_tags_bool = False
         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.
@@ -58,12 +66,11 @@ class Track:
             if tag not in self.tags_to_collapse:
                 continue
             if isinstance(value, list):
-                self.collapse_tags_bool = True
                 self.collapsed_tags.append(tag)
-                self.__dict__.update({tag: ', '.join(set(value))})
+                self.__dict__.update({tag: SEPARATOR.join(set(value))})
 
     def __repr__(self):
-        return '%s(artist="%s", album="%s", title="%s", filename="%s")' % (
+        return '%s(artist="%s", album="%s", title="%s", file="%s")' % (
             self.__class__.__name__,
             self.artist,
             self.album,
@@ -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:
@@ -99,6 +110,8 @@ class Track:
         return hash(self) != hash(other)
 
     def __bool__(self):
+        if not self._file:
+            return False
         return not self._empty
 
     @property
@@ -114,21 +127,27 @@ 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:
             fmt = '%M:%S'
         return time.strftime(fmt, temps)
 
-    def get_artist(self):
-       """Get artist object from track"""
-       return Artist(name=self.artist, mbid=self.musicbrainz_artistid)
+    @property
+    def Artist(self):
+        """Get the :class:`sima.lib.meta.Artist` associated to this track"""
+        if not self.artist:
+            if not self.musicbrainz_artistid:
+                return Artist(name='[unknown]',
+                              mbid='125ec42a-7229-4250-afc5-e057484327fe')
+            return Artist(name='[unknown]', **self.__dict__)
+        return Artist(**self.__dict__)
 
 # VIM MODLINE
 # vim: ai ts=4 sw=4 sts=4 expandtab