2016-03-16 16:27:48 -08:00
|
|
|
package persistence
|
|
|
|
|
|
|
|
|
|
import (
|
2016-03-16 16:51:03 -08:00
|
|
|
"encoding/json"
|
2016-03-23 06:06:26 -08:00
|
|
|
"fmt"
|
2016-03-16 16:27:48 -08:00
|
|
|
|
2020-01-09 05:51:54 -09:00
|
|
|
"github.com/cloudsonic/sonic-server/domain"
|
2016-03-16 16:27:48 -08:00
|
|
|
)
|
|
|
|
|
|
2016-03-16 16:51:03 -08:00
|
|
|
var (
|
2016-03-23 06:06:26 -08:00
|
|
|
nowPlayingKeyPrefix = []byte("nowplaying")
|
2016-03-16 16:51:03 -08:00
|
|
|
)
|
|
|
|
|
|
2016-03-16 16:27:48 -08:00
|
|
|
type nowPlayingRepository struct {
|
|
|
|
|
ledisRepository
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-09 05:51:54 -09:00
|
|
|
func NewNowPlayingRepository() domain.NowPlayingRepository {
|
2016-03-16 16:27:48 -08:00
|
|
|
r := &nowPlayingRepository{}
|
2020-01-09 05:51:54 -09:00
|
|
|
r.init("nowplaying", &domain.NowPlayingInfo{})
|
2016-03-16 16:27:48 -08:00
|
|
|
return r
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-23 06:06:26 -08:00
|
|
|
func nowPlayingKeyName(playerId int) string {
|
|
|
|
|
return fmt.Sprintf("%s:%d", nowPlayingKeyPrefix, playerId)
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-09 05:51:54 -09:00
|
|
|
func (r *nowPlayingRepository) Enqueue(info *domain.NowPlayingInfo) error {
|
2016-03-24 13:14:13 -08:00
|
|
|
h, err := json.Marshal(info)
|
2016-03-16 16:51:03 -08:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2016-03-23 06:06:26 -08:00
|
|
|
|
2016-03-24 13:14:13 -08:00
|
|
|
keyName := []byte(nowPlayingKeyName(info.PlayerId))
|
2016-03-23 06:06:26 -08:00
|
|
|
|
|
|
|
|
_, err = Db().LPush(keyName, []byte(h))
|
2020-01-09 05:51:54 -09:00
|
|
|
Db().LExpire(keyName, int64(domain.NowPlayingExpire.Seconds()))
|
2016-03-23 06:06:26 -08:00
|
|
|
return err
|
2016-03-16 16:27:48 -08:00
|
|
|
}
|
|
|
|
|
|
2020-01-09 05:51:54 -09:00
|
|
|
func (r *nowPlayingRepository) Dequeue(playerId int) (*domain.NowPlayingInfo, error) {
|
2016-03-23 06:06:26 -08:00
|
|
|
keyName := []byte(nowPlayingKeyName(playerId))
|
|
|
|
|
|
2016-03-23 09:51:02 -08:00
|
|
|
val, err := Db().RPop(keyName)
|
2016-03-17 14:58:09 -08:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2016-03-23 09:51:02 -08:00
|
|
|
if val == nil {
|
2016-03-17 14:58:09 -08:00
|
|
|
return nil, nil
|
|
|
|
|
}
|
2016-03-23 09:51:02 -08:00
|
|
|
return r.parseInfo(val)
|
2016-03-17 14:58:09 -08:00
|
|
|
}
|
|
|
|
|
|
2020-01-09 05:51:54 -09:00
|
|
|
func (r *nowPlayingRepository) Head(playerId int) (*domain.NowPlayingInfo, error) {
|
2016-03-23 09:51:02 -08:00
|
|
|
keyName := []byte(nowPlayingKeyName(playerId))
|
|
|
|
|
|
|
|
|
|
val, err := Db().LIndex(keyName, 0)
|
|
|
|
|
if err != nil {
|
2016-03-23 07:26:27 -08:00
|
|
|
return nil, err
|
|
|
|
|
}
|
2016-03-23 09:51:02 -08:00
|
|
|
return r.parseInfo(val)
|
2016-03-23 06:06:26 -08:00
|
|
|
}
|
|
|
|
|
|
2020-01-09 05:51:54 -09:00
|
|
|
func (r *nowPlayingRepository) Tail(playerId int) (*domain.NowPlayingInfo, error) {
|
2016-03-23 06:06:26 -08:00
|
|
|
keyName := []byte(nowPlayingKeyName(playerId))
|
|
|
|
|
|
2016-03-23 09:51:02 -08:00
|
|
|
val, err := Db().LIndex(keyName, -1)
|
2016-03-17 05:34:32 -08:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2016-03-23 09:51:02 -08:00
|
|
|
return r.parseInfo(val)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *nowPlayingRepository) Count(playerId int) (int64, error) {
|
|
|
|
|
keyName := []byte(nowPlayingKeyName(playerId))
|
|
|
|
|
return Db().LLen(keyName)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO Will not work for multiple players
|
2020-01-09 05:51:54 -09:00
|
|
|
func (r *nowPlayingRepository) GetAll() ([]*domain.NowPlayingInfo, error) {
|
2016-03-28 15:11:49 -08:00
|
|
|
np, err := r.Head(1)
|
2016-03-23 09:51:02 -08:00
|
|
|
if np == nil || err != nil {
|
|
|
|
|
return nil, err
|
2016-03-17 06:37:19 -08:00
|
|
|
}
|
2020-01-09 05:51:54 -09:00
|
|
|
return []*domain.NowPlayingInfo{np}, err
|
2016-03-23 09:51:02 -08:00
|
|
|
}
|
|
|
|
|
|
2020-01-09 05:51:54 -09:00
|
|
|
func (r *nowPlayingRepository) parseInfo(val []byte) (*domain.NowPlayingInfo, error) {
|
|
|
|
|
info := &domain.NowPlayingInfo{}
|
2016-03-23 09:51:02 -08:00
|
|
|
err := json.Unmarshal(val, info)
|
2016-03-17 14:58:09 -08:00
|
|
|
if err != nil {
|
2016-03-23 06:06:26 -08:00
|
|
|
return nil, nil
|
2016-03-17 14:58:09 -08:00
|
|
|
}
|
2016-03-23 06:06:26 -08:00
|
|
|
return info, nil
|
2016-03-17 05:34:32 -08:00
|
|
|
}
|
|
|
|
|
|
2020-01-09 05:51:54 -09:00
|
|
|
var _ domain.NowPlayingRepository = (*nowPlayingRepository)(nil)
|