mirror of
https://github.com/YspCoder/clawgo.git
synced 2026-04-29 06:57:31 +08:00
Initial commit for ClawGo
This commit is contained in:
71
pkg/tools/camera.go
Normal file
71
pkg/tools/camera.go
Normal file
@@ -0,0 +1,71 @@
|
||||
package tools
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"time"
|
||||
)
|
||||
|
||||
type CameraTool struct {
|
||||
workspace string
|
||||
}
|
||||
|
||||
func NewCameraTool(workspace string) *CameraTool {
|
||||
return &CameraTool{
|
||||
workspace: workspace,
|
||||
}
|
||||
}
|
||||
|
||||
func (t *CameraTool) Name() string {
|
||||
return "camera_snap"
|
||||
}
|
||||
|
||||
func (t *CameraTool) Description() string {
|
||||
return "Take a photo using the system camera (/dev/video0) and save to workspace."
|
||||
}
|
||||
|
||||
func (t *CameraTool) Parameters() map[string]interface{} {
|
||||
return map[string]interface{}{
|
||||
"type": "object",
|
||||
"properties": map[string]interface{}{
|
||||
"filename": map[string]interface{}{
|
||||
"type": "string",
|
||||
"description": "Optional filename (default: snap_TIMESTAMP.jpg)",
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (t *CameraTool) Execute(ctx context.Context, args map[string]interface{}) (string, error) {
|
||||
filename := ""
|
||||
if v, ok := args["filename"].(string); ok && v != "" {
|
||||
filename = v
|
||||
} else {
|
||||
filename = fmt.Sprintf("snap_%d.jpg", time.Now().Unix())
|
||||
}
|
||||
|
||||
// Ensure filename is safe and within workspace
|
||||
filename = filepath.Clean(filename)
|
||||
if filepath.IsAbs(filename) {
|
||||
return "", fmt.Errorf("filename must be relative to workspace")
|
||||
}
|
||||
|
||||
outputPath := filepath.Join(t.workspace, filename)
|
||||
|
||||
// Check if video device exists
|
||||
if _, err := os.Stat("/dev/video0"); os.IsNotExist(err) {
|
||||
return "", fmt.Errorf("camera device /dev/video0 not found")
|
||||
}
|
||||
|
||||
// ffmpeg -y -f video4linux2 -i /dev/video0 -vframes 1 -q:v 2 output.jpg
|
||||
cmd := exec.CommandContext(ctx, "ffmpeg", "-y", "-f", "video4linux2", "-i", "/dev/video0", "-vframes", "1", "-q:v", "2", outputPath)
|
||||
output, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
return fmt.Sprintf("Error taking photo: %v\nOutput: %s", err, string(output)), nil
|
||||
}
|
||||
|
||||
return fmt.Sprintf("Photo saved to %s", filename), nil
|
||||
}
|
||||
Reference in New Issue
Block a user