2016-03-09 01:13:36 +01:00
|
|
|
package engine
|
|
|
|
|
|
|
|
import (
|
2016-03-09 03:54:32 +01:00
|
|
|
"math/rand"
|
2016-03-17 14:34:32 +01:00
|
|
|
"time"
|
2016-03-09 03:54:32 +01:00
|
|
|
|
2017-04-01 15:47:14 +02:00
|
|
|
"github.com/cloudsonic/sonic-server/domain"
|
|
|
|
"github.com/cloudsonic/sonic-server/utils"
|
2016-03-09 01:13:36 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
type ListGenerator interface {
|
2016-03-21 16:37:56 +01:00
|
|
|
GetNewest(offset int, size int) (Entries, error)
|
|
|
|
GetRecent(offset int, size int) (Entries, error)
|
|
|
|
GetFrequent(offset int, size int) (Entries, error)
|
|
|
|
GetHighest(offset int, size int) (Entries, error)
|
|
|
|
GetRandom(offset int, size int) (Entries, error)
|
2016-03-21 22:37:12 +01:00
|
|
|
GetByName(offset int, size int) (Entries, error)
|
|
|
|
GetByArtist(offset int, size int) (Entries, error)
|
|
|
|
GetStarred(offset int, size int) (Entries, error)
|
2016-03-24 00:02:58 +01:00
|
|
|
GetAllStarred() (albums Entries, mediaFiles Entries, err error)
|
2016-03-20 03:58:20 +01:00
|
|
|
GetNowPlaying() (Entries, error)
|
2016-03-29 06:01:27 +02:00
|
|
|
GetRandomSongs(size int) (Entries, error)
|
2016-03-09 01:13:36 +01:00
|
|
|
}
|
|
|
|
|
2020-01-09 15:51:54 +01:00
|
|
|
func NewListGenerator(alr domain.AlbumRepository, mfr domain.MediaFileRepository, npr domain.NowPlayingRepository) ListGenerator {
|
2016-03-22 04:11:57 +01:00
|
|
|
return &listGenerator{alr, mfr, npr}
|
2016-03-09 01:13:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
type listGenerator struct {
|
2016-03-17 14:34:32 +01:00
|
|
|
albumRepo domain.AlbumRepository
|
|
|
|
mfRepository domain.MediaFileRepository
|
2020-01-09 15:51:54 +01:00
|
|
|
npRepo domain.NowPlayingRepository
|
2016-03-09 01:13:36 +01:00
|
|
|
}
|
|
|
|
|
2016-03-22 04:11:57 +01:00
|
|
|
func (g *listGenerator) query(qo domain.QueryOptions, offset int, size int) (Entries, error) {
|
2016-03-09 01:13:36 +01:00
|
|
|
qo.Offset = offset
|
|
|
|
qo.Size = size
|
2016-03-21 16:37:56 +01:00
|
|
|
albums, err := g.albumRepo.GetAll(qo)
|
|
|
|
|
|
|
|
return FromAlbums(albums), err
|
2016-03-09 01:13:36 +01:00
|
|
|
}
|
|
|
|
|
2016-03-22 04:11:57 +01:00
|
|
|
func (g *listGenerator) GetNewest(offset int, size int) (Entries, error) {
|
2016-03-09 01:13:36 +01:00
|
|
|
qo := domain.QueryOptions{SortBy: "CreatedAt", Desc: true, Alpha: true}
|
|
|
|
return g.query(qo, offset, size)
|
|
|
|
}
|
|
|
|
|
2016-03-22 04:11:57 +01:00
|
|
|
func (g *listGenerator) GetRecent(offset int, size int) (Entries, error) {
|
2016-03-09 01:13:36 +01:00
|
|
|
qo := domain.QueryOptions{SortBy: "PlayDate", Desc: true, Alpha: true}
|
|
|
|
return g.query(qo, offset, size)
|
|
|
|
}
|
|
|
|
|
2016-03-22 04:11:57 +01:00
|
|
|
func (g *listGenerator) GetFrequent(offset int, size int) (Entries, error) {
|
2016-03-09 01:13:36 +01:00
|
|
|
qo := domain.QueryOptions{SortBy: "PlayCount", Desc: true}
|
|
|
|
return g.query(qo, offset, size)
|
|
|
|
}
|
|
|
|
|
2016-03-22 04:11:57 +01:00
|
|
|
func (g *listGenerator) GetHighest(offset int, size int) (Entries, error) {
|
2016-03-09 01:13:36 +01:00
|
|
|
qo := domain.QueryOptions{SortBy: "Rating", Desc: true}
|
|
|
|
return g.query(qo, offset, size)
|
|
|
|
}
|
2016-03-09 03:54:32 +01:00
|
|
|
|
2016-03-22 04:11:57 +01:00
|
|
|
func (g *listGenerator) GetByName(offset int, size int) (Entries, error) {
|
2016-03-21 22:37:12 +01:00
|
|
|
qo := domain.QueryOptions{SortBy: "Name", Alpha: true}
|
|
|
|
return g.query(qo, offset, size)
|
|
|
|
}
|
|
|
|
|
2016-03-22 04:11:57 +01:00
|
|
|
func (g *listGenerator) GetByArtist(offset int, size int) (Entries, error) {
|
2016-03-21 22:37:12 +01:00
|
|
|
qo := domain.QueryOptions{SortBy: "Artist", Alpha: true}
|
|
|
|
return g.query(qo, offset, size)
|
|
|
|
}
|
|
|
|
|
2016-03-22 04:11:57 +01:00
|
|
|
func (g *listGenerator) GetRandom(offset int, size int) (Entries, error) {
|
2016-03-09 03:54:32 +01:00
|
|
|
ids, err := g.albumRepo.GetAllIds()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2016-03-20 03:58:20 +01:00
|
|
|
size = utils.MinInt(size, len(ids))
|
2016-03-14 04:31:24 +01:00
|
|
|
perm := rand.Perm(size)
|
2016-03-21 16:37:56 +01:00
|
|
|
r := make(Entries, size)
|
2016-03-09 03:54:32 +01:00
|
|
|
|
2016-03-13 18:26:28 +01:00
|
|
|
for i := 0; i < size; i++ {
|
|
|
|
v := perm[i]
|
2016-03-20 03:58:20 +01:00
|
|
|
al, err := g.albumRepo.Get((ids)[v])
|
2016-03-09 03:54:32 +01:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2016-03-21 16:37:56 +01:00
|
|
|
r[i] = FromAlbum(al)
|
2016-03-09 03:54:32 +01:00
|
|
|
}
|
2016-03-20 03:58:20 +01:00
|
|
|
return r, nil
|
2016-03-09 03:54:32 +01:00
|
|
|
}
|
2016-03-14 16:35:48 +01:00
|
|
|
|
2016-03-29 06:01:27 +02:00
|
|
|
func (g *listGenerator) GetRandomSongs(size int) (Entries, error) {
|
|
|
|
ids, err := g.mfRepository.GetAllIds()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
size = utils.MinInt(size, len(ids))
|
|
|
|
perm := rand.Perm(size)
|
|
|
|
r := make(Entries, size)
|
|
|
|
|
|
|
|
for i := 0; i < size; i++ {
|
|
|
|
v := perm[i]
|
|
|
|
mf, err := g.mfRepository.Get(ids[v])
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
r[i] = FromMediaFile(mf)
|
|
|
|
}
|
|
|
|
return r, nil
|
|
|
|
}
|
|
|
|
|
2016-03-22 04:11:57 +01:00
|
|
|
func (g *listGenerator) GetStarred(offset int, size int) (Entries, error) {
|
2016-03-23 00:00:18 +01:00
|
|
|
qo := domain.QueryOptions{Offset: offset, Size: size, Desc: true}
|
2016-03-21 22:37:12 +01:00
|
|
|
albums, err := g.albumRepo.GetStarred(qo)
|
2016-03-14 16:35:48 +01:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2016-03-21 16:37:56 +01:00
|
|
|
return FromAlbums(albums), nil
|
2016-03-14 16:35:48 +01:00
|
|
|
}
|
2016-03-17 14:34:32 +01:00
|
|
|
|
2016-03-24 00:02:58 +01:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2016-03-22 04:11:57 +01:00
|
|
|
func (g *listGenerator) GetNowPlaying() (Entries, error) {
|
2016-03-17 14:34:32 +01:00
|
|
|
npInfo, err := g.npRepo.GetAll()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2016-03-23 15:06:26 +01:00
|
|
|
entries := make(Entries, len(npInfo))
|
|
|
|
for i, np := range npInfo {
|
2020-01-10 05:33:01 +01:00
|
|
|
mf, err := g.mfRepository.Get(np.TrackID)
|
2016-03-17 14:34:32 +01:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
entries[i] = FromMediaFile(mf)
|
2016-03-17 15:37:19 +01:00
|
|
|
entries[i].UserName = np.Username
|
2016-03-17 14:34:32 +01:00
|
|
|
entries[i].MinutesAgo = int(time.Now().Sub(np.Start).Minutes())
|
|
|
|
entries[i].PlayerId = np.PlayerId
|
|
|
|
entries[i].PlayerName = np.PlayerName
|
|
|
|
|
|
|
|
}
|
2016-03-20 03:58:20 +01:00
|
|
|
return entries, nil
|
2016-03-17 14:34:32 +01:00
|
|
|
}
|