prune also stashes the first jpg with movement as movement/cam/series.jpg
parent
6a8445fbd0
commit
9bda977a29
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue