From eeed2973f1236a25b598586c1634cbc225d359d9 Mon Sep 17 00:00:00 2001 From: Alexandre Petitjean Date: Sat, 17 Jan 2015 14:30:40 +0100 Subject: [PATCH] Fix metadata refresh with more than one pl in tracklist --- mopidy/core/actor.py | 32 ++++++++++++++++++------- mopidy/mpd/protocol/current_playlist.py | 23 ++++++++++++++---- mopidy/mpd/translator.py | 23 +----------------- 3 files changed, 43 insertions(+), 35 deletions(-) diff --git a/mopidy/core/actor.py b/mopidy/core/actor.py index 4ad38cb6..dbcfc9a1 100644 --- a/mopidy/core/actor.py +++ b/mopidy/core/actor.py @@ -14,6 +14,7 @@ from mopidy.core.listener import CoreListener from mopidy.core.playback import PlaybackController from mopidy.core.playlists import PlaylistsController from mopidy.core.tracklist import TracklistController +from mopidy.models import TlTrack, Track from mopidy.utils import versioning @@ -107,16 +108,31 @@ class Core( # Should return only one audio instance audios = pykka.ActorRegistry.get_by_class(audio.Audio) - if audios and len(audios) == 1: - audio_proxy = audios[0].proxy() + # Validity checks + if audios is None or len(audios) != 1: + return + if self.playback.current_tl_track is None: + return - # Request available metadata and put in playback - future = audio_proxy.get_current_tags() - mtdata = future.get() - self.playback.current_md_track = convert_tags_to_track(mtdata) + audio_proxy = audios[0].proxy() - # Send event to frontends - CoreListener.send('current_metadata_changed') + # Request available metadata and set a track + future = audio_proxy.get_current_tags() + mt_track = convert_tags_to_track(future.get()) + + # Merge current_tl_track with metadata in current_md_track + c_track = self.playback.current_tl_track.track + track_kwargs = {k: v for k, v in c_track.__dict__.items() if v} + for k, v in mt_track.__dict__.items(): + if v: + track_kwargs[k] = v + + self.playback.current_md_track = TlTrack(**{ + 'tlid': self.playback.current_tl_track.tlid, + 'track': Track(**track_kwargs)}) + + # Send event to frontends + CoreListener.send('current_metadata_changed') class Backends(list): diff --git a/mopidy/mpd/protocol/current_playlist.py b/mopidy/mpd/protocol/current_playlist.py index d5464791..bc89afcb 100644 --- a/mopidy/mpd/protocol/current_playlist.py +++ b/mopidy/mpd/protocol/current_playlist.py @@ -275,13 +275,26 @@ def plchanges(context, version): - Calls ``plchanges "-1"`` two times per second to get the entire playlist. """ # XXX Naive implementation that returns all tracks as changed - if int(version) < context.core.tracklist.version.get(): + tracklist_version = context.core.tracklist.version.get() + iversion = int(version) + if iversion < tracklist_version: return translator.tracks_to_mpd_format( context.core.tracklist.tl_tracks.get()) - else: - return translator.metadata_track_to_mpd_format( - context.core.playback.current_tl_track.get(), - context.core.playback.current_md_track.get()) + elif iversion == tracklist_version: + # If version are equals, it is just a metadata update + # So we replace the updated track in playlist + current_md_track = context.core.playback.current_md_track.get() + if current_md_track is None: + return None + + ntl_tracks = [] + tl_tracks = context.core.tracklist.tl_tracks.get() + for tl_track in tl_tracks: + if tl_track.tlid == current_md_track.tlid: + ntl_tracks.append(current_md_track) + else: + ntl_tracks.append(tl_track) + return translator.tracks_to_mpd_format(ntl_tracks) @protocol.commands.add('plchangesposid', version=protocol.INT) diff --git a/mopidy/mpd/translator.py b/mopidy/mpd/translator.py index 0788b2d6..23fb2874 100644 --- a/mopidy/mpd/translator.py +++ b/mopidy/mpd/translator.py @@ -2,7 +2,7 @@ from __future__ import absolute_import, unicode_literals import re -from mopidy.models import TlTrack, Track +from mopidy.models import TlTrack # TODO: special handling of local:// uri scheme normalize_path_re = re.compile(r'[^/]+') @@ -86,27 +86,6 @@ def track_to_mpd_format(track, position=None): return result -def metadata_track_to_mpd_format(track, metadata): - """ - Create new Track with a mix of track and metadata - and convert it to mpd format - """ - # Sanity check - if track is None or metadata is None: - return None - - # - if isinstance(track, TlTrack): - (tlid, track) = track - - track_kwargs = {k: v for k, v in track.__dict__.items() if v} - for k, v in metadata.__dict__.items(): - if v: - track_kwargs[k] = v - result_track = Track(**track_kwargs) - return track_to_mpd_format(result_track) - - def artists_to_mpd_format(artists): """ Format track artists for output to MPD client.