From 9390f7b4e1a064f7a915c289798eb1b5a68f6b14 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sun, 5 Jan 2025 16:45:48 -0800 Subject: [PATCH] Fix #522: add -volume-adjust-pct CLI arg --- backend/app.go | 2 ++ backend/cmdlineoptions.go | 16 +++++++++++++--- backend/ipc/api.go | 29 +++++++++++++++++------------ backend/ipc/client.go | 4 ++++ backend/ipc/server.go | 11 ++++++++--- 5 files changed, 44 insertions(+), 18 deletions(-) diff --git a/backend/app.go b/backend/app.go index 542a515..3946114 100644 --- a/backend/app.go +++ b/backend/app.go @@ -435,6 +435,8 @@ func (a *App) checkFlagsAndSendIPCMsg(cli *ipc.Client) error { return cli.SeekNext() case VolumeCLIArg >= 0: return cli.SetVolume(VolumeCLIArg) + case VolumePctCLIArg != 0: + return cli.AdjustVolumePct(VolumePctCLIArg) case SeekToCLIArg >= 0: return cli.SeekSeconds(SeekToCLIArg) case SeekByCLIArg != 0: diff --git a/backend/cmdlineoptions.go b/backend/cmdlineoptions.go index 267ed7a..9f022b1 100644 --- a/backend/cmdlineoptions.go +++ b/backend/cmdlineoptions.go @@ -3,12 +3,14 @@ package backend import ( "flag" "strconv" + "strings" ) var ( - VolumeCLIArg int = -1 - SeekToCLIArg float64 = -1 - SeekByCLIArg float64 = 0 + VolumeCLIArg int = -1 + SeekToCLIArg float64 = -1 + SeekByCLIArg float64 = 0 + VolumePctCLIArg float64 = 0 FlagPlay = flag.Bool("play", false, "unpause or begin playback") FlagPause = flag.Bool("pause", false, "pause playback") @@ -36,6 +38,14 @@ func init() { SeekByCLIArg = v return err }) + flag.Func("volume-adjust-pct", "adjusts volume up or down by the given percentage (positive or negative)", func(s string) error { + if strings.HasSuffix(s, "%") { + s = s[:len(s)-1] + } + v, err := strconv.ParseFloat(s, 64) + VolumePctCLIArg = v + return err + }) } func HaveCommandLineOptions() bool { diff --git a/backend/ipc/api.go b/backend/ipc/api.go index f7eba39..f53a4a4 100644 --- a/backend/ipc/api.go +++ b/backend/ipc/api.go @@ -3,18 +3,19 @@ package ipc import "fmt" const ( - PingPath = "/ping" - PlayPath = "/transport/play" - PlayPausePath = "/transport/playpause" - PausePath = "/transport/pause" - StopPath = "/transport/stop" - PreviousPath = "/transport/previous" - NextPath = "/transport/next" - TimePosPath = "/transport/timepos" // ?s= - SeekByPath = "/transport/seek-by" // ?s=<+/- seconds> - VolumePath = "/volume" // ?v= - ShowPath = "/window/show" - QuitPath = "/window/quit" + PingPath = "/ping" + PlayPath = "/transport/play" + PlayPausePath = "/transport/playpause" + PausePath = "/transport/pause" + StopPath = "/transport/stop" + PreviousPath = "/transport/previous" + NextPath = "/transport/next" + TimePosPath = "/transport/timepos" // ?s= + SeekByPath = "/transport/seek-by" // ?s=<+/- seconds> + VolumePath = "/volume" // ?v= + VolumeAdjustPath = "/volume/adjust" // ?pct=<+/- percentage> + ShowPath = "/window/show" + QuitPath = "/window/quit" ) type Response struct { @@ -25,6 +26,10 @@ func SetVolumePath(vol int) string { return fmt.Sprintf("%s?v=%d", VolumePath, vol) } +func AdjustVolumePctPath(pct float64) string { + return fmt.Sprintf("%s?pct=%0.2f", VolumeAdjustPath, pct) +} + func SeekToSecondsPath(secs float64) string { return fmt.Sprintf("%s?s=%0.2f", TimePosPath, secs) } diff --git a/backend/ipc/client.go b/backend/ipc/client.go index 755183a..fbc6737 100644 --- a/backend/ipc/client.go +++ b/backend/ipc/client.go @@ -68,6 +68,10 @@ func (c *Client) SetVolume(vol int) error { return c.sendRequest(SetVolumePath(vol)) } +func (c *Client) AdjustVolumePct(pct float64) error { + return c.sendRequest(AdjustVolumePctPath(pct)) +} + func (c *Client) Show() error { return c.sendRequest(ShowPath) } diff --git a/backend/ipc/server.go b/backend/ipc/server.go index 26c50ac..8de46ad 100644 --- a/backend/ipc/server.go +++ b/backend/ipc/server.go @@ -70,8 +70,8 @@ func (s *serverImpl) createHandler() http.Handler { m.HandleFunc(StopPath, s.makeSimpleEndpointHandler(s.pbHandler.Stop)) m.HandleFunc(PreviousPath, s.makeSimpleEndpointHandler(s.pbHandler.SeekBackOrPrevious)) m.HandleFunc(NextPath, s.makeSimpleEndpointHandler(s.pbHandler.SeekNext)) - m.HandleFunc(TimePosPath, s.makeFloatEndpointHandler(s.pbHandler.SeekSeconds, "s")) - m.HandleFunc(SeekByPath, s.makeFloatEndpointHandler(s.pbHandler.SeekBySeconds, "s")) + m.HandleFunc(TimePosPath, s.makeFloatEndpointHandler("s", s.pbHandler.SeekSeconds)) + m.HandleFunc(SeekByPath, s.makeFloatEndpointHandler("s", s.pbHandler.SeekBySeconds)) m.HandleFunc(VolumePath, func(w http.ResponseWriter, r *http.Request) { v := r.URL.Query().Get("v") if vol, err := strconv.Atoi(v); err == nil { @@ -81,6 +81,11 @@ func (s *serverImpl) createHandler() http.Handler { s.writeErr(w, err) } }) + m.HandleFunc(VolumeAdjustPath, s.makeFloatEndpointHandler("pct", func(pct float64) { + vol := s.pbHandler.Volume() + vol = vol + int(float64(vol)*(pct/100)) + s.pbHandler.SetVolume(vol) // will clamp to range for us + })) return m } @@ -91,7 +96,7 @@ func (s *serverImpl) makeSimpleEndpointHandler(f func()) func(http.ResponseWrite } } -func (s *serverImpl) makeFloatEndpointHandler(f func(float64), queryParam string) func(http.ResponseWriter, *http.Request) { +func (s *serverImpl) makeFloatEndpointHandler(queryParam string, f func(float64)) func(http.ResponseWriter, *http.Request) { return func(w http.ResponseWriter, r *http.Request) { v := r.URL.Query().Get(queryParam) if val, err := strconv.ParseFloat(v, 64); err == nil {