Compare commits

...

7 Commits

Author SHA1 Message Date
d9c0e40d8f add 0.10.3 to CHANGELOG 2025-06-07 20:10:56 +01:00
42ab45b9fb upd flags for input list command 2025-06-07 19:19:31 +01:00
27c3c5369b add --fmpeg and --vlc flags to filter list
add Muted column to table
2025-06-07 19:19:10 +01:00
0a0c75ae51 sceneitem list now prints enabled mark
patch bump
2025-06-04 14:43:16 +01:00
cf5da68137 add filter list fixes to 0.10.1 section 2025-06-04 14:34:09 +01:00
14d9feb43e add missing SourceName arg to filter list 2025-06-04 14:32:32 +01:00
8204d6520d filter list SourceName arg now defaults to current scene
filter list now prints defaults for unchanged values
2025-06-04 14:32:08 +01:00
5 changed files with 93 additions and 25 deletions

View File

@ -5,13 +5,29 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
# [0.10.0] # [0.10.3] - 2025-06-07
### Added
- filter list:
- --ffmpeg, --vlc flags
- Muted column to list table
# [0.10.2] - 2025-06-04
### Added ### Added
- screenshot save command, see [ScreenshotCmd](https://github.com/onyx-and-iris/gobs-cli?tab=readme-ov-file#screenshotcmd) - screenshot save command, see [ScreenshotCmd](https://github.com/onyx-and-iris/gobs-cli?tab=readme-ov-file#screenshotcmd)
# [0.9.0] ### Fixed
- filter list:
- sourceName arg now defaults to current scene.
- defaults are printed for any unmodified values.
- sceneitem list:
- prints enabled mark instead of true/false
# [0.9.0] - 2025-06-02
### Added ### Added
@ -21,7 +37,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- version command renamed to obs-version - version command renamed to obs-version
# [0.8.2] # [0.8.2] - 2025-05-29
### Added ### Added

View File

@ -223,6 +223,8 @@ gobs-cli group status START "test_group"
- --input: List all inputs. - --input: List all inputs.
- --output: List all outputs. - --output: List all outputs.
- --colour: List all colour sources. - --colour: List all colour sources.
- --ffmpeg: List all ffmpeg sources.
- --vlc: List all VLC sources.
```console ```console
gobs-cli input list gobs-cli input list
@ -513,6 +515,10 @@ gobs-cli hotkey trigger-sequence OBS_KEY_F1 --shift --ctrl
- list: List all filters. - list: List all filters.
*optional*
- args: SourceName
- defaults to current scene
```console ```console
gobs-cli filter list gobs-cli filter list
``` ```
@ -561,7 +567,7 @@ gobs-cli projector list-monitors
- defaults to 0 - defaults to 0
*optional* *optional*
- args: <source_name> - args: SourceName
- defaults to current scene - defaults to current scene
```console ```console
@ -585,7 +591,7 @@ gobs-cli projector open --monitor-index=1 "test_group"
- --quality: - --quality:
- defaults to -1 - defaults to -1
- args: <source_name> <output_path> - args: SourceName FilePath
```console ```console
gobs-cli screenshot save --width=2560 --height=1440 "Scene" "C:\Users\me\Videos\screenshot.png" gobs-cli screenshot save --width=2560 --height=1440 "Scene" "C:\Users\me\Videos\screenshot.png"

View File

@ -2,6 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"maps"
"sort" "sort"
"strings" "strings"
@ -20,19 +21,27 @@ type FilterCmd struct {
// FilterListCmd provides a command to list all filters in a scene. // FilterListCmd provides a command to list all filters in a scene.
type FilterListCmd struct { type FilterListCmd struct {
SourceName string `arg:"" help:"Name of the source to list filters from."` SourceName string `arg:"" help:"Name of the source to list filters from." default:""`
} }
// Run executes the command to list all filters in a scene. // Run executes the command to list all filters in a scene.
func (cmd *FilterListCmd) Run(ctx *context) error { func (cmd *FilterListCmd) Run(ctx *context) error {
filters, err := ctx.Client.Filters.GetSourceFilterList( if cmd.SourceName == "" {
currentScene, err := ctx.Client.Scenes.GetCurrentProgramScene()
if err != nil {
return fmt.Errorf("failed to get current program scene: %w", err)
}
cmd.SourceName = currentScene.SceneName
}
sourceFilters, err := ctx.Client.Filters.GetSourceFilterList(
filters.NewGetSourceFilterListParams().WithSourceName(cmd.SourceName), filters.NewGetSourceFilterListParams().WithSourceName(cmd.SourceName),
) )
if err != nil { if err != nil {
return err return err
} }
if len(filters.Filters) == 0 { if len(sourceFilters.Filters) == 0 {
fmt.Fprintf(ctx.Out, "No filters found for source %s.\n", cmd.SourceName) fmt.Fprintf(ctx.Out, "No filters found for source %s.\n", cmd.SourceName)
return nil return nil
} }
@ -42,10 +51,20 @@ func (cmd *FilterListCmd) Run(ctx *context) error {
t.SetAlignment(table.AlignLeft, table.AlignLeft, table.AlignCenter, table.AlignLeft) t.SetAlignment(table.AlignLeft, table.AlignLeft, table.AlignCenter, table.AlignLeft)
t.SetHeaders("Filter Name", "Kind", "Enabled", "Settings") t.SetHeaders("Filter Name", "Kind", "Enabled", "Settings")
for _, filter := range filters.Filters { for _, filter := range sourceFilters.Filters {
defaultSettings, err := ctx.Client.Filters.GetSourceFilterDefaultSettings(
filters.NewGetSourceFilterDefaultSettingsParams().
WithFilterKind(filter.FilterKind),
)
if err != nil {
return fmt.Errorf("failed to get default settings for filter %s: %w",
filter.FilterName, err)
}
maps.Insert(defaultSettings.DefaultFilterSettings, maps.All(filter.FilterSettings))
var lines []string var lines []string
for k, v := range filter.FilterSettings { for k, v := range defaultSettings.DefaultFilterSettings {
lines = append(lines, fmt.Sprintf("%s %v", k, v)) lines = append(lines, fmt.Sprintf("%s: %v", snakeCaseToTitleCase(k), v))
} }
sort.Slice(lines, func(i, j int) bool { sort.Slice(lines, func(i, j int) bool {
return strings.ToLower(lines[i]) < strings.ToLower(lines[j]) return strings.ToLower(lines[i]) < strings.ToLower(lines[j])

View File

@ -21,6 +21,8 @@ type InputListCmd struct {
Input bool `flag:"" help:"List all inputs." aliases:"i"` Input bool `flag:"" help:"List all inputs." aliases:"i"`
Output bool `flag:"" help:"List all outputs." aliases:"o"` Output bool `flag:"" help:"List all outputs." aliases:"o"`
Colour bool `flag:"" help:"List all colour sources." aliases:"c"` 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. // Run executes the command to list all inputs.
@ -32,22 +34,47 @@ func (cmd *InputListCmd) Run(ctx *context) error {
t := table.New(ctx.Out) t := table.New(ctx.Out)
t.SetPadding(3) t.SetPadding(3)
t.SetAlignment(table.AlignLeft, table.AlignLeft) t.SetAlignment(table.AlignLeft, table.AlignLeft, table.AlignCenter)
t.SetHeaders("Input Name", "Kind") t.SetHeaders("Input Name", "Kind", "Muted")
for _, input := range resp.Inputs { for _, input := range resp.Inputs {
if cmd.Input && strings.Contains(input.InputKind, "input") { var muteMark string
t.AddRow(input.InputName, input.InputKind) for _, kind := range []string{"input", "output", "ffmpeg", "vlc"} {
} if strings.Contains(input.InputKind, kind) {
if cmd.Output && strings.Contains(input.InputKind, "output") { resp, err := ctx.Client.Inputs.GetInputMute(
t.AddRow(input.InputName, input.InputKind) inputs.NewGetInputMuteParams().WithInputName(input.InputName),
} )
if cmd.Colour && strings.Contains(input.InputKind, "color") { // nolint if err != nil {
t.AddRow(input.InputName, input.InputKind) return fmt.Errorf("failed to get input mute state: %w", err)
}
muteMark = getEnabledMark(resp.InputMuted)
break
}
} }
if !cmd.Input && !cmd.Output && !cmd.Colour { type filter struct {
t.AddRow(input.InputName, input.InputKind) 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() t.Render()

View File

@ -71,11 +71,11 @@ func (cmd *SceneItemListCmd) Run(ctx *context) error {
fmt.Sprintf("%d", groupItem.SceneItemID), fmt.Sprintf("%d", groupItem.SceneItemID),
groupItem.SourceName, groupItem.SourceName,
item.SourceName, item.SourceName,
fmt.Sprintf("%t", item.SceneItemEnabled && groupItem.SceneItemEnabled), getEnabledMark(item.SceneItemEnabled && groupItem.SceneItemEnabled),
) )
} }
} else { } else {
t.AddRow(fmt.Sprintf("%d", item.SceneItemID), item.SourceName, "", fmt.Sprintf("%t", item.SceneItemEnabled)) t.AddRow(fmt.Sprintf("%d", item.SceneItemID), item.SourceName, "", getEnabledMark(item.SceneItemEnabled))
} }
} }
t.Render() t.Render()