feat(ipc): add an endpoint for getting current track (#911)
This commit is contained in:
@@ -28,6 +28,7 @@ const (
|
||||
ShowPath = "/window/show"
|
||||
ReloadThemePath = "/window/reload-theme"
|
||||
QuitPath = "/window/quit"
|
||||
CurrentTrackPath = "/current_track"
|
||||
RateCurrentTrackPath = "/current_track/rate" // ?r=<rating 0-5>
|
||||
)
|
||||
|
||||
|
||||
@@ -118,6 +118,10 @@ func (c *Client) AdjustVolumePct(pct float64) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *Client) CurrentTrack() (string, error) {
|
||||
return c.sendRequest(CurrentTrackPath)
|
||||
}
|
||||
|
||||
func (c *Client) RateCurrentTrack(rating int) error {
|
||||
_, err := c.sendRequest(BuildRateCurrentTrackPath(rating))
|
||||
return err
|
||||
|
||||
+36
-8
@@ -29,6 +29,7 @@ type PlaybackHandler interface {
|
||||
PlayAlbum(string, int, bool) error
|
||||
PlayPlaylist(string, int, bool) error
|
||||
PlayTrack(string) error
|
||||
NowPlaying() mediaprovider.MediaItem
|
||||
}
|
||||
|
||||
type IPCServer interface {
|
||||
@@ -41,16 +42,21 @@ type ServerManager interface {
|
||||
}
|
||||
|
||||
type serverImpl struct {
|
||||
server *http.Server
|
||||
pbHandler PlaybackHandler
|
||||
rateFn func(int)
|
||||
sm ServerManager
|
||||
showFn func()
|
||||
quitFn func()
|
||||
reloadThemeFn func()
|
||||
server *http.Server
|
||||
pbHandler PlaybackHandler
|
||||
rateFn func(int)
|
||||
sm ServerManager
|
||||
showFn func()
|
||||
quitFn func()
|
||||
reloadThemeFn func()
|
||||
}
|
||||
|
||||
func NewServer(pbHandler PlaybackHandler, rateFn func(int), sm ServerManager, showFn, quitFn, reloadThemeFn func()) IPCServer {
|
||||
func NewServer(
|
||||
pbHandler PlaybackHandler,
|
||||
rateFn func(int),
|
||||
sm ServerManager,
|
||||
showFn, quitFn, reloadThemeFn func(),
|
||||
) IPCServer {
|
||||
s := &serverImpl{pbHandler: pbHandler, rateFn: rateFn, sm: sm, showFn: showFn, quitFn: quitFn, reloadThemeFn: reloadThemeFn}
|
||||
s.server = &http.Server{
|
||||
Handler: s.createHandler(),
|
||||
@@ -175,6 +181,13 @@ func (s *serverImpl) createHandler() http.Handler {
|
||||
|
||||
return tracks, nil
|
||||
}))
|
||||
m.HandleFunc(CurrentTrackPath, s.makeStatusEndpointHandler(func() (any, error) {
|
||||
track := s.pbHandler.NowPlaying()
|
||||
if track == nil {
|
||||
return nil, errors.New("nothing is playing right now")
|
||||
}
|
||||
return track.Metadata(), nil
|
||||
}))
|
||||
m.HandleFunc(RateCurrentTrackPath, func(w http.ResponseWriter, r *http.Request) {
|
||||
v := r.URL.Query().Get("r")
|
||||
if rating, err := strconv.Atoi(v); err == nil {
|
||||
@@ -231,6 +244,21 @@ func (s *serverImpl) makeTracklistEndpointHandler(f func(string, int, bool) erro
|
||||
}
|
||||
}
|
||||
|
||||
func (s *serverImpl) makeStatusEndpointHandler(f func() (any, error)) func(http.ResponseWriter, *http.Request) {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
data, err := f()
|
||||
if err != nil {
|
||||
s.writeErr(w, err)
|
||||
return
|
||||
}
|
||||
bytes, err := json.Marshal(data)
|
||||
if err != nil {
|
||||
s.writeErr(w, err)
|
||||
}
|
||||
s.writeData(w, bytes)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *serverImpl) makeSearchEndpointHandler(f func(string) (any, error)) func(http.ResponseWriter, *http.Request) {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
search := r.URL.Query().Get("s")
|
||||
|
||||
Reference in New Issue
Block a user