navidrome/server/subsonic/filter/filters.go

96 lines
2.0 KiB
Go

package filter
import (
"time"
"github.com/Masterminds/squirrel"
"github.com/navidrome/navidrome/model"
)
type Options model.QueryOptions
func AlbumsByNewest() Options {
return Options{Sort: "recently_added", Order: "desc"}
}
func AlbumsByRecent() Options {
return Options{Sort: "playDate", Order: "desc", Filters: squirrel.Gt{"play_date": time.Time{}}}
}
func AlbumsByFrequent() Options {
return Options{Sort: "playCount", Order: "desc", Filters: squirrel.Gt{"play_count": 0}}
}
func AlbumsByRandom() Options {
return Options{Sort: "random()"}
}
func AlbumsByName() Options {
return Options{Sort: "name"}
}
func AlbumsByArtist() Options {
return Options{Sort: "artist"}
}
func AlbumsByStarred() Options {
return Options{Sort: "starred_at", Order: "desc", Filters: squirrel.Eq{"starred": true}}
}
func AlbumsByRating() Options {
return Options{Sort: "Rating", Order: "desc", Filters: squirrel.Gt{"rating": 0}}
}
func AlbumsByGenre(genre string) Options {
return Options{
Sort: "genre asc, name asc",
Filters: squirrel.Eq{"genre": genre},
}
}
func AlbumsByYear(fromYear, toYear int) Options {
sortOption := "max_year, name"
if fromYear > toYear {
fromYear, toYear = toYear, fromYear
sortOption = "max_year desc, name"
}
return Options{
Sort: sortOption,
Filters: squirrel.Or{
squirrel.And{
squirrel.GtOrEq{"min_year": fromYear},
squirrel.LtOrEq{"min_year": toYear},
},
squirrel.And{
squirrel.GtOrEq{"max_year": fromYear},
squirrel.LtOrEq{"max_year": toYear},
},
},
}
}
func SongsByGenre(genre string) Options {
return Options{
Sort: "genre asc, title asc",
Filters: squirrel.Eq{"genre": genre},
}
}
func SongsByRandom(genre string, fromYear, toYear int) Options {
options := Options{
Sort: "random()",
}
ff := squirrel.And{}
if genre != "" {
ff = append(ff, squirrel.Eq{"genre": genre})
}
if fromYear != 0 {
ff = append(ff, squirrel.GtOrEq{"year": fromYear})
}
if toYear != 0 {
ff = append(ff, squirrel.LtOrEq{"year": toYear})
}
options.Filters = ff
return options
}