navidrome/persistence/playlist_repository.go

131 lines
2.8 KiB
Go
Raw Normal View History

package persistence
2020-01-13 03:59:06 +01:00
import (
"context"
2020-01-13 03:59:06 +01:00
"strings"
. "github.com/Masterminds/squirrel"
2020-01-13 03:59:06 +01:00
"github.com/astaxie/beego/orm"
2020-01-24 01:44:08 +01:00
"github.com/deluan/navidrome/model"
2020-01-13 03:59:06 +01:00
)
2020-01-18 03:03:54 +01:00
type playlist struct {
ID string `orm:"column(id)"`
Name string
2020-01-13 03:59:06 +01:00
Comment string
Duration float32
2020-01-13 03:59:06 +01:00
Owner string
Public bool
Tracks string
2020-01-13 03:59:06 +01:00
}
type playlistRepository struct {
sqlRepository
}
func NewPlaylistRepository(ctx context.Context, o orm.Ormer) model.PlaylistRepository {
2020-01-13 03:59:06 +01:00
r := &playlistRepository{}
r.ctx = ctx
r.ormer = o
2020-01-13 06:04:11 +01:00
r.tableName = "playlist"
2020-01-13 03:59:06 +01:00
return r
}
func (r *playlistRepository) CountAll() (int64, error) {
return r.count(Select())
}
func (r *playlistRepository) Exists(id string) (bool, error) {
return r.exists(Select().Where(Eq{"id": id}))
}
func (r *playlistRepository) Delete(id string) error {
return r.delete(Eq{"id": id})
}
2020-01-15 04:22:34 +01:00
func (r *playlistRepository) Put(p *model.Playlist) error {
pls := r.fromModel(p)
_, err := r.put(pls.ID, pls)
return err
2020-01-13 03:59:06 +01:00
}
2020-01-15 04:22:34 +01:00
func (r *playlistRepository) Get(id string) (*model.Playlist, error) {
sel := r.newSelect().Columns("*").Where(Eq{"id": id})
var res playlist
err := r.queryOne(sel, &res)
pls := r.toModel(&res)
return &pls, err
}
func (r *playlistRepository) GetWithTracks(id string) (*model.Playlist, error) {
pls, err := r.Get(id)
if err != nil {
return nil, err
}
mfRepo := NewMediaFileRepository(r.ctx, r.ormer)
pls.Duration = 0
2020-01-31 22:47:13 +01:00
newTracks := model.MediaFiles{}
for _, t := range pls.Tracks {
mf, err := mfRepo.Get(t.ID)
if err != nil {
continue
}
pls.Duration += mf.Duration
newTracks = append(newTracks, *mf)
}
pls.Tracks = newTracks
return pls, err
2020-01-13 03:59:06 +01:00
}
2020-01-15 04:22:34 +01:00
func (r *playlistRepository) GetAll(options ...model.QueryOptions) (model.Playlists, error) {
sel := r.newSelect(options...).Columns("*")
var res []playlist
err := r.queryAll(sel, &res)
return r.toModels(res), err
2020-01-13 03:59:06 +01:00
}
func (r *playlistRepository) toModels(all []playlist) model.Playlists {
2020-01-15 04:22:34 +01:00
result := make(model.Playlists, len(all))
2020-01-13 03:59:06 +01:00
for i, p := range all {
2020-01-21 23:50:56 +01:00
result[i] = r.toModel(&p)
2020-01-13 03:59:06 +01:00
}
return result
2020-01-13 03:59:06 +01:00
}
2020-01-21 23:50:56 +01:00
func (r *playlistRepository) toModel(p *playlist) model.Playlist {
pls := model.Playlist{
2020-01-13 03:59:06 +01:00
ID: p.ID,
Name: p.Name,
Comment: p.Comment,
Duration: p.Duration,
Owner: p.Owner,
Public: p.Public,
}
if strings.TrimSpace(p.Tracks) != "" {
tracks := strings.Split(p.Tracks, ",")
for _, t := range tracks {
pls.Tracks = append(pls.Tracks, model.MediaFile{ID: t})
}
}
return pls
2020-01-13 03:59:06 +01:00
}
2020-01-21 23:50:56 +01:00
func (r *playlistRepository) fromModel(p *model.Playlist) playlist {
pls := playlist{
2020-01-13 03:59:06 +01:00
ID: p.ID,
Name: p.Name,
Comment: p.Comment,
Duration: p.Duration,
Owner: p.Owner,
Public: p.Public,
}
var newTracks []string
for _, t := range p.Tracks {
newTracks = append(newTracks, t.ID)
}
pls.Tracks = strings.Join(newTracks, ",")
return pls
2020-01-13 03:59:06 +01:00
}
2020-01-15 04:22:34 +01:00
var _ model.PlaylistRepository = (*playlistRepository)(nil)