check for movement every 1s apart

master
Bel LaPointe 2024-09-18 11:12:11 -04:00
parent 9a4abb407a
commit 9a09eb7c10
2 changed files with 49 additions and 12 deletions

View File

@ -14,6 +14,7 @@ import (
"strconv"
"strings"
"syscall"
"time"
)
func main() {
@ -57,18 +58,7 @@ func Run(ctx context.Context, args []string) error {
seriesFiles = append(seriesFiles, file)
}
}
if seriesHasMovement, err := func() (bool, error) {
for i := 1; i < len(files); i++ {
f := files[i-1]
g := files[i]
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)
} else if hasMovement {
return true, nil
}
}
return false, nil
}(); err != nil {
if seriesHasMovement, err := seriesHasMovement(ctx, seriesFiles); err != nil {
return err
} else if seriesHasMovement {
for _, seriesFile := range seriesFiles {
@ -92,6 +82,41 @@ func Run(ctx context.Context, args []string) error {
return nil
}
func seriesHasMovement(ctx context.Context, files []string) (bool, error) {
if len(files) < 1 {
return false, nil
}
f := files[0]
fStat, err := os.Stat(f)
if err != nil {
return false, err
}
fTime := fStat.ModTime()
for i := 1; i < len(files); i++ {
g := files[i]
gStat, err := os.Stat(g)
if err != nil {
return false, err
}
gTime := gStat.ModTime()
if gTime.Sub(fTime) < time.Second {
continue
}
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)
} else if hasMovement {
return true, nil
}
f = g
fTime = gTime
}
return false, nil
}
func hasMovement(ctx context.Context, a, b string) (bool, error) {
sizeOfCmd := exec.CommandContext(ctx, "identify", a)
sizeOfOutput, err := sizeOfCmd.CombinedOutput()

View File

@ -6,6 +6,7 @@ import (
"os"
"path"
"testing"
"time"
)
func TestRun(t *testing.T) {
@ -23,16 +24,27 @@ func TestRun(t *testing.T) {
t.Fatal(err)
}
now := time.Now()
if err := os.WriteFile(path.Join(d, "series.0.jpg"), a, os.ModePerm); err != nil {
t.Fatal(err)
} else if err := os.Chtimes(path.Join(d, "series.0.jpg"), now, now.Add(-4000*time.Millisecond)); err != nil {
t.Fatal(err)
} else if err := os.WriteFile(path.Join(d, "series.1.jpg"), a, os.ModePerm); err != nil {
t.Fatal(err)
} else if err := os.Chtimes(path.Join(d, "series.1.jpg"), now, now.Add(-3500*time.Millisecond)); err != nil {
t.Fatal(err)
} else if err := os.WriteFile(path.Join(d, "series.2.jpg"), b, os.ModePerm); err != nil {
t.Fatal(err)
} else if err := os.Chtimes(path.Join(d, "series.2.jpg"), now, now.Add(-3000*time.Millisecond)); err != nil {
t.Fatal(err)
} else if err := os.WriteFile(path.Join(d, "series.3.jpg"), b, os.ModePerm); err != nil {
t.Fatal(err)
} else if err := os.Chtimes(path.Join(d, "series.3.jpg"), now, now.Add(-2500*time.Millisecond)); err != nil {
t.Fatal(err)
} else if err := os.WriteFile(path.Join(d, "zlast.0.jpg"), b, os.ModePerm); err != nil {
t.Fatal(err)
} else if err := os.Chtimes(path.Join(d, "zlast.0.jpg"), now, now.Add(-2000*time.Millisecond)); err != nil {
t.Fatal(err)
}
if err := Run(context.Background(), []string{path.Dir(d)}); err != nil {