From d0d34beb44d5dad2b2b28961ed5780d59e24e1d2 Mon Sep 17 00:00:00 2001 From: Daniel Schubert Date: Sun, 6 Sep 2026 03:48:12 +0200 Subject: [PATCH] first working version --- convertVideo.go | 37 ++++++++++++++++++++ main.go | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ optimizeImage.go | 27 +++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 convertVideo.go create mode 100644 main.go create mode 100644 optimizeImage.go diff --git a/convertVideo.go b/convertVideo.go new file mode 100644 index 0000000..ab0a1e1 --- /dev/null +++ b/convertVideo.go @@ -0,0 +1,37 @@ +package main + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" +) + +func ConvertVideo(path string) { + out := path[:len(path)-len(filepath.Ext(path))] + ".mp4" + + cmd := exec.Command("ffmpeg", + "-i", "input.mp4", + "-c:v", "libx264", + "-crf", "23", + "-preset", "medium", + "-c:a", "aac", + "-b:a", "128k", + out, + ) + + cmd.Stderr = cmd.Stdout + + _, err := cmd.CombinedOutput() + + if err != nil { + fmt.Printf("Error converting %s: %v\n", path, err) + return + } + + if err := os.Remove(path); err != nil { + fmt.Printf("Converted %s -> %s, but failed to delete original: %v\n", path, out, err) + return + } + fmt.Printf("Converted %s -> %s (original deleted)\n", path, out) +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..c9bda0b --- /dev/null +++ b/main.go @@ -0,0 +1,88 @@ +package main + +import ( + "fmt" + "io/fs" + "log" + "os" + "path/filepath" + "strings" + "sync" +) + +const touchedFile = ".touched" + +var touched = loadTouched() + +var wg sync.WaitGroup + +var imageExts = map[string]bool{ + ".jpeg": true, + ".jpg": true, + ".png": true, + ".gif": true, + ".bmp": true, + ".tiff": true, + ".tif": true, + ".webp": true, +} + +func main() { + err := filepath.WalkDir(".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() { + return nil + } + + ext := strings.ToLower(filepath.Ext(path)) + switch { + case ext == ".mov": + wg.Go(func() { + ConvertVideo(path) + }) + case imageExts[ext]: + if touched[path] { + fmt.Printf("Skipping %s (already touched)\n", path) + return nil + } + wg.Go(func() { OptimizeImage(path) }) + } + return nil + }) + + wg.Wait() + + if err != nil { + log.Fatal(err) + } +} + +func loadTouched() map[string]bool { + set := map[string]bool{} + data, err := os.ReadFile(touchedFile) + if err != nil { + return set + } + for _, line := range strings.Split(string(data), "\n") { + line = strings.TrimSpace(line) + if line != "" && !set[line] { + set[line] = true + } + } + return set +} + +func markTouched(path string) { + f, err := os.OpenFile(touchedFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + fmt.Printf("Error updating %s: %v\n", touchedFile, err) + return + } + defer f.Close() + + if _, err := fmt.Fprintln(f, path); err == nil { + touched[path] = true + } +} diff --git a/optimizeImage.go b/optimizeImage.go new file mode 100644 index 0000000..88d0cec --- /dev/null +++ b/optimizeImage.go @@ -0,0 +1,27 @@ +package main + +import ( + "fmt" + "os/exec" +) + +func OptimizeImage(path string) { + + fmt.Println("optiimg") + cmd := exec.Command("mogrify", + "-strip", + "-interlace", "Plane", + "-sampling-factor", "4:2:0", + "-resize", "5000x3000", + "-quality", "80%", + path, + ) + + out, err := cmd.CombinedOutput() + if err != nil { + fmt.Printf("Error optimizing %s: %v\n%s", path, err, out) + } else { + markTouched(path) + fmt.Printf("Optimized %s\n", path) + } +}