From cd0e425effa391d9436dfb7176f15b2a7ba6b2ff Mon Sep 17 00:00:00 2001 From: Sumner Evans Date: Wed, 17 Jun 2020 22:17:50 -0600 Subject: [PATCH] Fix issue where createPlaylist didn't replace the song IDs --- server/ctrlsubsonic/handlers_common.go | 36 ++++++++++++++++++++++++-- server/server.go | 2 +- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/server/ctrlsubsonic/handlers_common.go b/server/ctrlsubsonic/handlers_common.go index 0ab4c63..d9c1993 100644 --- a/server/ctrlsubsonic/handlers_common.go +++ b/server/ctrlsubsonic/handlers_common.go @@ -140,7 +140,7 @@ func (c *Controller) ServeGetPlaylists(r *http.Request) *spec.Response { func (c *Controller) ServeGetPlaylist(r *http.Request) *spec.Response { params := r.Context().Value(CtxParams).(params.Params) - playlistID, err := params.GetInt("id") + playlistID, err := params.GetFirstInt("id", "playlistId") if err != nil { return spec.NewError(10, "please provide an `id` parameter") } @@ -175,6 +175,38 @@ func (c *Controller) ServeGetPlaylist(r *http.Request) *spec.Response { return sub } +func (c *Controller) ServeCreatePlaylist(r *http.Request) *spec.Response { + user := r.Context().Value(CtxUser).(*db.User) + params := r.Context().Value(CtxParams).(params.Params) + playlistID := params.GetFirstOrInt( /* default */ 0, "id", "playlistId") + // playlistID may be 0 from above. in that case we get a new playlist + // as intended + var playlist db.Playlist + c.DB. + Where("id=?", playlistID). + FirstOrCreate(&playlist) + // ** begin update meta info + playlist.UserID = user.ID + if val, err := params.Get("name"); err == nil { + playlist.Name = val + } + + // ** begin replace song IDs + trackIDs := []int{} + if p, err := params.GetIDList("songId"); err == nil { + for _, i := range p { + trackIDs = append(trackIDs, i.Value) + } + } + + // Set the items of the playlist + playlist.SetItems(trackIDs) + c.DB.Save(playlist) + + // Return the created/updated playlist. + return c.ServeGetPlaylist(r) +} + func (c *Controller) ServeUpdatePlaylist(r *http.Request) *spec.Response { user := r.Context().Value(CtxUser).(*db.User) params := r.Context().Value(CtxParams).(params.Params) @@ -202,7 +234,7 @@ func (c *Controller) ServeUpdatePlaylist(r *http.Request) *spec.Response { } } // ** begin add items - if p, err := params.GetFirstIDList("songId", "songIdToAdd"); err == nil { + if p, err := params.GetIDList("songIdToAdd"); err == nil { for _, i := range p { trackIDs = append(trackIDs, i.Value) } diff --git a/server/server.go b/server/server.go index efc6c1b..4e5a65b 100644 --- a/server/server.go +++ b/server/server.go @@ -153,7 +153,7 @@ func setupSubsonic(r *mux.Router, ctrl *ctrlsubsonic.Controller) { r.Handle("/getUser{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetUser)) r.Handle("/getPlaylists{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetPlaylists)) r.Handle("/getPlaylist{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetPlaylist)) - r.Handle("/createPlaylist{_:(?:\\.view)?}", ctrl.H(ctrl.ServeUpdatePlaylist)) + r.Handle("/createPlaylist{_:(?:\\.view)?}", ctrl.H(ctrl.ServeCreatePlaylist)) r.Handle("/updatePlaylist{_:(?:\\.view)?}", ctrl.H(ctrl.ServeUpdatePlaylist)) r.Handle("/deletePlaylist{_:(?:\\.view)?}", ctrl.H(ctrl.ServeDeletePlaylist)) r.Handle("/savePlayQueue{_:(?:\\.view)?}", ctrl.H(ctrl.ServeSavePlayQueue))