diff --git a/persistence/playlist_repository.go b/persistence/playlist_repository.go index d7d516cf9..ac3b60bb2 100644 --- a/persistence/playlist_repository.go +++ b/persistence/playlist_repository.go @@ -53,6 +53,7 @@ func NewPlaylistRepository(ctx context.Context, db dbx.Builder) model.PlaylistRe r.db = db r.tableName = "playlist" r.registerModel(&model.Playlist{}, map[string]filterFunc{ + "id": idFilter(r.tableName), "q": playlistFilter, "smart": smartPlaylistFilter, "starred": booleanFilter, @@ -97,7 +98,7 @@ func (r *playlistRepository) CountAll(options ...model.QueryOptions) (int64, err } func (r *playlistRepository) Exists(id string) (bool, error) { - return r.exists(And{Eq{"id": id}, r.userFilter()}) + return r.exists(And{Eq{"playlist.id": id}, r.userFilter()}) } func (r *playlistRepository) Delete(id string) error { @@ -111,7 +112,7 @@ func (r *playlistRepository) Delete(id string) error { return rest.ErrPermissionDenied } } - return r.delete(And{Eq{"id": id}, r.userFilter()}) + return r.delete(And{Eq{"playlist.id": id}, r.userFilter()}) } func (r *playlistRepository) Put(p *model.Playlist) error { diff --git a/server/subsonic/media_annotation.go b/server/subsonic/media_annotation.go index 18589814d..381db9675 100644 --- a/server/subsonic/media_annotation.go +++ b/server/subsonic/media_annotation.go @@ -147,7 +147,9 @@ func (api *Router) setStar(ctx context.Context, star bool, ids ...string) error if err != nil { return err } - event = event.With("playlist", id) + event = event.With("playlist", "*") + // Ensure the refresh event is sent to all clients, including the originator + ctx = events.BroadcastToAll(ctx) continue } err = tx.MediaFile(ctx).SetStar(star, id) diff --git a/server/subsonic/media_annotation_test.go b/server/subsonic/media_annotation_test.go index 84642c8c9..4b5077a35 100644 --- a/server/subsonic/media_annotation_test.go +++ b/server/subsonic/media_annotation_test.go @@ -45,8 +45,7 @@ var _ = Describe("MediaAnnotationController", func() { event := eventBroker.Events[0].(*events.RefreshResource) data := event.Data(event) - Expect(data).To(ContainSubstring("playlist")) - Expect(data).To(ContainSubstring("pls-1")) + Expect(data).To(ContainSubstring(`"playlist":["*"]`)) }) It("should send refresh resource event when unstarring a playlist", func() { @@ -63,8 +62,7 @@ var _ = Describe("MediaAnnotationController", func() { event := eventBroker.Events[0].(*events.RefreshResource) data := event.Data(event) - Expect(data).To(ContainSubstring("playlist")) - Expect(data).To(ContainSubstring("pls-1")) + Expect(data).To(ContainSubstring(`"playlist":["*"]`)) }) }) diff --git a/ui/src/layout/PlaylistsSubMenu.jsx b/ui/src/layout/PlaylistsSubMenu.jsx index 1d4996909..f0cb39588 100644 --- a/ui/src/layout/PlaylistsSubMenu.jsx +++ b/ui/src/layout/PlaylistsSubMenu.jsx @@ -51,7 +51,7 @@ const PlaylistMenuItemLink = ({ pls, sidebarIsOpen }) => { const PlaylistsSubMenu = ({ state, setState, sidebarIsOpen, dense }) => { const history = useHistory() - useResourceRefresh('playlist') + useResourceRefresh() const { data, loaded } = useQueryWithStore({ type: 'getList', resource: 'playlist',