Files
wehub-resource-sync 95f0813436
build / build (push) Failing after 0s
nightly / nightly (push) Failing after 0s
build / snapshot (push) Failing after 0s
lint / lint (push) Failing after 1s
chore: import upstream snapshot with attribution
2026-07-13 13:02:37 +08:00

102 lines
2.8 KiB
Go

package main
import (
"fmt"
"os/exec"
"path/filepath"
)
// ScreenshotOptions holds options related with screenshots.
type ScreenshotOptions struct {
// frameCapture holds a flag indicating if screenshots must be taken.
frameCapture bool
// nextScreenshotPath holds the path of new screenshot.
nextScreenshotPath string
// screenshots represents a map holding screenshot path as key and frame as value.
screenshots map[string]int
// Input represents location of cursor and text frames png files.
input string
style *StyleOptions
}
// NewScreenshotOptions returns ScreenshotOptions by given input.
func NewScreenshotOptions(input string, style *StyleOptions) ScreenshotOptions {
return ScreenshotOptions{
frameCapture: false,
nextScreenshotPath: "",
screenshots: make(map[string]int),
input: input,
style: style,
}
}
// makeScreenshot stores in screenshots map the target frame of the screenshot.
// After storing frame it disables frame capture.
func (opts *ScreenshotOptions) makeScreenshot(frame int) {
opts.screenshots[opts.nextScreenshotPath] = frame
opts.frameCapture = false
opts.nextScreenshotPath = ""
}
// captureNextFrame prepares capture of next frame by given path.
func (opts *ScreenshotOptions) enableFrameCapture(path string) {
opts.frameCapture = true
opts.nextScreenshotPath = path
}
// MakeScreenshots generates screenshots by given ScreenshotOptions.
func MakeScreenshots(opts ScreenshotOptions) []*exec.Cmd {
cmds := []*exec.Cmd{} //nolint:prealloc
for path, frame := range opts.screenshots {
cursorStream := filepath.Join(opts.input, fmt.Sprintf(cursorFrameFormat, frame))
textStream := filepath.Join(opts.input, fmt.Sprintf(textFrameFormat, frame))
args := opts.buildFFopts(path, textStream, cursorStream)
cmds = append(cmds, exec.Command(
"ffmpeg",
args...,
))
}
return cmds
}
// buildFFopts assembles an ffmpeg command from some VideoOptions.
func (opts *ScreenshotOptions) buildFFopts(targetFile, textStream, cursorStream string) []string {
var args []string //nolint:prealloc
streamCounter := 2
streamBuilder := NewStreamBuilder(streamCounter, opts.input, opts.style)
// Input frame options, used no matter what
// Stream 0: text frames
// Stream 1: cursor frames
streamBuilder.args = append(streamBuilder.args,
"-y",
"-i", textStream,
"-i", cursorStream,
)
streamBuilder = streamBuilder.
WithMargin().
WithBar().
WithCorner()
filterBuilder := NewScreenshotFilterComplexBuilder(opts.style).
WithWindowBar(streamBuilder.barStream).
WithBorderRadius(streamBuilder.cornerStream).
WithMarginFill(streamBuilder.marginStream)
args = append(args, streamBuilder.Build()...)
args = append(args, filterBuilder.Build()...)
args = append(args, targetFile)
return args
}