gobs-cli/input.go
2025-04-24 11:54:51 +01:00

115 lines
3.4 KiB
Go

package main
import (
"fmt"
"strings"
"github.com/andreykaipov/goobs/api/requests/inputs"
)
// InputCmd provides commands to manage inputs in OBS Studio.
type InputCmd struct {
List InputListCmd `cmd:"" help:"List all inputs." aliases:"ls"`
Mute InputMuteCmd `cmd:"" help:"Mute input." aliases:"m"`
Unmute InputUnmuteCmd `cmd:"" help:"Unmute input." aliases:"um"`
Toggle InputToggleCmd `cmd:"" help:"Toggle input." aliases:"tg"`
}
// InputListCmd provides a command to list all inputs.
type InputListCmd struct {
Input bool `flag:"" help:"List all inputs." aliases:"i"`
Output bool `flag:"" help:"List all outputs." aliases:"o"`
Colour bool `flag:"" help:"List all colour sources." aliases:"c"`
}
// Run executes the command to list all inputs.
func (cmd *InputListCmd) Run(ctx *context) error {
resp, err := ctx.Client.Inputs.GetInputList(inputs.NewGetInputListParams())
if err != nil {
return err
}
for _, input := range resp.Inputs {
if cmd.Input && strings.Contains(input.InputKind, "input") {
fmt.Fprintln(ctx.Out, "Input:", input.InputName)
}
if cmd.Output && strings.Contains(input.InputKind, "output") {
fmt.Fprintln(ctx.Out, "Output:", input.InputName)
}
if cmd.Colour && strings.Contains(input.InputKind, "color") { // nolint
fmt.Fprintln(ctx.Out, "Colour Source:", input.InputName)
}
if !cmd.Input && !cmd.Output && !cmd.Colour {
fmt.Fprintln(ctx.Out, "Source:", input.InputName)
}
}
return nil
}
// InputMuteCmd provides a command to mute an input.
type InputMuteCmd struct {
InputName string `arg:"" help:"Name of the input to mute."`
}
// Run executes the command to mute an input.
func (cmd *InputMuteCmd) Run(ctx *context) error {
_, err := ctx.Client.Inputs.SetInputMute(
inputs.NewSetInputMuteParams().WithInputName(cmd.InputName).WithInputMuted(true),
)
if err != nil {
return fmt.Errorf("failed to mute input: %w", err)
}
fmt.Fprintf(ctx.Out, "Muted input: %s\n", cmd.InputName)
return nil
}
// InputUnmuteCmd provides a command to unmute an input.
type InputUnmuteCmd struct {
InputName string `arg:"" help:"Name of the input to unmute."`
}
// Run executes the command to unmute an input.
func (cmd *InputUnmuteCmd) Run(ctx *context) error {
_, err := ctx.Client.Inputs.SetInputMute(
inputs.NewSetInputMuteParams().WithInputName(cmd.InputName).WithInputMuted(false),
)
if err != nil {
return fmt.Errorf("failed to unmute input: %w", err)
}
fmt.Fprintf(ctx.Out, "Unmuted input: %s\n", cmd.InputName)
return nil
}
// InputToggleCmd provides a command to toggle the mute state of an input.
type InputToggleCmd struct {
InputName string `arg:"" help:"Name of the input to toggle."`
}
// Run executes the command to toggle the mute state of an input.
func (cmd *InputToggleCmd) Run(ctx *context) error {
// Get the current mute state of the input
resp, err := ctx.Client.Inputs.GetInputMute(
inputs.NewGetInputMuteParams().WithInputName(cmd.InputName),
)
if err != nil {
return fmt.Errorf("failed to get input mute state: %w", err)
}
// Toggle the mute state
newMuteState := !resp.InputMuted
_, err = ctx.Client.Inputs.SetInputMute(
inputs.NewSetInputMuteParams().WithInputName(cmd.InputName).WithInputMuted(newMuteState),
)
if err != nil {
return fmt.Errorf("failed to toggle input mute state: %w", err)
}
if newMuteState {
fmt.Fprintf(ctx.Out, "Muted input: %s\n", cmd.InputName)
} else {
fmt.Fprintf(ctx.Out, "Unmuted input: %s\n", cmd.InputName)
}
return nil
}