@remotion/player 4.0.219 → 4.0.221

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/cjs/Player.d.ts +2 -0
  2. package/dist/cjs/Player.js +7 -2
  3. package/dist/cjs/PlayerUI.d.ts +2 -0
  4. package/dist/cjs/PlayerUI.js +2 -1
  5. package/dist/cjs/browser-mediasession.d.ts +13 -0
  6. package/dist/cjs/browser-mediasession.js +111 -0
  7. package/dist/cjs/index.d.ts +2 -1
  8. package/dist/cjs/use-playback.d.ts +3 -1
  9. package/dist/cjs/use-playback.js +8 -1
  10. package/dist/esm/index.mjs +215 -91
  11. package/package.json +2 -2
  12. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/BufferingIndicator.d.ts +0 -5
  13. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/BufferingIndicator.js +0 -38
  14. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/DefaultPlayPauseButton.d.ts +0 -5
  15. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/DefaultPlayPauseButton.js +0 -12
  16. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/EmitterProvider.d.ts +0 -5
  17. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/EmitterProvider.js +0 -20
  18. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/MediaVolumeSlider.d.ts +0 -5
  19. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/MediaVolumeSlider.js +0 -129
  20. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlaybackrateControl.d.ts +0 -8
  21. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlaybackrateControl.js +0 -156
  22. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/Player.d.ts +0 -56
  23. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/Player.js +0 -143
  24. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlayerControls.d.ts +0 -47
  25. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlayerControls.js +0 -176
  26. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlayerSeekBar.d.ts +0 -8
  27. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlayerSeekBar.js +0 -145
  28. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlayerUI.d.ts +0 -46
  29. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlayerUI.js +0 -369
  30. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/SharedPlayerContext.d.ts +0 -15
  31. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/SharedPlayerContext.js +0 -55
  32. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/Thumbnail.d.ts +0 -23
  33. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/Thumbnail.js +0 -48
  34. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/ThumbnailUI.d.ts +0 -11
  35. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/ThumbnailUI.js +0 -89
  36. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/calculate-next-frame.d.ts +0 -14
  37. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/calculate-next-frame.js +0 -24
  38. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/calculate-scale.d.ts +0 -50
  39. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/calculate-scale.js +0 -72
  40. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/emitter-context.d.ts +0 -4
  41. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/emitter-context.js +0 -3
  42. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/error-boundary.d.ts +0 -19
  43. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/error-boundary.js +0 -32
  44. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/event-emitter.d.ts +0 -91
  45. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/event-emitter.js +0 -114
  46. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/format-time.d.ts +0 -1
  47. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/format-time.js +0 -5
  48. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/icons.d.ts +0 -10
  49. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/icons.js +0 -39
  50. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/index.d.ts +0 -64
  51. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/index.js +0 -23
  52. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/is-backgrounded.d.ts +0 -2
  53. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/is-backgrounded.js +0 -20
  54. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/player-css-classname.d.ts +0 -1
  55. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/player-css-classname.js +0 -1
  56. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/player-methods.d.ts +0 -25
  57. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/player-methods.js +0 -1
  58. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/index.test.d.ts +0 -1
  59. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/index.test.js +0 -7
  60. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/test-utils.d.ts +0 -6
  61. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/test-utils.js +0 -14
  62. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/validate-in-out-frames.test.d.ts +0 -1
  63. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/validate-in-out-frames.test.js +0 -54
  64. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/validate-prop.test.d.ts +0 -1
  65. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/validate-prop.test.js +0 -129
  66. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-buffer-state-emitter.d.ts +0 -2
  67. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-buffer-state-emitter.js +0 -22
  68. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-hover-state.d.ts +0 -1
  69. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-hover-state.js +0 -43
  70. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-playback.d.ts +0 -8
  71. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-playback.js +0 -157
  72. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-player.d.ts +0 -24
  73. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-player.js +0 -157
  74. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-thumbnail.d.ts +0 -6
  75. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-thumbnail.js +0 -14
  76. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-video-controls-resize.d.ts +0 -11
  77. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-video-controls-resize.js +0 -35
  78. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/calculate-player-size.d.ts +0 -9
  79. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/calculate-player-size.js +0 -24
  80. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/cancellable-promise.d.ts +0 -5
  81. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/cancellable-promise.js +0 -22
  82. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/delay.d.ts +0 -1
  83. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/delay.js +0 -2
  84. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/is-node.d.ts +0 -1
  85. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/is-node.js +0 -1
  86. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/props-if-has-props.d.ts +0 -10
  87. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/props-if-has-props.js +0 -1
  88. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-cancellable-promises.d.ts +0 -7
  89. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-cancellable-promises.js +0 -18
  90. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-click-prevention-on-double-click.d.ts +0 -3
  91. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-click-prevention-on-double-click.js +0 -41
  92. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-component-visible.d.ts +0 -6
  93. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-component-visible.js +0 -18
  94. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-element-size.d.ts +0 -16
  95. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-element-size.js +0 -127
  96. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/validate-in-out-frame.d.ts +0 -6
  97. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/validate-in-out-frame.js +0 -49
  98. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/validate-initial-frame.d.ts +0 -4
  99. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/validate-initial-frame.js +0 -23
  100. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/validate-playbackrate.d.ts +0 -1
  101. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/validate-playbackrate.js +0 -14
  102. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/validate.d.ts +0 -5
  103. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/validate.js +0 -6
  104. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/volume-persistance.d.ts +0 -2
  105. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/volume-persistance.js +0 -29
  106. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/tsconfig-esm.tsbuildinfo +0 -1
@@ -5,6 +5,7 @@ import type { AnyZodObject } from 'zod';
5
5
  import type { RenderMuteButton } from './MediaVolumeSlider.js';
6
6
  import type { RenderFullscreenButton, RenderPlayPauseButton } from './PlayerControls.js';
7
7
  import type { PosterFillMode, RenderLoading, RenderPoster } from './PlayerUI.js';
8
+ import type { BrowserMediaControlsBehavior } from './browser-mediasession.js';
8
9
  import type { PlayerRef } from './player-methods.js';
9
10
  import type { RenderVolumeSlider } from './render-volume-slider.js';
10
11
  import type { PropsIfHasProps } from './utils/props-if-has-props.js';
@@ -52,6 +53,7 @@ export type PlayerProps<Schema extends AnyZodObject, Props extends Record<string
52
53
  readonly bufferStateDelayInMilliseconds?: number;
53
54
  readonly hideControlsWhenPointerDoesntMove?: boolean | number;
54
55
  readonly overflowVisible?: boolean;
56
+ readonly browserMediaControlsBehavior?: BrowserMediaControlsBehavior;
55
57
  } & CompProps<Props> & PropsIfHasProps<Schema, Props>;
56
58
  export type PlayerPropsWithoutZod<Props extends Record<string, unknown>> = PlayerProps<AnyZodObject, Props>;
57
59
  export declare const componentOrNullIfLazy: <Props>(props: CompProps<Props>) => ComponentType<Props> | null;
@@ -22,7 +22,7 @@ const componentOrNullIfLazy = (props) => {
22
22
  return null;
23
23
  };
24
24
  exports.componentOrNullIfLazy = componentOrNullIfLazy;
25
- const PlayerFn = ({ durationInFrames, compositionHeight, compositionWidth, fps, inputProps, style, controls = false, loop = false, autoPlay = false, showVolumeControls = true, allowFullscreen = true, clickToPlay, doubleClickToFullscreen = false, spaceKeyToPlayOrPause = true, moveToBeginningWhenEnded = true, numberOfSharedAudioTags = 5, errorFallback = () => '⚠️', playbackRate = 1, renderLoading, className, showPosterWhenUnplayed, showPosterWhenEnded, showPosterWhenPaused, showPosterWhenBuffering, initialFrame, renderPoster, inFrame, outFrame, initiallyShowControls, renderFullscreenButton, renderPlayPauseButton, renderVolumeSlider, alwaysShowControls = false, initiallyMuted = false, showPlaybackRateControl = false, posterFillMode = 'player-size', bufferStateDelayInMilliseconds, hideControlsWhenPointerDoesntMove = true, overflowVisible = false, renderMuteButton, ...componentProps }, ref) => {
25
+ const PlayerFn = ({ durationInFrames, compositionHeight, compositionWidth, fps, inputProps, style, controls = false, loop = false, autoPlay = false, showVolumeControls = true, allowFullscreen = true, clickToPlay, doubleClickToFullscreen = false, spaceKeyToPlayOrPause = true, moveToBeginningWhenEnded = true, numberOfSharedAudioTags = 5, errorFallback = () => '⚠️', playbackRate = 1, renderLoading, className, showPosterWhenUnplayed, showPosterWhenEnded, showPosterWhenPaused, showPosterWhenBuffering, initialFrame, renderPoster, inFrame, outFrame, initiallyShowControls, renderFullscreenButton, renderPlayPauseButton, renderVolumeSlider, alwaysShowControls = false, initiallyMuted = false, showPlaybackRateControl = false, posterFillMode = 'player-size', bufferStateDelayInMilliseconds, hideControlsWhenPointerDoesntMove = true, overflowVisible = false, renderMuteButton, browserMediaControlsBehavior: passedBrowserMediaControlsBehavior, ...componentProps }, ref) => {
26
26
  if (typeof window !== 'undefined') {
27
27
  // eslint-disable-next-line react-hooks/rules-of-hooks
28
28
  (0, react_1.useLayoutEffect)(() => {
@@ -138,9 +138,14 @@ const PlayerFn = ({ durationInFrames, compositionHeight, compositionWidth, fps,
138
138
  }, []);
139
139
  }
140
140
  const actualInputProps = (0, react_1.useMemo)(() => inputProps !== null && inputProps !== void 0 ? inputProps : {}, [inputProps]);
141
+ const browserMediaControlsBehavior = (0, react_1.useMemo)(() => {
142
+ return (passedBrowserMediaControlsBehavior !== null && passedBrowserMediaControlsBehavior !== void 0 ? passedBrowserMediaControlsBehavior : {
143
+ mode: 'prevent-media-session',
144
+ });
145
+ }, [passedBrowserMediaControlsBehavior]);
141
146
  return ((0, jsx_runtime_1.jsx)(remotion_1.Internals.IsPlayerContextProvider, { children: (0, jsx_runtime_1.jsx)(SharedPlayerContext_js_1.SharedPlayerContexts, { timelineContext: timelineContextValue, component: component, compositionHeight: compositionHeight, compositionWidth: compositionWidth, durationInFrames: durationInFrames, fps: fps, numberOfSharedAudioTags: numberOfSharedAudioTags, initiallyMuted: initiallyMuted, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.Timeline.SetTimelineContext.Provider, { value: setTimelineContextValue, children: (0, jsx_runtime_1.jsx)(EmitterProvider_js_1.PlayerEmitterProvider, { currentPlaybackRate: currentPlaybackRate, children: (0, jsx_runtime_1.jsx)(PlayerUI_js_1.default, { ref: rootRef, posterFillMode: posterFillMode, renderLoading: renderLoading, autoPlay: Boolean(autoPlay), loop: Boolean(loop), controls: Boolean(controls), errorFallback: errorFallback, style: style, inputProps: actualInputProps, allowFullscreen: Boolean(allowFullscreen), moveToBeginningWhenEnded: Boolean(moveToBeginningWhenEnded), clickToPlay: typeof clickToPlay === 'boolean'
142
147
  ? clickToPlay
143
- : Boolean(controls), showVolumeControls: Boolean(showVolumeControls), doubleClickToFullscreen: Boolean(doubleClickToFullscreen), spaceKeyToPlayOrPause: Boolean(spaceKeyToPlayOrPause), playbackRate: currentPlaybackRate, className: className !== null && className !== void 0 ? className : undefined, showPosterWhenUnplayed: Boolean(showPosterWhenUnplayed), showPosterWhenEnded: Boolean(showPosterWhenEnded), showPosterWhenPaused: Boolean(showPosterWhenPaused), showPosterWhenBuffering: Boolean(showPosterWhenBuffering), renderPoster: renderPoster, inFrame: inFrame !== null && inFrame !== void 0 ? inFrame : null, outFrame: outFrame !== null && outFrame !== void 0 ? outFrame : null, initiallyShowControls: initiallyShowControls !== null && initiallyShowControls !== void 0 ? initiallyShowControls : true, renderFullscreen: renderFullscreenButton !== null && renderFullscreenButton !== void 0 ? renderFullscreenButton : null, renderPlayPauseButton: renderPlayPauseButton !== null && renderPlayPauseButton !== void 0 ? renderPlayPauseButton : null, renderMuteButton: renderMuteButton !== null && renderMuteButton !== void 0 ? renderMuteButton : null, renderVolumeSlider: renderVolumeSlider !== null && renderVolumeSlider !== void 0 ? renderVolumeSlider : null, alwaysShowControls: alwaysShowControls, showPlaybackRateControl: showPlaybackRateControl, bufferStateDelayInMilliseconds: bufferStateDelayInMilliseconds !== null && bufferStateDelayInMilliseconds !== void 0 ? bufferStateDelayInMilliseconds : 300, hideControlsWhenPointerDoesntMove: hideControlsWhenPointerDoesntMove, overflowVisible: overflowVisible }) }) }) }) }));
148
+ : Boolean(controls), showVolumeControls: Boolean(showVolumeControls), doubleClickToFullscreen: Boolean(doubleClickToFullscreen), spaceKeyToPlayOrPause: Boolean(spaceKeyToPlayOrPause), playbackRate: currentPlaybackRate, className: className !== null && className !== void 0 ? className : undefined, showPosterWhenUnplayed: Boolean(showPosterWhenUnplayed), showPosterWhenEnded: Boolean(showPosterWhenEnded), showPosterWhenPaused: Boolean(showPosterWhenPaused), showPosterWhenBuffering: Boolean(showPosterWhenBuffering), renderPoster: renderPoster, inFrame: inFrame !== null && inFrame !== void 0 ? inFrame : null, outFrame: outFrame !== null && outFrame !== void 0 ? outFrame : null, initiallyShowControls: initiallyShowControls !== null && initiallyShowControls !== void 0 ? initiallyShowControls : true, renderFullscreen: renderFullscreenButton !== null && renderFullscreenButton !== void 0 ? renderFullscreenButton : null, renderPlayPauseButton: renderPlayPauseButton !== null && renderPlayPauseButton !== void 0 ? renderPlayPauseButton : null, renderMuteButton: renderMuteButton !== null && renderMuteButton !== void 0 ? renderMuteButton : null, renderVolumeSlider: renderVolumeSlider !== null && renderVolumeSlider !== void 0 ? renderVolumeSlider : null, alwaysShowControls: alwaysShowControls, showPlaybackRateControl: showPlaybackRateControl, bufferStateDelayInMilliseconds: bufferStateDelayInMilliseconds !== null && bufferStateDelayInMilliseconds !== void 0 ? bufferStateDelayInMilliseconds : 300, hideControlsWhenPointerDoesntMove: hideControlsWhenPointerDoesntMove, overflowVisible: overflowVisible, browserMediaControlsBehavior: browserMediaControlsBehavior }) }) }) }) }));
144
149
  };
145
150
  const forward = react_1.forwardRef;
146
151
  /**
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { RenderMuteButton } from './MediaVolumeSlider.js';
3
3
  import type { RenderFullscreenButton, RenderPlayPauseButton } from './PlayerControls.js';
4
+ import type { BrowserMediaControlsBehavior } from './browser-mediasession.js';
4
5
  import type { PlayerRef } from './player-methods.js';
5
6
  import type { RenderVolumeSlider } from './render-volume-slider.js';
6
7
  export type ErrorFallback = (info: {
@@ -47,5 +48,6 @@ declare const _default: React.ForwardRefExoticComponent<{
47
48
  readonly bufferStateDelayInMilliseconds: number;
48
49
  readonly hideControlsWhenPointerDoesntMove: boolean | number;
49
50
  readonly overflowVisible: boolean;
51
+ readonly browserMediaControlsBehavior: BrowserMediaControlsBehavior;
50
52
  } & React.RefAttributes<PlayerRef>>;
51
53
  export default _default;
@@ -40,7 +40,7 @@ if (reactVersion === '0') {
40
40
  throw new Error(`Version ${reactVersion} of "react" is not supported by Remotion`);
41
41
  }
42
42
  const doesReactVersionSupportSuspense = parseInt(reactVersion, 10) >= 18;
43
- const PlayerUI = ({ controls, style, loop, autoPlay, allowFullscreen, inputProps, clickToPlay, showVolumeControls, doubleClickToFullscreen, spaceKeyToPlayOrPause, errorFallback, playbackRate, renderLoading, renderPoster, className, moveToBeginningWhenEnded, showPosterWhenUnplayed, showPosterWhenEnded, showPosterWhenPaused, showPosterWhenBuffering, inFrame, outFrame, initiallyShowControls, renderFullscreen: renderFullscreenButton, renderPlayPauseButton, renderMuteButton, renderVolumeSlider, alwaysShowControls, showPlaybackRateControl, posterFillMode, bufferStateDelayInMilliseconds, hideControlsWhenPointerDoesntMove, overflowVisible, }, ref) => {
43
+ const PlayerUI = ({ controls, style, loop, autoPlay, allowFullscreen, inputProps, clickToPlay, showVolumeControls, doubleClickToFullscreen, spaceKeyToPlayOrPause, errorFallback, playbackRate, renderLoading, renderPoster, className, moveToBeginningWhenEnded, showPosterWhenUnplayed, showPosterWhenEnded, showPosterWhenPaused, showPosterWhenBuffering, inFrame, outFrame, initiallyShowControls, renderFullscreen: renderFullscreenButton, renderPlayPauseButton, renderMuteButton, renderVolumeSlider, alwaysShowControls, showPlaybackRateControl, posterFillMode, bufferStateDelayInMilliseconds, hideControlsWhenPointerDoesntMove, overflowVisible, browserMediaControlsBehavior, }, ref) => {
44
44
  var _a, _b, _c;
45
45
  const config = remotion_1.Internals.useUnsafeVideoConfig();
46
46
  const video = remotion_1.Internals.useVideo();
@@ -69,6 +69,7 @@ const PlayerUI = ({ controls, style, loop, autoPlay, allowFullscreen, inputProps
69
69
  inFrame,
70
70
  outFrame,
71
71
  frameRef: player.remotionInternal_currentFrameRef,
72
+ browserMediaControlsBehavior,
72
73
  });
73
74
  (0, react_1.useEffect)(() => {
74
75
  if (hasPausedToResume && !player.playing) {
@@ -0,0 +1,13 @@
1
+ import type { VideoConfig } from 'remotion';
2
+ export type BrowserMediaControlsBehavior = {
3
+ mode: 'do-nothing';
4
+ } | {
5
+ mode: 'prevent-media-session';
6
+ } | {
7
+ mode: 'register-media-session';
8
+ };
9
+ export declare const useBrowserMediaSession: ({ browserMediaControlsBehavior, videoConfig, playbackRate, }: {
10
+ browserMediaControlsBehavior: BrowserMediaControlsBehavior;
11
+ videoConfig: VideoConfig | null;
12
+ playbackRate: number;
13
+ }) => void;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useBrowserMediaSession = void 0;
4
+ const react_1 = require("react");
5
+ const use_player_js_1 = require("./use-player.js");
6
+ const useBrowserMediaSession = ({ browserMediaControlsBehavior, videoConfig, playbackRate, }) => {
7
+ const { playing, pause, play, emitter, getCurrentFrame, seek } = (0, use_player_js_1.usePlayer)();
8
+ (0, react_1.useEffect)(() => {
9
+ if (!navigator.mediaSession) {
10
+ return;
11
+ }
12
+ if (browserMediaControlsBehavior.mode === 'do-nothing') {
13
+ return;
14
+ }
15
+ if (playing) {
16
+ navigator.mediaSession.playbackState = 'playing';
17
+ }
18
+ else {
19
+ navigator.mediaSession.playbackState = 'paused';
20
+ }
21
+ }, [browserMediaControlsBehavior.mode, playing]);
22
+ (0, react_1.useEffect)(() => {
23
+ if (!navigator.mediaSession) {
24
+ return;
25
+ }
26
+ if (browserMediaControlsBehavior.mode === 'do-nothing') {
27
+ return;
28
+ }
29
+ const onTimeUpdate = () => {
30
+ if (!videoConfig) {
31
+ return;
32
+ }
33
+ if (navigator.mediaSession) {
34
+ navigator.mediaSession.setPositionState({
35
+ duration: videoConfig.durationInFrames / videoConfig.fps,
36
+ playbackRate,
37
+ position: getCurrentFrame() / videoConfig.fps,
38
+ });
39
+ }
40
+ };
41
+ emitter.addEventListener('timeupdate', onTimeUpdate);
42
+ return () => {
43
+ emitter.removeEventListener('timeupdate', onTimeUpdate);
44
+ };
45
+ }, [
46
+ browserMediaControlsBehavior.mode,
47
+ emitter,
48
+ getCurrentFrame,
49
+ playbackRate,
50
+ videoConfig,
51
+ ]);
52
+ (0, react_1.useEffect)(() => {
53
+ if (!navigator.mediaSession) {
54
+ return;
55
+ }
56
+ if (browserMediaControlsBehavior.mode === 'do-nothing') {
57
+ return;
58
+ }
59
+ navigator.mediaSession.setActionHandler('play', () => {
60
+ if (browserMediaControlsBehavior.mode === 'register-media-session') {
61
+ play();
62
+ }
63
+ });
64
+ navigator.mediaSession.setActionHandler('pause', () => {
65
+ if (browserMediaControlsBehavior.mode === 'register-media-session') {
66
+ pause();
67
+ }
68
+ });
69
+ navigator.mediaSession.setActionHandler('seekto', (event) => {
70
+ if (browserMediaControlsBehavior.mode === 'register-media-session' &&
71
+ event.seekTime !== undefined &&
72
+ videoConfig) {
73
+ seek(Math.round(event.seekTime * videoConfig.fps));
74
+ }
75
+ });
76
+ navigator.mediaSession.setActionHandler('seekbackward', () => {
77
+ if (browserMediaControlsBehavior.mode === 'register-media-session' &&
78
+ videoConfig) {
79
+ seek(Math.max(0, Math.round((getCurrentFrame() - 10) * videoConfig.fps)));
80
+ }
81
+ });
82
+ navigator.mediaSession.setActionHandler('seekforward', () => {
83
+ if (browserMediaControlsBehavior.mode === 'register-media-session' &&
84
+ videoConfig) {
85
+ seek(Math.max(videoConfig.durationInFrames - 1, Math.round((getCurrentFrame() + 10) * videoConfig.fps)));
86
+ }
87
+ });
88
+ navigator.mediaSession.setActionHandler('previoustrack', () => {
89
+ if (browserMediaControlsBehavior.mode === 'register-media-session') {
90
+ seek(0);
91
+ }
92
+ });
93
+ return () => {
94
+ navigator.mediaSession.metadata = null;
95
+ navigator.mediaSession.setActionHandler('play', null);
96
+ navigator.mediaSession.setActionHandler('pause', null);
97
+ navigator.mediaSession.setActionHandler('seekto', null);
98
+ navigator.mediaSession.setActionHandler('seekbackward', null);
99
+ navigator.mediaSession.setActionHandler('seekforward', null);
100
+ navigator.mediaSession.setActionHandler('previoustrack', null);
101
+ };
102
+ }, [
103
+ browserMediaControlsBehavior.mode,
104
+ getCurrentFrame,
105
+ pause,
106
+ play,
107
+ seek,
108
+ videoConfig,
109
+ ]);
110
+ };
111
+ exports.useBrowserMediaSession = useBrowserMediaSession;
@@ -32,13 +32,14 @@ export declare const PlayerInternals: {
32
32
  isBuffering: () => boolean;
33
33
  remotionInternal_currentFrameRef: React.MutableRefObject<number>;
34
34
  };
35
- usePlayback: ({ loop, playbackRate, moveToBeginningWhenEnded, inFrame, outFrame, frameRef, }: {
35
+ usePlayback: ({ loop, playbackRate, moveToBeginningWhenEnded, inFrame, outFrame, frameRef, browserMediaControlsBehavior, }: {
36
36
  loop: boolean;
37
37
  playbackRate: number;
38
38
  moveToBeginningWhenEnded: boolean;
39
39
  inFrame: number | null;
40
40
  outFrame: number | null;
41
41
  frameRef: React.MutableRefObject<number>;
42
+ browserMediaControlsBehavior: import("./browser-mediasession.js").BrowserMediaControlsBehavior;
42
43
  }) => void;
43
44
  useElementSize: (ref: React.RefObject<HTMLElement>, options: {
44
45
  triggerOnWindowResize: boolean;
@@ -1,8 +1,10 @@
1
- export declare const usePlayback: ({ loop, playbackRate, moveToBeginningWhenEnded, inFrame, outFrame, frameRef, }: {
1
+ import type { BrowserMediaControlsBehavior } from './browser-mediasession.js';
2
+ export declare const usePlayback: ({ loop, playbackRate, moveToBeginningWhenEnded, inFrame, outFrame, frameRef, browserMediaControlsBehavior, }: {
2
3
  loop: boolean;
3
4
  playbackRate: number;
4
5
  moveToBeginningWhenEnded: boolean;
5
6
  inFrame: number | null;
6
7
  outFrame: number | null;
7
8
  frameRef: React.MutableRefObject<number>;
9
+ browserMediaControlsBehavior: BrowserMediaControlsBehavior;
8
10
  }) => void;
@@ -4,10 +4,11 @@ exports.usePlayback = void 0;
4
4
  /* eslint-disable @typescript-eslint/no-use-before-define */
5
5
  const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
+ const browser_mediasession_js_1 = require("./browser-mediasession.js");
7
8
  const calculate_next_frame_js_1 = require("./calculate-next-frame.js");
8
9
  const is_backgrounded_js_1 = require("./is-backgrounded.js");
9
10
  const use_player_js_1 = require("./use-player.js");
10
- const usePlayback = ({ loop, playbackRate, moveToBeginningWhenEnded, inFrame, outFrame, frameRef, }) => {
11
+ const usePlayback = ({ loop, playbackRate, moveToBeginningWhenEnded, inFrame, outFrame, frameRef, browserMediaControlsBehavior, }) => {
11
12
  const config = remotion_1.Internals.useUnsafeVideoConfig();
12
13
  const frame = remotion_1.Internals.Timeline.useTimelinePosition();
13
14
  const { playing, pause, emitter } = (0, use_player_js_1.usePlayer)();
@@ -22,6 +23,12 @@ const usePlayback = ({ loop, playbackRate, moveToBeginningWhenEnded, inFrame, ou
22
23
  if (!context) {
23
24
  throw new Error('Missing the buffering context. Most likely you have a Remotion version mismatch.');
24
25
  }
26
+ (0, browser_mediasession_js_1.useBrowserMediaSession)({
27
+ browserMediaControlsBehavior,
28
+ playbackRate,
29
+ videoConfig: config,
30
+ });
31
+ // complete code for media session API
25
32
  (0, react_1.useEffect)(() => {
26
33
  const onBufferClear = context.listenForBuffering(() => {
27
34
  buffering.current = performance.now();