Extend media formats, simplify code

This commit is contained in:
2025-07-23 16:35:02 +03:00
parent fe5c4788b6
commit 9c8072c08c

63
main.go
View File

@@ -8,6 +8,7 @@ import (
"log" "log"
"os" "os"
"path/filepath" "path/filepath"
"slices"
"strings" "strings"
"time" "time"
@@ -25,7 +26,6 @@ type FileInfo struct {
Path string Path string
DateTaken *time.Time DateTaken *time.Time
Hash string Hash string
Size int64
} }
func main() { func main() {
@@ -68,13 +68,6 @@ func validateDirectories(sourceDir, destDir string) error {
return fmt.Errorf("source path is not a directory: %s", sourceDir) return fmt.Errorf("source path is not a directory: %s", sourceDir)
} }
// Проверяем доступ на чтение
sourceFile, err := os.Open(sourceDir)
if err != nil {
return fmt.Errorf("cannot read source directory: %v", err)
}
sourceFile.Close()
// Проверяем, что destDir не пустая // Проверяем, что destDir не пустая
if strings.TrimSpace(destDir) == "" { if strings.TrimSpace(destDir) == "" {
return fmt.Errorf("destination directory cannot be empty") return fmt.Errorf("destination directory cannot be empty")
@@ -139,57 +132,31 @@ func organizePhotos(config Config) error {
} }
func isMediaFile(path string) bool { func isMediaFile(path string) bool {
ext := strings.ToLower(filepath.Ext(path))
mediaExtensions := []string{ mediaExtensions := []string{
".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".tif", ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".tif", ".webp",
".heif", ".heifs", ".heic", ".heics", ".avci", ".avcs", ".hif",
".mp4", ".avi", ".mov", ".mkv", ".wmv", ".flv", ".webm", ".mp4", ".avi", ".mov", ".mkv", ".wmv", ".flv", ".webm",
".cr2", ".nef", ".arw", ".dng", ".raf", ".orf", ".rw2", ".cr2", ".nef", ".arw", ".dng", ".raf", ".orf", ".rw2",
} }
for _, mediaExt := range mediaExtensions { ext := strings.ToLower(filepath.Ext(path))
if ext == mediaExt {
return true return slices.Contains(mediaExtensions, ext)
}
}
return false
} }
func analyzeFile(path string) (*FileInfo, error) { func analyzeFile(path string) (*FileInfo, error) {
file, err := os.Open(path) hash, err := calculateFileHash(path)
if err != nil { if err == nil {
return nil, err return nil, err
} }
defer file.Close()
stat, err := file.Stat()
if err != nil {
return nil, err
}
// Вычисляем хеш файла
hasher := sha256.New()
if _, err := io.Copy(hasher, file); err != nil {
return nil, err
}
hash := fmt.Sprintf("%x", hasher.Sum(nil))
// Сбрасываем указатель файла для чтения EXIF
file.Seek(0, 0)
fileInfo := &FileInfo{
Path: path,
Hash: hash,
Size: stat.Size(),
}
// Пытаемся извлечь дату из метаданных // Пытаемся извлечь дату из метаданных
dateTaken := extractDateFromMetadata(path) dateTaken := extractDateFromMetadata(path)
if dateTaken != nil {
fileInfo.DateTaken = dateTaken fileInfo := &FileInfo{
} else { Path: path,
// Если метаданные не содержат дату, используем дату модификации файла Hash: hash,
modTime := stat.ModTime() DateTaken: dateTaken,
fileInfo.DateTaken = &modTime
} }
return fileInfo, nil return fileInfo, nil
@@ -372,7 +339,9 @@ func calculateFileHash(path string) (string, error) {
return "", err return "", err
} }
return fmt.Sprintf("%x", hasher.Sum(nil)), nil hash := fmt.Sprintf("%x", hasher.Sum(nil))
return hash, nil
} }
func moveFile(fileInfo *FileInfo, destPath string) error { func moveFile(fileInfo *FileInfo, destPath string) error {