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:
parent
6fcd43891e
commit
4db4b4d63b
@ -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):
|
||||
|
||||
@ -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.
|
||||
"""
|
||||
|
||||
@ -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):
|
||||
"""
|
||||
|
||||
@ -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')
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user