diff options
author | 2024-07-12 09:39:47 +0000 | |
---|---|---|
committer | 2024-07-12 09:39:47 +0000 | |
commit | cde2fb6244a791b3c5b746112e3a8be3a79f39a4 (patch) | |
tree | 6079d6fb66d90ffbe8c1623525bb86829c162459 /internal/api | |
parent | [chore] Add interaction policy gtsmodels (#3075) (diff) | |
download | gotosocial-cde2fb6244a791b3c5b746112e3a8be3a79f39a4.tar.xz |
[feature] support processing of (many) more media types (#3090)
* initial work replacing our media decoding / encoding pipeline with ffprobe + ffmpeg
* specify the video codec to use when generating static image from emoji
* update go-storage library (fixes incompatibility after updating go-iotools)
* maintain image aspect ratio when generating a thumbnail for it
* update readme to show go-ffmpreg
* fix a bunch of media tests, move filesize checking to callers of media manager for more flexibility
* remove extra debug from error message
* fix up incorrect function signatures
* update PutFile to just use regular file copy, as changes are file is on separate partition
* fix remaining tests, remove some unneeded tests now we're working with ffmpeg/ffprobe
* update more tests, add more code comments
* add utilities to generate processed emoji / media outputs
* fix remaining tests
* add test for opus media file, add license header to utility cmds
* limit the number of concurrently available ffmpeg / ffprobe instances
* reduce number of instances
* further reduce number of instances
* fix envparsing test with configuration variables
* update docs and configuration with new media-{local,remote}-max-size variables
Diffstat (limited to 'internal/api')
-rw-r--r-- | internal/api/client/admin/emojicreate_test.go | 12 | ||||
-rw-r--r-- | internal/api/client/admin/emojidelete_test.go | 2 | ||||
-rw-r--r-- | internal/api/client/admin/emojiget_test.go | 4 | ||||
-rw-r--r-- | internal/api/client/admin/emojiupdate_test.go | 30 | ||||
-rw-r--r-- | internal/api/client/instance/instancepatch.go | 7 | ||||
-rw-r--r-- | internal/api/client/instance/instancepatch_test.go | 14 | ||||
-rw-r--r-- | internal/api/client/media/mediacreate.go | 13 | ||||
-rw-r--r-- | internal/api/client/media/mediacreate_test.go | 4 |
8 files changed, 33 insertions, 53 deletions
diff --git a/internal/api/client/admin/emojicreate_test.go b/internal/api/client/admin/emojicreate_test.go index be39ebdf5..a687fb0af 100644 --- a/internal/api/client/admin/emojicreate_test.go +++ b/internal/api/client/admin/emojicreate_test.go @@ -90,10 +90,10 @@ func (suite *EmojiCreateTestSuite) TestEmojiCreateNewCategory() { suite.Equal(apiEmoji.StaticURL, dbEmoji.ImageStaticURL) suite.NotEmpty(dbEmoji.ImagePath) suite.NotEmpty(dbEmoji.ImageStaticPath) - suite.Equal("image/png", dbEmoji.ImageContentType) + suite.Equal("image/apng", dbEmoji.ImageContentType) suite.Equal("image/png", dbEmoji.ImageStaticContentType) suite.Equal(36702, dbEmoji.ImageFileSize) - suite.Equal(10413, dbEmoji.ImageStaticFileSize) + suite.Equal(6092, dbEmoji.ImageStaticFileSize) suite.False(*dbEmoji.Disabled) suite.NotEmpty(dbEmoji.URI) suite.True(*dbEmoji.VisibleInPicker) @@ -163,10 +163,10 @@ func (suite *EmojiCreateTestSuite) TestEmojiCreateExistingCategory() { suite.Equal(apiEmoji.StaticURL, dbEmoji.ImageStaticURL) suite.NotEmpty(dbEmoji.ImagePath) suite.NotEmpty(dbEmoji.ImageStaticPath) - suite.Equal("image/png", dbEmoji.ImageContentType) + suite.Equal("image/apng", dbEmoji.ImageContentType) suite.Equal("image/png", dbEmoji.ImageStaticContentType) suite.Equal(36702, dbEmoji.ImageFileSize) - suite.Equal(10413, dbEmoji.ImageStaticFileSize) + suite.Equal(6092, dbEmoji.ImageStaticFileSize) suite.False(*dbEmoji.Disabled) suite.NotEmpty(dbEmoji.URI) suite.True(*dbEmoji.VisibleInPicker) @@ -236,10 +236,10 @@ func (suite *EmojiCreateTestSuite) TestEmojiCreateNoCategory() { suite.Equal(apiEmoji.StaticURL, dbEmoji.ImageStaticURL) suite.NotEmpty(dbEmoji.ImagePath) suite.NotEmpty(dbEmoji.ImageStaticPath) - suite.Equal("image/png", dbEmoji.ImageContentType) + suite.Equal("image/apng", dbEmoji.ImageContentType) suite.Equal("image/png", dbEmoji.ImageStaticContentType) suite.Equal(36702, dbEmoji.ImageFileSize) - suite.Equal(10413, dbEmoji.ImageStaticFileSize) + suite.Equal(6092, dbEmoji.ImageStaticFileSize) suite.False(*dbEmoji.Disabled) suite.NotEmpty(dbEmoji.URI) suite.True(*dbEmoji.VisibleInPicker) diff --git a/internal/api/client/admin/emojidelete_test.go b/internal/api/client/admin/emojidelete_test.go index 10cf3fe8d..88e929b55 100644 --- a/internal/api/client/admin/emojidelete_test.go +++ b/internal/api/client/admin/emojidelete_test.go @@ -62,7 +62,7 @@ func (suite *EmojiDeleteTestSuite) TestEmojiDelete1() { "id": "01F8MH9H8E4VG3KDYJR9EGPXCQ", "disabled": false, "updated_at": "2021-09-20T10:40:37.000Z", - "total_file_size": 47115, + "total_file_size": 42794, "content_type": "image/png", "uri": "http://localhost:8080/emoji/01F8MH9H8E4VG3KDYJR9EGPXCQ" }`, dst.String()) diff --git a/internal/api/client/admin/emojiget_test.go b/internal/api/client/admin/emojiget_test.go index b8bad2536..d6b2924ab 100644 --- a/internal/api/client/admin/emojiget_test.go +++ b/internal/api/client/admin/emojiget_test.go @@ -60,7 +60,7 @@ func (suite *EmojiGetTestSuite) TestEmojiGet1() { "id": "01F8MH9H8E4VG3KDYJR9EGPXCQ", "disabled": false, "updated_at": "2021-09-20T10:40:37.000Z", - "total_file_size": 47115, + "total_file_size": 42794, "content_type": "image/png", "uri": "http://localhost:8080/emoji/01F8MH9H8E4VG3KDYJR9EGPXCQ" }`, dst.String()) @@ -92,7 +92,7 @@ func (suite *EmojiGetTestSuite) TestEmojiGet2() { "disabled": false, "domain": "fossbros-anonymous.io", "updated_at": "2020-03-18T12:12:00.000Z", - "total_file_size": 21697, + "total_file_size": 19854, "content_type": "image/png", "uri": "http://fossbros-anonymous.io/emoji/01GD5KP5CQEE1R3X43Y1EHS2CW" }`, dst.String()) diff --git a/internal/api/client/admin/emojiupdate_test.go b/internal/api/client/admin/emojiupdate_test.go index 11beaeaa9..073e3cec0 100644 --- a/internal/api/client/admin/emojiupdate_test.go +++ b/internal/api/client/admin/emojiupdate_test.go @@ -100,19 +100,19 @@ func (suite *EmojiUpdateTestSuite) TestEmojiUpdateNewCategory() { suite.Equal("image/png", dbEmoji.ImageContentType) suite.Equal("image/png", dbEmoji.ImageStaticContentType) suite.Equal(36702, dbEmoji.ImageFileSize) - suite.Equal(10413, dbEmoji.ImageStaticFileSize) + suite.Equal(6092, dbEmoji.ImageStaticFileSize) suite.False(*dbEmoji.Disabled) suite.NotEmpty(dbEmoji.URI) suite.True(*dbEmoji.VisibleInPicker) suite.NotEmpty(dbEmoji.CategoryID) // emoji should be in storage - emojiBytes, err := suite.storage.Get(ctx, dbEmoji.ImagePath) + entry, err := suite.storage.Storage.Stat(ctx, dbEmoji.ImagePath) suite.NoError(err) - suite.Len(emojiBytes, dbEmoji.ImageFileSize) - emojiStaticBytes, err := suite.storage.Get(ctx, dbEmoji.ImageStaticPath) + suite.Equal(int64(dbEmoji.ImageFileSize), entry.Size) + entry, err = suite.storage.Storage.Stat(ctx, dbEmoji.ImageStaticPath) suite.NoError(err) - suite.Len(emojiStaticBytes, dbEmoji.ImageStaticFileSize) + suite.Equal(int64(dbEmoji.ImageStaticFileSize), entry.Size) } func (suite *EmojiUpdateTestSuite) TestEmojiUpdateSwitchCategory() { @@ -177,19 +177,19 @@ func (suite *EmojiUpdateTestSuite) TestEmojiUpdateSwitchCategory() { suite.Equal("image/png", dbEmoji.ImageContentType) suite.Equal("image/png", dbEmoji.ImageStaticContentType) suite.Equal(36702, dbEmoji.ImageFileSize) - suite.Equal(10413, dbEmoji.ImageStaticFileSize) + suite.Equal(6092, dbEmoji.ImageStaticFileSize) suite.False(*dbEmoji.Disabled) suite.NotEmpty(dbEmoji.URI) suite.True(*dbEmoji.VisibleInPicker) suite.NotEmpty(dbEmoji.CategoryID) // emoji should be in storage - emojiBytes, err := suite.storage.Get(ctx, dbEmoji.ImagePath) + entry, err := suite.storage.Storage.Stat(ctx, dbEmoji.ImagePath) suite.NoError(err) - suite.Len(emojiBytes, dbEmoji.ImageFileSize) - emojiStaticBytes, err := suite.storage.Get(ctx, dbEmoji.ImageStaticPath) + suite.Equal(int64(dbEmoji.ImageFileSize), entry.Size) + entry, err = suite.storage.Storage.Stat(ctx, dbEmoji.ImageStaticPath) suite.NoError(err) - suite.Len(emojiStaticBytes, dbEmoji.ImageStaticFileSize) + suite.Equal(int64(dbEmoji.ImageStaticFileSize), entry.Size) } func (suite *EmojiUpdateTestSuite) TestEmojiUpdateCopyRemoteToLocal() { @@ -255,19 +255,19 @@ func (suite *EmojiUpdateTestSuite) TestEmojiUpdateCopyRemoteToLocal() { suite.Equal("image/png", dbEmoji.ImageContentType) suite.Equal("image/png", dbEmoji.ImageStaticContentType) suite.Equal(10889, dbEmoji.ImageFileSize) - suite.Equal(10672, dbEmoji.ImageStaticFileSize) + suite.Equal(8965, dbEmoji.ImageStaticFileSize) suite.False(*dbEmoji.Disabled) suite.NotEmpty(dbEmoji.URI) suite.True(*dbEmoji.VisibleInPicker) suite.NotEmpty(dbEmoji.CategoryID) // emoji should be in storage - emojiBytes, err := suite.storage.Get(ctx, dbEmoji.ImagePath) + entry, err := suite.storage.Storage.Stat(ctx, dbEmoji.ImagePath) suite.NoError(err) - suite.Len(emojiBytes, dbEmoji.ImageFileSize) - emojiStaticBytes, err := suite.storage.Get(ctx, dbEmoji.ImageStaticPath) + suite.Equal(int64(dbEmoji.ImageFileSize), entry.Size) + entry, err = suite.storage.Storage.Stat(ctx, dbEmoji.ImageStaticPath) suite.NoError(err) - suite.Len(emojiStaticBytes, dbEmoji.ImageStaticFileSize) + suite.Equal(int64(dbEmoji.ImageStaticFileSize), entry.Size) } func (suite *EmojiUpdateTestSuite) TestEmojiUpdateDisableEmoji() { diff --git a/internal/api/client/instance/instancepatch.go b/internal/api/client/instance/instancepatch.go index afddc5a50..64263caf6 100644 --- a/internal/api/client/instance/instancepatch.go +++ b/internal/api/client/instance/instancepatch.go @@ -182,13 +182,6 @@ func validateInstanceUpdate(form *apimodel.InstanceSettingsUpdateRequest) error return errors.New("empty form submitted") } - if form.Avatar != nil { - maxImageSize := config.GetMediaImageMaxSize() - if size := form.Avatar.Size; size > int64(maxImageSize) { - return fmt.Errorf("file size limit exceeded: limit is %d bytes but desired instance avatar was %d bytes", maxImageSize, size) - } - } - if form.AvatarDescription != nil { maxDescriptionChars := config.GetMediaDescriptionMaxChars() if length := len([]rune(*form.AvatarDescription)); length > maxDescriptionChars { diff --git a/internal/api/client/instance/instancepatch_test.go b/internal/api/client/instance/instancepatch_test.go index 936d6efd9..605b056b9 100644 --- a/internal/api/client/instance/instancepatch_test.go +++ b/internal/api/client/instance/instancepatch_test.go @@ -109,7 +109,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch1() { "image/webp", "video/mp4" ], - "image_size_limit": 10485760, + "image_size_limit": 41943040, "image_matrix_limit": 16777216, "video_size_limit": 41943040, "video_frame_rate_limit": 60, @@ -230,7 +230,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch2() { "image/webp", "video/mp4" ], - "image_size_limit": 10485760, + "image_size_limit": 41943040, "image_matrix_limit": 16777216, "video_size_limit": 41943040, "video_frame_rate_limit": 60, @@ -351,7 +351,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch3() { "image/webp", "video/mp4" ], - "image_size_limit": 10485760, + "image_size_limit": 41943040, "image_matrix_limit": 16777216, "video_size_limit": 41943040, "video_frame_rate_limit": 60, @@ -523,7 +523,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch6() { "image/webp", "video/mp4" ], - "image_size_limit": 10485760, + "image_size_limit": 41943040, "image_matrix_limit": 16777216, "video_size_limit": 41943040, "video_frame_rate_limit": 60, @@ -666,7 +666,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch8() { "image/webp", "video/mp4" ], - "image_size_limit": 10485760, + "image_size_limit": 41943040, "image_matrix_limit": 16777216, "video_size_limit": 41943040, "video_frame_rate_limit": 60, @@ -754,7 +754,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch8() { "url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/attachment/original/`+instanceAccount.AvatarMediaAttachment.ID+`.gif",`+` "thumbnail_type": "image/gif", "thumbnail_description": "A bouncing little green peglin.", - "blurhash": "LG9t;qRS4YtO.4WDRlt5IXoxtPj[" + "blurhash": "LtJ[eKxu_4xt9Yj]M{WBt8WBM{WB" }`, string(instanceV2ThumbnailJson)) // double extra special bonus: now update the image description without changing the image @@ -824,7 +824,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch9() { "image/webp", "video/mp4" ], - "image_size_limit": 10485760, + "image_size_limit": 41943040, "image_matrix_limit": 16777216, "video_size_limit": 41943040, "video_frame_rate_limit": 60, diff --git a/internal/api/client/media/mediacreate.go b/internal/api/client/media/mediacreate.go index eef945d21..efe567f13 100644 --- a/internal/api/client/media/mediacreate.go +++ b/internal/api/client/media/mediacreate.go @@ -153,22 +153,9 @@ func validateCreateMedia(form *apimodel.AttachmentRequest) error { return errors.New("no attachment given") } - maxVideoSize := config.GetMediaVideoMaxSize() - maxImageSize := config.GetMediaImageMaxSize() minDescriptionChars := config.GetMediaDescriptionMinChars() maxDescriptionChars := config.GetMediaDescriptionMaxChars() - // a very superficial check to see if no size limits are exceeded - // we still don't actually know which media types we're dealing with but the other handlers will go into more detail there - maxSize := maxVideoSize - if maxImageSize > maxSize { - maxSize = maxImageSize - } - - if form.File.Size > int64(maxSize) { - return fmt.Errorf("file size limit exceeded: limit is %d bytes but attachment was %d bytes", maxSize, form.File.Size) - } - if length := len([]rune(form.Description)); length > maxDescriptionChars { return fmt.Errorf("image description length must be between %d and %d characters (inclusive), but provided image description was %d chars", minDescriptionChars, maxDescriptionChars, length) } diff --git a/internal/api/client/media/mediacreate_test.go b/internal/api/client/media/mediacreate_test.go index c2871aff0..2f6813a7c 100644 --- a/internal/api/client/media/mediacreate_test.go +++ b/internal/api/client/media/mediacreate_test.go @@ -206,7 +206,7 @@ func (suite *MediaCreateTestSuite) TestMediaCreateSuccessful() { Y: 0.5, }, }, *attachmentReply.Meta) - suite.Equal("LiBzRk#6V[WF_NvzV@WY_3rqV@a$", *attachmentReply.Blurhash) + suite.Equal("LjCGfG#6RkRn_NvzRjWF?urqV@a$", *attachmentReply.Blurhash) suite.NotEmpty(attachmentReply.ID) suite.NotEmpty(attachmentReply.URL) suite.NotEmpty(attachmentReply.PreviewURL) @@ -291,7 +291,7 @@ func (suite *MediaCreateTestSuite) TestMediaCreateSuccessfulV2() { Y: 0.5, }, }, *attachmentReply.Meta) - suite.Equal("LiBzRk#6V[WF_NvzV@WY_3rqV@a$", *attachmentReply.Blurhash) + suite.Equal("LjCGfG#6RkRn_NvzRjWF?urqV@a$", *attachmentReply.Blurhash) suite.NotEmpty(attachmentReply.ID) suite.Nil(attachmentReply.URL) suite.NotEmpty(attachmentReply.PreviewURL) |