From 672c133051f57e292332e018aee90dd834bc72a5 Mon Sep 17 00:00:00 2001 From: hnbnh Date: Wed, 26 Nov 2025 19:43:30 +0700 Subject: [PATCH 1/7] feat(media): add crossOrigin prop to Audio --- packages/media/src/audio/audio-for-preview.tsx | 6 ++++++ packages/media/src/audio/audio-for-rendering.tsx | 2 ++ packages/media/src/audio/props.ts | 1 + 3 files changed, 9 insertions(+) diff --git a/packages/media/src/audio/audio-for-preview.tsx b/packages/media/src/audio/audio-for-preview.tsx index 10ef6472634..3546f4702c7 100644 --- a/packages/media/src/audio/audio-for-preview.tsx +++ b/packages/media/src/audio/audio-for-preview.tsx @@ -50,6 +50,7 @@ type NewAudioForPreviewProps = { readonly toneFrequency: number | undefined; readonly audioStreamIndex: number | undefined; readonly fallbackHtml5AudioProps: FallbackHtml5AudioProps | undefined; + readonly crossOrigin?: '' | 'anonymous' | 'use-credentials'; }; const AudioForPreviewAssertedShowing: React.FC = ({ @@ -69,6 +70,7 @@ const AudioForPreviewAssertedShowing: React.FC = ({ toneFrequency, audioStreamIndex, fallbackHtml5AudioProps, + crossOrigin, }) => { const videoConfig = useUnsafeVideoConfig(); const frame = useCurrentFrame(); @@ -436,6 +438,7 @@ const AudioForPreviewAssertedShowing: React.FC = ({ toneFrequency={toneFrequency} audioStreamIndex={audioStreamIndex} pauseWhenBuffering={fallbackHtml5AudioProps?.pauseWhenBuffering} + crossOrigin={crossOrigin} {...fallbackHtml5AudioProps} /> ); @@ -469,6 +472,7 @@ type InnerAudioProps = { readonly toneFrequency?: number; readonly audioStreamIndex?: number; readonly fallbackHtml5AudioProps?: FallbackHtml5AudioProps; + readonly crossOrigin?: '' | 'anonymous' | 'use-credentials'; }; export const AudioForPreview: React.FC = ({ @@ -488,6 +492,7 @@ export const AudioForPreview: React.FC = ({ toneFrequency, audioStreamIndex, fallbackHtml5AudioProps, + crossOrigin, }) => { const preloadedSrc = usePreload(src); @@ -546,6 +551,7 @@ export const AudioForPreview: React.FC = ({ disallowFallbackToHtml5Audio={disallowFallbackToHtml5Audio ?? false} toneFrequency={toneFrequency} fallbackHtml5AudioProps={fallbackHtml5AudioProps} + crossOrigin={crossOrigin} /> ); }; diff --git a/packages/media/src/audio/audio-for-rendering.tsx b/packages/media/src/audio/audio-for-rendering.tsx index 27910c482fc..e947fbec9d8 100644 --- a/packages/media/src/audio/audio-for-rendering.tsx +++ b/packages/media/src/audio/audio-for-rendering.tsx @@ -21,6 +21,7 @@ export const AudioForRendering: React.FC = ({ playbackRate, src, muted, + crossOrigin, loopVolumeCurveBehavior, delayRenderRetries, delayRenderTimeoutInMilliseconds, @@ -272,6 +273,7 @@ export const AudioForRendering: React.FC = ({ style={style} loopVolumeCurveBehavior={loopVolumeCurveBehavior} audioStreamIndex={audioStreamIndex} + crossOrigin={crossOrigin} useWebAudioApi={fallbackHtml5AudioProps?.useWebAudioApi} onError={fallbackHtml5AudioProps?.onError} toneFrequency={toneFrequency} diff --git a/packages/media/src/audio/props.ts b/packages/media/src/audio/props.ts index 4b3b88337d3..829b8e758ca 100644 --- a/packages/media/src/audio/props.ts +++ b/packages/media/src/audio/props.ts @@ -17,6 +17,7 @@ export type AudioProps = { showInTimeline?: boolean; playbackRate?: number; muted?: boolean; + crossOrigin?: '' | 'anonymous' | 'use-credentials'; style?: React.CSSProperties; /** * @deprecated For internal use only From 2190af53b83b1ca330e38a443588c7a614bf4442 Mon Sep 17 00:00:00 2001 From: hnbnh Date: Wed, 26 Nov 2025 20:04:13 +0700 Subject: [PATCH 2/7] feat(media): add crossOrigin to video --- packages/media/src/video/props.ts | 1 + packages/media/src/video/video-for-preview.tsx | 3 +++ packages/media/src/video/video-for-rendering.tsx | 4 +++- packages/media/src/video/video.tsx | 5 +++++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/media/src/video/props.ts b/packages/media/src/video/props.ts index e8fde292f1b..8f6ad270652 100644 --- a/packages/media/src/video/props.ts +++ b/packages/media/src/video/props.ts @@ -32,6 +32,7 @@ type OptionalVideoProps = { delayRenderRetries: number | null; delayRenderTimeoutInMilliseconds: number | null; style: React.CSSProperties; + crossOrigin: '' | 'anonymous' | 'use-credentials' | undefined; /** * @deprecated For internal use only */ diff --git a/packages/media/src/video/video-for-preview.tsx b/packages/media/src/video/video-for-preview.tsx index 551f7c7adf0..91d1a5ca853 100644 --- a/packages/media/src/video/video-for-preview.tsx +++ b/packages/media/src/video/video-for-preview.tsx @@ -54,6 +54,7 @@ type VideoForPreviewProps = { readonly fallbackOffthreadVideoProps: FallbackOffthreadVideoProps; readonly audioStreamIndex: number; readonly debugOverlay: boolean; + readonly crossOrigin: '' | 'anonymous' | 'use-credentials' | undefined; }; const VideoForPreviewAssertedShowing: React.FC = ({ @@ -76,6 +77,7 @@ const VideoForPreviewAssertedShowing: React.FC = ({ fallbackOffthreadVideoProps, audioStreamIndex, debugOverlay, + crossOrigin, }) => { const src = usePreload(unpreloadedSrc); @@ -471,6 +473,7 @@ const VideoForPreviewAssertedShowing: React.FC = ({ loop={loop} showInTimeline={showInTimeline} stack={stack ?? undefined} + crossOrigin={crossOrigin} {...fallbackOffthreadVideoProps} /> ); diff --git a/packages/media/src/video/video-for-rendering.tsx b/packages/media/src/video/video-for-rendering.tsx index 6574e9f42a8..69f3f134130 100644 --- a/packages/media/src/video/video-for-rendering.tsx +++ b/packages/media/src/video/video-for-rendering.tsx @@ -48,6 +48,7 @@ type InnerVideoProps = { readonly toneFrequency: number; readonly trimBeforeValue: number | undefined; readonly trimAfterValue: number | undefined; + readonly crossOrigin: '' | 'anonymous' | 'use-credentials' | undefined; }; type FallbackToOffthreadVideo = { @@ -75,6 +76,7 @@ export const VideoForRendering: React.FC = ({ toneFrequency, trimAfterValue, trimBeforeValue, + crossOrigin, }) => { if (!src) { throw new TypeError('No `src` was passed to