diff --git a/cmd/wire_gen.go b/cmd/wire_gen.go index e77343ce5..e462c1102 100644 --- a/cmd/wire_gen.go +++ b/cmd/wire_gen.go @@ -47,14 +47,13 @@ func CreateSubsonicAPIRouter() (*subsonic.Router, error) { listGenerator := engine.NewListGenerator(dataStore, nowPlayingRepository) users := engine.NewUsers(dataStore) playlists := engine.NewPlaylists(dataStore) - ratings := engine.NewRatings(dataStore) scrobbler := engine.NewScrobbler(dataStore, nowPlayingRepository) search := engine.NewSearch(dataStore) transcoderTranscoder := transcoder.New() transcodingCache := core.NewTranscodingCache() mediaStreamer := core.NewMediaStreamer(dataStore, transcoderTranscoder, transcodingCache) players := engine.NewPlayers(dataStore) - router := subsonic.New(browser, artwork, listGenerator, users, playlists, ratings, scrobbler, search, mediaStreamer, players, dataStore) + router := subsonic.New(browser, artwork, listGenerator, users, playlists, scrobbler, search, mediaStreamer, players, dataStore) return router, nil } diff --git a/engine/ratings.go b/engine/ratings.go deleted file mode 100644 index 0807602cb..000000000 --- a/engine/ratings.go +++ /dev/null @@ -1,71 +0,0 @@ -package engine - -import ( - "context" - - "github.com/deluan/navidrome/log" - "github.com/deluan/navidrome/model" -) - -type Ratings interface { - SetStar(ctx context.Context, star bool, ids ...string) error - SetRating(ctx context.Context, id string, rating int) error -} - -func NewRatings(ds model.DataStore) Ratings { - return &ratings{ds} -} - -type ratings struct { - ds model.DataStore -} - -func (r ratings) SetRating(ctx context.Context, id string, rating int) error { - exist, err := r.ds.Album(ctx).Exists(id) - if err != nil { - return err - } - if exist { - return r.ds.Album(ctx).SetRating(rating, id) - } - return r.ds.MediaFile(ctx).SetRating(rating, id) -} - -func (r ratings) SetStar(ctx context.Context, star bool, ids ...string) error { - if len(ids) == 0 { - log.Warn(ctx, "Cannot star/unstar an empty list of ids") - return nil - } - - return r.ds.WithTx(func(tx model.DataStore) error { - for _, id := range ids { - exist, err := r.ds.Album(ctx).Exists(id) - if err != nil { - return err - } - if exist { - err = tx.Album(ctx).SetStar(star, ids...) - if err != nil { - return err - } - continue - } - exist, err = r.ds.Artist(ctx).Exists(id) - if err != nil { - return err - } - if exist { - err = tx.Artist(ctx).SetStar(star, ids...) - if err != nil { - return err - } - continue - } - err = tx.MediaFile(ctx).SetStar(star, ids...) - if err != nil { - return err - } - } - return nil - }) -} diff --git a/engine/wire_providers.go b/engine/wire_providers.go index d2d676588..36fef83f8 100644 --- a/engine/wire_providers.go +++ b/engine/wire_providers.go @@ -8,7 +8,6 @@ var Set = wire.NewSet( NewBrowser, NewListGenerator, NewPlaylists, - NewRatings, NewScrobbler, NewSearch, NewNowPlayingRepository, diff --git a/server/subsonic/api.go b/server/subsonic/api.go index 158ccad94..ad01afb53 100644 --- a/server/subsonic/api.go +++ b/server/subsonic/api.go @@ -27,7 +27,6 @@ type Router struct { Artwork core.Artwork ListGenerator engine.ListGenerator Playlists engine.Playlists - Ratings engine.Ratings Scrobbler engine.Scrobbler Search engine.Search Users engine.Users @@ -39,10 +38,10 @@ type Router struct { } func New(browser engine.Browser, artwork core.Artwork, listGenerator engine.ListGenerator, users engine.Users, - playlists engine.Playlists, ratings engine.Ratings, scrobbler engine.Scrobbler, search engine.Search, + playlists engine.Playlists, scrobbler engine.Scrobbler, search engine.Search, streamer core.MediaStreamer, players engine.Players, ds model.DataStore) *Router { r := &Router{Browser: browser, Artwork: artwork, ListGenerator: listGenerator, Playlists: playlists, - Ratings: ratings, Scrobbler: scrobbler, Search: search, Users: users, Streamer: streamer, Players: players, + Scrobbler: scrobbler, Search: search, Users: users, Streamer: streamer, Players: players, DataStore: ds} r.mux = r.routes() return r diff --git a/server/subsonic/media_annotation.go b/server/subsonic/media_annotation.go index 35fb3d4a2..28abe2588 100644 --- a/server/subsonic/media_annotation.go +++ b/server/subsonic/media_annotation.go @@ -14,14 +14,11 @@ import ( type MediaAnnotationController struct { scrobbler engine.Scrobbler - ratings engine.Ratings + ds model.DataStore } -func NewMediaAnnotationController(scrobbler engine.Scrobbler, ratings engine.Ratings) *MediaAnnotationController { - return &MediaAnnotationController{ - scrobbler: scrobbler, - ratings: ratings, - } +func NewMediaAnnotationController(scrobbler engine.Scrobbler, ds model.DataStore) *MediaAnnotationController { + return &MediaAnnotationController{scrobbler: scrobbler, ds: ds} } func (c *MediaAnnotationController) SetRating(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { @@ -35,7 +32,7 @@ func (c *MediaAnnotationController) SetRating(w http.ResponseWriter, r *http.Req } log.Debug(r, "Setting rating", "rating", rating, "id", id) - err = c.ratings.SetRating(r.Context(), id, rating) + err = c.setRating(r.Context(), id, rating) switch { case err == model.ErrNotFound: @@ -49,6 +46,17 @@ func (c *MediaAnnotationController) SetRating(w http.ResponseWriter, r *http.Req return NewResponse(), nil } +func (c *MediaAnnotationController) setRating(ctx context.Context, id string, rating int) error { + exist, err := c.ds.Album(ctx).Exists(id) + if err != nil { + return err + } + if exist { + return c.ds.Album(ctx).SetRating(rating, id) + } + return c.ds.MediaFile(ctx).SetRating(rating, id) +} + func (c *MediaAnnotationController) Star(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { ids := utils.ParamStrings(r, "id") albumIds := utils.ParamStrings(r, "albumId") @@ -67,23 +75,6 @@ func (c *MediaAnnotationController) Star(w http.ResponseWriter, r *http.Request) return NewResponse(), nil } -func (c *MediaAnnotationController) setStar(ctx context.Context, starred bool, ids ...string) error { - if len(ids) == 0 { - return nil - } - log.Debug(ctx, "Changing starred", "ids", ids, "starred", starred) - err := c.ratings.SetStar(ctx, starred, ids...) - switch { - case err == model.ErrNotFound: - log.Error(ctx, err) - return NewError(responses.ErrorDataNotFound, "ID not found") - case err != nil: - log.Error(ctx, err) - return NewError(responses.ErrorGeneric, "Internal Error") - } - return nil -} - func (c *MediaAnnotationController) Unstar(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { ids := utils.ParamStrings(r, "id") albumIds := utils.ParamStrings(r, "albumId") @@ -140,3 +131,56 @@ func (c *MediaAnnotationController) Scrobble(w http.ResponseWriter, r *http.Requ } return NewResponse(), nil } + +func (c *MediaAnnotationController) setStar(ctx context.Context, star bool, ids ...string) error { + if len(ids) == 0 { + return nil + } + log.Debug(ctx, "Changing starred", "ids", ids, "starred", star) + if len(ids) == 0 { + log.Warn(ctx, "Cannot star/unstar an empty list of ids") + return nil + } + + err := c.ds.WithTx(func(tx model.DataStore) error { + for _, id := range ids { + exist, err := c.ds.Album(ctx).Exists(id) + if err != nil { + return err + } + if exist { + err = tx.Album(ctx).SetStar(star, ids...) + if err != nil { + return err + } + continue + } + exist, err = c.ds.Artist(ctx).Exists(id) + if err != nil { + return err + } + if exist { + err = tx.Artist(ctx).SetStar(star, ids...) + if err != nil { + return err + } + continue + } + err = tx.MediaFile(ctx).SetStar(star, ids...) + if err != nil { + return err + } + } + return nil + }) + + switch { + case err == model.ErrNotFound: + log.Error(ctx, err) + return NewError(responses.ErrorDataNotFound, "ID not found") + case err != nil: + log.Error(ctx, err) + return NewError(responses.ErrorGeneric, "Internal Error") + } + return nil +} diff --git a/server/subsonic/wire_gen.go b/server/subsonic/wire_gen.go index 335d09306..82b2b413f 100644 --- a/server/subsonic/wire_gen.go +++ b/server/subsonic/wire_gen.go @@ -30,8 +30,8 @@ func initAlbumListController(router *Router) *AlbumListController { func initMediaAnnotationController(router *Router) *MediaAnnotationController { scrobbler := router.Scrobbler - ratings := router.Ratings - mediaAnnotationController := NewMediaAnnotationController(scrobbler, ratings) + dataStore := router.DataStore + mediaAnnotationController := NewMediaAnnotationController(scrobbler, dataStore) return mediaAnnotationController } @@ -82,5 +82,5 @@ var allProviders = wire.NewSet( NewUsersController, NewMediaRetrievalController, NewStreamController, - NewBookmarksController, wire.FieldsOf(new(*Router), "Browser", "Artwork", "ListGenerator", "Playlists", "Ratings", "Scrobbler", "Search", "Streamer", "DataStore"), + NewBookmarksController, wire.FieldsOf(new(*Router), "Browser", "Artwork", "ListGenerator", "Playlists", "Scrobbler", "Search", "Streamer", "DataStore"), ) diff --git a/server/subsonic/wire_injectors.go b/server/subsonic/wire_injectors.go index f869bb6ed..3673eed3e 100644 --- a/server/subsonic/wire_injectors.go +++ b/server/subsonic/wire_injectors.go @@ -17,7 +17,7 @@ var allProviders = wire.NewSet( NewMediaRetrievalController, NewStreamController, NewBookmarksController, - wire.FieldsOf(new(*Router), "Browser", "Artwork", "ListGenerator", "Playlists", "Ratings", "Scrobbler", "Search", "Streamer", "DataStore"), + wire.FieldsOf(new(*Router), "Browser", "Artwork", "ListGenerator", "Playlists", "Scrobbler", "Search", "Streamer", "DataStore"), ) func initSystemController(router *Router) *SystemController {