Files
photoprism/internal/commands/vision_reset.go
2025-10-01 08:52:28 +02:00

86 lines
2.3 KiB
Go

package commands
import (
"fmt"
"slices"
"strings"
"github.com/manifoldco/promptui"
"github.com/urfave/cli/v2"
"github.com/photoprism/photoprism/internal/ai/vision"
"github.com/photoprism/photoprism/internal/config"
"github.com/photoprism/photoprism/internal/workers"
"github.com/photoprism/photoprism/pkg/txt"
)
// VisionResetCommand configures the command name, flags, and action.
var VisionResetCommand = &cli.Command{
Name: "reset",
Usage: "Resets data generated by computer vision models for pictures that match the specified search filters",
ArgsUsage: "[filter]...",
Flags: []cli.Flag{
&cli.StringFlag{
Name: "models",
Aliases: []string{"m"},
Usage: "computer vision `MODELS` to reset, e.g. caption or labels",
Value: "",
},
PicturesCountFlag(),
VisionSourceFlag(vision.DefaultSrc),
&cli.BoolFlag{
Name: "yes",
Aliases: []string{"y"},
Usage: "runs the command non-interactively",
},
},
Action: visionResetAction,
}
func visionResetAction(ctx *cli.Context) error {
return CallWithDependencies(ctx, func(conf *config.Config) error {
models := vision.ParseModelTypes(ctx.String("models"))
resetCaptions := slices.Contains(models, vision.ModelTypeCaption)
resetLabels := slices.Contains(models, vision.ModelTypeLabels)
if !resetCaptions && !resetLabels {
log.Warn("vision: no resettable models were specified, nothing to reset")
return nil
}
selectedModels := make([]string, 0, 2)
if resetCaptions {
selectedModels = append(selectedModels, vision.ModelTypeCaption)
}
if resetLabels {
selectedModels = append(selectedModels, vision.ModelTypeLabels)
}
confirmed := RunNonInteractively(ctx.Bool("yes"))
if !confirmed && len(selectedModels) > 0 {
label := fmt.Sprintf("Reset generated %s for matching pictures?", txt.JoinAnd(selectedModels))
prompt := promptui.Prompt{Label: label, IsConfirm: true}
if _, err := prompt.Run(); err != nil {
return nil
}
}
worker := workers.NewVision(conf)
filter := strings.TrimSpace(strings.Join(ctx.Args().Slice(), " "))
source, err := sanitizeVisionSource(ctx.String("source"))
if err != nil {
return cli.Exit(err.Error(), 1)
}
return worker.Reset(
filter,
ctx.Int("count"),
selectedModels,
string(source),
)
})
}