From 0b466fd8906cf4b235e057c9b2d2067bce354796 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 2 Jun 2026 17:06:47 +0300 Subject: [PATCH] Ungate video upload size change (#10683) (cherry picked from commit fd9f988b905326c1bf81c3ed1c03f6bf549f32ff) --- src/analytics/features/types.ts | 1 - src/lib/constants.ts | 4 +-- src/lib/media/video/compress.ts | 1 - src/lib/media/video/compress.web.ts | 12 +++------ src/view/com/composer/Composer.tsx | 10 ++----- src/view/com/composer/SelectMediaButton.tsx | 8 ++++-- src/view/com/composer/state/video.ts | 29 +++++---------------- 7 files changed, 20 insertions(+), 45 deletions(-) diff --git a/src/analytics/features/types.ts b/src/analytics/features/types.ts index bd48bd5851..39df48e532 100644 --- a/src/analytics/features/types.ts +++ b/src/analytics/features/types.ts @@ -16,7 +16,6 @@ export enum Features { DmsNewMessageComposerEnable = 'dms:new_message_composer:enable', ComposerLanguageDetectionEnable = 'composer:language_detection:enable', PostGalleryEmbedEnable = 'post_gallery_embed:enable', - LargeVideoUploads = 'large_video_uploads:enable', AATest = 'aa-test', } diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 59d82e94f9..95eb57fd54 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -188,8 +188,8 @@ export const VIDEO_MAX_DURATION_MS = 3 * 60 * 1000 // 3 minutes in milliseconds * Maximum size of a video in megabytes, _not_ mebibytes. Backend uses * ISO megabytes. */ -export const VIDEO_MAX_SIZE_REDUCED = 1000 * 1000 * 100 // 100mb -export const VIDEO_MAX_SIZE = 3000 * 1000 * 100 // 300mb +export const VIDEO_MAX_SIZE_MB = 300 +export const VIDEO_MAX_SIZE = VIDEO_MAX_SIZE_MB * 1000 * 1000 // 300mb export const SUPPORTED_MIME_TYPES = [ 'video/mp4', diff --git a/src/lib/media/video/compress.ts b/src/lib/media/video/compress.ts index 60eda2dcee..1d00bfcea1 100644 --- a/src/lib/media/video/compress.ts +++ b/src/lib/media/video/compress.ts @@ -12,7 +12,6 @@ export async function compressVideo( opts?: { signal?: AbortSignal onProgress?: (progress: number) => void - TEMP_enableLargeVideoUploads?: boolean }, ): Promise { const {onProgress, signal} = opts || {} diff --git a/src/lib/media/video/compress.web.ts b/src/lib/media/video/compress.web.ts index 63921fe8e7..83fdfde533 100644 --- a/src/lib/media/video/compress.web.ts +++ b/src/lib/media/video/compress.web.ts @@ -1,28 +1,22 @@ import {type ImagePickerAsset} from 'expo-image-picker' -import {VIDEO_MAX_SIZE, VIDEO_MAX_SIZE_REDUCED} from '#/lib/constants' +import {VIDEO_MAX_SIZE} from '#/lib/constants' import {VideoTooLargeError} from '#/lib/media/video/errors' import {type CompressedVideo} from './types' // doesn't actually compress, converts to ArrayBuffer export async function compressVideo( asset: ImagePickerAsset, - opts?: { + _opts?: { signal?: AbortSignal onProgress?: (progress: number) => void - TEMP_enableLargeVideoUploads?: number }, ): Promise { const {mimeType, base64} = parseDataUrl(asset.uri) const blob = base64ToBlob(base64, mimeType) const uri = URL.createObjectURL(blob) - if ( - blob.size > - (opts?.TEMP_enableLargeVideoUploads - ? VIDEO_MAX_SIZE - : VIDEO_MAX_SIZE_REDUCED) - ) { + if (blob.size > VIDEO_MAX_SIZE) { throw new VideoTooLargeError() } diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 033341f2c2..7299abcb1b 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -222,10 +222,6 @@ export const ComposePost = ({ const [publishingStage, setPublishingStage] = useState('') const [error, setError] = useState('') - const enableLargeVideoUploads = ax.features.enabled( - ax.features.LargeVideoUploads, - ) - /** * Track when a draft was created so we can measure draft age in metrics. * Set when a draft is loaded via handleSelectDraft. @@ -348,10 +344,9 @@ export const ComposePost = ({ currentDid, abortController.signal, i18n, - enableLargeVideoUploads, ) }, - [i18n, agent, currentDid, composerDispatch, enableLargeVideoUploads], + [i18n, agent, currentDid, composerDispatch], ) const onInitVideo = useNonReactiveCallback(() => { @@ -496,7 +491,6 @@ export const ComposePost = ({ currentDid, abortController.signal, i18n, - enableLargeVideoUploads, ) } catch (e) { logger.error('Failed to restore video from draft', { @@ -505,7 +499,7 @@ export const ComposePost = ({ }) } }, - [i18n, agent, currentDid, composerDispatch, enableLargeVideoUploads], + [i18n, agent, currentDid, composerDispatch], ) const handleSelectDraft = useCallback( diff --git a/src/view/com/composer/SelectMediaButton.tsx b/src/view/com/composer/SelectMediaButton.tsx index 8f44cfc3e7..2d70195488 100644 --- a/src/view/com/composer/SelectMediaButton.tsx +++ b/src/view/com/composer/SelectMediaButton.tsx @@ -5,7 +5,11 @@ import {type ImagePickerAsset} from 'expo-image-picker' import {msg, plural} from '@lingui/core/macro' import {useLingui} from '@lingui/react' -import {VIDEO_MAX_DURATION_MS, VIDEO_MAX_SIZE} from '#/lib/constants' +import { + VIDEO_MAX_DURATION_MS, + VIDEO_MAX_SIZE, + VIDEO_MAX_SIZE_MB, +} from '#/lib/constants' import { usePhotoLibraryPermission, useVideoLibraryPermission, @@ -431,7 +435,7 @@ export function SelectMediaButton({ msg`You can only select one GIF at a time.`, ), [SelectedAssetError.FileTooBig]: _( - msg`One or more of your selected files are too large. Maximum size is 100 MB.`, + msg`One or more of your selected files are too large. Maximum size is ${VIDEO_MAX_SIZE_MB} MB.`, ), }[error] }) diff --git a/src/view/com/composer/state/video.ts b/src/view/com/composer/state/video.ts index b99d0a1e9d..6d73e846e6 100644 --- a/src/view/com/composer/state/video.ts +++ b/src/view/com/composer/state/video.ts @@ -4,6 +4,7 @@ import {type I18n} from '@lingui/core' import {msg} from '@lingui/core/macro' import {AbortError} from '#/lib/async/cancelable' +import {VIDEO_MAX_SIZE_MB} from '#/lib/constants' import {compressVideo} from '#/lib/media/video/compress' import { ServerError, @@ -264,7 +265,6 @@ export async function processVideo( did: string, signal: AbortSignal, i18n: I18n, - TEMP_enableLargeVideoUploads: boolean, ) { let video: CompressedVideo | undefined try { @@ -273,14 +273,9 @@ export async function processVideo( dispatch({type: 'update_progress', progress: trunc2dp(num), signal}) }, signal, - TEMP_enableLargeVideoUploads, }) } catch (e) { - const message = getCompressErrorMessage( - e, - i18n, - TEMP_enableLargeVideoUploads, - ) + const message = getCompressErrorMessage(e, i18n) if (message !== null) { dispatch({ type: 'to_error', @@ -309,7 +304,7 @@ export async function processVideo( }, }) } catch (e) { - const message = getUploadErrorMessage(e, i18n, TEMP_enableLargeVideoUploads) + const message = getUploadErrorMessage(e, i18n) if (message !== null) { dispatch({ type: 'to_error', @@ -393,30 +388,20 @@ export async function processVideo( } } -function getCompressErrorMessage( - e: unknown, - i18n: I18n, - TEMP_enableLargeVideoUploads: boolean, -): string | null { - const videoSize = TEMP_enableLargeVideoUploads ? 300 : 100 +function getCompressErrorMessage(e: unknown, i18n: I18n): string | null { if (e instanceof AbortError) { return null } if (e instanceof VideoTooLargeError) { return i18n._( - msg`The selected video is larger than ${videoSize} MB. Please try again with a smaller file.`, + msg`The selected video is larger than ${VIDEO_MAX_SIZE_MB} MB. Please try again with a smaller file.`, ) } logger.error('Error compressing video', {safeMessage: e}) return i18n._(msg`An error occurred while compressing the video.`) } -function getUploadErrorMessage( - e: unknown, - i18n: I18n, - TEMP_enableLargeVideoUploads: boolean, -): string | null { - const videoSize = TEMP_enableLargeVideoUploads ? 300 : 100 +function getUploadErrorMessage(e: unknown, i18n: I18n): string | null { if (e instanceof AbortError) { return null } @@ -448,7 +433,7 @@ function getUploadErrorMessage( case 'file size (100000001 bytes) is larger than the maximum allowed size (100000000 bytes)': case 'file size (300000001 bytes) is larger than the maximum allowed size (300000000 bytes)': return i18n._( - msg`The selected video is larger than ${videoSize} MB. Please try again with a smaller file.`, + msg`The selected video is larger than ${VIDEO_MAX_SIZE_MB} MB. Please try again with a smaller file.`, ) case 'Confirm your email address to upload videos': return i18n._(msg`Please confirm your email address to upload videos.`)