mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-11-26 14:03:32 -06:00
[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
This commit is contained in:
parent
8f288f1689
commit
f3b2eca8b8
8 changed files with 161 additions and 44 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue