diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index 9a41404355..a7a9961e1c 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -197,28 +197,21 @@ import { Events } from 'jellyfin-apiclient'; export function playWithPromise(elem, onErrorFn) { try { - const promise = elem.play(); - if (promise && promise.then) { - // Chrome now returns a promise - return promise - .catch((e) => { - const errorName = (e.name || '').toLowerCase(); - // safari uses aborterror - if (errorName === 'notallowederror' || - errorName === 'aborterror') { - // swallow this error because the user can still click the play button on the video element - return Promise.resolve(); - } - return Promise.reject(); - }) - .then(() => { - onSuccessfulPlay(elem, onErrorFn); + return elem.play() + .catch((e) => { + const errorName = (e.name || '').toLowerCase(); + // safari uses aborterror + if (errorName === 'notallowederror' || + errorName === 'aborterror') { + // swallow this error because the user can still click the play button on the video element return Promise.resolve(); - }); - } else { - onSuccessfulPlay(elem, onErrorFn); - return Promise.resolve(); - } + } + return Promise.reject(); + }) + .then(() => { + onSuccessfulPlay(elem, onErrorFn); + return Promise.resolve(); + }); } catch (err) { console.error('error calling video.play: ' + err); return Promise.reject(); diff --git a/src/legacy/htmlMediaElement.js b/src/legacy/htmlMediaElement.js new file mode 100644 index 0000000000..b7a2c70825 --- /dev/null +++ b/src/legacy/htmlMediaElement.js @@ -0,0 +1,26 @@ +/** + * Polyfill for HTMLMediaElement + * - HTMLMediaElement.play + * Return a `Promise`. + */ + +(function (HTMLMediaElement) { + 'use strict'; + + const HTMLMediaElement_proto = HTMLMediaElement.prototype; + const real_play = HTMLMediaElement_proto.play; + + HTMLMediaElement_proto.play = function () { + try { + const promise = real_play.apply(this, arguments); + + if (typeof promise?.then === 'function') { + return promise; + } + + return Promise.resolve(); + } catch (err) { + return Promise.reject(err); + } + }; +}(HTMLMediaElement)); diff --git a/src/scripts/site.js b/src/scripts/site.js index 9a167ff5d2..7b94f2b204 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -31,6 +31,7 @@ import './serverNotifications'; import '../components/playback/playerSelectionMenu'; import '../legacy/domParserTextHtml'; import '../legacy/focusPreventScroll'; +import '../legacy/htmlMediaElement'; import '../legacy/vendorStyles'; import SyncPlay from '../components/syncPlay/core'; import { playbackManager } from '../components/playback/playbackmanager';