From ed87ab8dd10f74ebd99b004651c0a8213527eb41 Mon Sep 17 00:00:00 2001 From: Arjun Naik Date: Mon, 28 Jul 2014 22:48:26 +0200 Subject: [PATCH] Added a playback history object to the core. --- mopidy/core/__init__.py | 1 + mopidy/core/actor.py | 7 +++++++ mopidy/core/history.py | 42 ++++++++++++++++++++++++++++++++++++++ mopidy/core/playback.py | 1 + tests/core/test_history.py | 27 ++++++++++++++++++++++++ 5 files changed, 78 insertions(+) create mode 100644 mopidy/core/history.py create mode 100644 tests/core/test_history.py diff --git a/mopidy/core/__init__.py b/mopidy/core/__init__.py index f49bbbe7..d857d4fb 100644 --- a/mopidy/core/__init__.py +++ b/mopidy/core/__init__.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals # flake8: noqa from .actor import Core +from .history import TrackHistory 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 66f2aa82..bb5058ee 100644 --- a/mopidy/core/actor.py +++ b/mopidy/core/actor.py @@ -7,6 +7,7 @@ import pykka from mopidy import audio, backend, mixer from mopidy.audio import PlaybackState +from mopidy.core.history import TrackHistory from mopidy.core.library import LibraryController from mopidy.core.listener import CoreListener from mopidy.core.playback import PlaybackController @@ -23,6 +24,10 @@ class Core( """The library controller. An instance of :class:`mopidy.core.LibraryController`.""" + history = None + """The playback history. An instance of + :class:`mopidy.core.TrackHistory`""" + playback = None """The playback controller. An instance of :class:`mopidy.core.PlaybackController`.""" @@ -42,6 +47,8 @@ class Core( self.library = LibraryController(backends=self.backends, core=self) + self.history = TrackHistory() + self.playback = PlaybackController( mixer=mixer, backends=self.backends, core=self) diff --git a/mopidy/core/history.py b/mopidy/core/history.py new file mode 100644 index 00000000..7f617441 --- /dev/null +++ b/mopidy/core/history.py @@ -0,0 +1,42 @@ +from __future__ import unicode_literals + +import logging + +from mopidy.models import Track + + +logger = logging.getLogger(__name__) + + +class TrackHistory(): + track_list = [] + + def add_track(self, track): + """ + :param track: track to change to + :type track: :class:`mopidy.models.Track` + """ + if type(track) is not Track: + 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) + + def get_history_size(self): + """ + Returns the number of tracks in the history. + :returns: The number of tracks in the history. + :rtype :int + """ + return len(self.track_list) + + def get_history(self): + """ + Returns the history. + :returns: The history as a list of `mopidy.models.Track` + :rtype: L{`mopidy.models.Track`} + """ + return self.track_list diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index df48422d..f0262830 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -248,6 +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._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 new file mode 100644 index 00000000..4e9b059c --- /dev/null +++ b/tests/core/test_history.py @@ -0,0 +1,27 @@ +import unittest + +from mopidy.core import TrackHistory + +from mopidy.models import Track + + +class PlaybackHistoryTest(unittest.TestCase): + def setUp(self): + self.tracks = [ + Track(uri='dummy1:a', name='foo'), + Track(uri='dummy2:a', name='foo'), + Track(uri='dummy3:a', name='bar') + ] + self.history = TrackHistory() + + def test_add_track(self): + self.history.add_track(self.tracks[0]) + self.assertEqual(self.history.get_history_size(), 1) + + 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