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"
"os"
"path/filepath"
"slices"
"strings"
"time"
@@ -25,7 +26,6 @@ type FileInfo struct {
Path string
DateTaken *time.Time
Hash string
Size int64
}
func main() {
@@ -68,13 +68,6 @@ func validateDirectories(sourceDir, destDir string) error {
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 не пустая
if strings.TrimSpace(destDir) == "" {
return fmt.Errorf("destination directory cannot be empty")
@@ -139,57 +132,31 @@ func organizePhotos(config Config) error {
}
func isMediaFile(path string) bool {
ext := strings.ToLower(filepath.Ext(path))
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",
".cr2", ".nef", ".arw", ".dng", ".raf", ".orf", ".rw2",
}
for _, mediaExt := range mediaExtensions {
if ext == mediaExt {
return true
}
}
return false
ext := strings.ToLower(filepath.Ext(path))
return slices.Contains(mediaExtensions, ext)
}
func analyzeFile(path string) (*FileInfo, error) {
file, err := os.Open(path)
if err != nil {
hash, err := calculateFileHash(path)
if err == nil {
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)
if dateTaken != nil {
fileInfo.DateTaken = dateTaken
} else {
// Если метаданные не содержат дату, используем дату модификации файла
modTime := stat.ModTime()
fileInfo.DateTaken = &modTime
fileInfo := &FileInfo{
Path: path,
Hash: hash,
DateTaken: dateTaken,
}
return fileInfo, nil
@@ -372,7 +339,9 @@ func calculateFileHash(path string) (string, error) {
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 {