remove jukebox's dependency on ctrlsubsonic
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user