Skip to content

Commit dadca90

Browse files
authored
fix: Resolve infinite loading state in Safari with MSE and on-demand stream type (#1257)
Closes muxinc/devextravaganza#190 ### Problem When using `prefer-playback="mse"` with `stream-type="on-demand"` on `mux-player`, Safari experienced an infinite loading state. ## Changes - Added `#hasLoaded` flag that is set to `true` when `loadstart` event fires - Only if the element has loaded return the storyboard URL, otherwise return undefined ## Testing When using `mux-player` with `prefer-playback="mse"` and `stream-type="on-demand"` **in Safari**, the video now loads and plays correctly without getting stuck. Try refreshing the page a couple of times when testing this to make sure that there are no cache problems. Code snippets to test: HTML: ```html <mux-player stream-type="on-demand" prefer-playback="mse" playback-id="ihZa7qP1zY8oyLSQW9TS602VgwQvNdyIvlk9LInEGU2s" /> ``` React: ```tsx <MuxPlayer streamType="on-demand" preferPlayback="mse" playbackId="ihZa7qP1zY8oyLSQW9TS602VgwQvNdyIvlk9LInEGU2s" /> ```
1 parent d044183 commit dadca90

File tree

4 files changed

+9
-6
lines changed

4 files changed

+9
-6
lines changed

packages/mux-audio/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class MuxAudioElement extends CustomAudioElement implements Partial<MuxMediaProp
6767

6868
#core?: PlaybackCore;
6969
#loadRequested?: Promise<void> | null;
70-
#defaultPlayerInitTime: number;
70+
#defaultPlayerInitTime: number | undefined;
7171
#metadata: Readonly<Metadata> = {};
7272
#tokens: Tokens = {};
7373
#_hlsConfig?: Partial<HlsConfig>;

packages/mux-player/src/base.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ function getProps(el: MuxPlayerElement, state?: any): MuxTemplateProps {
127127
playbackId: el.playbackId,
128128
hasSrc: !!el.playbackId || !!el.src || !!el.currentSrc,
129129
poster: el.poster,
130-
storyboard: el.storyboard,
130+
storyboard: el.media?.currentSrc && el.storyboard,
131131
storyboardSrc: el.getAttribute(PlayerAttributes.STORYBOARD_SRC),
132132
fullscreenElement: el.getAttribute(PlayerAttributes.FULLSCREEN_ELEMENT),
133133
placeholder: el.getAttribute('placeholder'),
@@ -285,7 +285,7 @@ const initialState = {
285285
const DEFAULT_EXTRA_PLAYLIST_PARAMS = { redundant_streams: true };
286286

287287
class MuxPlayerElement extends VideoApiElement implements IMuxPlayerElement {
288-
#defaultPlayerInitTime: number;
288+
#defaultPlayerInitTime: number | undefined;
289289
#isInit = false;
290290
#tokens: Tokens = {};
291291
#userInactive = true;

packages/mux-player/test/player.test.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,6 @@ describe('<mux-player>', () => {
543543

544544
const muxVideo = player.media;
545545
const mediaPosterImage = player.mediaTheme.querySelector('media-poster-image');
546-
const storyboardTrack = muxVideo.shadowRoot.querySelector("track[label='thumbnails']");
547546

548547
await waitUntil(() => !!muxVideo.getAttribute('src'), '<mux-video> src never set');
549548
assert.equal(
@@ -557,7 +556,11 @@ describe('<mux-player>', () => {
557556
'https://image.mux.com/bos2bPV3qbFgpVPaQ900Xd5UcdM6WXTmz02WZSz01nJ00tY/thumbnail.webp?token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik96VU90ek1nUWhPbkk2MDJ6SlFQbU52THR4MDBnSjJqTlBxN0tTTzAxQlozelEifQ.eyJleHAiOjE5NjE2MDE3MzYsImF1ZCI6InQiLCJzdWIiOiJib3MyYlBWM3FiRmdwVlBhUTkwMFhkNVVjZE02V1hUbXowMldaU3owMW5KMDB0WSJ9.gDe_efqmRB5E3e4ag6in8MfMK-Vn3c_3B4M-BiWw6lg2aaf2BOTv7ltxhn2cvg4G0iFi-esRjhDlHbMRTxwTGavsx8TRLFtJ8vyBzToaFQbQMrn9OZztq_XrCEwqkD8bUAVtdOT1YB606OZyy6XO-CxdMRrKMUsM-cGrfv0TxvzJjThJBY4SzFv_whtYRxqAypZojROU7IiTbqcsk_cSrRMjB7WyAOAvyPNKnr6RkVEuMJtlCtaf_e4DIJHebZUZb3JmVTG4jIWrD1QkN7uLUwCPPRvGhXwhet9JaJPyC5lmkcb9YmH-15V6GOpwSg7sDMGC3YS4aIb_RtVkan0t-w'
558557
);
559558

560-
await waitUntil(() => !!storyboardTrack.getAttribute('src'), 'storyboard <track> src never set');
559+
let storyboardTrack;
560+
await waitUntil(() => {
561+
storyboardTrack = muxVideo.shadowRoot.querySelector("track[label='thumbnails']");
562+
return storyboardTrack && !!storyboardTrack.getAttribute('src');
563+
}, 'storyboard <track> src never set');
561564
assert.equal(
562565
storyboardTrack.getAttribute('src'),
563566
'https://image.mux.com/bos2bPV3qbFgpVPaQ900Xd5UcdM6WXTmz02WZSz01nJ00tY/storyboard.vtt?token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik96VU90ek1nUWhPbkk2MDJ6SlFQbU52THR4MDBnSjJqTlBxN0tTTzAxQlozelEifQ.eyJleHAiOjE5NjE2MDE3NzcsImF1ZCI6InMiLCJzdWIiOiJib3MyYlBWM3FiRmdwVlBhUTkwMFhkNVVjZE02V1hUbXowMldaU3owMW5KMDB0WSJ9.aVd0dsOJUVeQko3BWd9YEhL41Eytf_ZfaBeNzHSSUqU_gREa_jJEVTlRfuiE4g71cKJLSiVTKP7f-F7Txh6DlL8E2SkonfIPB2H0f_3DQxYLso2E8qI4zuJkyxKORbQFLAEB_vSE-2lMbrHXfdpQhv6SrVyu6di9ku0LpFpoyz-_7fVJICr8nhlsqOGt66AYcaa99TXoZ582FWzBaePmWw-WWKYsLvtNjLS9UoxbdVaBRwNylohvhh-i1Y9dNilyNooJ7O8Cj4GuMjeh1pCj0BOrGagxrWrswm3HjUVNUqFq5JCWnJCxgjjwiV4RLZg_4z7gkBXyX7H2-i1dKA3Cpw&format=webp'

packages/mux-video/src/base.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ export class MuxVideoBaseElement extends CustomVideoElement implements IMuxVideo
104104

105105
#core?: PlaybackCore;
106106
#loadRequested?: Promise<void> | null;
107-
#defaultPlayerInitTime: number;
107+
#defaultPlayerInitTime: number | undefined;
108108
#metadata: Metadata = {};
109109
#tokens: Tokens = {};
110110
#_hlsConfig?: Partial<HlsConfig>;

0 commit comments

Comments
 (0)