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.
This commit is contained in:
Thomas Adamcik 2015-03-13 23:56:51 +01:00
parent 6fcd43891e
commit 4db4b4d63b
8 changed files with 34 additions and 51 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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