photoprism/internal/meta/xmp.go

83 lines
1.7 KiB
Go
Raw Normal View History

package meta
import (
"fmt"
"path/filepath"
"runtime/debug"
"time"
"github.com/photoprism/photoprism/pkg/fs"
"github.com/photoprism/photoprism/pkg/clean"
)
// XMP parses an XMP file and returns a Data struct.
func XMP(fileName string) (data Data, err error) {
err = data.XMP(fileName)
return data, err
}
// XMP parses an XMP file and returns a Data struct.
func (data *Data) XMP(fileName string) (err error) {
defer func() {
if e := recover(); e != nil {
err = fmt.Errorf("metadata: %s in %s (xmp panic)\nstack: %s", e, clean.Log(filepath.Base(fileName)), debug.Stack())
}
}()
// Resolve file name e.g. in case it's a symlink.
if fileName, err = fs.Resolve(fileName); err != nil {
return fmt.Errorf("metadata: %s %s (xmp)", err, clean.Log(filepath.Base(fileName)))
}
doc := XmpDocument{}
if err = doc.Load(fileName); err != nil {
return fmt.Errorf("metadata: cannot read %s (xmp)", clean.Log(filepath.Base(fileName)))
}
if doc.Title() != "" {
data.Title = doc.Title()
}
if doc.Artist() != "" {
data.Artist = doc.Artist()
}
if doc.Description() != "" {
data.Description = doc.Description()
}
if doc.Copyright() != "" {
data.Copyright = doc.Copyright()
}
if doc.CameraMake() != "" {
data.CameraMake = doc.CameraMake()
}
if doc.CameraModel() != "" {
data.CameraModel = doc.CameraModel()
}
if doc.LensModel() != "" {
data.LensModel = doc.LensModel()
}
if takenAt := doc.TakenAt(data.TimeZone); !takenAt.IsZero() {
data.TakenAt = takenAt.UTC()
if data.TimeZone == "" {
data.TimeZone = time.UTC.String()
}
}
if len(doc.Keywords()) != 0 {
data.AddKeywords(doc.Keywords())
}
data.Favorite = doc.Favorite()
return nil
}