remove jukebox's dependency on ctrlsubsonic

This commit is contained in:
sentriz
2020-04-26 18:01:07 +01:00
committed by Senan Kelly
parent 51f2e12a3c
commit 080189e977
2 changed files with 41 additions and 26 deletions

View File

@@ -10,11 +10,11 @@ import (
"github.com/jinzhu/gorm" "github.com/jinzhu/gorm"
"go.senan.xyz/gonic/server/db"
"go.senan.xyz/gonic/server/scanner"
"go.senan.xyz/gonic/server/ctrlsubsonic/params" "go.senan.xyz/gonic/server/ctrlsubsonic/params"
"go.senan.xyz/gonic/server/ctrlsubsonic/spec" "go.senan.xyz/gonic/server/ctrlsubsonic/spec"
"go.senan.xyz/gonic/server/db"
"go.senan.xyz/gonic/server/lastfm" "go.senan.xyz/gonic/server/lastfm"
"go.senan.xyz/gonic/server/scanner"
) )
func lowerUDecOrHash(in string) string { func lowerUDecOrHash(in string) string {
@@ -329,6 +329,23 @@ func (c *Controller) ServeJukebox(r *http.Request) *spec.Response {
} }
return tracks return tracks
} }
getStatus := func() spec.JukeboxStatus {
status := c.Jukebox.GetStatus()
return spec.JukeboxStatus{
CurrentIndex: status.CurrentIndex,
Playing: status.Playing,
Gain: status.Gain,
Position: status.Position,
}
}
getStatusTracks := func() []*spec.TrackChild {
tracks := c.Jukebox.GetTracks()
ret := make([]*spec.TrackChild, len(tracks))
for i, track := range tracks {
ret[i] = spec.NewTrackByTags(track, track.Album)
}
return ret
}
switch act := params.Get("action"); act { switch act := params.Get("action"); act {
case "set": case "set":
c.Jukebox.SetTracks(getTracks()) c.Jukebox.SetTracks(getTracks())
@@ -354,11 +371,16 @@ func (c *Controller) ServeJukebox(r *http.Request) *spec.Response {
c.Jukebox.Skip(index) c.Jukebox.Skip(index)
case "get": case "get":
sub := spec.NewResponse() sub := spec.NewResponse()
sub.JukeboxPlaylist = c.Jukebox.GetTracks() sub.JukeboxPlaylist = &spec.JukeboxPlaylist{
JukeboxStatus: getStatus(),
List: getStatusTracks(),
}
return sub return sub
} }
// all actions except get are expected to return a status // all actions except get are expected to return a status
sub := spec.NewResponse() sub := spec.NewResponse()
sub.JukeboxStatus = c.Jukebox.Status() sub.JukeboxPlaylist = &spec.JukeboxPlaylist{
JukeboxStatus: getStatus(),
}
return sub return sub
} }

View File

@@ -15,13 +15,13 @@ import (
"github.com/faiface/beep/speaker" "github.com/faiface/beep/speaker"
"go.senan.xyz/gonic/server/db" "go.senan.xyz/gonic/server/db"
"go.senan.xyz/gonic/server/ctrlsubsonic/spec"
) )
type strmInfo struct { type Status struct {
ctrlStrmr beep.Ctrl CurrentIndex int
strm beep.StreamSeekCloser Playing bool
format beep.Format Gain float64
Position int
} }
type Jukebox struct { type Jukebox struct {
@@ -39,6 +39,12 @@ type Jukebox struct {
sync.Mutex sync.Mutex
} }
type strmInfo struct {
ctrlStrmr beep.Ctrl
strm beep.StreamSeekCloser
format beep.Format
}
type updateType string type updateType string
const ( const (
@@ -227,13 +233,13 @@ func (j *Jukebox) Start() {
j.updates <- update{action: start} j.updates <- update{action: start}
} }
func (j *Jukebox) Status() *spec.JukeboxStatus { func (j *Jukebox) GetStatus() Status {
position := 0 position := 0
if j.info != nil { if j.info != nil {
length := j.info.format.SampleRate.D(j.info.strm.Position()) length := j.info.format.SampleRate.D(j.info.strm.Position())
position = int(length.Round(time.Millisecond).Seconds()) position = int(length.Round(time.Millisecond).Seconds())
} }
return &spec.JukeboxStatus{ return Status{
CurrentIndex: j.index, CurrentIndex: j.index,
Playing: j.playing, Playing: j.playing,
Gain: 0.9, Gain: 0.9,
@@ -241,21 +247,8 @@ func (j *Jukebox) Status() *spec.JukeboxStatus {
} }
} }
func (j *Jukebox) GetTracks() *spec.JukeboxPlaylist { func (j *Jukebox) GetTracks() []*db.Track {
j.Lock() j.Lock()
defer j.Unlock() defer j.Unlock()
jb := &spec.JukeboxPlaylist{} return j.playlist
jb.List = make([]*spec.TrackChild, len(j.playlist))
for i, track := range j.playlist {
jb.List[i] = spec.NewTrackByTags(track, track.Album)
}
jb.CurrentIndex = j.index
jb.Playing = j.playing
jb.Gain = 0.9
jb.Position = 0
if j.info != nil {
length := j.info.format.SampleRate.D(j.info.strm.Position())
jb.Position = int(length.Round(time.Millisecond).Seconds())
}
return jb
} }