diff --git a/api/album_lists.go b/api/album_lists.go index faeef50b..ac35ee16 100644 --- a/api/album_lists.go +++ b/api/album_lists.go @@ -54,15 +54,16 @@ func (c *AlbumListController) GetAlbumList() { } func (c *AlbumListController) GetStarred() { - albums, err := c.listGen.GetStarred(0, -1) + albums, mediaFiles, err := c.listGen.GetAllStarred() if err != nil { - beego.Error("Error retrieving starred albums:", err) + beego.Error("Error retrieving starred media:", err) c.SendError(responses.ErrorGeneric, "Internal Error") } response := c.NewEmpty() response.Starred = &responses.Starred{} response.Starred.Album = c.ToChildren(albums) + response.Starred.Song = c.ToChildren(mediaFiles) c.SendResponse(response) } diff --git a/domain/mediafile.go b/domain/mediafile.go index 6f774988..ee2ce3aa 100644 --- a/domain/mediafile.go +++ b/domain/mediafile.go @@ -28,7 +28,7 @@ type MediaFile struct { PlayDate time.Time Rating int Starred bool - StarredAt time.Time + StarredAt time.Time `idx:"Starred"` CreatedAt time.Time UpdatedAt time.Time } @@ -50,5 +50,6 @@ type MediaFileRepository interface { Put(m *MediaFile) error Get(id string) (*MediaFile, error) FindByAlbum(albumId string) (MediaFiles, error) + GetStarred(options QueryOptions) (MediaFiles, error) PurgeInactive(active MediaFiles) ([]string, error) } diff --git a/engine/common.go b/engine/common.go index 01506d94..0de72812 100644 --- a/engine/common.go +++ b/engine/common.go @@ -99,3 +99,11 @@ func FromAlbums(albums domain.Albums) Entries { } return entries } + +func FromMediaFiles(mfs domain.MediaFiles) Entries { + entries := make(Entries, len(mfs)) + for i, mf := range mfs { + entries[i] = FromMediaFile(&mf) + } + return entries +} diff --git a/engine/list_generator.go b/engine/list_generator.go index b29a0df0..c6287dce 100644 --- a/engine/list_generator.go +++ b/engine/list_generator.go @@ -17,6 +17,7 @@ type ListGenerator interface { GetByName(offset int, size int) (Entries, error) GetByArtist(offset int, size int) (Entries, error) GetStarred(offset int, size int) (Entries, error) + GetAllStarred() (albums Entries, mediaFiles Entries, err error) GetNowPlaying() (Entries, error) } @@ -98,6 +99,17 @@ func (g *listGenerator) GetStarred(offset int, size int) (Entries, error) { return FromAlbums(albums), nil } +func (g *listGenerator) GetAllStarred() (Entries, Entries, error) { + albums, err := g.GetStarred(0, -1) + if err != nil { + return nil, nil, err + } + + mediaFiles, err := g.mfRepository.GetStarred(domain.QueryOptions{Desc: true}) + + return albums, FromMediaFiles(mediaFiles), err +} + func (g *listGenerator) GetNowPlaying() (Entries, error) { npInfo, err := g.npRepo.GetAll() if err != nil { diff --git a/persistence/mediafile_repository.go b/persistence/mediafile_repository.go index f56ae8cb..921e765f 100644 --- a/persistence/mediafile_repository.go +++ b/persistence/mediafile_repository.go @@ -4,6 +4,8 @@ import ( "errors" "sort" + "time" + "github.com/deluan/gosonic/domain" ) @@ -43,6 +45,13 @@ func (r *mediaFileRepository) FindByAlbum(albumId string) (domain.MediaFiles, er return mfs, err } +func (r *mediaFileRepository) GetStarred(options domain.QueryOptions) (domain.MediaFiles, error) { + var mfs = make(domain.MediaFiles, 0) + start := time.Time{}.Add(time.Duration(1) * time.Hour) + err := r.loadRange("Starred", start, time.Now(), &mfs, options) + return mfs, err +} + func (r *mediaFileRepository) PurgeInactive(active domain.MediaFiles) ([]string, error) { return r.purgeInactive(active, func(e interface{}) string { return e.(domain.MediaFile).Id