From 4db4b4d63b80510ec25805d3ecb39838c1d76f3b Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Fri, 13 Mar 2015 23:56:51 +0100 Subject: [PATCH] core: Reduce stream metadata to just the title The API I really want for this to support regular tracks, stream updates and dynamic playlists is still unclear to me. As such I'm taking the KISS approach and reducing this to just the stream title and nothing else. If all goes as planed this will be replaced by playback_track_changed(tlid, ref) style events and other improvements in a later version. --- mopidy/core/actor.py | 7 ++++--- mopidy/core/listener.py | 4 ++-- mopidy/core/playback.py | 24 +++++------------------ mopidy/mpd/actor.py | 2 +- mopidy/mpd/protocol/current_playlist.py | 6 +++--- mopidy/mpd/protocol/status.py | 4 ++-- mopidy/mpd/translator.py | 12 +++++------- tests/core/test_playback.py | 26 ++++++++++++------------- 8 files changed, 34 insertions(+), 51 deletions(-) diff --git a/mopidy/core/actor.py b/mopidy/core/actor.py index 251f6e2c..ed1c33ab 100644 --- a/mopidy/core/actor.py +++ b/mopidy/core/actor.py @@ -5,7 +5,7 @@ import itertools import pykka -from mopidy import audio, backend, mixer, models +from mopidy import audio, backend, mixer from mopidy.audio import PlaybackState from mopidy.core.history import HistoryController from mopidy.core.library import LibraryController @@ -124,8 +124,9 @@ class Core( if not tags or 'title' not in tags or not tags['title']: return - self.playback._stream_ref = models.Ref.track(name=tags['title'][0]) - CoreListener.send('stream_changed') + title = tags['title'][0] + self.playback._stream_title = title + CoreListener.send('stream_title_changed', title=title) class Backends(list): diff --git a/mopidy/core/listener.py b/mopidy/core/listener.py index f013fa18..3ae03925 100644 --- a/mopidy/core/listener.py +++ b/mopidy/core/listener.py @@ -164,9 +164,9 @@ class CoreListener(listener.Listener): """ pass - def stream_changed(self): + def stream_title_changed(self, title): """ - Called whenever the currently playing stream changes. + Called whenever the currently playing stream title changes. *MAY* be implemented by actor. """ diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index 6314442b..e92563dd 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -20,7 +20,7 @@ class PlaybackController(object): self.core = core self._current_tl_track = None - self._stream_ref = None + self._stream_title = None self._state = PlaybackState.STOPPED def _get_backend(self): @@ -73,23 +73,9 @@ class PlaybackController(object): Use :meth:`get_current_track` instead. """ - def get_stream_reference(self): - """ - Get additional information about the current stream. - - For most cases this value won't be set, but for radio streams it will - contain a reference with the name of the currently playing track or - program. Clients should show this when available. - - The :class:`mopidy.models.Ref` instance may or may not have an URI set. - If present you can call ``lookup`` on it to get the full metadata for - the URI. - - Returns a :class:`mopidy.models.Ref` instance representing the current - stream. If nothing is playing, or no stream info is available this will - return :class:`None`. - """ - return self._stream_ref + def get_stream_title(self): + """Get the current stream title or :class:`None`.""" + return self._stream_title def get_state(self): """Get The playback state.""" @@ -248,7 +234,7 @@ class PlaybackController(object): self.set_current_tl_track(None) def on_stream_changed(self, uri): - self._stream_ref = None + self._stream_title = None def next(self): """ diff --git a/mopidy/mpd/actor.py b/mopidy/mpd/actor.py index 2c63bcb2..2aecb6d1 100644 --- a/mopidy/mpd/actor.py +++ b/mopidy/mpd/actor.py @@ -74,5 +74,5 @@ class MpdFrontend(pykka.ThreadingActor, CoreListener): def mute_changed(self, mute): self.send_idle('output') - def stream_changed(self): + def stream_title_changed(self, title): self.send_idle('playlist') diff --git a/mopidy/mpd/protocol/current_playlist.py b/mopidy/mpd/protocol/current_playlist.py index fdd65bde..d8e1a9d8 100644 --- a/mopidy/mpd/protocol/current_playlist.py +++ b/mopidy/mpd/protocol/current_playlist.py @@ -282,14 +282,14 @@ def plchanges(context, version): elif version == tracklist_version: # A version match could indicate this is just a metadata update, so # check for a stream ref and let the client know about the change. - stream_ref = context.core.playback.get_stream_reference().get() - if stream_ref is None: + stream_title = context.core.playback.get_stream_title().get() + if stream_title is None: return None tl_track = context.core.playback.current_tl_track.get() position = context.core.tracklist.index(tl_track).get() return translator.track_to_mpd_format( - tl_track, position=position, stream=stream_ref) + tl_track, position=position, stream_title=stream_title) @protocol.commands.add('plchangesposid', version=protocol.INT) diff --git a/mopidy/mpd/protocol/status.py b/mopidy/mpd/protocol/status.py index e2e73e6f..aa78b387 100644 --- a/mopidy/mpd/protocol/status.py +++ b/mopidy/mpd/protocol/status.py @@ -35,11 +35,11 @@ def currentsong(context): identified in status). """ tl_track = context.core.playback.current_tl_track.get() - stream = context.core.playback.get_stream_reference().get() + stream_title = context.core.playback.get_stream_title().get() if tl_track is not None: position = context.core.tracklist.index(tl_track).get() return translator.track_to_mpd_format( - tl_track, position=position, stream=stream) + tl_track, position=position, stream_title=stream_title) @protocol.commands.add('idle', list_command=False) diff --git a/mopidy/mpd/translator.py b/mopidy/mpd/translator.py index 37c1493b..10207a69 100644 --- a/mopidy/mpd/translator.py +++ b/mopidy/mpd/translator.py @@ -15,7 +15,7 @@ def normalize_path(path, relative=False): return '/'.join(parts) -def track_to_mpd_format(track, position=None, stream=None): +def track_to_mpd_format(track, position=None, stream_title=None): """ Format track for output to MPD client. @@ -23,10 +23,8 @@ def track_to_mpd_format(track, position=None, stream=None): :type track: :class:`mopidy.models.Track` or :class:`mopidy.models.TlTrack` :param position: track's position in playlist :type position: integer - :param key: if we should set key - :type key: boolean - :param mtime: if we should set mtime - :type mtime: boolean + :param stream_title: The current streams title. + :type position: string :rtype: list of two-tuples """ if isinstance(track, TlTrack): @@ -42,8 +40,8 @@ def track_to_mpd_format(track, position=None, stream=None): ('Album', track.album and track.album.name or ''), ] - if stream and stream.name != track.name: - result.append(('Name', stream.name)) + if stream_title: + result.append(('Name', stream_title)) if track.date: result.append(('Date', track.date)) diff --git a/tests/core/test_playback.py b/tests/core/test_playback.py index 15d2d5f8..80efc38a 100644 --- a/tests/core/test_playback.py +++ b/tests/core/test_playback.py @@ -571,45 +571,43 @@ class TestStream(unittest.TestCase): event, kwargs = self.events.pop(0) self.core.on_event(event, **kwargs) - def test_get_stream_reference_before_playback(self): - self.assertEqual(self.playback.get_stream_reference(), None) + def test_get_stream_title_before_playback(self): + self.assertEqual(self.playback.get_stream_title(), None) - def test_get_stream_reference_during_playback(self): + def test_get_stream_title_during_playback(self): self.core.playback.play() self.replay_audio_events() - self.assertEqual(self.playback.get_stream_reference(), None) + self.assertEqual(self.playback.get_stream_title(), None) - def test_get_stream_reference_during_playback_with_tags_change(self): + def test_get_stream_title_during_playback_with_tags_change(self): self.core.playback.play() self.audio.trigger_fake_tags_changed({'title': ['foobar']}).get() self.replay_audio_events() - expected = Ref.track(name='foobar') - self.assertEqual(self.playback.get_stream_reference(), expected) + self.assertEqual(self.playback.get_stream_title(), 'foobar') - def test_get_stream_reference_after_next(self): + def test_get_stream_title_after_next(self): self.core.playback.play() self.audio.trigger_fake_tags_changed({'title': ['foobar']}).get() self.core.playback.next() self.replay_audio_events() - self.assertEqual(self.playback.get_stream_reference(), None) + self.assertEqual(self.playback.get_stream_title(), None) - def test_get_stream_reference_after_next_with_tags_change(self): + def test_get_stream_title_after_next_with_tags_change(self): self.core.playback.play() self.audio.trigger_fake_tags_changed({'title': ['foo']}).get() self.core.playback.next() self.audio.trigger_fake_tags_changed({'title': ['bar']}).get() self.replay_audio_events() - expected = Ref.track(name='bar') - self.assertEqual(self.playback.get_stream_reference(), expected) + self.assertEqual(self.playback.get_stream_title(), 'bar') - def test_get_stream_reference_after_stop(self): + def test_get_stream_title_after_stop(self): self.core.playback.play() self.audio.trigger_fake_tags_changed({'title': ['foobar']}).get() self.core.playback.stop() self.replay_audio_events() - self.assertEqual(self.playback.get_stream_reference(), None) + self.assertEqual(self.playback.get_stream_title(), None)