From 6c976c3b06f709e90eed10dc15ca3c7868b66288 Mon Sep 17 00:00:00 2001 From: Claudio Costa Date: Fri, 11 Dec 2020 00:15:17 +0100 Subject: [PATCH] Generate preview regardless of HasPreviewImage value (#16535) Automatic Merge --- api4/file_test.go | 12 ++++++++++++ app/file.go | 24 ++++++++++++------------ tests/testgif_expected_preview.jpg | Bin 0 -> 6877 bytes tests/testgif_expected_thumbnail.jpg | Bin 0 -> 5329 bytes 4 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 tests/testgif_expected_preview.jpg create mode 100644 tests/testgif_expected_thumbnail.jpg diff --git a/api4/file_test.go b/api4/file_test.go index 19423351d4..fbc1a12388 100644 --- a/api4/file_test.go +++ b/api4/file_test.go @@ -404,6 +404,18 @@ func TestUploadFiles(t *testing.T) { expectedImageHasPreview: []bool{true}, expectedCreatorId: th.BasicUser.Id, }, + // animated GIF + { + title: "Happy image thumbnail/preview 12", + names: []string{"testgif.gif"}, + expectedImageThumbnailNames: []string{"testgif_expected_thumbnail.jpg"}, + expectedImagePreviewNames: []string{"testgif_expected_preview.jpg"}, + expectImage: true, + expectedImageWidths: []int{118}, + expectedImageHeights: []int{118}, + expectedImageHasPreview: []bool{false}, + expectedCreatorId: th.BasicUser.Id, + }, { title: "Happy admin", client: th.SystemAdminClient, diff --git a/app/file.go b/app/file.go index 83f32c749f..f910002019 100644 --- a/app/file.go +++ b/app/file.go @@ -793,19 +793,19 @@ func (t *UploadFileTask) postprocessImage(file io.Reader) { } var wg sync.WaitGroup - wg.Add(1) - if t.fileinfo.HasPreviewImage { - wg.Add(2) - go func() { - defer wg.Done() - writeJPEG(genThumbnail(decoded), t.fileinfo.ThumbnailPath) - }() + wg.Add(3) + // Generating thumbnail and preview regardless of HasPreviewImage value. + // This is needed on mobile in case of animated GIFs. + go func() { + defer wg.Done() + writeJPEG(genThumbnail(decoded), t.fileinfo.ThumbnailPath) + }() + + go func() { + defer wg.Done() + writeJPEG(genPreview(decoded), t.fileinfo.PreviewPath) + }() - go func() { - defer wg.Done() - writeJPEG(genPreview(decoded), t.fileinfo.PreviewPath) - }() - } go func() { defer wg.Done() if t.fileinfo.MiniPreview == nil { diff --git a/tests/testgif_expected_preview.jpg b/tests/testgif_expected_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2878eb684f27d200fd3a80de30c89929a25b4d4a GIT binary patch literal 6877 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 A*#H0l literal 0 HcmV?d00001