gobs-cli/input.go
2025-06-07 19:19:10 +01:00

150 lines
4.3 KiB
Go

package main
import (
"fmt"
"strings"
"github.com/andreykaipov/goobs/api/requests/inputs"
"github.com/aquasecurity/table"
)
// 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"`
Ffmpeg bool `flag:"" help:"List all ffmpeg sources." aliases:"f"`
Vlc bool `flag:"" help:"List all VLC sources." aliases:"v"`
}
// 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
}
t := table.New(ctx.Out)
t.SetPadding(3)
t.SetAlignment(table.AlignLeft, table.AlignLeft, table.AlignCenter)
t.SetHeaders("Input Name", "Kind", "Muted")
for _, input := range resp.Inputs {
var muteMark string
for _, kind := range []string{"input", "output", "ffmpeg", "vlc"} {
if strings.Contains(input.InputKind, kind) {
resp, err := ctx.Client.Inputs.GetInputMute(
inputs.NewGetInputMuteParams().WithInputName(input.InputName),
)
if err != nil {
return fmt.Errorf("failed to get input mute state: %w", err)
}
muteMark = getEnabledMark(resp.InputMuted)
break
}
}
type filter struct {
enabled bool
keyword string
}
filters := []filter{
{cmd.Input, "input"},
{cmd.Output, "output"},
{cmd.Colour, "color"}, // nolint: misspell
{cmd.Ffmpeg, "ffmpeg"},
{cmd.Vlc, "vlc"},
}
var added bool
for _, f := range filters {
if f.enabled && strings.Contains(input.InputKind, f.keyword) {
t.AddRow(input.InputName, input.InputKind, muteMark)
added = true
break
}
}
if !added && (!cmd.Input && !cmd.Output && !cmd.Colour && !cmd.Ffmpeg && !cmd.Vlc) {
t.AddRow(input.InputName, input.InputKind, muteMark)
}
}
t.Render()
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
}