dupe-finder/file.go
2023-12-04 22:59:55 +01:00

75 lines
1.2 KiB
Go

package main
import (
"crypto/sha1"
"encoding/base64"
"image/jpeg"
"io"
"os"
"path/filepath"
"strconv"
"strings"
"github.com/corona10/goimagehash"
)
func remove(path string) {
if !*force {
return
}
if *moveToFolder == "" {
os.Remove(path)
return
}
moveButDontOvewrite(path, *moveToFolder)
}
func moveButDontOvewrite(path string, targetPath string) {
num := 0
filename := filepath.Base(path)
target := filepath.Join(targetPath, filename)
for {
_, err := os.Stat(target)
if os.IsNotExist(err) {
os.Rename(path, target)
return
}
target = filepath.Join(targetPath, filename+"."+strconv.Itoa(num))
num++
}
}
func calculateHash(path string) (string, error) {
f, err := os.Open(path)
if err != nil {
return "", err
}
defer f.Close()
if strings.HasSuffix(path, ".jpg") {
img, err := jpeg.Decode(f)
if err != nil {
return "", err
}
hash, err := goimagehash.DifferenceHash(img)
if err != nil {
return "", err
}
return hash.ToString(), nil
}
h := sha1.New()
if _, err := io.Copy(h, f); err != nil {
return "", err
}
return base64.RawStdEncoding.EncodeToString(h.Sum(nil)), nil
}