photoprism/internal/workers/sync_upload.go
Michael Mayer a91206a509 Universal sidecar configuration, indexing with multiple roots #268 #348
Slowly getting to the point where only very few people are able to maintain this codebase :)

Signed-off-by: Michael Mayer <michael@liquidbytes.net>
2020-06-07 10:09:35 +02:00

75 lines
1.9 KiB
Go

package workers
import (
"path"
"path/filepath"
"time"
"github.com/photoprism/photoprism/internal/entity"
"github.com/photoprism/photoprism/internal/event"
"github.com/photoprism/photoprism/internal/mutex"
"github.com/photoprism/photoprism/internal/photoprism"
"github.com/photoprism/photoprism/internal/query"
"github.com/photoprism/photoprism/internal/remote/webdav"
)
// Uploads local files to a remote account
func (worker *Sync) upload(a entity.Account) (complete bool, err error) {
maxResults := 250
// Get upload file list from database
files, err := query.AccountUploads(a, maxResults)
if err != nil {
return false, err
}
if len(files) == 0 {
log.Infof("sync: upload complete for %s", a.AccName)
event.Publish("sync.uploaded", event.Data{"account": a})
return true, nil
}
client := webdav.New(a.AccURL, a.AccUser, a.AccPass)
existingDirs := make(map[string]string)
for _, file := range files {
if mutex.SyncWorker.Canceled() {
return false, nil
}
fileName := photoprism.FileName(file.FileRoot, file.FileName)
remoteName := path.Join(a.SyncPath, file.FileName)
remoteDir := filepath.Dir(remoteName)
if _, ok := existingDirs[remoteDir]; !ok {
if err := client.CreateDir(remoteDir); err != nil {
log.Errorf("sync: could not create remote folder %s", remoteDir)
continue // try again next time
}
}
if err := client.Upload(fileName, remoteName); err != nil {
worker.logError(err)
continue // try again next time
}
log.Infof("sync: uploaded %s to %s on %s", fileName, remoteName, a.AccName)
fileSync := entity.NewFileSync(a.ID, remoteName)
fileSync.Status = entity.FileSyncUploaded
fileSync.RemoteDate = time.Now()
fileSync.RemoteSize = file.FileSize
fileSync.FileID = file.ID
fileSync.Error = ""
fileSync.Errors = 0
if mutex.SyncWorker.Canceled() {
return false, nil
}
worker.logError(entity.Db().Save(&fileSync).Error)
}
return false, nil
}