navidrome/engine/playlists.go

65 lines
1.2 KiB
Go

package engine
import (
"github.com/deluan/gosonic/domain"
)
type Playlists interface {
GetAll() (domain.Playlists, error)
Get(id string) (*PlaylistInfo, error)
}
func NewPlaylists(pr domain.PlaylistRepository, mr domain.MediaFileRepository) Playlists {
return &playlists{pr, mr}
}
type playlists struct {
plsRepo domain.PlaylistRepository
mfileRepo domain.MediaFileRepository
}
func (p *playlists) GetAll() (domain.Playlists, error) {
return p.plsRepo.GetAll(domain.QueryOptions{})
}
type PlaylistInfo struct {
Id string
Name string
Entries Entries
SongCount int
Duration int
Public bool
Owner string
}
func (p *playlists) Get(id string) (*PlaylistInfo, error) {
pl, err := p.plsRepo.Get(id)
if err == domain.ErrNotFound {
return nil, ErrDataNotFound
}
if err != nil {
return nil, err
}
pinfo := &PlaylistInfo{
Id: pl.Id,
Name: pl.Name,
SongCount: len(pl.Tracks),
Duration: pl.Duration,
Public: pl.Public,
Owner: pl.Owner,
}
pinfo.Entries = make(Entries, len(pl.Tracks))
// TODO Optimize: Get all tracks at once
for i, mfId := range pl.Tracks {
mf, err := p.mfileRepo.Get(mfId)
if err != nil {
return nil, err
}
pinfo.Entries[i] = FromMediaFile(mf)
}
return pinfo, nil
}