diff --git a/cmd/prune/main.go b/cmd/prune/main.go index 97f1d6b..6a3f63a 100644 --- a/cmd/prune/main.go +++ b/cmd/prune/main.go @@ -68,7 +68,17 @@ func Run(ctx context.Context, args []string) error { } if seriesHasMovement, err := seriesHasMovement(ctx, seriesFiles, movementInterval); err != nil { return err - } else if seriesHasMovement { + } else if seriesHasMovement > -1 { + outd := strings.ReplaceAll(cam, "record", "movement") + os.MkdirAll(outd, os.ModePerm) + + fileWithMovement := seriesFiles[seriesHasMovement] + if b, err := os.ReadFile(fileWithMovement); err != nil { + return err + } else if err := os.WriteFile(path.Join(outd, series+path.Ext(fileWithMovement)), b, os.ModePerm); err != nil { + return err + } + firstFileInfo, err := os.Stat(seriesFiles[0]) if err != nil { return err @@ -83,8 +93,6 @@ func Run(ctx context.Context, args []string) error { log.Println("found movement in", series, "over", durationSeconds, "seconds at", fps, "fps") - outd := strings.ReplaceAll(cam, "record", "movement") - os.MkdirAll(outd, os.ModePerm) cmd := exec.CommandContext(ctx, "ffmpeg", "-y", @@ -154,15 +162,15 @@ func Run(ctx context.Context, args []string) error { return nil } -func seriesHasMovement(ctx context.Context, files []string, movementInterval time.Duration) (bool, error) { +func seriesHasMovement(ctx context.Context, files []string, movementInterval time.Duration) (int, error) { if len(files) < 1 { - return false, nil + return -1, nil } f := files[0] fStat, err := os.Stat(f) if err != nil { - return false, err + return -1, err } fTime := fStat.ModTime() @@ -170,7 +178,7 @@ func seriesHasMovement(ctx context.Context, files []string, movementInterval tim g := files[i] gStat, err := os.Stat(g) if err != nil { - return false, err + return -1, err } gTime := gStat.ModTime() @@ -179,15 +187,15 @@ func seriesHasMovement(ctx context.Context, files []string, movementInterval tim } 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) + return -1, fmt.Errorf("failed to check for movement between %s and %s: %w", f, g, err) } else if hasMovement { - return true, nil + return i, nil } f = g fTime = gTime } - return false, nil + return -1, nil } func hasMovement(ctx context.Context, a, b string) (bool, error) { diff --git a/cmd/prune/main_test.go b/cmd/prune/main_test.go index a834275..3265446 100644 --- a/cmd/prune/main_test.go +++ b/cmd/prune/main_test.go @@ -57,9 +57,11 @@ func TestRun(t *testing.T) { if results, err := lsf(path.Join(path.Dir(d), "movement")); err != nil { t.Fatal("failed to lsf for results:", err) - } else if len(results) != 1 { + } else if len(results) != 2 { t.Fatal(results) - } else if path.Base(results[0]) != seriesA+".mp4" { + } else if path.Base(results[0]) != seriesA+".jpg" { + t.Fatal(results) + } else if path.Base(results[1]) != seriesA+".mp4" { t.Fatal(results) }