From 8fd381860ae6fc68db4fbf025d1224db49bd3438 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Sat, 11 Jul 2020 20:47:52 +0200 Subject: [PATCH] Backend: Refactor Google Photos metadata parsing Signed-off-by: Michael Mayer --- internal/meta/json.go | 6 +++-- internal/meta/json_gphotos.go | 32 ++++++++++++++++++++++----- internal/photoprism/mediafile_test.go | 1 - 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/internal/meta/json.go b/internal/meta/json.go index f2d4d9b5a..3b7090ff6 100644 --- a/internal/meta/json.go +++ b/internal/meta/json.go @@ -38,8 +38,10 @@ func (data *Data) JSON(jsonName, originalName string) (err error) { if bytes.Contains(jsonData, []byte("ExifToolVersion")) { return data.Exiftool(jsonData, originalName) - } else if bytes.Contains(jsonData, []byte("geoData")) { - return data.GPhotos(jsonData) + } else if bytes.Contains(jsonData, []byte("albumData")) { + return data.GMeta(jsonData) + } else if bytes.Contains(jsonData, []byte("photoTakenTime")) { + return data.GPhoto(jsonData) } log.Warnf("metadata: unknown format in %s (json)", quotedName) diff --git a/internal/meta/json_gphotos.go b/internal/meta/json_gphotos.go index 6d3ceca4d..6f3b1270e 100644 --- a/internal/meta/json_gphotos.go +++ b/internal/meta/json_gphotos.go @@ -12,7 +12,6 @@ type GPhoto struct { Title string `json:"title"` Description string `json:"description"` Views int `json:"imageViews,string"` - Album GAlbum `json:"albumData"` Geo GGeo `json:"geoData"` TakenAt GTime `json:"photoTakenTime"` CreatedAt GTime `json:"creationTime"` @@ -27,6 +26,10 @@ func (m GPhoto) SanitizedDescription() string { return SanitizeDescription(m.Description) } +type GMeta struct { + Album GAlbum `json:"albumData"` +} + type GAlbum struct { Title string `json:"title"` Description string `json:"description"` @@ -64,7 +67,28 @@ func (m GTime) Time() time.Time { } // Parses JSON sidecar data as created by Google Photos. -func (data *Data) GPhotos(jsonData []byte) (err error) { +func (data *Data) GMeta(jsonData []byte) (err error) { + defer func() { + if e := recover(); e != nil { + err = fmt.Errorf("metadata: %s (gphotos panic)", e) + } + }() + + p := GMeta{} + + if err := json.Unmarshal(jsonData, &p); err != nil { + return err + } + + if p.Album.Exists() { + data.Albums = append(data.Albums, p.Album.Title) + } + + return nil +} + +// Parses JSON photo sidecar data as created by Google Photos. +func (data *Data) GPhoto(jsonData []byte) (err error) { defer func() { if e := recover(); e != nil { err = fmt.Errorf("metadata: %s (gphotos panic)", e) @@ -100,10 +124,6 @@ func (data *Data) GPhotos(jsonData []byte) (err error) { data.Altitude = int(p.Geo.Altitude) } - if p.Album.Exists() { - data.Albums = append(data.Albums, p.Album.Title) - } - // Set time zone and calculate UTC time. if data.Lat != 0 && data.Lng != 0 { zones, err := tz.GetZone(tz.Point{ diff --git a/internal/photoprism/mediafile_test.go b/internal/photoprism/mediafile_test.go index 7cfdf2048..0f95a4312 100644 --- a/internal/photoprism/mediafile_test.go +++ b/internal/photoprism/mediafile_test.go @@ -560,7 +560,6 @@ func TestMediaFile_RelatedFiles(t *testing.T) { assert.Equal(t, "2015-02-04.jpg", related.Main.BaseName()) - assert.Equal(t, "2015-02-04.jpg", related.Files[0].BaseName()) assert.Equal(t, "2015-02-04(1).jpg", related.Files[1].BaseName()) assert.Equal(t, "2015-02-04.jpg.json", related.Files[2].BaseName())