diff options
author | 2024-11-04 14:00:10 +0000 | |
---|---|---|
committer | 2024-11-04 15:00:10 +0100 | |
commit | f3b2eca8b86c797170d198d2aeb16a4cadd71e41 (patch) | |
tree | e387216c9d91e1fefb50a02cee84c9e166558336 /internal/typeutils | |
parent | [bugfix] determine mime-type to use during ffprobe evaluation stage, don't bo... (diff) | |
download | gotosocial-f3b2eca8b86c797170d198d2aeb16a4cadd71e41.tar.xz |
[feature] add support for hinting via api/v_/instance preferred image / video max sizes (#3505)
* add support for hinting via api/v_/instance endpoints a preferred image / video size limit
* fix tests expecting old default values
Diffstat (limited to 'internal/typeutils')
-rw-r--r-- | internal/typeutils/internaltofrontend.go | 65 | ||||
-rw-r--r-- | internal/typeutils/internaltofrontend_test.go | 12 |
2 files changed, 51 insertions, 26 deletions
diff --git a/internal/typeutils/internaltofrontend.go b/internal/typeutils/internaltofrontend.go index 03b24fc9c..2a6d495d7 100644 --- a/internal/typeutils/internaltofrontend.go +++ b/internal/typeutils/internaltofrontend.go @@ -18,9 +18,11 @@ package typeutils import ( + "cmp" "context" "errors" "fmt" + "math" "slices" "strconv" "strings" @@ -42,16 +44,13 @@ import ( ) const ( - instanceStatusesCharactersReservedPerURL = 25 - instanceMediaAttachmentsImageMatrixLimit = 16777216 // width * height - instanceMediaAttachmentsVideoMatrixLimit = 16777216 // width * height - instanceMediaAttachmentsVideoFrameRateLimit = 60 - instancePollsMinExpiration = 300 // seconds - instancePollsMaxExpiration = 2629746 // seconds - instanceAccountsMaxFeaturedTags = 10 - instanceAccountsMaxProfileFields = 6 // FIXME: https://github.com/superseriousbusiness/gotosocial/issues/1876 - instanceSourceURL = "https://github.com/superseriousbusiness/gotosocial" - instanceMastodonVersion = "3.5.3" + instanceStatusesCharactersReservedPerURL = 25 + instancePollsMinExpiration = 300 // seconds + instancePollsMaxExpiration = 2629746 // seconds + instanceAccountsMaxFeaturedTags = 10 + instanceAccountsMaxProfileFields = 6 // FIXME: https://github.com/superseriousbusiness/gotosocial/issues/1876 + instanceSourceURL = "https://github.com/superseriousbusiness/gotosocial" + instanceMastodonVersion = "3.5.3" ) var instanceStatusesSupportedMimeTypes = []string{ @@ -1563,11 +1562,24 @@ func (c *Converter) InstanceToAPIV1Instance(ctx context.Context, i *gtsmodel.Ins instance.Configuration.Statuses.CharactersReservedPerURL = instanceStatusesCharactersReservedPerURL instance.Configuration.Statuses.SupportedMimeTypes = instanceStatusesSupportedMimeTypes instance.Configuration.MediaAttachments.SupportedMimeTypes = media.SupportedMIMETypes - instance.Configuration.MediaAttachments.ImageSizeLimit = int(config.GetMediaRemoteMaxSize()) // #nosec G115 -- Already validated. - instance.Configuration.MediaAttachments.ImageMatrixLimit = instanceMediaAttachmentsImageMatrixLimit - instance.Configuration.MediaAttachments.VideoSizeLimit = int(config.GetMediaRemoteMaxSize()) // #nosec G115 -- Already validated. - instance.Configuration.MediaAttachments.VideoFrameRateLimit = instanceMediaAttachmentsVideoFrameRateLimit - instance.Configuration.MediaAttachments.VideoMatrixLimit = instanceMediaAttachmentsVideoMatrixLimit + + // NOTE: we use the local max sizes here + // as it hints to apps like Tusky for image + // compression of locally uploaded media. + // + // TODO: return local / remote depending + // on authorized endpoint user (if any)? + localMax := config.GetMediaLocalMaxSize() + imageSz := cmp.Or(config.GetMediaImageSizeHint(), localMax) + videoSz := cmp.Or(config.GetMediaVideoSizeHint(), localMax) + instance.Configuration.MediaAttachments.ImageSizeLimit = int(imageSz) // #nosec G115 -- Already validated. + instance.Configuration.MediaAttachments.VideoSizeLimit = int(videoSz) // #nosec G115 -- Already validated. + + // we don't actually set any limits on these. set to max possible. + instance.Configuration.MediaAttachments.ImageMatrixLimit = math.MaxInt + instance.Configuration.MediaAttachments.VideoFrameRateLimit = math.MaxInt + instance.Configuration.MediaAttachments.VideoMatrixLimit = math.MaxInt + instance.Configuration.Polls.MaxOptions = config.GetStatusesPollMaxOptions() instance.Configuration.Polls.MaxCharactersPerOption = config.GetStatusesPollOptionMaxChars() instance.Configuration.Polls.MinExpiration = instancePollsMinExpiration @@ -1713,11 +1725,24 @@ func (c *Converter) InstanceToAPIV2Instance(ctx context.Context, i *gtsmodel.Ins instance.Configuration.Statuses.CharactersReservedPerURL = instanceStatusesCharactersReservedPerURL instance.Configuration.Statuses.SupportedMimeTypes = instanceStatusesSupportedMimeTypes instance.Configuration.MediaAttachments.SupportedMimeTypes = media.SupportedMIMETypes - instance.Configuration.MediaAttachments.ImageSizeLimit = int(config.GetMediaRemoteMaxSize()) // #nosec G115 -- Already validated. - instance.Configuration.MediaAttachments.ImageMatrixLimit = instanceMediaAttachmentsImageMatrixLimit - instance.Configuration.MediaAttachments.VideoSizeLimit = int(config.GetMediaRemoteMaxSize()) // #nosec G115 -- Already validated. - instance.Configuration.MediaAttachments.VideoFrameRateLimit = instanceMediaAttachmentsVideoFrameRateLimit - instance.Configuration.MediaAttachments.VideoMatrixLimit = instanceMediaAttachmentsVideoMatrixLimit + + // NOTE: we use the local max sizes here + // as it hints to apps like Tusky for image + // compression of locally uploaded media. + // + // TODO: return local / remote depending + // on authorized endpoint user (if any)? + localMax := config.GetMediaLocalMaxSize() + imageSz := cmp.Or(config.GetMediaImageSizeHint(), localMax) + videoSz := cmp.Or(config.GetMediaVideoSizeHint(), localMax) + instance.Configuration.MediaAttachments.ImageSizeLimit = int(imageSz) // #nosec G115 -- Already validated. + instance.Configuration.MediaAttachments.VideoSizeLimit = int(videoSz) // #nosec G115 -- Already validated. + + // we don't actually set any limits on these. set to max possible. + instance.Configuration.MediaAttachments.ImageMatrixLimit = math.MaxInt + instance.Configuration.MediaAttachments.VideoFrameRateLimit = math.MaxInt + instance.Configuration.MediaAttachments.VideoMatrixLimit = math.MaxInt + instance.Configuration.Polls.MaxOptions = config.GetStatusesPollMaxOptions() instance.Configuration.Polls.MaxCharactersPerOption = config.GetStatusesPollOptionMaxChars() instance.Configuration.Polls.MinExpiration = instancePollsMinExpiration diff --git a/internal/typeutils/internaltofrontend_test.go b/internal/typeutils/internaltofrontend_test.go index cf11655ca..6c318e851 100644 --- a/internal/typeutils/internaltofrontend_test.go +++ b/internal/typeutils/internaltofrontend_test.go @@ -1968,10 +1968,10 @@ func (suite *InternalToFrontendTestSuite) TestInstanceV1ToFrontend() { "video/x-matroska" ], "image_size_limit": 41943040, - "image_matrix_limit": 16777216, + "image_matrix_limit": 9223372036854775807, "video_size_limit": 41943040, - "video_frame_rate_limit": 60, - "video_matrix_limit": 16777216 + "video_frame_rate_limit": 9223372036854775807, + "video_matrix_limit": 9223372036854775807 }, "polls": { "max_options": 6, @@ -2113,10 +2113,10 @@ func (suite *InternalToFrontendTestSuite) TestInstanceV2ToFrontend() { "video/x-matroska" ], "image_size_limit": 41943040, - "image_matrix_limit": 16777216, + "image_matrix_limit": 9223372036854775807, "video_size_limit": 41943040, - "video_frame_rate_limit": 60, - "video_matrix_limit": 16777216 + "video_frame_rate_limit": 9223372036854775807, + "video_matrix_limit": 9223372036854775807 }, "polls": { "max_options": 6, |