diff --git a/internal/photoprism/index_mediafile.go b/internal/photoprism/index_mediafile.go index cb0ce7bc5..fc8d92970 100644 --- a/internal/photoprism/index_mediafile.go +++ b/internal/photoprism/index_mediafile.go @@ -238,7 +238,7 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) ( if err := photo.LoadFromYaml(yamlName); err != nil { log.Errorf("index: %s in %s (restore from yaml)", err.Error(), logName) } else if err := photo.Find(); err != nil { - log.Infof("index: restored from %s", txt.Quote(filepath.Base(yamlName))) + log.Infof("index: %s restored from %s", txt.Quote(m.BaseName()), txt.Quote(filepath.Base(yamlName))) } else { photoExists = true log.Infof("index: uid %s restored from %s", photo.PhotoUID, txt.Quote(filepath.Base(yamlName))) diff --git a/internal/server/webdav.go b/internal/server/webdav.go index 6adbb8ed8..dcd2657e0 100644 --- a/internal/server/webdav.go +++ b/internal/server/webdav.go @@ -1,7 +1,12 @@ package server import ( + "github.com/photoprism/photoprism/pkg/fs" + "io/ioutil" "net/http" + "os" + "path/filepath" + "strings" "github.com/photoprism/photoprism/pkg/txt" @@ -14,6 +19,32 @@ import ( const WebDAVOriginals = "/originals" const WebDAVImport = "/import" +// MarkUploadAsFavorite sets the favorite flag for newly uploaded files. +func MarkUploadAsFavorite(fileName string) { + yamlName := fs.AbsPrefix(fileName, false) + fs.YamlExt + + // Abort if YAML file already exists to avoid overwriting metadata. + if fs.FileExists(yamlName) { + log.Warnf("webdav: %s already exists", txt.Quote(filepath.Base(yamlName))) + return + } + + // Make sure directory exists. + if err := os.MkdirAll(filepath.Dir(yamlName), os.ModePerm); err != nil { + log.Errorf("webdav: %s", err.Error()) + return + } + + // Write YAML data to file. + if err := ioutil.WriteFile(yamlName, []byte("Favorite: true\n"), os.ModePerm); err != nil { + log.Errorf("webdav: %s", err.Error()) + return + } + + // Log success. + log.Infof("webdav: marked %s as favorite", txt.Quote(filepath.Base(fileName))) +} + // ANY /webdav/* func WebDAV(path string, router *gin.RouterGroup, conf *config.Config) { if router == nil { @@ -44,6 +75,15 @@ func WebDAV(path string, router *gin.RouterGroup, conf *config.Config) { } } else { + // Mark uploaded files as favorite if X-Favorite HTTP header is "1". + if r.Method == MethodPut && r.Header.Get("X-Favorite") == "1" { + if router.BasePath() == WebDAVOriginals { + MarkUploadAsFavorite(filepath.Join(conf.OriginalsPath(), strings.TrimPrefix(r.URL.Path, router.BasePath()))) + } else if router.BasePath() == WebDAVImport { + MarkUploadAsFavorite(filepath.Join(conf.ImportPath(), strings.TrimPrefix(r.URL.Path, router.BasePath()))) + } + } + switch r.Method { case MethodPut, MethodPost, MethodPatch, MethodDelete, MethodCopy, MethodMove: log.Infof("webdav: %s %s", r.Method, r.URL)