From 30ee5deb9ccc1f8ccb2800494bdbc61e1a320afe Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Fri, 8 Aug 2025 08:16:33 -0700 Subject: [PATCH] add CLI flag to set stop after current --- backend/app.go | 4 ++++ backend/cmdlineoptions.go | 20 +++++++++++--------- backend/ipc/api.go | 27 ++++++++++++++------------- backend/ipc/client.go | 8 ++++++++ backend/ipc/server.go | 4 ++++ 5 files changed, 41 insertions(+), 22 deletions(-) diff --git a/backend/app.go b/backend/app.go index 1eae20e..6597581 100644 --- a/backend/app.go +++ b/backend/app.go @@ -548,6 +548,10 @@ func (a *App) checkFlagsAndSendIPCMsg(cli *ipc.Client) error { return cli.SeekBackOrPrevious() case *FlagNext: return cli.SeekNext() + case *FlagStop: + return cli.Stop() + case *FlagStopAfterCurrent: + return cli.StopAfterCurrent() case *FlagShow: return cli.Show() case VolumeCLIArg >= 0: diff --git a/backend/cmdlineoptions.go b/backend/cmdlineoptions.go index c7252ed..4750bf2 100644 --- a/backend/cmdlineoptions.go +++ b/backend/cmdlineoptions.go @@ -12,15 +12,17 @@ var ( SeekByCLIArg float64 = 0 VolumePctCLIArg float64 = 0 - FlagPlay = flag.Bool("play", false, "unpause or begin playback") - FlagPause = flag.Bool("pause", false, "pause playback") - FlagPlayPause = flag.Bool("play-pause", false, "toggle play/pause state") - FlagPrevious = flag.Bool("previous", false, "seek to previous track or beginning of current") - FlagNext = flag.Bool("next", false, "seek to next track") - FlagStartMinimized = flag.Bool("start-minimized", false, "start app minimized") - FlagShow = flag.Bool("show", false, "show minimized app") - FlagVersion = flag.Bool("version", false, "print app version and exit") - FlagHelp = flag.Bool("help", false, "print command line options and exit") + FlagPlay = flag.Bool("play", false, "unpause or begin playback") + FlagPause = flag.Bool("pause", false, "pause playback") + FlagPlayPause = flag.Bool("play-pause", false, "toggle play/pause state") + FlagPrevious = flag.Bool("previous", false, "seek to previous track or beginning of current") + FlagNext = flag.Bool("next", false, "seek to next track") + FlagStop = flag.Bool("stop", false, "stop playback") + FlagStopAfterCurrent = flag.Bool("stop-after-current", false, "stop playback after current track") + FlagStartMinimized = flag.Bool("start-minimized", false, "start app minimized") + FlagShow = flag.Bool("show", false, "show minimized app") + FlagVersion = flag.Bool("version", false, "print app version and exit") + FlagHelp = flag.Bool("help", false, "print command line options and exit") ) func init() { diff --git a/backend/ipc/api.go b/backend/ipc/api.go index f53a4a4..f163962 100644 --- a/backend/ipc/api.go +++ b/backend/ipc/api.go @@ -3,19 +3,20 @@ 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= - VolumeAdjustPath = "/volume/adjust" // ?pct=<+/- percentage> - ShowPath = "/window/show" - QuitPath = "/window/quit" + PingPath = "/ping" + PlayPath = "/transport/play" + PlayPausePath = "/transport/playpause" + PausePath = "/transport/pause" + StopPath = "/transport/stop" + StopAfterCurrentPath = "/transport/stop-after-current" + 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 { diff --git a/backend/ipc/client.go b/backend/ipc/client.go index fbc6737..7e9bc80 100644 --- a/backend/ipc/client.go +++ b/backend/ipc/client.go @@ -48,6 +48,14 @@ func (c *Client) PlayPause() error { return c.sendRequest(PlayPausePath) } +func (c *Client) Stop() error { + return c.sendRequest(StopPath) +} + +func (c *Client) StopAfterCurrent() error { + return c.sendRequest(StopAfterCurrentPath) +} + func (c *Client) SeekNext() error { return c.sendRequest(NextPath) } diff --git a/backend/ipc/server.go b/backend/ipc/server.go index 8de46ad..7c91408 100644 --- a/backend/ipc/server.go +++ b/backend/ipc/server.go @@ -15,6 +15,7 @@ type PlaybackHandler interface { Continue() SeekBackOrPrevious() SeekNext() + SetStopAfterCurrent(bool) SeekSeconds(float64) SeekBySeconds(float64) Volume() int @@ -68,6 +69,9 @@ func (s *serverImpl) createHandler() http.Handler { m.HandleFunc(PausePath, s.makeSimpleEndpointHandler(s.pbHandler.Pause)) m.HandleFunc(PlayPausePath, s.makeSimpleEndpointHandler(s.pbHandler.PlayPause)) m.HandleFunc(StopPath, s.makeSimpleEndpointHandler(s.pbHandler.Stop)) + m.HandleFunc(StopAfterCurrentPath, s.makeSimpleEndpointHandler(func() { + s.pbHandler.SetStopAfterCurrent(true) + })) m.HandleFunc(PreviousPath, s.makeSimpleEndpointHandler(s.pbHandler.SeekBackOrPrevious)) m.HandleFunc(NextPath, s.makeSimpleEndpointHandler(s.pbHandler.SeekNext)) m.HandleFunc(TimePosPath, s.makeFloatEndpointHandler("s", s.pbHandler.SeekSeconds))