TrackHistory stores Ref instances. Timestamp as epoch in milliseconds also stored.

This commit is contained in:
Arjun Naik 2014-08-04 01:07:26 +02:00 committed by Stein Magnus Jodal
parent ed87ab8dd1
commit 9006968f75
5 changed files with 52 additions and 27 deletions

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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])
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)