From 7e151cbb0e4a0e5367f201eac4ef47dad0c1357c Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sun, 22 Oct 2023 16:52:58 -0700 Subject: [PATCH] ensure track artwork is fetched before updating Mac now playing metadata --- backend/app.go | 5 +++- backend/mpmedia_mac.go | 54 +++++++++++++++++++++++------------------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/backend/app.go b/backend/app.go index 7cb225a..c2bd2e2 100644 --- a/backend/app.go +++ b/backend/app.go @@ -112,7 +112,10 @@ func StartupApp(appName, displayAppName, appVersionTag, configFile, latestReleas // OS media center integrations a.setupMPRIS(displayAppName) - InitMPMediaHandler(a.Player, a.PlaybackManager, a.ImageManager.GetCoverArtUrl) + InitMPMediaHandler(a.Player, a.PlaybackManager, func(id string) (string, error) { + a.ImageManager.GetCoverThumbnail(id) // ensure image is cached locally + return a.ImageManager.GetCoverArtUrl(id) + }) return a, nil } diff --git a/backend/mpmedia_mac.go b/backend/mpmedia_mac.go index 832b8ac..2ea3308 100644 --- a/backend/mpmedia_mac.go +++ b/backend/mpmedia_mac.go @@ -74,31 +74,8 @@ func InitMPMediaHandler(player *player.Player, playbackManager *PlaybackManager, C.register_os_remote_commands() mp.playbackManager.OnSongChange(func(track, _ *mediaprovider.Track) { - var title, artist, artURL string - var duration int - if track != nil && track.ID != "" { - var err error - if artURL, err = mp.artURLLookup(track.CoverArtID); err != nil { - log.Printf("error fetching art url: %s", err.Error()) - } - title = track.Name - artist = strings.Join(track.ArtistNames, ", ") - duration = track.Duration - } - - cTitle := C.CString(title) - defer C.free(unsafe.Pointer(cTitle)) - - cArtist := C.CString(artist) - defer C.free(unsafe.Pointer(cArtist)) - - cArtURL := C.CString(artURL) - defer C.free(unsafe.Pointer(cArtURL)) - - cTrackDuration := C.double(duration) - - C.set_os_now_playing_info(cTitle, cArtist, cArtURL, cTrackDuration) - + // Asynchronously because artwork fetching can take time + go mp.updateMetadata(track) }) mp.player.OnStopped(func() { @@ -122,6 +99,33 @@ func InitMPMediaHandler(player *player.Player, playbackManager *PlaybackManager, return nil } +func (mp *MPMediaHandler) updateMetadata(track *mediaprovider.Track) { + var title, artist, artURL string + var duration int + if track != nil && track.ID != "" { + var err error + if artURL, err = mp.artURLLookup(track.CoverArtID); err != nil { + log.Printf("error fetching art url: %s", err.Error()) + } + title = track.Name + artist = strings.Join(track.ArtistNames, ", ") + duration = track.Duration + } + + cTitle := C.CString(title) + defer C.free(unsafe.Pointer(cTitle)) + + cArtist := C.CString(artist) + defer C.free(unsafe.Pointer(cArtist)) + + cArtURL := C.CString(artURL) + defer C.free(unsafe.Pointer(cArtURL)) + + cTrackDuration := C.double(duration) + + C.set_os_now_playing_info(cTitle, cArtist, cArtURL, cTrackDuration) +} + /** * Handle incoming OS commands. **/