From 1894b4440f5418ada3b00bfc04defef949bc8bca Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Fri, 8 May 2020 12:01:22 +0200 Subject: [PATCH] Detect and report photos without primary file, e.g. after purging #234 Signed-off-by: Michael Mayer --- .../Screenshot 2019-05-21 at 10.45.52.png | Bin 0 -> 93017 bytes frontend/src/pages/library/originals.vue | 13 +++++++++ internal/config/client.go | 4 ++- internal/entity/file.go | 4 +-- internal/photoprism/colors_test.go | 13 ++++++++- internal/photoprism/index_mediafile.go | 16 +++++++---- internal/photoprism/purge.go | 2 ++ internal/query/photo.go | 7 +++++ pkg/fs/base.go | 14 +++++++-- pkg/fs/base_test.go | 27 +++++++++++++----- 10 files changed, 81 insertions(+), 19 deletions(-) create mode 100644 assets/resources/examples/Screenshot 2019-05-21 at 10.45.52.png diff --git a/assets/resources/examples/Screenshot 2019-05-21 at 10.45.52.png b/assets/resources/examples/Screenshot 2019-05-21 at 10.45.52.png new file mode 100644 index 0000000000000000000000000000000000000000..0b935420b35905afcb7d5aae551acecef2a7cc49 GIT binary patch literal 93017 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 literal 0 HcmV?d00001 diff --git a/frontend/src/pages/library/originals.vue b/frontend/src/pages/library/originals.vue index f64f2702a..21442e747 100644 --- a/frontend/src/pages/library/originals.vue +++ b/frontend/src/pages/library/originals.vue @@ -66,6 +66,18 @@ Index update + + + The index currently contains {{ config.count.hidden }} hidden files. Their format may not be supported, + they haven't been converted to JPEG yet or there are duplicates. + @@ -87,6 +99,7 @@ return { settings: new Settings(this.$config.settings()), readonly: this.$config.get("readonly"), + config: this.$config.values, started: false, busy: false, loading: false, diff --git a/internal/config/client.go b/internal/config/client.go index 9e115c969..ce9862216 100644 --- a/internal/config/client.go +++ b/internal/config/client.go @@ -59,6 +59,7 @@ func (c *Config) PublicClientConfig() ClientConfig { var count = struct { Photos uint `json:"photos"` + Hidden uint `json:"hidden"` Favorites uint `json:"favorites"` Private uint `json:"private"` Stories uint `json:"stories"` @@ -131,6 +132,7 @@ func (c *Config) ClientConfig() ClientConfig { var count = struct { Photos uint `json:"photos"` + Hidden uint `json:"hidden"` Favorites uint `json:"favorites"` Private uint `json:"private"` Stories uint `json:"stories"` @@ -141,7 +143,7 @@ func (c *Config) ClientConfig() ClientConfig { }{} db.Table("photos"). - Select("COUNT(*) AS photos, SUM(photo_favorite) AS favorites, SUM(photo_private) AS private, SUM(photo_story) AS stories"). + Select("SUM(photo_quality = -1) AS hidden, SUM(photo_quality >= 0) AS photos, SUM(photo_favorite) AS favorites, SUM(photo_private) AS private, SUM(photo_story) AS stories"). Where("deleted_at IS NULL"). Take(&count) diff --git a/internal/entity/file.go b/internal/entity/file.go index 5d34088fd..2b9a3e67b 100644 --- a/internal/entity/file.go +++ b/internal/entity/file.go @@ -35,8 +35,8 @@ type File struct { FileOrientation int FileAspectRatio float32 `gorm:"type:FLOAT;"` FileMainColor string `gorm:"type:varbinary(16);index;"` - FileColors string `gorm:"type:binary(9);"` - FileLuminance string `gorm:"type:binary(9);"` + FileColors string `gorm:"type:varbinary(9);"` + FileLuminance string `gorm:"type:varbinary(9);"` FileDiff uint32 FileChroma uint8 FileNotes string `gorm:"type:text"` diff --git a/internal/photoprism/colors_test.go b/internal/photoprism/colors_test.go index d635023fb..9406c91b0 100644 --- a/internal/photoprism/colors_test.go +++ b/internal/photoprism/colors_test.go @@ -52,6 +52,12 @@ func TestMediaFile_Colors_Testdata(t *testing.T) { Luminance: colors.LightMap{0x9, 0x5, 0xb, 0x6, 0x1, 0x6, 0xa, 0x1, 0x8}, Chroma: 20, }, + "Screenshot 2019-05-21 at 10.45.52.png": { + Colors: colors.Colors{}, + MainColor: 0, + Luminance: colors.LightMap{}, + Chroma: 0, + }, } if err := fastwalk.Walk(conf.ExamplesPath(), func(filename string, info os.FileMode) error { @@ -61,7 +67,12 @@ func TestMediaFile_Colors_Testdata(t *testing.T) { mediaFile, err := NewMediaFile(filename) - if err != nil || !mediaFile.IsJpeg() { + if err != nil { + t.Fatal(err) + } + + if !mediaFile.IsJpeg() { + t.Logf("not a jpeg: %s", filepath.Base(mediaFile.FileName())) return nil } diff --git a/internal/photoprism/index_mediafile.go b/internal/photoprism/index_mediafile.go index d06799ca3..c11231865 100644 --- a/internal/photoprism/index_mediafile.go +++ b/internal/photoprism/index_mediafile.go @@ -56,14 +56,16 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) ( start := time.Now() - var photo entity.Photo - var description entity.Description - var file, primaryFile entity.File - var metaData meta.Data var photoQuery, fileQuery *gorm.DB var locKeywords []string + file, primaryFile := entity.File{}, entity.File{} + + photo := entity.Photo{} + metaData := meta.Data{} + description := entity.Description{} labels := classify.Labels{} + fileBase := m.Base(ind.conf.Settings().Index.Group) filePath := m.RelativePath(ind.originalsPath()) fileName := m.RelativeName(ind.originalsPath()) @@ -120,6 +122,8 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) ( if photoExists { ind.db.Model(&photo).Related(&description) + } else { + photo.PhotoQuality = -1 } if fileHash == "" { @@ -377,7 +381,9 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) ( log.Warnf("%s (%s)", err.Error(), photo.PhotoUUID) } } else { - photo.PhotoQuality = photo.QualityScore() + if photo.PhotoQuality >= 0 { + photo.PhotoQuality = photo.QualityScore() + } if err := ind.db.Unscoped().Save(&photo).Error; err != nil { log.Errorf("index: %s", err) diff --git a/internal/photoprism/purge.go b/internal/photoprism/purge.go index 8d2c59007..e2ef2532d 100644 --- a/internal/photoprism/purge.go +++ b/internal/photoprism/purge.go @@ -163,6 +163,8 @@ func (prg *Purge) Start(opt PurgeOptions) (purgedFiles map[string]bool, purgedPh offset += limit } + err = q.ResetPhotosQuality() + return purgedFiles, purgedPhotos, err } diff --git a/internal/query/photo.go b/internal/query/photo.go index d63126ec0..15bc00bb3 100644 --- a/internal/query/photo.go +++ b/internal/query/photo.go @@ -469,3 +469,10 @@ func (q *Query) MissingPhotos(limit int, offset int) (entities []entity.Photo, e return entities, err } + +// ResetPhotosQuality resets the quality of photos without primary file to -1. +func (q *Query) ResetPhotosQuality() error { + return q.db.Table("photos"). + Where("id IN (SELECT photos.id FROM photos LEFT JOIN files ON photos.id = files.photo_id AND files.file_primary = 1 WHERE files.id IS NULL GROUP BY photos.id)"). + Update("photo_quality", -1).Error +} diff --git a/pkg/fs/base.go b/pkg/fs/base.go index 7780203c3..0f9f78d8f 100644 --- a/pkg/fs/base.go +++ b/pkg/fs/base.go @@ -2,6 +2,7 @@ package fs import ( "path/filepath" + "strconv" "strings" ) @@ -9,8 +10,8 @@ import ( func Base(fileName string, stripSequence bool) string { basename := filepath.Base(fileName) - if end := strings.Index(basename, "."); end != -1 { - // ignore everything behind the first dot in the file name + // strip file type extension + if end := strings.LastIndex(basename, "."); end != -1 { basename = basename[:end] } @@ -18,7 +19,14 @@ func Base(fileName string, stripSequence bool) string { return basename } - // common sequential naming schemes + // strip numeric extensions like .0000, .0001, .4542353245,.... + if dot := strings.LastIndex(basename, "."); dot != -1 { + if i, err := strconv.Atoi(basename[dot+1:]); err == nil && i >= 0 { + basename = basename[:dot] + } + } + + // other common sequential naming schemes if end := strings.Index(basename, " ("); end != -1 { // copies created by Chrome & Windows, example: IMG_1234 (2) basename = basename[:end] diff --git a/pkg/fs/base_test.go b/pkg/fs/base_test.go index 1f82f3218..f540e2ec0 100644 --- a/pkg/fs/base_test.go +++ b/pkg/fs/base_test.go @@ -7,13 +7,15 @@ import ( ) func TestBase(t *testing.T) { - t.Run("Test.jpg", func(t *testing.T) { - result := Base("/testdata/Test.jpg", true) - assert.Equal(t, "Test", result) + t.Run("Screenshot 2019-05-21 at 10.45.52.png", func(t *testing.T) { + regular := Base("Screenshot 2019-05-21 at 10.45.52.png", false) + assert.Equal(t, "Screenshot 2019-05-21 at 10.45.52", regular) + stripped := Base("Screenshot 2019-05-21 at 10.45.52.png", true) + assert.Equal(t, "Screenshot 2019-05-21 at 10.45", stripped) }) - t.Run("Test.3453453.jpg", func(t *testing.T) { - result := Base("/testdata/Test.3453453.jpg", true) + t.Run("Test.jpg", func(t *testing.T) { + result := Base("/testdata/Test.jpg", true) assert.Equal(t, "Test", result) }) @@ -33,8 +35,19 @@ func TestBase(t *testing.T) { }) t.Run("Test.3453453.jpg", func(t *testing.T) { - result := Base("/testdata/Test.3453453.jpg", false) - assert.Equal(t, "Test", result) + regular := Base("/testdata/Test.3453453.jpg", false) + assert.Equal(t, "Test.3453453", regular) + + stripped := Base("/testdata/Test.3453453.jpg", true) + assert.Equal(t, "Test", stripped) + }) + + t.Run("/foo/bar.0000.ZIP", func(t *testing.T) { + regular := Base("/foo/bar.0000.ZIP", false) + assert.Equal(t, "bar.0000", regular) + + stripped := Base("/foo/bar.0000.ZIP", true) + assert.Equal(t, "bar", stripped) }) t.Run("Test copy 3.jpg", func(t *testing.T) {