diff --git a/server/subsonic/browsing.go b/server/subsonic/browsing.go index 0392c1f1e..2651e5df8 100644 --- a/server/subsonic/browsing.go +++ b/server/subsonic/browsing.go @@ -3,6 +3,7 @@ package subsonic import ( "context" "net/http" + "strconv" "time" "github.com/deluan/navidrome/conf" @@ -15,14 +16,15 @@ import ( type BrowsingController struct { browser engine.Browser + ds model.DataStore } -func NewBrowsingController(browser engine.Browser) *BrowsingController { - return &BrowsingController{browser: browser} +func NewBrowsingController(browser engine.Browser, ds model.DataStore) *BrowsingController { + return &BrowsingController{browser: browser, ds: ds} } func (c *BrowsingController) GetMusicFolders(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { - mediaFolderList, _ := c.browser.MediaFolders(r.Context()) + mediaFolderList, _ := c.ds.MediaFolder(r.Context()).GetAll() folders := make([]responses.MusicFolder, len(mediaFolderList)) for i, f := range mediaFolderList { folders[i].Id = f.ID @@ -33,13 +35,30 @@ func (c *BrowsingController) GetMusicFolders(w http.ResponseWriter, r *http.Requ return response, nil } -func (c *BrowsingController) getArtistIndex(r *http.Request, musicFolderId string, ifModifiedSince time.Time) (*responses.Indexes, error) { - indexes, lastModified, err := c.browser.Indexes(r.Context(), musicFolderId, ifModifiedSince) +func (c *BrowsingController) getArtistIndex(ctx context.Context, mediaFolderId string, ifModifiedSince time.Time) (*responses.Indexes, error) { + folder, err := c.ds.MediaFolder(ctx).Get(mediaFolderId) if err != nil { - log.Error(r, "Error retrieving Indexes", "error", err) + log.Error(ctx, "Error retrieving MediaFolder", "id", mediaFolderId, err) return nil, NewError(responses.ErrorGeneric, "Internal Error") } + l, err := c.ds.Property(ctx).DefaultGet(model.PropLastScan+"-"+folder.Path, "-1") + if err != nil { + log.Error(ctx, "Error retrieving LastScan property", err) + return nil, NewError(responses.ErrorGeneric, "Internal Error") + } + + var indexes model.ArtistIndexes + ms, _ := strconv.ParseInt(l, 10, 64) + lastModified := utils.ToTime(ms) + if lastModified.After(ifModifiedSince) { + indexes, err = c.ds.Artist(ctx).GetIndex() + if err != nil { + log.Error(ctx, "Error retrieving Indexes", err) + return nil, NewError(responses.ErrorGeneric, "Internal Error") + } + } + res := &responses.Indexes{ IgnoredArticles: conf.Server.IgnoredArticles, LastModified: utils.ToMillis(lastModified), @@ -62,7 +81,7 @@ func (c *BrowsingController) GetIndexes(w http.ResponseWriter, r *http.Request) musicFolderId := utils.ParamString(r, "musicFolderId") ifModifiedSince := utils.ParamTime(r, "ifModifiedSince", time.Time{}) - res, err := c.getArtistIndex(r, musicFolderId, ifModifiedSince) + res, err := c.getArtistIndex(r.Context(), musicFolderId, ifModifiedSince) if err != nil { return nil, err } @@ -74,7 +93,7 @@ func (c *BrowsingController) GetIndexes(w http.ResponseWriter, r *http.Request) func (c *BrowsingController) GetArtists(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { musicFolderId := utils.ParamString(r, "musicFolderId") - res, err := c.getArtistIndex(r, musicFolderId, time.Time{}) + res, err := c.getArtistIndex(r.Context(), musicFolderId, time.Time{}) if err != nil { return nil, err } diff --git a/server/subsonic/engine/browser.go b/server/subsonic/engine/browser.go index 25976bb4c..d7b98e1dc 100644 --- a/server/subsonic/engine/browser.go +++ b/server/subsonic/engine/browser.go @@ -4,18 +4,15 @@ import ( "context" "fmt" "sort" - "strconv" "strings" "time" "github.com/deluan/navidrome/log" "github.com/deluan/navidrome/model" - "github.com/deluan/navidrome/utils" ) type Browser interface { - MediaFolders(ctx context.Context) (model.MediaFolders, error) - Indexes(ctx context.Context, mediaFolderId string, ifModifiedSince time.Time) (model.ArtistIndexes, time.Time, error) + // Deprecated Directory(ctx context.Context, id string) (*DirectoryInfo, error) Artist(ctx context.Context, id string) (*DirectoryInfo, error) Album(ctx context.Context, id string) (*DirectoryInfo, error) @@ -31,30 +28,6 @@ type browser struct { ds model.DataStore } -func (b *browser) MediaFolders(ctx context.Context) (model.MediaFolders, error) { - return b.ds.MediaFolder(ctx).GetAll() -} - -func (b *browser) Indexes(ctx context.Context, mediaFolderId string, ifModifiedSince time.Time) (model.ArtistIndexes, time.Time, error) { - // TODO Proper handling of mediaFolderId param - folder, _ := b.ds.MediaFolder(ctx).Get(mediaFolderId) - - l, err := b.ds.Property(ctx).DefaultGet(model.PropLastScan+"-"+folder.Path, "-1") - ms, _ := strconv.ParseInt(l, 10, 64) - lastModified := utils.ToTime(ms) - - if err != nil { - return nil, time.Time{}, fmt.Errorf("error retrieving LastScan property: %v", err) - } - - if lastModified.After(ifModifiedSince) { - indexes, err := b.ds.Artist(ctx).GetIndex() - return indexes, lastModified, err - } - - return nil, lastModified, nil -} - type DirectoryInfo struct { Id string Name string diff --git a/server/subsonic/wire_gen.go b/server/subsonic/wire_gen.go index 9357f014f..88b5de514 100644 --- a/server/subsonic/wire_gen.go +++ b/server/subsonic/wire_gen.go @@ -18,7 +18,8 @@ func initSystemController(router *Router) *SystemController { func initBrowsingController(router *Router) *BrowsingController { browser := router.Browser - browsingController := NewBrowsingController(browser) + dataStore := router.DataStore + browsingController := NewBrowsingController(browser, dataStore) return browsingController }