]> kaliko git repositories - mpd-sima.git/blobdiff - sima/lib/track.py
Changed tracks equality test
[mpd-sima.git] / sima / lib / track.py
index 2874a192ad59497161b7698db3cbabd5d088aab2..f6385d38a6b613fe7b2cd45257b40f164a105c5c 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
 # -*- 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
 #
 # Copyright (c) 2009 J. Alexander Treuman (Tag collapse method)
 # Copyright (c) 2008 Rick van Hattem
 #
 
 import time
 
 
 import time
 
-from .meta import Artist
+from .meta import Artist, SEPARATOR
 
 class Track:
     """
     Track object.
 
 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):
     """
 
     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
         #  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.
         """
         Necessary to deal with tags defined multiple times.
         These entries are set as lists instead of strings.
@@ -60,7 +67,7 @@ class Track:
                 continue
             if isinstance(value, list):
                 self.collapsed_tags.append(tag)
                 continue
             if isinstance(value, list):
                 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", file="%s")' % (
 
     def __repr__(self):
         return '%s(artist="%s", album="%s", title="%s", file="%s")' % (
@@ -72,8 +79,8 @@ class Track:
         )
 
     def __str__(self):
         )
 
     def __str__(self):
-        return '{artist} - {album} - {title} ({duration})'.format(
-                duration=self.duration,
+        return '{artist} - {album} - {title} ({length})'.format(
+                length=self.length,
                 **self.__dict__
                 )
 
                 **self.__dict__
                 )
 
@@ -87,6 +94,10 @@ class Track:
         return Track(time=self.time - other.time)
 
     def __hash__(self):
         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:
         if self.file:
             return hash(self.file)
         else:
@@ -99,6 +110,8 @@ class Track:
         return hash(self) != hash(other)
 
     def __bool__(self):
         return hash(self) != hash(other)
 
     def __bool__(self):
+        if not self._file:
+            return False
         return not self._empty
 
     @property
         return not self._empty
 
     @property
@@ -114,12 +127,12 @@ class Track:
         """set time property"""
         self._time = int(value)
 
         """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
 
     @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:
         if temps.tm_hour:
             fmt = '%H:%M:%S'
         else:
@@ -128,7 +141,7 @@ class Track:
 
     @property
     def Artist(self):
 
     @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]',
         if not self.artist:
             if not self.musicbrainz_artistid:
                 return Artist(name='[unknown]',