TrackHistory stores Ref instances. Timestamp as epoch in milliseconds also stored.
This commit is contained in:
parent
ed87ab8dd1
commit
9006968f75
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user