Compare commits

...

6 Commits

Author SHA1 Message Date
1d590eb788 add 0.10.0 to CHANGELOG 2025-06-04 12:57:32 +01:00
29fe6fedfb add ScreenshotCmd 2025-06-04 12:57:17 +01:00
ee47832cd6 add ScreenshotCmd to README 2025-06-04 12:56:00 +01:00
17b8e53da3 read version from build info if version was not injected at build time (go install)
inject version from tag at build time for local builds
2025-06-03 16:35:19 +01:00
92761ab1b3 upd link to --version 2025-06-03 13:12:22 +01:00
4446784709 add short names for root options
fix flag example in readme
2025-06-03 12:33:37 +01:00
7 changed files with 104 additions and 20 deletions

View File

@@ -5,11 +5,17 @@ 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/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
# [0.10.0]
### Added
- screenshot save command, see [ScreenshotCmd](https://github.com/onyx-and-iris/gobs-cli?tab=readme-ov-file#screenshotcmd)
# [0.9.0]
### Added
- --version/-v option. See [VersionFlag](https://github.com/onyx-and-iris/gobs-cli?tab=readme-ov-file#versionflag)
- --version/-v option. See [Flags](https://github.com/onyx-and-iris/gobs-cli?tab=readme-ov-file#flags)
### Changed

View File

@@ -14,10 +14,16 @@ go install github.com/onyx-and-iris/gobs-cli@latest
#### Flags
Pass `--host`, `--port` and `--password` as flags to the root command, for example:
- --host/-H: Websocket host
- --port/-P Websocket port
- --password/-p: Websocket password
- --timeout/-T: Websocket timeout
- --version/-v: Print the gobs-cli version
Pass `--host`, `--port` and `--password` as flags on the root command, for example:
```console
gobs-cli --host=localhost --port=4455 --password=<websocket password> --help
gobs-cli --host localhost --port 4455 --password 'websocket password' --help
```
#### Environment Variables
@@ -37,14 +43,6 @@ OBS_TIMEOUT=5
## Commands
### VersionFlag
- --version/-v: Print gobs-cli version information and quit
```console
gobs-cli --version
```
### ObsVersionCmd
- Print OBS client and websocket version.
@@ -574,6 +572,25 @@ gobs-cli projector open --monitor-index=1 "test_scene"
gobs-cli projector open --monitor-index=1 "test_group"
```
### ScreenshotCmd
- save: Take a screenshot and save it to a file.
- flags:
*optional*
- --width:
- defaults to 1920
- --height:
- defaults to 1080
- --quality:
- defaults to -1
- args: <source_name> <output_path>
```console
gobs-cli screenshot save --width=2560 --height=1440 "Scene" "C:\Users\me\Videos\screenshot.png"
```
[userconfigdir]: https://pkg.go.dev/os#UserConfigDir
[obs-keyids]: https://github.com/obsproject/obs-studio/blob/master/libobs/obs-hotkeys.h

View File

@@ -7,6 +7,8 @@ vars:
PROGRAM: gobs-cli
SHELL: '{{if eq .OS "Windows_NT"}}powershell{{end}}'
BIN_DIR: bin
VERSION:
sh: 'git describe --tags $(git rev-list --tags --max-count=1)'
tasks:
default:
@@ -35,13 +37,13 @@ tasks:
build-windows:
desc: Build the gobs-cli project for Windows
cmds:
- GOOS=windows GOARCH=amd64 go build -ldflags "-X 'main.version=debug'" -o {{.BIN_DIR}}/{{.PROGRAM}}_windows_amd64.exe
- GOOS=windows GOARCH=amd64 go build -ldflags "-X 'main.version={{.VERSION}}'" -o {{.BIN_DIR}}/{{.PROGRAM}}_windows_amd64.exe
internal: true
build-linux:
desc: Build the gobs-cli project for Linux
cmds:
- GOOS=linux GOARCH=amd64 go build -ldflags "-X 'main.version=debug'" -o {{.BIN_DIR}}/{{.PROGRAM}}_linux_amd64
- GOOS=linux GOARCH=amd64 go build -ldflags "-X 'main.version={{.VERSION}}'" -o {{.BIN_DIR}}/{{.PROGRAM}}_linux_amd64
internal: true
test:

View File

@@ -18,10 +18,10 @@ import (
// ObsConfig holds the configuration for connecting to the OBS WebSocket server.
type ObsConfig struct {
Host string `flag:"host" help:"Host to connect to." default:"localhost" env:"OBS_HOST"`
Port int `flag:"port" help:"Port to connect to." default:"4455" env:"OBS_PORT"`
Password string `flag:"password" help:"Password for authentication." default:"" env:"OBS_PASSWORD"`
Timeout int `flag:"timeout" help:"Timeout in seconds." default:"5" env:"OBS_TIMEOUT"`
Host string `flag:"host" help:"Host to connect to." default:"localhost" env:"OBS_HOST" short:"H"`
Port int `flag:"port" help:"Port to connect to." default:"4455" env:"OBS_PORT" short:"P"`
Password string `flag:"password" help:"Password for authentication." default:"" env:"OBS_PASSWORD" short:"p"`
Timeout int `flag:"timeout" help:"Timeout in seconds." default:"5" env:"OBS_TIMEOUT" short:"T"`
}
// CLI is the main command line interface structure.
@@ -47,6 +47,7 @@ type CLI struct {
Hotkey HotkeyCmd `help:"Manage hotkeys." cmd:"" aliases:"hk"`
Filter FilterCmd `help:"Manage filters." cmd:"" aliases:"f"`
Projector ProjectorCmd `help:"Manage projectors." cmd:"" aliases:"prj"`
Screenshot ScreenshotCmd `help:"Take screenshots." cmd:"" aliases:"ss"`
}
type context struct {

41
screenshot.go Normal file
View File

@@ -0,0 +1,41 @@
package main
import (
"fmt"
"path/filepath"
"github.com/andreykaipov/goobs/api/requests/sources"
)
// ScreenshotCmd provides commands to manage screenshots in OBS Studio.
type ScreenshotCmd struct {
Save ScreenshotSaveCmd `cmd:"" help:"Take a screenshot and save it to a file." aliases:"sv"`
}
// ScreenshotSaveCmd represents the command to save a screenshot of a source in OBS.
type ScreenshotSaveCmd struct {
SourceName string `arg:"" help:"Name of the source to take a screenshot of."`
FilePath string `arg:"" help:"Path to the file where the screenshot will be saved."`
Width float64 ` help:"Width of the screenshot in pixels." flag:"" default:"1920"`
Height float64 ` help:"Height of the screenshot in pixels." flag:"" default:"1080"`
Quality float64 ` help:"Quality of the screenshot (1-100)." flag:"" default:"-1"`
}
// Run executes the command to take a screenshot and save it to a file.
func (cmd *ScreenshotSaveCmd) Run(ctx *context) error {
_, err := ctx.Client.Sources.SaveSourceScreenshot(
sources.NewSaveSourceScreenshotParams().
WithSourceName(cmd.SourceName).
WithImageFormat(trimPrefix(filepath.Ext(cmd.FilePath), ".")).
WithImageFilePath(cmd.FilePath).
WithImageWidth(cmd.Width).
WithImageHeight(cmd.Height).
WithImageCompressionQuality(cmd.Quality),
)
if err != nil {
return fmt.Errorf("failed to take screenshot: %w", err)
}
fmt.Fprintf(ctx.Out, "Screenshot saved to %s.\n", cmd.FilePath)
return nil
}

View File

@@ -20,3 +20,10 @@ func getEnabledMark(enabled bool) string {
}
return "\u274c" // red cross mark
}
func trimPrefix(s, prefix string) string {
if strings.HasPrefix(s, prefix) {
return s[len(prefix):]
}
return s
}

View File

@@ -2,11 +2,13 @@ package main
import (
"fmt"
"runtime/debug"
"strings"
"github.com/alecthomas/kong"
)
var version = "unknown"
var version string
// VersionFlag is a custom flag type for displaying version information.
type VersionFlag string
@@ -18,8 +20,16 @@ func (v VersionFlag) Decode(_ *kong.DecodeContext) error { return nil }
func (v VersionFlag) IsBool() bool { return true }
// BeforeApply implements the kong.Flag interface for VersionFlag.
func (v VersionFlag) BeforeApply(app *kong.Kong, _ kong.Vars) error {
fmt.Println(version)
func (v VersionFlag) BeforeApply(app *kong.Kong, _ kong.Vars) error { // nolint: unparam
if version == "" {
info, ok := debug.ReadBuildInfo()
if !ok {
return fmt.Errorf("failed to read build info")
}
version = strings.Split(info.Main.Version, "-")[0]
}
fmt.Printf("gobs-cli version: %s\n", version)
app.Exit(0) // Exit the application after printing the version
return nil
}