diff --git a/app/javascript/mastodon/features/compose/containers/upload_button_container.js b/app/javascript/mastodon/features/compose/containers/upload_button_container.js index a5ae874b066..aa5ac8d1c8e 100644 --- a/app/javascript/mastodon/features/compose/containers/upload_button_container.js +++ b/app/javascript/mastodon/features/compose/containers/upload_button_container.js @@ -9,12 +9,13 @@ const mapStateToProps = state => { const readyAttachmentsSize = state.getIn(['compose', 'media_attachments']).size ?? 0; const pendingAttachmentsSize = state.getIn(['compose', 'pending_media_attachments']).size ?? 0; const attachmentsSize = readyAttachmentsSize + pendingAttachmentsSize; + const allowMixMedia = state.getIn(['server', 'server', 'configuration', 'media_attachments', 'allow_mix_media'], false); const isOverLimit = attachmentsSize > state.getIn(['server', 'server', 'configuration', 'statuses', 'max_media_attachments'])-1; const hasVideoOrAudio = state.getIn(['compose', 'media_attachments']).some(m => ['video', 'audio'].includes(m.get('type'))); const hasQuote = !!state.compose.get('quoted_status_id'); return { - disabled: isPoll || isUploading || isOverLimit || hasVideoOrAudio || hasQuote, + disabled: isPoll || isUploading || isOverLimit || (!allowMixMedia && hasVideoOrAudio) || hasQuote, resetFileKey: state.getIn(['compose', 'resetFileKey']), }; }; diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index 2615eed4e39..be118b90bfd 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -40,6 +40,8 @@ class MediaAttachment < ApplicationRecord MAX_DESCRIPTION_LENGTH = 1_500 + ALLOW_MIX_MEDIA = false + IMAGE_LIMIT = 16.megabytes VIDEO_LIMIT = 99.megabytes diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index 36ddfae3286..3d0505b3880 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -87,6 +87,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer video_frame_rate_limit: MediaAttachment::MAX_VIDEO_FRAME_RATE, video_matrix_limit: MediaAttachment::MAX_VIDEO_MATRIX_LIMIT, video_size_limit: MediaAttachment::VIDEO_LIMIT, + allow_mix_media: MediaAttachment::ALLOW_MIX_MEDIA, }, polls: { diff --git a/app/serializers/rest/v1/instance_serializer.rb b/app/serializers/rest/v1/instance_serializer.rb index a1d51f50e42..a49bee53b0f 100644 --- a/app/serializers/rest/v1/instance_serializer.rb +++ b/app/serializers/rest/v1/instance_serializer.rb @@ -67,6 +67,7 @@ class REST::V1::InstanceSerializer < ActiveModel::Serializer video_size_limit: MediaAttachment::VIDEO_LIMIT, video_frame_rate_limit: MediaAttachment::MAX_VIDEO_FRAME_RATE, video_matrix_limit: MediaAttachment::MAX_VIDEO_MATRIX_LIMIT, + allow_mix_media: MediaAttachment::ALLOW_MIX_MEDIA, }, polls: { diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 3e4a715225a..2b6f3b06205 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -172,7 +172,7 @@ class PostStatusService < BaseService not_found_ids = @options[:media_ids].map(&:to_i) - @media.map(&:id) raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_found', ids: not_found_ids.join(', ')) if not_found_ids.any? - raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if @media.size > 1 && @media.find(&:audio_or_video?) + raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if !MediaAttachment::ALLOW_MIX_MEDIA && @media.size > 1 && @media.find(&:audio_or_video?) raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_ready') if @media.any?(&:not_processed?) end diff --git a/app/services/update_status_service.rb b/app/services/update_status_service.rb index 4b871211a46..796319a41de 100644 --- a/app/services/update_status_service.rb +++ b/app/services/update_status_service.rb @@ -76,7 +76,7 @@ class UpdateStatusService < BaseService not_found_ids = @options[:media_ids].map(&:to_i) - media_attachments.map(&:id) raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_found', ids: not_found_ids.join(', ')) if not_found_ids.any? - raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if media_attachments.size > 1 && media_attachments.find(&:audio_or_video?) + raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if !MediaAttachment::ALLOW_MIX_MEDIA && media_attachments.size > 1 && media_attachments.find(&:audio_or_video?) raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_ready') if media_attachments.any?(&:not_processed?) media_attachments