97 lines
1.8 KiB
Go
97 lines
1.8 KiB
Go
package tasks
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"io/fs"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/rwcarlsen/goexif/exif"
|
|
)
|
|
|
|
type ImageSortTask struct{}
|
|
|
|
func (t *ImageSortTask) Run(folderPath string) error {
|
|
return filepath.WalkDir(folderPath, func(path string, d fs.DirEntry, err error) error {
|
|
return visit(folderPath, path, d, err)
|
|
})
|
|
}
|
|
|
|
func visit(basePath, path string, di fs.DirEntry, err1 error) error {
|
|
fmt.Printf("Visited: %s\n", path)
|
|
|
|
if di.IsDir() {
|
|
if path == basePath {
|
|
return nil
|
|
}
|
|
return fs.SkipDir
|
|
}
|
|
f, err := os.Open(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
x, err := exif.Decode(f)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
dateTag, err := x.Get(exif.DateTime)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
dateVal, err := dateTag.StringVal()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if dateVal == "0000:00:00 00:00:00" {
|
|
return nil
|
|
}
|
|
date, err := time.Parse("2006:01:02 15:04:05", dateVal)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
f.Close()
|
|
|
|
newFolderName := fmt.Sprintf("%04d.%02d", date.Year(), date.Month())
|
|
|
|
if err := os.MkdirAll(filepath.Join(basePath, newFolderName), os.ModePerm); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := os.Rename(path, filepath.Join(basePath, newFolderName, filepath.Base(path))); err != nil {
|
|
return err
|
|
}
|
|
//copy(path, filepath.Join(basePath, newFolderName, filepath.Base(path)))
|
|
|
|
return nil
|
|
}
|
|
|
|
func copy(src, dst string) (int64, error) {
|
|
sourceFileStat, err := os.Stat(src)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
if !sourceFileStat.Mode().IsRegular() {
|
|
return 0, fmt.Errorf("%s is not a regular file", src)
|
|
}
|
|
|
|
source, err := os.Open(src)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
defer source.Close()
|
|
|
|
destination, err := os.Create(dst)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
defer destination.Close()
|
|
nBytes, err := io.Copy(destination, source)
|
|
return nBytes, err
|
|
}
|