From 9a09eb7c109c2e71b4e4a3009b5e283eae0daffb Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:12:11 -0400 Subject: [PATCH] check for movement every 1s apart --- testdata/ffmpeg.d/cmd/prune/main.go | 49 ++++++++++++++++++------ testdata/ffmpeg.d/cmd/prune/main_test.go | 12 ++++++ 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/testdata/ffmpeg.d/cmd/prune/main.go b/testdata/ffmpeg.d/cmd/prune/main.go index bf28185..bea5273 100644 --- a/testdata/ffmpeg.d/cmd/prune/main.go +++ b/testdata/ffmpeg.d/cmd/prune/main.go @@ -14,6 +14,7 @@ import ( "strconv" "strings" "syscall" + "time" ) func main() { @@ -57,18 +58,7 @@ func Run(ctx context.Context, args []string) error { seriesFiles = append(seriesFiles, file) } } - if seriesHasMovement, err := func() (bool, error) { - for i := 1; i < len(files); i++ { - f := files[i-1] - g := files[i] - if hasMovement, err := hasMovement(ctx, f, g); err != nil { - return false, fmt.Errorf("failed to check for movement between %s and %s: %w", f, g, err) - } else if hasMovement { - return true, nil - } - } - return false, nil - }(); err != nil { + if seriesHasMovement, err := seriesHasMovement(ctx, seriesFiles); err != nil { return err } else if seriesHasMovement { for _, seriesFile := range seriesFiles { @@ -92,6 +82,41 @@ func Run(ctx context.Context, args []string) error { return nil } +func seriesHasMovement(ctx context.Context, files []string) (bool, error) { + if len(files) < 1 { + return false, nil + } + + f := files[0] + fStat, err := os.Stat(f) + if err != nil { + return false, err + } + fTime := fStat.ModTime() + for i := 1; i < len(files); i++ { + g := files[i] + gStat, err := os.Stat(g) + if err != nil { + return false, err + } + gTime := gStat.ModTime() + + if gTime.Sub(fTime) < time.Second { + continue + } + + if hasMovement, err := hasMovement(ctx, f, g); err != nil { + return false, fmt.Errorf("failed to check for movement between %s and %s: %w", f, g, err) + } else if hasMovement { + return true, nil + } + + f = g + fTime = gTime + } + return false, nil +} + func hasMovement(ctx context.Context, a, b string) (bool, error) { sizeOfCmd := exec.CommandContext(ctx, "identify", a) sizeOfOutput, err := sizeOfCmd.CombinedOutput() diff --git a/testdata/ffmpeg.d/cmd/prune/main_test.go b/testdata/ffmpeg.d/cmd/prune/main_test.go index 59ddbf5..02c3afe 100644 --- a/testdata/ffmpeg.d/cmd/prune/main_test.go +++ b/testdata/ffmpeg.d/cmd/prune/main_test.go @@ -6,6 +6,7 @@ import ( "os" "path" "testing" + "time" ) func TestRun(t *testing.T) { @@ -23,16 +24,27 @@ func TestRun(t *testing.T) { t.Fatal(err) } + now := time.Now() if err := os.WriteFile(path.Join(d, "series.0.jpg"), a, os.ModePerm); err != nil { t.Fatal(err) + } else if err := os.Chtimes(path.Join(d, "series.0.jpg"), now, now.Add(-4000*time.Millisecond)); err != nil { + t.Fatal(err) } else if err := os.WriteFile(path.Join(d, "series.1.jpg"), a, os.ModePerm); err != nil { t.Fatal(err) + } else if err := os.Chtimes(path.Join(d, "series.1.jpg"), now, now.Add(-3500*time.Millisecond)); err != nil { + t.Fatal(err) } else if err := os.WriteFile(path.Join(d, "series.2.jpg"), b, os.ModePerm); err != nil { t.Fatal(err) + } else if err := os.Chtimes(path.Join(d, "series.2.jpg"), now, now.Add(-3000*time.Millisecond)); err != nil { + t.Fatal(err) } else if err := os.WriteFile(path.Join(d, "series.3.jpg"), b, os.ModePerm); err != nil { t.Fatal(err) + } else if err := os.Chtimes(path.Join(d, "series.3.jpg"), now, now.Add(-2500*time.Millisecond)); err != nil { + t.Fatal(err) } else if err := os.WriteFile(path.Join(d, "zlast.0.jpg"), b, os.ModePerm); err != nil { t.Fatal(err) + } else if err := os.Chtimes(path.Join(d, "zlast.0.jpg"), now, now.Add(-2000*time.Millisecond)); err != nil { + t.Fatal(err) } if err := Run(context.Background(), []string{path.Dir(d)}); err != nil {