From dc043b58479c3ef776c22015e09e1553aa20782b Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Fri, 20 Jun 2025 04:40:56 +0100 Subject: [PATCH] add --uuid flag to scene list, sceneitem list and input list --- input.go | 47 +++++++++++++++++++++++++++++++++-------------- scene.go | 28 ++++++++++++++++++++++++---- sceneitem.go | 41 +++++++++++++++++++++++++++++++---------- util.go | 4 ++-- 4 files changed, 90 insertions(+), 30 deletions(-) diff --git a/input.go b/input.go index 3baa6b1..4413e23 100644 --- a/input.go +++ b/input.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "sort" "strings" "github.com/andreykaipov/goobs/api/requests/inputs" @@ -23,6 +24,7 @@ type InputListCmd struct { 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"` + UUID bool `flag:"" help:"Display UUIDs of inputs." aliases:"u"` } // Run executes the command to list all inputs. @@ -34,22 +36,31 @@ func (cmd *InputListCmd) Run(ctx *context) error { t := table.New(ctx.Out) t.SetPadding(3) - t.SetAlignment(table.AlignLeft, table.AlignLeft, table.AlignCenter) - t.SetHeaders("Input Name", "Kind", "Muted") + if cmd.UUID { + t.SetAlignment(table.AlignLeft, table.AlignLeft, table.AlignCenter, table.AlignLeft) + t.SetHeaders("Input Name", "Kind", "Muted", "UUID") + } else { + t.SetAlignment(table.AlignLeft, table.AlignLeft, table.AlignCenter) + t.SetHeaders("Input Name", "Kind", "Muted") + } + + sort.Slice(resp.Inputs, func(i, j int) bool { + return resp.Inputs[i].InputName < resp.Inputs[j].InputName + }) 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 + resp, err := ctx.Client.Inputs.GetInputMute( + inputs.NewGetInputMuteParams().WithInputName(input.InputName), + ) + if err != nil { + if err.Error() == "request GetInputMute: InvalidResourceState (604): The specified input does not support audio." { + muteMark = "N/A" + } else { + return fmt.Errorf("failed to get input mute state: %w", err) } + } else { + muteMark = getEnabledMark(resp.InputMuted) } type filter struct { @@ -67,14 +78,22 @@ func (cmd *InputListCmd) Run(ctx *context) error { var added bool for _, f := range filters { if f.enabled && strings.Contains(input.InputKind, f.keyword) { - t.AddRow(input.InputName, input.InputKind, muteMark) + if cmd.UUID { + t.AddRow(input.InputName, input.InputKind, muteMark, input.InputUuid) + } else { + 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) + if cmd.UUID { + t.AddRow(input.InputName, snakeCaseToTitleCase(input.InputKind), muteMark, input.InputUuid) + } else { + t.AddRow(input.InputName, snakeCaseToTitleCase(input.InputKind), muteMark) + } } } t.Render() diff --git a/scene.go b/scene.go index 26d11cb..9ff42da 100644 --- a/scene.go +++ b/scene.go @@ -16,7 +16,9 @@ type SceneCmd struct { } // SceneListCmd provides a command to list all scenes. -type SceneListCmd struct{} // size = 0x0 +type SceneListCmd struct { + UUID bool `flag:"" help:"Display UUIDs of scenes."` +} // Run executes the command to list all scenes. func (cmd *SceneListCmd) Run(ctx *context) error { @@ -25,14 +27,32 @@ func (cmd *SceneListCmd) Run(ctx *context) error { return err } + currentScene, err := ctx.Client.Scenes.GetCurrentProgramScene() + if err != nil { + return err + } + t := table.New(ctx.Out) t.SetPadding(3) - t.SetAlignment(table.AlignLeft, table.AlignLeft) - t.SetHeaders("Scene Name", "UUID") + if cmd.UUID { + t.SetAlignment(table.AlignLeft, table.AlignCenter, table.AlignLeft) + t.SetHeaders("Scene Name", "Active", "UUID") + } else { + t.SetAlignment(table.AlignLeft, table.AlignCenter) + t.SetHeaders("Scene Name", "Active") + } slices.Reverse(scenes.Scenes) for _, scene := range scenes.Scenes { - t.AddRow(scene.SceneName, scene.SceneUuid) + var activeMark string + if scene.SceneName == currentScene.SceneName { + activeMark = getEnabledMark(true) + } + if cmd.UUID { + t.AddRow(scene.SceneName, activeMark, scene.SceneUuid) + } else { + t.AddRow(scene.SceneName, activeMark) + } } t.Render() return nil diff --git a/sceneitem.go b/sceneitem.go index 5c48c87..29b7242 100644 --- a/sceneitem.go +++ b/sceneitem.go @@ -21,7 +21,8 @@ type SceneItemCmd struct { // SceneItemListCmd provides a command to list all scene items in a scene. type SceneItemListCmd struct { - SceneName string `arg:"" help:"Name of the scene to list items from." default:""` + UUID bool `flag:"" help:"Display UUIDs of scene items."` + SceneName string ` help:"Name of the scene to list items from." arg:"" default:""` } // Run executes the command to list all scene items in a scene. @@ -47,8 +48,13 @@ func (cmd *SceneItemListCmd) Run(ctx *context) error { t := table.New(ctx.Out) t.SetPadding(3) - t.SetAlignment(table.AlignCenter, table.AlignLeft, table.AlignCenter, table.AlignCenter) - t.SetHeaders("Item ID", "Item Name", "In Group", "Enabled") + if cmd.UUID { + t.SetAlignment(table.AlignCenter, table.AlignLeft, table.AlignCenter, table.AlignCenter, table.AlignCenter) + t.SetHeaders("Item ID", "Item Name", "In Group", "Enabled", "UUID") + } else { + t.SetAlignment(table.AlignCenter, table.AlignLeft, table.AlignCenter, table.AlignCenter) + t.SetHeaders("Item ID", "Item Name", "In Group", "Enabled") + } sort.Slice(resp.SceneItems, func(i, j int) bool { return resp.SceneItems[i].SceneItemID < resp.SceneItems[j].SceneItemID @@ -67,15 +73,30 @@ func (cmd *SceneItemListCmd) Run(ctx *context) error { }) for _, groupItem := range resp.SceneItems { - t.AddRow( - fmt.Sprintf("%d", groupItem.SceneItemID), - groupItem.SourceName, - item.SourceName, - getEnabledMark(item.SceneItemEnabled && groupItem.SceneItemEnabled), - ) + if cmd.UUID { + t.AddRow( + fmt.Sprintf("%d", groupItem.SceneItemID), + groupItem.SourceName, + item.SourceName, + getEnabledMark(item.SceneItemEnabled && groupItem.SceneItemEnabled), + groupItem.SourceUuid, + ) + } else { + t.AddRow( + fmt.Sprintf("%d", groupItem.SceneItemID), + groupItem.SourceName, + item.SourceName, + getEnabledMark(item.SceneItemEnabled && groupItem.SceneItemEnabled), + ) + } } } else { - t.AddRow(fmt.Sprintf("%d", item.SceneItemID), item.SourceName, "", getEnabledMark(item.SceneItemEnabled)) + if cmd.UUID { + t.AddRow(fmt.Sprintf("%d", item.SceneItemID), item.SourceName, "", + getEnabledMark(item.SceneItemEnabled), item.SourceUuid) + } else { + t.AddRow(fmt.Sprintf("%d", item.SceneItemID), item.SourceName, "", getEnabledMark(item.SceneItemEnabled)) + } } } t.Render() diff --git a/util.go b/util.go index b9ee5e7..73d7e3a 100644 --- a/util.go +++ b/util.go @@ -16,9 +16,9 @@ func snakeCaseToTitleCase(snake string) string { func getEnabledMark(enabled bool) string { if enabled { - return "\u2713" // green check mark + return "\u2713" // check mark } - return "\u274c" // red cross mark + return "\u274c" // cross mark } func trimPrefix(s, prefix string) string {