From 4d6626b7f23398e7629bd566cca1b4b2879097d7 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Tue, 16 Apr 2024 17:17:48 -0700 Subject: [PATCH] add restoring of play queue from server --- backend/app.go | 4 ++-- backend/savedplayqueue.go | 24 +++++++++++++++++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/backend/app.go b/backend/app.go index 1f211c5..b3dbc5b 100644 --- a/backend/app.go +++ b/backend/app.go @@ -305,7 +305,7 @@ func (a *App) Shutdown() { a.MPRISHandler.Shutdown() a.PlaybackManager.DisableCallbacks() if a.Config.Application.SavePlayQueue { - SavePlayQueue(a.ServerManager.ServerID.String(), a.PlaybackManager, configdir.LocalConfig(a.appName, savedQueueFile), false) + SavePlayQueue(a.ServerManager.ServerID.String(), a.PlaybackManager, configdir.LocalConfig(a.appName, savedQueueFile), nil) } a.PlaybackManager.Stop() // will trigger scrobble check a.Config.LocalPlayback.Volume = a.LocalPlayer.GetVolume() @@ -316,7 +316,7 @@ func (a *App) Shutdown() { } func (a *App) LoadSavedPlayQueue() error { - queue, err := LoadPlayQueue(configdir.LocalConfig(a.appName, savedQueueFile), a.ServerManager) + queue, err := LoadPlayQueue(configdir.LocalConfig(a.appName, savedQueueFile), a.ServerManager, false) if err != nil { return err } diff --git a/backend/savedplayqueue.go b/backend/savedplayqueue.go index 53cdca6..2e492da 100644 --- a/backend/savedplayqueue.go +++ b/backend/savedplayqueue.go @@ -22,7 +22,8 @@ type serializedSavedPlayQueue struct { } // SavePlayQueue saves the current play queue and playback position to a JSON file. -func SavePlayQueue(serverID string, pm *PlaybackManager, filepath string, saveToServer bool) error { +// If the provided CanSavePlayQueue server is non-nil, it will also save to the server. +func SavePlayQueue(serverID string, pm *PlaybackManager, filepath string, server mediaprovider.CanSavePlayQueue) error { queue := pm.GetPlayQueue() stats := pm.PlayerStatus() trackIdx := pm.NowPlayingIndex() @@ -41,15 +42,32 @@ func SavePlayQueue(serverID string, pm *PlaybackManager, filepath string, saveTo b, _ := json.Marshal(saved) err := os.WriteFile(filepath, b, 0644) - if saveToServer { + if server != nil { + // save to server + err = server.SavePlayQueue(trackIDs, trackIdx, int(stats.TimePos)) } return err } // Loads the saved play queue from the given filepath using the current server. +// If loadFromServer is true and the current server supports saving the play queue, +// the queue will attempt to load from the server and only use the local file as a fallback. // Returns an error if the queue could not be loaded for any reason, including the // currently logged in server being different than the server from which the queue was saved. -func LoadPlayQueue(filepath string, sm *ServerManager) (*SavedPlayQueue, error) { +func LoadPlayQueue(filepath string, sm *ServerManager, loadFromServer bool) (*SavedPlayQueue, error) { + if pq, ok := sm.Server.(mediaprovider.CanSavePlayQueue); loadFromServer && ok && pq != nil { + // load queue from server + queue, err := pq.GetPlayQueue() + if err == nil { + return &SavedPlayQueue{ + Tracks: queue.Tracks, + TrackIndex: queue.TrackPos, + TimePos: float64(queue.TimePos), + }, nil + } + } + + // load queue from local file b, err := os.ReadFile(filepath) if err != nil { return nil, err