From e4dd04cfb77e0cd930a84ad4f7d983a5248a4b90 Mon Sep 17 00:00:00 2001 From: Alexandre Petitjean Date: Fri, 16 Jan 2015 21:41:55 +0100 Subject: [PATCH] One step beyond --- mopidy/core/actor.py | 12 +++--------- mopidy/core/listener.py | 5 +---- mopidy/core/playback.py | 8 ++++++++ mopidy/mpd/actor.py | 3 +++ mopidy/mpd/protocol/current_playlist.py | 4 ++++ mopidy/mpd/translator.py | 22 ++++++++++++++++++++++ 6 files changed, 41 insertions(+), 13 deletions(-) diff --git a/mopidy/core/actor.py b/mopidy/core/actor.py index ccd1e4c5..15a94665 100644 --- a/mopidy/core/actor.py +++ b/mopidy/core/actor.py @@ -109,18 +109,12 @@ class Core( if audios and len(audios) == 1: audio_proxy = audios[0].proxy() - # Gets metadata + # Request available metadata and put in playback future = audio_proxy.get_current_tags() - tags_data = future.get() - if not tags_data or not isinstance(tags_data, dict): - return - - # Convert to track and set playback - track = audio.utils.convert_tags_to_track(tags_data) - self.playback.current_track = track + self.playback.current_metadata = future.get() # Send event to frontends - CoreListener.send('track_metadata_changed', track_metadata=track) + CoreListener.send('current_metadata_changed') class Backends(list): diff --git a/mopidy/core/listener.py b/mopidy/core/listener.py index c94037b2..9d952473 100644 --- a/mopidy/core/listener.py +++ b/mopidy/core/listener.py @@ -164,13 +164,10 @@ class CoreListener(listener.Listener): """ pass - def track_metadata_changed(self, track_metadata): + def current_metadata_changed(self): """ Called whenever current track's metadata changed *MAY* be implemented by actor. - - :param track_metadata: the track with metadata - :type track_metadata: :class:`mopidy.models.Track` """ pass diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index ef3cc4b2..4b5f4b77 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -126,6 +126,14 @@ class PlaybackController(object): mute = property(get_mute, set_mute) """Mute state as a :class:`True` if muted, :class:`False` otherwise""" + def get_current_metadata(self): + return self.current_metadata + + current_metadata = None + """ + The currently playing metadata :class:`dict`, or :class:`None`. + """ + # Methods # TODO: remove this. diff --git a/mopidy/mpd/actor.py b/mopidy/mpd/actor.py index c8123c32..1f213812 100644 --- a/mopidy/mpd/actor.py +++ b/mopidy/mpd/actor.py @@ -71,3 +71,6 @@ class MpdFrontend(pykka.ThreadingActor, CoreListener): def mute_changed(self, mute): self.send_idle('output') + + def current_metadata_changed(self): + self.send_idle('playlist') diff --git a/mopidy/mpd/protocol/current_playlist.py b/mopidy/mpd/protocol/current_playlist.py index 33c090e3..09121df1 100644 --- a/mopidy/mpd/protocol/current_playlist.py +++ b/mopidy/mpd/protocol/current_playlist.py @@ -278,6 +278,10 @@ def plchanges(context, version): if int(version) < context.core.tracklist.version.get(): return translator.tracks_to_mpd_format( context.core.tracklist.tl_tracks.get()) + elif int(version) == context.core.tracklist.version.get(): + return translator.metadata_track_to_mpd_format( + context.core.playback.current_tl_track.get(), + context.core.playback.current_metadata.get()) @protocol.commands.add('plchangesposid', version=protocol.INT) diff --git a/mopidy/mpd/translator.py b/mopidy/mpd/translator.py index 23fb2874..95b1b263 100644 --- a/mopidy/mpd/translator.py +++ b/mopidy/mpd/translator.py @@ -86,6 +86,28 @@ def track_to_mpd_format(track, position=None): return result +def metadata_track_to_mpd_format(track, metadata): + # TODO: replace track data with metadata + result = [] + if track: + if isinstance(track, TlTrack): + (tlid, track) = track + else: + (tlid, track) = (None, track) + result = [ + ('file', track.uri or ''), + ('Time', track.length and (track.length // 1000) or 0), + ('Artist', artists_to_mpd_format(track.artists)), + ('Album', track.album and track.album.name or ''), + ] + if metadata and 'title' in metadata: + result.append(('Title', metadata['title'])) + else: + result.append(('Title', track.name or '')) + + return result + + def artists_to_mpd_format(artists): """ Format track artists for output to MPD client.