UNPKG

3.26 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.useMediaPlayback = void 0;
4const react_1 = require("react");
5const use_audio_frame_1 = require("./audio/use-audio-frame");
6const play_and_handle_not_allowed_error_1 = require("./play-and-handle-not-allowed-error");
7const timeline_position_state_1 = require("./timeline-position-state");
8const use_frame_1 = require("./use-frame");
9const use_video_config_1 = require("./use-video-config");
10const get_current_time_1 = require("./video/get-current-time");
11const warn_about_non_seekable_media_1 = require("./warn-about-non-seekable-media");
12const useMediaPlayback = ({ mediaRef, src, mediaType, playbackRate: localPlaybackRate, }) => {
13 const { playbackRate: globalPlaybackRate } = (0, react_1.useContext)(timeline_position_state_1.TimelineContext);
14 const frame = (0, use_frame_1.useCurrentFrame)();
15 const absoluteFrame = (0, use_frame_1.useAbsoluteCurrentFrame)();
16 const [playing] = (0, timeline_position_state_1.usePlayingState)();
17 const { fps } = (0, use_video_config_1.useVideoConfig)();
18 const mediaStartsAt = (0, use_audio_frame_1.useMediaStartsAt)();
19 const playbackRate = localPlaybackRate * globalPlaybackRate;
20 (0, react_1.useEffect)(() => {
21 var _a;
22 if (!playing) {
23 (_a = mediaRef.current) === null || _a === void 0 ? void 0 : _a.pause();
24 }
25 }, [mediaRef, mediaType, playing]);
26 (0, react_1.useEffect)(() => {
27 const tagName = mediaType === 'audio' ? '<Audio>' : '<Video>';
28 if (!mediaRef.current) {
29 throw new Error(`No ${mediaType} ref found`);
30 }
31 if (!src) {
32 throw new Error(`No 'src' attribute was passed to the ${tagName} element.`);
33 }
34 mediaRef.current.playbackRate = Math.max(0, playbackRate);
35 const shouldBeTime = (0, get_current_time_1.getMediaTime)({
36 fps,
37 frame,
38 src,
39 playbackRate: localPlaybackRate,
40 startFrom: -mediaStartsAt,
41 });
42 const isTime = mediaRef.current.currentTime;
43 const timeShift = Math.abs(shouldBeTime - isTime);
44 if (timeShift > 0.45 && !mediaRef.current.ended) {
45 console.log('Time has shifted by', timeShift, 'sec. Fixing...', `(isTime=${isTime},shouldBeTime=${shouldBeTime})`);
46 // If scrubbing around, adjust timing
47 // or if time shift is bigger than 0.2sec
48 mediaRef.current.currentTime = shouldBeTime;
49 (0, warn_about_non_seekable_media_1.warnAboutNonSeekableMedia)(mediaRef.current);
50 }
51 if (!playing || absoluteFrame === 0) {
52 mediaRef.current.currentTime = shouldBeTime;
53 }
54 if (mediaRef.current.paused && !mediaRef.current.ended && playing) {
55 const { current } = mediaRef;
56 current.currentTime = shouldBeTime;
57 (0, play_and_handle_not_allowed_error_1.playAndHandleNotAllowedError)(mediaRef, mediaType);
58 }
59 }, [
60 absoluteFrame,
61 fps,
62 playbackRate,
63 frame,
64 mediaRef,
65 mediaType,
66 playing,
67 src,
68 mediaStartsAt,
69 localPlaybackRate,
70 ]);
71};
72exports.useMediaPlayback = useMediaPlayback;