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 { if seriesHasMovement, err := seriesHasMovement(ctx, seriesFiles, movementInterval); err != nil {
return err 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]) firstFileInfo, err := os.Stat(seriesFiles[0])
if err != nil { if err != nil {
return err 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") 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, cmd := exec.CommandContext(ctx,
"ffmpeg", "ffmpeg",
"-y", "-y",
@ -154,15 +162,15 @@ func Run(ctx context.Context, args []string) error {
return nil 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 { if len(files) < 1 {
return false, nil return -1, nil
} }
f := files[0] f := files[0]
fStat, err := os.Stat(f) fStat, err := os.Stat(f)
if err != nil { if err != nil {
return false, err return -1, err
} }
fTime := fStat.ModTime() fTime := fStat.ModTime()
@ -170,7 +178,7 @@ func seriesHasMovement(ctx context.Context, files []string, movementInterval tim
g := files[i] g := files[i]
gStat, err := os.Stat(g) gStat, err := os.Stat(g)
if err != nil { if err != nil {
return false, err return -1, err
} }
gTime := gStat.ModTime() 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 { 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 { } else if hasMovement {
return true, nil return i, nil
} }
f = g f = g
fTime = gTime fTime = gTime
} }
return false, nil return -1, nil
} }
func hasMovement(ctx context.Context, a, b string) (bool, error) { 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 { if results, err := lsf(path.Join(path.Dir(d), "movement")); err != nil {
t.Fatal("failed to lsf for results:", err) t.Fatal("failed to lsf for results:", err)
} else if len(results) != 1 { } else if len(results) != 2 {
t.Fatal(results) 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) t.Fatal(results)
} }