From f77005128a391025c16fb65c47a4272ac003cbf1 Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Thu, 8 Aug 2024 17:12:13 +0000 Subject: [performance] move thumbnail generation to go code where possible (#3183) * wrap thumbnailing code to handle generation natively where possible * more code comments! * add even more code comments! * add code comments about blurhash generation * maintain image rotation if contained in exif data * move rotation before resizing * ensure pix_fmt actually selected by ffprobe, check for alpha layer with gifs * use linear instead of nearest-neighbour for resizing * work with image "orientation" instead of "rotation". use default 75% quality for both webp and jpeg generation * add header to new file * use thumb extension when getting thumb mime type * update test models and tests with new media processing * add suggested code comments * add note about thumbnail filter count reducing memory usage --- internal/media/manager_test.go | 50 +++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 25 deletions(-) (limited to 'internal/media/manager_test.go') diff --git a/internal/media/manager_test.go b/internal/media/manager_test.go index d988ae274..87777ea30 100644 --- a/internal/media/manager_test.go +++ b/internal/media/manager_test.go @@ -273,10 +273,10 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcess() { Width: 512, Height: 288, Size: 147456, Aspect: 1.7777777777777777, }, attachment.FileMeta.Small) suite.Equal("image/jpeg", attachment.File.ContentType) - suite.Equal("image/webp", attachment.Thumbnail.ContentType) + suite.Equal("image/jpeg", attachment.Thumbnail.ContentType) suite.Equal(269739, attachment.File.FileSize) - suite.Equal(8536, attachment.Thumbnail.FileSize) - suite.Equal("LcBzLU#6RkRn~qvzRjWF?urqV@jc", attachment.Blurhash) + suite.Equal(22858, attachment.Thumbnail.FileSize) + suite.Equal("LjCGfG#6RkRn_NvzRjWF?urqV@a$", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -285,7 +285,7 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcess() { // ensure the files contain the expected data. equalFiles(suite.T(), suite.state.Storage, dbAttachment.File.Path, "./test/test-jpeg-processed.jpg") - equalFiles(suite.T(), suite.state.Storage, dbAttachment.Thumbnail.Path, "./test/test-jpeg-thumbnail.webp") + equalFiles(suite.T(), suite.state.Storage, dbAttachment.Thumbnail.Path, "./test/test-jpeg-thumbnail.jpeg") } func (suite *ManagerTestSuite) TestSimpleJpegProcessTooLarge() { @@ -428,8 +428,8 @@ func (suite *ManagerTestSuite) TestSlothVineProcess() { suite.Equal("video/mp4", attachment.File.ContentType) suite.Equal("image/webp", attachment.Thumbnail.ContentType) suite.Equal(312453, attachment.File.FileSize) - suite.Equal(3746, attachment.Thumbnail.FileSize) - suite.Equal("LhIrNMt6Nsj[t7aybFj[_4WBspoe", attachment.Blurhash) + suite.Equal(5648, attachment.Thumbnail.FileSize) + suite.Equal("LhIrNMt6Nsj[t7ayW.j[_4WBsWkB", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -488,8 +488,8 @@ func (suite *ManagerTestSuite) TestLongerMp4Process() { suite.Equal("video/mp4", attachment.File.ContentType) suite.Equal("image/webp", attachment.Thumbnail.ContentType) suite.Equal(109569, attachment.File.FileSize) - suite.Equal(2128, attachment.Thumbnail.FileSize) - suite.Equal("L8Q0aP~qnM_3~qD%ozRjRiofWXRj", attachment.Blurhash) + suite.Equal(2976, attachment.Thumbnail.FileSize) + suite.Equal("L8QJfm~qD%_3_3D%t7RjM{j[ofRj", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -548,8 +548,8 @@ func (suite *ManagerTestSuite) TestBirdnestMp4Process() { suite.Equal("video/mp4", attachment.File.ContentType) suite.Equal("image/webp", attachment.Thumbnail.ContentType) suite.Equal(1409625, attachment.File.FileSize) - suite.Equal(9446, attachment.Thumbnail.FileSize) - suite.Equal("LKF~w1RjRO.99DRORPaetkV?WCMw", attachment.Blurhash) + suite.Equal(14478, attachment.Thumbnail.FileSize) + suite.Equal("LKF~w1RjRO.99DM_RPaetkV?WCMw", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -654,10 +654,10 @@ func (suite *ManagerTestSuite) TestPngNoAlphaChannelProcess() { Width: 186, Height: 187, Size: 34782, Aspect: 0.9946524064171123, }, attachment.FileMeta.Small) suite.Equal("image/png", attachment.File.ContentType) - suite.Equal("image/webp", attachment.Thumbnail.ContentType) + suite.Equal("image/jpeg", attachment.Thumbnail.ContentType) suite.Equal(17471, attachment.File.FileSize) - suite.Equal(2630, attachment.Thumbnail.FileSize) - suite.Equal("LBOW$@%i-=aj%go#RSRP_1av~Tt2", attachment.Blurhash) + suite.Equal(6446, attachment.Thumbnail.FileSize) + suite.Equal("LDQcrD%i-?aj%ho#M~RP~nf3~nt2", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -666,7 +666,7 @@ func (suite *ManagerTestSuite) TestPngNoAlphaChannelProcess() { // ensure the files contain the expected data. equalFiles(suite.T(), suite.state.Storage, dbAttachment.File.Path, "./test/test-png-noalphachannel-processed.png") - equalFiles(suite.T(), suite.state.Storage, dbAttachment.Thumbnail.Path, "./test/test-png-noalphachannel-thumbnail.webp") + equalFiles(suite.T(), suite.state.Storage, dbAttachment.Thumbnail.Path, "./test/test-png-noalphachannel-thumbnail.jpeg") } func (suite *ManagerTestSuite) TestPngAlphaChannelProcess() { @@ -712,8 +712,8 @@ func (suite *ManagerTestSuite) TestPngAlphaChannelProcess() { suite.Equal("image/png", attachment.File.ContentType) suite.Equal("image/webp", attachment.Thumbnail.ContentType) suite.Equal(18832, attachment.File.FileSize) - suite.Equal(2630, attachment.Thumbnail.FileSize) - suite.Equal("LBOW$@%i-=aj%go#RSRP_1av~Tt2", attachment.Blurhash) + suite.Equal(3592, attachment.Thumbnail.FileSize) + suite.Equal("LBOW$@%i-rak%go#RSRP_1av~Ts+", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -722,7 +722,7 @@ func (suite *ManagerTestSuite) TestPngAlphaChannelProcess() { // ensure the files contain the expected data. equalFiles(suite.T(), suite.state.Storage, dbAttachment.File.Path, "./test/test-png-alphachannel-processed.png") - equalFiles(suite.T(), suite.state.Storage, dbAttachment.Thumbnail.Path, "./test/test-png-alphachannel-thumbnail.webp") + equalFiles(suite.T(), suite.state.Storage, dbAttachment.Thumbnail.Path, "./test/test-png-alphachannel-thumbnail.jpeg") } func (suite *ManagerTestSuite) TestSimpleJpegProcessWithCallback() { @@ -766,10 +766,10 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessWithCallback() { Width: 512, Height: 288, Size: 147456, Aspect: 1.7777777777777777, }, attachment.FileMeta.Small) suite.Equal("image/jpeg", attachment.File.ContentType) - suite.Equal("image/webp", attachment.Thumbnail.ContentType) + suite.Equal("image/jpeg", attachment.Thumbnail.ContentType) suite.Equal(269739, attachment.File.FileSize) - suite.Equal(8536, attachment.Thumbnail.FileSize) - suite.Equal("LcBzLU#6RkRn~qvzRjWF?urqV@jc", attachment.Blurhash) + suite.Equal(22858, attachment.Thumbnail.FileSize) + suite.Equal("LjCGfG#6RkRn_NvzRjWF?urqV@a$", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -778,7 +778,7 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessWithCallback() { // ensure the files contain the expected data. equalFiles(suite.T(), suite.state.Storage, dbAttachment.File.Path, "./test/test-jpeg-processed.jpg") - equalFiles(suite.T(), suite.state.Storage, dbAttachment.Thumbnail.Path, "./test/test-jpeg-thumbnail.webp") + equalFiles(suite.T(), suite.state.Storage, dbAttachment.Thumbnail.Path, "./test/test-jpeg-thumbnail.jpeg") } func (suite *ManagerTestSuite) TestSimpleJpegProcessWithDiskStorage() { @@ -844,10 +844,10 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessWithDiskStorage() { Width: 512, Height: 288, Size: 147456, Aspect: 1.7777777777777777, }, attachment.FileMeta.Small) suite.Equal("image/jpeg", attachment.File.ContentType) - suite.Equal("image/webp", attachment.Thumbnail.ContentType) + suite.Equal("image/jpeg", attachment.Thumbnail.ContentType) suite.Equal(269739, attachment.File.FileSize) - suite.Equal(8536, attachment.Thumbnail.FileSize) - suite.Equal("LcBzLU#6RkRn~qvzRjWF?urqV@jc", attachment.Blurhash) + suite.Equal(22858, attachment.Thumbnail.FileSize) + suite.Equal("LjCGfG#6RkRn_NvzRjWF?urqV@a$", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -856,7 +856,7 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessWithDiskStorage() { // ensure the files contain the expected data. equalFiles(suite.T(), storage, dbAttachment.File.Path, "./test/test-jpeg-processed.jpg") - equalFiles(suite.T(), storage, dbAttachment.Thumbnail.Path, "./test/test-jpeg-thumbnail.webp") + equalFiles(suite.T(), storage, dbAttachment.Thumbnail.Path, "./test/test-jpeg-thumbnail.jpeg") } func (suite *ManagerTestSuite) TestSmallSizedMediaTypeDetection_issue2263() { -- cgit v1.2.3