prune also stashes the first jpg with movement as movement/cam/series.jpg

master
Bel LaPointe 2024-09-19 12:36:26 -04:00
parent 6a8445fbd0
commit 9bda977a29
2 changed files with 22 additions and 12 deletions

View File

@ -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) {

View File

@ -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)
}