diff --git a/main.go b/main.go index 648b002..fa0d927 100644 --- a/main.go +++ b/main.go @@ -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 {