Extend media formats, simplify code
This commit is contained in:
63
main.go
63
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 {
|
||||
|
Reference in New Issue
Block a user