summaryrefslogtreecommitdiff
path: root/internal/typeutils
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2024-11-04 14:00:10 +0000
committerLibravatar GitHub <noreply@github.com>2024-11-04 15:00:10 +0100
commitf3b2eca8b86c797170d198d2aeb16a4cadd71e41 (patch)
treee387216c9d91e1fefb50a02cee84c9e166558336 /internal/typeutils
parent[bugfix] determine mime-type to use during ffprobe evaluation stage, don't bo... (diff)
downloadgotosocial-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.go65
-rw-r--r--internal/typeutils/internaltofrontend_test.go12
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,