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