99 lines
3.1 KiB
Go
99 lines
3.1 KiB
Go
package app
|
|
|
|
import (
|
|
"git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/localFileStructure"
|
|
"git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/piwigo"
|
|
"github.com/sirupsen/logrus"
|
|
"sort"
|
|
)
|
|
|
|
func synchronizeImages(context *appContext, fileSystem map[string]*localFileStructure.FilesystemNode, existingCategories map[string]*piwigo.PiwigoCategory) error {
|
|
|
|
// to make use of the new local data store, we have to rethink and refactor the whole local detection process
|
|
|
|
// extend the storage of the images to keep track of upload state
|
|
|
|
// TBD: How to deal with updates -> delete / upload all based on md5 sums
|
|
|
|
// STEP 1 - update and sync local datastore with filesystem
|
|
// - walk through all files of the fileSystem map
|
|
// - get file metadata from filesystem (date, filename, dir, modtime etc.)
|
|
// - recalculate md5 sum if file changed referring to the stored record (reduces load after first calculation a lot)
|
|
// - mark metadata as upload required if changed or new
|
|
|
|
// STEP 2 - get file states from piwigo (pwg.images.checkFiles)
|
|
// - get upload status of md5 sum from piwigo for all marked to upload
|
|
// - check if category has to be assigned (image possibly added to two albums -> only uploaded once but assigned multiple times)
|
|
|
|
// STEP 3: Upload missing images
|
|
// - upload file in chunks
|
|
// - assign image to category
|
|
|
|
imageFiles, err := localFileStructure.GetImageList(fileSystem)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
missingFiles, err := findMissingImages(context, imageFiles)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = uploadImages(context, missingFiles, existingCategories)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
logrus.Infof("Synchronized %d files.", len(missingFiles))
|
|
|
|
return nil
|
|
}
|
|
|
|
func findMissingImages(context *appContext, imageFiles []*localFileStructure.ImageNode) ([]*localFileStructure.ImageNode, error) {
|
|
|
|
logrus.Debugln("Preparing lookuplist for missing files...")
|
|
|
|
files := make([]string, 0, len(imageFiles))
|
|
md5map := make(map[string]*localFileStructure.ImageNode, len(imageFiles))
|
|
for _, file := range imageFiles {
|
|
md5map[file.Md5Sum] = file
|
|
files = append(files, file.Md5Sum)
|
|
}
|
|
|
|
missingSums, err := piwigo.ImageUploadRequired(context.piwigo, files)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
missingFiles := make([]*localFileStructure.ImageNode, 0, len(missingSums))
|
|
for _, sum := range missingSums {
|
|
file := md5map[sum]
|
|
logrus.Infof("Found missing file %s", file.Path)
|
|
missingFiles = append(missingFiles, file)
|
|
}
|
|
|
|
logrus.Infof("Found %d missing files", len(missingFiles))
|
|
|
|
return missingFiles, nil
|
|
}
|
|
|
|
func uploadImages(context *appContext, missingFiles []*localFileStructure.ImageNode, existingCategories map[string]*piwigo.PiwigoCategory) error {
|
|
|
|
// We sort the files by path to populate per category and not random by file
|
|
sort.Slice(missingFiles, func(i, j int) bool {
|
|
return missingFiles[i].Path < missingFiles[j].Path
|
|
})
|
|
|
|
for _, file := range missingFiles {
|
|
categoryId := existingCategories[file.CategoryName].Id
|
|
|
|
imageId, err := piwigo.UploadImage(context.piwigo, file.Path, file.Md5Sum, categoryId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
file.ImageId = imageId
|
|
}
|
|
|
|
return nil
|
|
}
|