mirror of
https://github.com/navidrome/navidrome.git
synced 2025-06-02 08:31:27 +03:00
Implements NowPlayingRepository as an in-memory only struct
This commit is contained in:
parent
c9be5f7201
commit
cead8906d6
@ -38,7 +38,7 @@ func initBrowsingController() *BrowsingController {
|
|||||||
func initAlbumListController() *AlbumListController {
|
func initAlbumListController() *AlbumListController {
|
||||||
albumRepository := db_storm.NewAlbumRepository()
|
albumRepository := db_storm.NewAlbumRepository()
|
||||||
mediaFileRepository := db_storm.NewMediaFileRepository()
|
mediaFileRepository := db_storm.NewMediaFileRepository()
|
||||||
nowPlayingRepository := db_ledis.NewNowPlayingRepository()
|
nowPlayingRepository := persistence.NewNowPlayingRepository()
|
||||||
listGenerator := engine.NewListGenerator(albumRepository, mediaFileRepository, nowPlayingRepository)
|
listGenerator := engine.NewListGenerator(albumRepository, mediaFileRepository, nowPlayingRepository)
|
||||||
albumListController := NewAlbumListController(listGenerator)
|
albumListController := NewAlbumListController(listGenerator)
|
||||||
return albumListController
|
return albumListController
|
||||||
@ -47,7 +47,7 @@ func initAlbumListController() *AlbumListController {
|
|||||||
func initMediaAnnotationController() *MediaAnnotationController {
|
func initMediaAnnotationController() *MediaAnnotationController {
|
||||||
itunesControl := itunesbridge.NewItunesControl()
|
itunesControl := itunesbridge.NewItunesControl()
|
||||||
mediaFileRepository := db_storm.NewMediaFileRepository()
|
mediaFileRepository := db_storm.NewMediaFileRepository()
|
||||||
nowPlayingRepository := db_ledis.NewNowPlayingRepository()
|
nowPlayingRepository := persistence.NewNowPlayingRepository()
|
||||||
scrobbler := engine.NewScrobbler(itunesControl, mediaFileRepository, nowPlayingRepository)
|
scrobbler := engine.NewScrobbler(itunesControl, mediaFileRepository, nowPlayingRepository)
|
||||||
albumRepository := db_storm.NewAlbumRepository()
|
albumRepository := db_storm.NewAlbumRepository()
|
||||||
artistRepository := db_storm.NewArtistRepository()
|
artistRepository := db_storm.NewArtistRepository()
|
||||||
@ -96,7 +96,7 @@ func initStreamController() *StreamController {
|
|||||||
|
|
||||||
// wire_injectors.go:
|
// wire_injectors.go:
|
||||||
|
|
||||||
var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_ledis.Set, db_storm.Set, engine.Set, NewSystemController,
|
var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_storm.Set, engine.Set, NewSystemController,
|
||||||
NewBrowsingController,
|
NewBrowsingController,
|
||||||
NewAlbumListController,
|
NewAlbumListController,
|
||||||
NewMediaAnnotationController,
|
NewMediaAnnotationController,
|
||||||
|
@ -14,7 +14,7 @@ import (
|
|||||||
|
|
||||||
var allProviders = wire.NewSet(
|
var allProviders = wire.NewSet(
|
||||||
itunesbridge.NewItunesControl,
|
itunesbridge.NewItunesControl,
|
||||||
db_ledis.Set,
|
//db_ledis.Set,
|
||||||
db_storm.Set,
|
db_storm.Set,
|
||||||
engine.Set,
|
engine.Set,
|
||||||
NewSystemController,
|
NewSystemController,
|
||||||
|
@ -29,6 +29,6 @@ type NowPlayingRepository interface {
|
|||||||
// Size of the queue for the playerId
|
// Size of the queue for the playerId
|
||||||
Count(playerId int) (int64, error)
|
Count(playerId int) (int64, error)
|
||||||
|
|
||||||
// Returns all tails from all playerIds
|
// Returns all heads from all playerIds
|
||||||
GetAll() ([]*NowPlayingInfo, error)
|
GetAll() ([]*NowPlayingInfo, error)
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,18 @@
|
|||||||
package db_ledis
|
package db_ledis
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/cloudsonic/sonic-server/persistence"
|
||||||
"github.com/google/wire"
|
"github.com/google/wire"
|
||||||
)
|
)
|
||||||
|
|
||||||
var Set = wire.NewSet(
|
var Set = wire.NewSet(
|
||||||
|
NewPropertyRepository,
|
||||||
|
NewArtistRepository,
|
||||||
|
NewAlbumRepository,
|
||||||
|
NewMediaFileRepository,
|
||||||
|
NewArtistIndexRepository,
|
||||||
|
NewPlaylistRepository,
|
||||||
|
NewCheckSumRepository,
|
||||||
NewNowPlayingRepository,
|
NewNowPlayingRepository,
|
||||||
|
persistence.NewMediaFolderRepository,
|
||||||
)
|
)
|
||||||
|
@ -13,5 +13,6 @@ var Set = wire.NewSet(
|
|||||||
NewArtistIndexRepository,
|
NewArtistIndexRepository,
|
||||||
NewPlaylistRepository,
|
NewPlaylistRepository,
|
||||||
NewCheckSumRepository,
|
NewCheckSumRepository,
|
||||||
|
persistence.NewNowPlayingRepository,
|
||||||
persistence.NewMediaFolderRepository,
|
persistence.NewMediaFolderRepository,
|
||||||
)
|
)
|
||||||
|
75
persistence/nowplaying_repository.go
Normal file
75
persistence/nowplaying_repository.go
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
package persistence
|
||||||
|
|
||||||
|
import (
|
||||||
|
"container/list"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/cloudsonic/sonic-server/domain"
|
||||||
|
)
|
||||||
|
|
||||||
|
var playerMap = sync.Map{}
|
||||||
|
|
||||||
|
type nowPlayingRepository struct{}
|
||||||
|
|
||||||
|
// TODO Make it persistent
|
||||||
|
func NewNowPlayingRepository() domain.NowPlayingRepository {
|
||||||
|
r := &nowPlayingRepository{}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *nowPlayingRepository) getList(id int) *list.List {
|
||||||
|
l, _ := playerMap.LoadOrStore(id, list.New())
|
||||||
|
return l.(*list.List)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *nowPlayingRepository) Enqueue(info *domain.NowPlayingInfo) error {
|
||||||
|
l := r.getList(info.PlayerId)
|
||||||
|
l.PushFront(info)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *nowPlayingRepository) Dequeue(playerId int) (*domain.NowPlayingInfo, error) {
|
||||||
|
l := r.getList(playerId)
|
||||||
|
e := l.Back()
|
||||||
|
if e == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
l.Remove(e)
|
||||||
|
return e.Value.(*domain.NowPlayingInfo), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *nowPlayingRepository) Head(playerId int) (*domain.NowPlayingInfo, error) {
|
||||||
|
l := r.getList(playerId)
|
||||||
|
e := l.Front()
|
||||||
|
if e == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return e.Value.(*domain.NowPlayingInfo), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *nowPlayingRepository) Tail(playerId int) (*domain.NowPlayingInfo, error) {
|
||||||
|
l := r.getList(playerId)
|
||||||
|
e := l.Back()
|
||||||
|
if e == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return e.Value.(*domain.NowPlayingInfo), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *nowPlayingRepository) Count(playerId int) (int64, error) {
|
||||||
|
l := r.getList(playerId)
|
||||||
|
return int64(l.Len()), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *nowPlayingRepository) GetAll() ([]*domain.NowPlayingInfo, error) {
|
||||||
|
var all []*domain.NowPlayingInfo
|
||||||
|
playerMap.Range(func(playerId, l interface{}) bool {
|
||||||
|
ll := l.(*list.List)
|
||||||
|
e := ll.Front()
|
||||||
|
all = append(all, e.Value.(*domain.NowPlayingInfo))
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
return all, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ domain.NowPlayingRepository = (*nowPlayingRepository)(nil)
|
50
persistence/nowplaying_repository_test.go
Normal file
50
persistence/nowplaying_repository_test.go
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package persistence
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/cloudsonic/sonic-server/domain"
|
||||||
|
. "github.com/onsi/ginkgo"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = Describe("NowPlayingRepository", func() {
|
||||||
|
var repo domain.NowPlayingRepository
|
||||||
|
|
||||||
|
BeforeEach(func() {
|
||||||
|
playerMap = sync.Map{}
|
||||||
|
repo = NewNowPlayingRepository()
|
||||||
|
})
|
||||||
|
|
||||||
|
It("enqueues and dequeues records", func() {
|
||||||
|
Expect(repo.Enqueue(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "AAA"})).To(BeNil())
|
||||||
|
Expect(repo.Enqueue(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "BBB"})).To(BeNil())
|
||||||
|
|
||||||
|
Expect(repo.Tail(1)).To(Equal(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "AAA"}))
|
||||||
|
Expect(repo.Head(1)).To(Equal(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "BBB"}))
|
||||||
|
|
||||||
|
Expect(repo.Count(1)).To(Equal(int64(2)))
|
||||||
|
|
||||||
|
Expect(repo.Dequeue(1)).To(Equal(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "AAA"}))
|
||||||
|
Expect(repo.Count(1)).To(Equal(int64(1)))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("handles multiple players", func() {
|
||||||
|
Expect(repo.Enqueue(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "AAA"})).To(BeNil())
|
||||||
|
Expect(repo.Enqueue(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "BBB"})).To(BeNil())
|
||||||
|
|
||||||
|
Expect(repo.Enqueue(&domain.NowPlayingInfo{PlayerId: 2, TrackID: "CCC"})).To(BeNil())
|
||||||
|
Expect(repo.Enqueue(&domain.NowPlayingInfo{PlayerId: 2, TrackID: "DDD"})).To(BeNil())
|
||||||
|
|
||||||
|
Expect(repo.GetAll()).To(Equal([]*domain.NowPlayingInfo{
|
||||||
|
{PlayerId: 1, TrackID: "BBB"},
|
||||||
|
{PlayerId: 2, TrackID: "DDD"},
|
||||||
|
}))
|
||||||
|
|
||||||
|
Expect(repo.Count(2)).To(Equal(int64(2)))
|
||||||
|
Expect(repo.Count(2)).To(Equal(int64(2)))
|
||||||
|
|
||||||
|
Expect(repo.Tail(1)).To(Equal(&domain.NowPlayingInfo{PlayerId: 1, TrackID: "AAA"}))
|
||||||
|
Expect(repo.Head(2)).To(Equal(&domain.NowPlayingInfo{PlayerId: 2, TrackID: "DDD"}))
|
||||||
|
})
|
||||||
|
})
|
14
persistence/persistence_suite_test.go
Normal file
14
persistence/persistence_suite_test.go
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package persistence
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
. "github.com/onsi/ginkgo"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPersistence(t *testing.T) {
|
||||||
|
//log.SetLevel(log.LevelCritical)
|
||||||
|
RegisterFailHandler(Fail)
|
||||||
|
RunSpecs(t, "Common Persistence Suite")
|
||||||
|
}
|
@ -35,7 +35,7 @@ func initImporter(musicFolder string) *scanner.Importer {
|
|||||||
|
|
||||||
// wire_injectors.go:
|
// wire_injectors.go:
|
||||||
|
|
||||||
var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_ledis.Set, db_storm.Set, engine.Set, scanner.Set, newDB)
|
var allProviders = wire.NewSet(itunesbridge.NewItunesControl, db_storm.Set, engine.Set, scanner.Set, newDB)
|
||||||
|
|
||||||
func newDB() gomate.DB {
|
func newDB() gomate.DB {
|
||||||
return ledis.NewEmbeddedDB(db_ledis.Db())
|
return ledis.NewEmbeddedDB(db_ledis.Db())
|
||||||
|
@ -15,7 +15,7 @@ import (
|
|||||||
|
|
||||||
var allProviders = wire.NewSet(
|
var allProviders = wire.NewSet(
|
||||||
itunesbridge.NewItunesControl,
|
itunesbridge.NewItunesControl,
|
||||||
db_ledis.Set,
|
//db_ledis.Set,
|
||||||
db_storm.Set,
|
db_storm.Set,
|
||||||
engine.Set,
|
engine.Set,
|
||||||
scanner.Set,
|
scanner.Set,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user