diff --git a/mopidy/core/__init__.py b/mopidy/core/__init__.py index d857d4fb..302c0a74 100644 --- a/mopidy/core/__init__.py +++ b/mopidy/core/__init__.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals # flake8: noqa from .actor import Core -from .history import TrackHistory +from .history import History from .library import LibraryController from .listener import CoreListener from .playback import PlaybackController, PlaybackState diff --git a/mopidy/core/actor.py b/mopidy/core/actor.py index bb5058ee..46f94d00 100644 --- a/mopidy/core/actor.py +++ b/mopidy/core/actor.py @@ -7,7 +7,7 @@ import pykka from mopidy import audio, backend, mixer from mopidy.audio import PlaybackState -from mopidy.core.history import TrackHistory +from mopidy.core.history import History from mopidy.core.library import LibraryController from mopidy.core.listener import CoreListener from mopidy.core.playback import PlaybackController @@ -47,7 +47,7 @@ class Core( self.library = LibraryController(backends=self.backends, core=self) - self.history = TrackHistory() + self.history = History() self.playback = PlaybackController( mixer=mixer, backends=self.backends, core=self) diff --git a/mopidy/core/history.py b/mopidy/core/history.py index 7f617441..3b7b9d9f 100644 --- a/mopidy/core/history.py +++ b/mopidy/core/history.py @@ -1,17 +1,19 @@ from __future__ import unicode_literals +import copy +import datetime import logging -from mopidy.models import Track +from mopidy.models import Ref, Track logger = logging.getLogger(__name__) -class TrackHistory(): +class History(object): track_list = [] - def add_track(self, track): + def add(self, track): """ :param track: track to change to :type track: :class:`mopidy.models.Track` @@ -20,12 +22,21 @@ class TrackHistory(): logger.warning('Cannot add non-Track type object to TrackHistory') return - # Reorder the track history if the track is already present. - if track in self.track_list: - self.track_list.remove(track) - self.track_list.insert(0, track) + timestamp = int(datetime.datetime.now().strftime("%s")) * 1000 + name_parts = [] + if track.name is not None: + name_parts.append(track.name) + if track.artists: + name_parts.append( + ', '.join([artist.name for artist in track.artists]) + ) + ref_name = ' - '.join(name_parts) + track_ref = Ref.track(uri=track.uri, name=ref_name) - def get_history_size(self): + self.track_list.insert(0, (timestamp, track_ref)) + + @property + def size(self): """ Returns the number of tracks in the history. :returns: The number of tracks in the history. @@ -39,4 +50,4 @@ class TrackHistory(): :returns: The history as a list of `mopidy.models.Track` :rtype: L{`mopidy.models.Track`} """ - return self.track_list + return copy.copy(self.track_list) diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index f0262830..58cc1a4b 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -248,7 +248,7 @@ class PlaybackController(object): if success: self.core.tracklist.mark_playing(tl_track) # TODO: replace with stream-changed - self.core.history.add_track(tl_track.track) + self.core.history.add(tl_track.track) self._trigger_track_playback_started() else: self.core.tracklist.mark_unplayable(tl_track) diff --git a/tests/core/test_history.py b/tests/core/test_history.py index 4e9b059c..67e3ccee 100644 --- a/tests/core/test_history.py +++ b/tests/core/test_history.py @@ -1,27 +1,41 @@ +from __future__ import unicode_literals + import unittest -from mopidy.core import TrackHistory - -from mopidy.models import Track +from mopidy.core import History +from mopidy.models import Artist, Track class PlaybackHistoryTest(unittest.TestCase): def setUp(self): self.tracks = [ - Track(uri='dummy1:a', name='foo'), + Track(uri='dummy1:a', name='foo', + artists=[Artist(name='foober'), Artist(name='barber')]), Track(uri='dummy2:a', name='foo'), Track(uri='dummy3:a', name='bar') ] - self.history = TrackHistory() + self.history = History() def test_add_track(self): - self.history.add_track(self.tracks[0]) - self.assertEqual(self.history.get_history_size(), 1) + self.history.add(self.tracks[0]) + self.history.add(self.tracks[1]) + self.history.add(self.tracks[2]) + self.assertEqual(self.history.size, 3) - def test_track_order(self): - self.history.add_track(self.tracks[0]) - self.history.add_track(self.tracks[1]) - self.history.add_track(self.tracks[2]) - self.history.add_track(self.tracks[0]) - self.assertEqual(self.history.get_history_size(), 3) - self.assertEqual(self.history.get_history()[0], self.tracks[0]) \ No newline at end of file + def test_unsuitable_add(self): + size = self.history.size + self.history.add(self.tracks[0]) + self.history.add(object()) + self.history.add(self.tracks[1]) + self.assertEqual(self.history.size, size + 2) + + def test_history_sanity(self): + track = self.tracks[0] + self.history.add(track) + stored_history = self.history.get_history() + track_ref = stored_history[0][1] + self.assertEqual(track_ref.uri, track.uri) + self.assertTrue(track.name in track_ref.name) + if track.artists: + for artist in track.artists: + self.assertTrue(artist.name in track_ref.name)