Fix metadata refresh with more than one pl in tracklist
This commit is contained in:
parent
7ee1935315
commit
eeed2973f1
@ -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):
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user