This commit is contained in:
parent
8fccb0886f
commit
162574aa62
@ -3,6 +3,7 @@ package cli
|
||||
import (
|
||||
"log/slog"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/urfave/cli/v2"
|
||||
"go.uber.org/fx"
|
||||
@ -55,6 +56,14 @@ func Run(c *commands.Commander, s fx.Shutdowner) {
|
||||
return c.PrintLink()
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "linkcontext",
|
||||
Aliases: []string{"lc"},
|
||||
Usage: "Prints the current album or playlist",
|
||||
Action: func(cCtx *cli.Context) error {
|
||||
return c.PrintLinkContext()
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "next",
|
||||
Aliases: []string{"n", "skip"},
|
||||
@ -96,19 +105,76 @@ func Run(c *commands.Commander, s fx.Shutdowner) {
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "download_cover",
|
||||
Usage: "Downloads the cover of the current song",
|
||||
Aliases: []string{"dl"},
|
||||
Flags: []cli.Flag{
|
||||
&cli.PathFlag{
|
||||
Name: "path",
|
||||
Aliases: []string{"p"},
|
||||
Usage: "Path to save the cover",
|
||||
DefaultText: "./cover.png",
|
||||
Name: "volume",
|
||||
Aliases: []string{"v"},
|
||||
Usage: "Control the volume",
|
||||
Subcommands: []*cli.Command{
|
||||
{
|
||||
Name: "up",
|
||||
Usage: "Increase the volume",
|
||||
Args: true,
|
||||
ArgsUsage: "percent",
|
||||
Action: func(cCtx *cli.Context) error {
|
||||
amt, err := strconv.Atoi(cCtx.Args().First())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return c.ChangeVolume(amt)
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "down",
|
||||
Aliases: []string{"dn"},
|
||||
Usage: "Decrease the volume",
|
||||
Args: true,
|
||||
ArgsUsage: "percent",
|
||||
Action: func(cCtx *cli.Context) error {
|
||||
amt, err := strconv.Atoi(cCtx.Args().First())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return c.ChangeVolume(-amt)
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "mute",
|
||||
Aliases: []string{"m"},
|
||||
Usage: "Mute",
|
||||
Action: func(cCtx *cli.Context) error {
|
||||
return c.Mute()
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "unmute",
|
||||
Aliases: []string{"um"},
|
||||
Usage: "Unmute",
|
||||
Action: func(cCtx *cli.Context) error {
|
||||
return c.UnMute()
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "togglemute",
|
||||
Aliases: []string{"tm"},
|
||||
Usage: "Toggle mute",
|
||||
Action: func(cCtx *cli.Context) error {
|
||||
return c.ToggleMute()
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "download_cover",
|
||||
Usage: "Downloads the cover of the current song",
|
||||
Aliases: []string{"dl"},
|
||||
Args: true,
|
||||
ArgsUsage: "path",
|
||||
BashComplete: func(cCtx *cli.Context) {
|
||||
if cCtx.NArg() > 0 {
|
||||
return
|
||||
}
|
||||
},
|
||||
Action: func(cCtx *cli.Context) error {
|
||||
return c.DownloadCover(cCtx.Path("path"))
|
||||
return c.DownloadCover(cCtx.Args().First())
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -119,9 +185,24 @@ func Run(c *commands.Commander, s fx.Shutdowner) {
|
||||
return c.Radio()
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "clearradio",
|
||||
Usage: "Clears the radio queue",
|
||||
Aliases: []string{"cr"},
|
||||
Action: func(ctx *cli.Context) error {
|
||||
return c.ClearRadio()
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "devices",
|
||||
Usage: "Lists available devices",
|
||||
Aliases: []string{"d"},
|
||||
Action: func(ctx *cli.Context) error {
|
||||
return c.ListDevices()
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
app.Suggest = true
|
||||
if err := app.Run(os.Args); err != nil {
|
||||
slog.Error("COMMANDER", "run error", err)
|
||||
os.Exit(1)
|
||||
|
25
src/components/commands/devices.go
Normal file
25
src/components/commands/devices.go
Normal file
@ -0,0 +1,25 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/zmb3/spotify/v2"
|
||||
)
|
||||
|
||||
func (c *Commander) ListDevices() error {
|
||||
devices, err := c.Client.PlayerDevices(c.Context)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return PrintDevices(devices)
|
||||
}
|
||||
|
||||
func PrintDevices(devices []spotify.PlayerDevice) error {
|
||||
out, err := json.MarshalIndent(devices, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Println(string(out))
|
||||
return nil
|
||||
}
|
@ -10,3 +10,12 @@ func (c *Commander) PrintLink() error {
|
||||
fmt.Println(state.Item.ExternalURLs["spotify"])
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Commander) PrintLinkContext() error {
|
||||
state, err := c.Client.PlayerState(c.Context)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Println(state.PlaybackContext.ExternalURLs["spotify"])
|
||||
return nil
|
||||
}
|
||||
|
35
src/components/commands/volume.go
Normal file
35
src/components/commands/volume.go
Normal file
@ -0,0 +1,35 @@
|
||||
package commands
|
||||
|
||||
func (c *Commander) ChangeVolume(amount int) error {
|
||||
state, err := c.Client.PlayerState(c.Context)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
newVolume := state.Device.Volume + amount
|
||||
if newVolume > 100 {
|
||||
newVolume = 100
|
||||
}
|
||||
if newVolume < 0 {
|
||||
newVolume = 0
|
||||
}
|
||||
return c.Client.Volume(c.Context, newVolume)
|
||||
}
|
||||
|
||||
func (c *Commander) Mute() error {
|
||||
return c.ChangeVolume(-100)
|
||||
}
|
||||
|
||||
func (c *Commander) UnMute() error {
|
||||
return c.ChangeVolume(100)
|
||||
}
|
||||
|
||||
func (c *Commander) ToggleMute() error {
|
||||
state, err := c.Client.PlayerState(c.Context)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if state.Device.Volume == 0 {
|
||||
return c.ChangeVolume(100)
|
||||
}
|
||||
return c.ChangeVolume(-100)
|
||||
}
|
Loading…
Reference in New Issue
Block a user