From 3b7b551cca78faa160d17f688a33d2e018367e22 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 18 Jul 2023 17:23:39 +0200 Subject: [PATCH] Media: Add test for creating thumbs from broken JPEG #2721 Signed-off-by: Michael Mayer --- internal/photoprism/mediafile_meta.go | 2 +- internal/photoprism/mediafile_thumbs_test.go | 23 ++++++++++++++++++ .../testdata/broken/animated-earth.jpg | Bin 0 -> 12870 bytes 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 internal/photoprism/testdata/broken/animated-earth.jpg diff --git a/internal/photoprism/mediafile_meta.go b/internal/photoprism/mediafile_meta.go index 4616edd11..9ac054991 100644 --- a/internal/photoprism/mediafile_meta.go +++ b/internal/photoprism/mediafile_meta.go @@ -106,7 +106,7 @@ func (m *MediaFile) MetaData() (result meta.Data) { if err != nil { m.metaData.Error = err - log.Debugf("metadata: %s in %s", err, clean.Log(m.BaseName())) + log.Debugf("%s in %s", err, clean.Log(m.BaseName())) } }) diff --git a/internal/photoprism/mediafile_thumbs_test.go b/internal/photoprism/mediafile_thumbs_test.go index 19c5b2e80..1bc85f604 100644 --- a/internal/photoprism/mediafile_thumbs_test.go +++ b/internal/photoprism/mediafile_thumbs_test.go @@ -200,6 +200,29 @@ func TestMediaFile_CreateThumbnails(t *testing.T) { assert.FileExists(t, thumbFilename) assert.NoError(t, m.CreateThumbnails(thumbsPath, false)) }) + + t.Run("broken/animated-earth.jpg", func(t *testing.T) { + m, err := NewMediaFile("testdata/broken/animated-earth.jpg") + + if err != nil { + t.Fatal(err) + } + + err = m.CreateThumbnails(thumbsPath, true) + + if err != nil { + t.Fatal(err) + } + + thumbFilename, err := thumb.FileName(m.Hash(), thumbsPath, thumb.Sizes[thumb.Tile50].Width, thumb.Sizes[thumb.Tile50].Height, thumb.Sizes[thumb.Tile50].Options...) + + if err != nil { + t.Fatal(err) + } + + assert.FileExists(t, thumbFilename) + assert.NoError(t, m.CreateThumbnails(thumbsPath, false)) + }) } func TestMediaFile_ChangeOrientation(t *testing.T) { diff --git a/internal/photoprism/testdata/broken/animated-earth.jpg b/internal/photoprism/testdata/broken/animated-earth.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dcee9825c4559b93c76bfec9f1778482512cd746 GIT binary patch literal 12870 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 n_IoJNHNflDEjS9`aVR