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 {
|
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) {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue