Skip to content

Commit

Permalink
Add fromYear/toYear params to getRandomSongs
Browse files Browse the repository at this point in the history
  • Loading branch information
deluan committed Apr 18, 2020
1 parent 0e1735e commit 4c0250f
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 36 deletions.
83 changes: 50 additions & 33 deletions engine/list_generator.go
Expand Up @@ -11,58 +11,58 @@ import (
type ListGenerator interface {
GetAllStarred(ctx context.Context) (artists Entries, albums Entries, mediaFiles Entries, err error)
GetNowPlaying(ctx context.Context) (Entries, error)
GetRandomSongs(ctx context.Context, size int, genre string) (Entries, error)
GetSongsByGenre(ctx context.Context, offset int, count int, genre string) (Entries, error)
GetAlbums(ctx context.Context, offset, size int, filter AlbumFilter) (Entries, error)
GetSongs(ctx context.Context, offset, size int, filter ListFilter) (Entries, error)
GetAlbums(ctx context.Context, offset, size int, filter ListFilter) (Entries, error)
}

func NewListGenerator(ds model.DataStore, npRepo NowPlayingRepository) ListGenerator {
return &listGenerator{ds, npRepo}
}

type AlbumFilter model.QueryOptions
type ListFilter model.QueryOptions

func ByNewest() AlbumFilter {
return AlbumFilter{Sort: "createdAt", Order: "desc"}
func ByNewest() ListFilter {
return ListFilter{Sort: "createdAt", Order: "desc"}
}

func ByRecent() AlbumFilter {
return AlbumFilter{Sort: "playDate", Order: "desc", Filters: squirrel.Gt{"play_date": time.Time{}}}
func ByRecent() ListFilter {
return ListFilter{Sort: "playDate", Order: "desc", Filters: squirrel.Gt{"play_date": time.Time{}}}
}

func ByFrequent() AlbumFilter {
return AlbumFilter{Sort: "playCount", Order: "desc", Filters: squirrel.Gt{"play_count": 0}}
func ByFrequent() ListFilter {
return ListFilter{Sort: "playCount", Order: "desc", Filters: squirrel.Gt{"play_count": 0}}
}

func ByRandom() AlbumFilter {
return AlbumFilter{Sort: "random()"}
func ByRandom() ListFilter {
return ListFilter{Sort: "random()"}
}

func ByName() AlbumFilter {
return AlbumFilter{Sort: "name"}
func ByName() ListFilter {
return ListFilter{Sort: "name"}
}

func ByArtist() AlbumFilter {
return AlbumFilter{Sort: "artist"}
func ByArtist() ListFilter {
return ListFilter{Sort: "artist"}
}

func ByStarred() AlbumFilter {
return AlbumFilter{Sort: "starred_at", Order: "desc", Filters: squirrel.Eq{"starred": true}}
func ByStarred() ListFilter {
return ListFilter{Sort: "starred_at", Order: "desc", Filters: squirrel.Eq{"starred": true}}
}

func ByRating() AlbumFilter {
return AlbumFilter{Sort: "Rating", Order: "desc", Filters: squirrel.Gt{"rating": 0}}
func ByRating() ListFilter {
return ListFilter{Sort: "Rating", Order: "desc", Filters: squirrel.Gt{"rating": 0}}
}

func ByGenre(genre string) AlbumFilter {
return AlbumFilter{
func ByGenre(genre string) ListFilter {
return ListFilter{
Sort: "genre asc, name asc",
Filters: squirrel.Eq{"genre": genre},
}
}

func ByYear(fromYear, toYear int) AlbumFilter {
return AlbumFilter{
func ByYear(fromYear, toYear int) ListFilter {
return ListFilter{
Sort: "max_year, name",
Filters: squirrel.Or{
squirrel.And{
Expand All @@ -77,6 +77,24 @@ func ByYear(fromYear, toYear int) AlbumFilter {
}
}

func RandomSongs(genre string, fromYear, toYear int) ListFilter {
options := ListFilter{
Sort: "random()",
}
ff := squirrel.And{}
if genre != "" {
options.Filters = append(ff, squirrel.Eq{"genre": genre})
}
if fromYear != 0 {
options.Filters = append(ff, squirrel.GtOrEq{"year": fromYear})
}
if toYear != 0 {
options.Filters = append(ff, squirrel.LtOrEq{"year": toYear})
}
options.Filters = ff
return options
}

type listGenerator struct {
ds model.DataStore
npRepo NowPlayingRepository
Expand All @@ -94,33 +112,32 @@ func (g *listGenerator) query(ctx context.Context, qo model.QueryOptions) (Entri
return FromAlbums(albums), err
}

func (g *listGenerator) GetRandomSongs(ctx context.Context, size int, genre string) (Entries, error) {
options := model.QueryOptions{Max: size}
func (g *listGenerator) GetSongsByGenre(ctx context.Context, offset int, count int, genre string) (Entries, error) {
options := model.QueryOptions{Offset: offset, Max: count}
if genre != "" {
options.Filters = squirrel.Eq{"genre": genre}
}
mediaFiles, err := g.ds.MediaFile(ctx).GetRandom(options)
mediaFiles, err := g.ds.MediaFile(ctx).GetAll(options)
if err != nil {
return nil, err
}

return FromMediaFiles(mediaFiles), nil
}

func (g *listGenerator) GetSongsByGenre(ctx context.Context, offset int, count int, genre string) (Entries, error) {
options := model.QueryOptions{Offset: offset, Max: count}
if genre != "" {
options.Filters = squirrel.Eq{"genre": genre}
}
mediaFiles, err := g.ds.MediaFile(ctx).GetAll(options)
func (g *listGenerator) GetSongs(ctx context.Context, offset, size int, filter ListFilter) (Entries, error) {
qo := model.QueryOptions(filter)
qo.Offset = offset
qo.Max = size
mediaFiles, err := g.ds.MediaFile(ctx).GetAll(qo)
if err != nil {
return nil, err
}

return FromMediaFiles(mediaFiles), nil
}

func (g *listGenerator) GetAlbums(ctx context.Context, offset, size int, filter AlbumFilter) (Entries, error) {
func (g *listGenerator) GetAlbums(ctx context.Context, offset, size int, filter ListFilter) (Entries, error) {
qo := model.QueryOptions(filter)
qo.Offset = offset
qo.Max = size
Expand Down
6 changes: 4 additions & 2 deletions server/subsonic/album_lists.go
Expand Up @@ -27,7 +27,7 @@ func (c *AlbumListController) getNewAlbumList(r *http.Request) (engine.Entries,
return nil, err
}

var filter engine.AlbumFilter
var filter engine.ListFilter
switch typ {
case "newest":
filter = engine.ByNewest()
Expand Down Expand Up @@ -141,8 +141,10 @@ func (c *AlbumListController) GetNowPlaying(w http.ResponseWriter, r *http.Reque
func (c *AlbumListController) GetRandomSongs(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
size := utils.MinInt(utils.ParamInt(r, "size", 10), 500)
genre := utils.ParamString(r, "genre")
fromYear := utils.ParamInt(r, "fromYear", 0)
toYear := utils.ParamInt(r, "toYear", 0)

songs, err := c.listGen.GetRandomSongs(r.Context(), size, genre)
songs, err := c.listGen.GetSongs(r.Context(), 0, size, engine.RandomSongs(genre, fromYear, toYear))
if err != nil {
log.Error(r, "Error retrieving random songs", "error", err)
return nil, NewError(responses.ErrorGeneric, "Internal Error")
Expand Down
2 changes: 1 addition & 1 deletion server/subsonic/album_lists_test.go
Expand Up @@ -18,7 +18,7 @@ type fakeListGen struct {
recvSize int
}

func (lg *fakeListGen) GetAlbums(ctx context.Context, offset int, size int, filter engine.AlbumFilter) (engine.Entries, error) {
func (lg *fakeListGen) GetAlbums(ctx context.Context, offset int, size int, filter engine.ListFilter) (engine.Entries, error) {
if lg.err != nil {
return nil, lg.err
}
Expand Down

0 comments on commit 4c0250f

Please sign in to comment.