Fix metadata refresh with more than one pl in tracklist

This commit is contained in:
Alexandre Petitjean 2015-01-17 14:30:40 +01:00
parent 7ee1935315
commit eeed2973f1
3 changed files with 43 additions and 35 deletions

View File

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

View File

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

View File

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