check for movement every 1s apart
parent
9a4abb407a
commit
9a09eb7c10
|
|
@ -14,6 +14,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
@ -57,18 +58,7 @@ func Run(ctx context.Context, args []string) error {
|
||||||
seriesFiles = append(seriesFiles, file)
|
seriesFiles = append(seriesFiles, file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if seriesHasMovement, err := func() (bool, error) {
|
if seriesHasMovement, err := seriesHasMovement(ctx, seriesFiles); err != nil {
|
||||||
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 {
|
|
||||||
return err
|
return err
|
||||||
} else if seriesHasMovement {
|
} else if seriesHasMovement {
|
||||||
for _, seriesFile := range seriesFiles {
|
for _, seriesFile := range seriesFiles {
|
||||||
|
|
@ -92,6 +82,41 @@ func Run(ctx context.Context, args []string) error {
|
||||||
return nil
|
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) {
|
func hasMovement(ctx context.Context, a, b string) (bool, error) {
|
||||||
sizeOfCmd := exec.CommandContext(ctx, "identify", a)
|
sizeOfCmd := exec.CommandContext(ctx, "identify", a)
|
||||||
sizeOfOutput, err := sizeOfCmd.CombinedOutput()
|
sizeOfOutput, err := sizeOfCmd.CombinedOutput()
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestRun(t *testing.T) {
|
func TestRun(t *testing.T) {
|
||||||
|
|
@ -23,16 +24,27 @@ func TestRun(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
now := time.Now()
|
||||||
if err := os.WriteFile(path.Join(d, "series.0.jpg"), a, os.ModePerm); err != nil {
|
if err := os.WriteFile(path.Join(d, "series.0.jpg"), a, os.ModePerm); err != nil {
|
||||||
t.Fatal(err)
|
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 {
|
} else if err := os.WriteFile(path.Join(d, "series.1.jpg"), a, os.ModePerm); err != nil {
|
||||||
t.Fatal(err)
|
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 {
|
} else if err := os.WriteFile(path.Join(d, "series.2.jpg"), b, os.ModePerm); err != nil {
|
||||||
t.Fatal(err)
|
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 {
|
} else if err := os.WriteFile(path.Join(d, "series.3.jpg"), b, os.ModePerm); err != nil {
|
||||||
t.Fatal(err)
|
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 {
|
} else if err := os.WriteFile(path.Join(d, "zlast.0.jpg"), b, os.ModePerm); err != nil {
|
||||||
t.Fatal(err)
|
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 {
|
if err := Run(context.Background(), []string{path.Dir(d)}); err != nil {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue