@srgssr/pillarbox-web 1.35.1 → 1.36.0

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.
@@ -3,7 +3,7 @@
3
3
  const videojs = require('video.js');
4
4
  require('videojs-contrib-eme');
5
5
 
6
- const version = "1.35.0";
6
+ const version = "1.35.1";
7
7
 
8
8
  /** @import VJSPlayer from 'video.js/dist/types/player' */
9
9
  /** @import AudioTrack from 'video.js/dist/types/tracks/audio-track' */
@@ -100,6 +100,79 @@ class Player extends vjsPlayer {
100
100
  return ranges;
101
101
  }
102
102
 
103
+ /**
104
+ * Create a floating video window always on top of other windows so that users may
105
+ * continue consuming media while they interact with other content sites, or
106
+ * applications on their device.
107
+ *
108
+ * This can use document picture-in-picture or element picture in picture
109
+ *
110
+ * Set `enableDocumentPictureInPicture` to `true` to use docPiP on a supported browser
111
+ * Else set `disablePictureInPicture` to `false` to disable elPiP on a supported browser
112
+ *
113
+ *
114
+ * @see [Spec]{@link https://w3c.github.io/picture-in-picture/}
115
+ * @see [Spec]{@link https://wicg.github.io/document-picture-in-picture/}
116
+ *
117
+ * @fires Player#enterpictureinpicture
118
+ *
119
+ * @return {Promise}
120
+ * A promise with a Picture-in-Picture window.
121
+ */
122
+ /* eslint-disable */
123
+ requestPictureInPicture() {
124
+ if (this.options_.enableDocumentPictureInPicture && window.documentPictureInPicture) {
125
+ const pipContainer = document.createElement(this.el().tagName);
126
+ pipContainer.classList = this.el().classList;
127
+ pipContainer.classList.add('vjs-pip-container');
128
+ if (this.posterImage) {
129
+ pipContainer.appendChild(this.posterImage.el().cloneNode(true));
130
+ }
131
+ if (this.titleBar) {
132
+ pipContainer.appendChild(this.titleBar.el().cloneNode(true));
133
+ }
134
+ pipContainer.appendChild(videojs.dom.createEl('p', {
135
+ className: 'vjs-pip-text'
136
+ }, {}, this.localize('Playing in picture-in-picture')));
137
+ return window.documentPictureInPicture.requestWindow({
138
+ // The aspect ratio won't be correct, Chrome bug https://crbug.com/1407629
139
+ width: this.videoWidth(),
140
+ height: this.videoHeight()
141
+ }).then(pipWindow => {
142
+ videojs.dom.copyStyleSheetsToWindow(pipWindow);
143
+ this.el_.parentNode.insertBefore(pipContainer, this.el_);
144
+ pipWindow.document.body.appendChild(this.el_);
145
+ pipWindow.document.body.classList.add('vjs-pip-window');
146
+ this.player_.isInPictureInPicture(true);
147
+ this.player_.trigger({
148
+ type: 'enterpictureinpicture',
149
+ pipWindow
150
+ });
151
+
152
+ // Listen for the PiP closing event to move the video back.
153
+ pipWindow.addEventListener('pagehide', event => {
154
+ console.log(event.target);
155
+ const pipVideo = event.target.querySelector('.vjs-v8');
156
+ pipContainer.parentNode.replaceChild(pipVideo, pipContainer);
157
+ this.player_.isInPictureInPicture(false);
158
+ this.player_.trigger('leavepictureinpicture');
159
+ });
160
+ return pipWindow;
161
+ });
162
+ }
163
+ if ('pictureInPictureEnabled' in document && this.disablePictureInPicture() === false) {
164
+ /**
165
+ * This event fires when the player enters picture in picture mode
166
+ *
167
+ * @event Player#enterpictureinpicture
168
+ * @type {Event}
169
+ */
170
+ return this.techGet_('requestPictureInPicture');
171
+ }
172
+ return Promise.reject('No PiP mode is available');
173
+ }
174
+ /* eslint-enable */
175
+
103
176
  /**
104
177
  * Get the percent (as a decimal) of the media that's been played.
105
178
  * This method is not a part of the native HTML video API.
@@ -364,6 +437,45 @@ class AudioTrackButton extends VJSAudioTrackButton {
364
437
  videojs.registerComponent('AudioTrackMenuItem', AudioTrackMenuItem);
365
438
  videojs.registerComponent('AudioTrackButton', AudioTrackButton);
366
439
 
440
+ /**
441
+ * @ignore
442
+ */
443
+ const VJSPictureInPictureToggle = videojs.getComponent('PictureInPictureToggle');
444
+ class PictureInPictureToggle extends VJSPictureInPictureToggle {
445
+ /**
446
+ * Displays or hides the button depending on the audio mode detection.
447
+ * Exits picture-in-picture if it is enabled when switching to audio mode.
448
+ */
449
+ /* eslint-disable */
450
+ handlePictureInPictureAudioModeChange() {
451
+ // This audio detection will not detect HLS or DASH audio-only streams because there was no reliable way to detect them at the time
452
+ const isSourceAudio = this.player_.currentType().substring(0, 5) === 'audio';
453
+ const isAudioMode = isSourceAudio || this.player_.audioPosterMode() || this.player_.audioOnlyMode();
454
+ if (!isAudioMode || this.player_.options_.enableDocumentPictureInPicture && 'documentPictureInPicture' in window) {
455
+ this.show();
456
+ return;
457
+ }
458
+ if (this.player_.isInPictureInPicture()) {
459
+ this.player_.exitPictureInPicture();
460
+ }
461
+ this.hide();
462
+ }
463
+ /* eslint-enable */
464
+
465
+ /**
466
+ * Show the `Component`s element if it is hidden by removing the
467
+ * 'vjs-hidden' class name from it only in browsers that support the Picture-in-Picture API.
468
+ */
469
+ show() {
470
+ // Does not allow to display the pictureInPictureToggle in browsers that do not support the Picture-in-Picture or DocumentPictureInPicture API.
471
+ if (typeof document.exitPictureInPicture !== 'function' && !(this.player_.options_.enableDocumentPictureInPicture && 'documentPictureInPicture' in window)) {
472
+ return;
473
+ }
474
+ this.removeClass('vjs-hidden');
475
+ }
476
+ }
477
+ videojs.registerComponent('PictureInPictureToggle', PictureInPictureToggle);
478
+
367
479
  /**
368
480
  * Pillarbox is an alias for the video.js namespace with additional options.
369
481
  *
@@ -1 +1 @@
1
- {"version":3,"file":"pillarbox-core.cjs","sources":["../src/components/player.js","../src/components/audio-track-menu-item.js","../src/pillarbox.js"],"sourcesContent":["import videojs from 'video.js';\nimport 'videojs-contrib-eme';\n\n/** @import VJSPlayer from 'video.js/dist/types/player' */\n/** @import AudioTrack from 'video.js/dist/types/tracks/audio-track' */\n/** @import TextTrack from 'video.js/dist/types/tracks/text-track' */\n/** @import {TrackSelector} from './typedef' */\n\n/**\n * @ignore\n * @type {typeof VJSPlayer}\n */\nconst vjsPlayer = videojs.getComponent('player');\n\n/**\n * This class extends the video.js Player.\n *\n * @class Player\n * @see https://docs.videojs.com/player\n */\nclass Player extends vjsPlayer {\n constructor(tag, options, ready) {\n /**\n * Configuration for plugins.\n *\n * @see [Video.js Plugins Option]{@link https://videojs.com/guides/options/#plugins}\n * @type {Object}\n * @property {boolean} eme - Enable the EME (Encrypted Media Extensions) plugin.\n */\n options = videojs.obj.merge(options, { plugins: { eme: true }});\n super(tag, options, ready);\n }\n\n /**\n * A getter/setter for the media's audio track.\n * Activates the audio track according to the language and kind properties.\n * Falls back on the first audio track found if the kind property is not satisfied.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AudioTrack/kind\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AudioTrack/language\n *\n * @param {TrackSelector} [trackSelector]\n *\n * @example\n * // Get the current audio track\n * player.audioTrack();\n *\n * @example\n * // Activate an audio track based on language and kind properties\n * player.audioTrack({language:'en', kind:'description'});\n *\n * @example\n * // Activate first audio track found corresponding to language\n * player.audioTrack({language:'fr'});\n *\n * @return {AudioTrack | undefined} The\n * currently enabled audio track. See {@link https://docs.videojs.com/audiotrack}.\n */\n audioTrack(trackSelector) {\n const audioTracks = Array.from(this.player().audioTracks());\n\n if (!trackSelector) {\n return audioTracks.find((audioTrack) => audioTrack.enabled);\n }\n\n const { kind, language } = trackSelector;\n const audioTrack =\n audioTracks.find(\n (audioTrack) =>\n audioTrack.language === language && audioTrack.kind === kind\n ) || audioTracks.find((audioTrack) => audioTrack.language === language);\n\n if (audioTrack) {\n audioTrack.enabled = true;\n }\n\n return audioTrack;\n }\n\n /**\n * Calculates an array of ranges based on the `buffered()` data.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/buffered\n *\n * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of buffered ranges.\n */\n bufferedRanges() {\n const ranges = [];\n\n for (let i = 0; i < this.buffered().length; i++) {\n const start = this.buffered().start(i);\n const end = this.buffered().end(i);\n\n ranges.push({ start, end });\n }\n\n return ranges;\n }\n\n /**\n * Get the percent (as a decimal) of the media that's been played.\n * This method is not a part of the native HTML video API.\n *\n * Live streams with DVR are not currently supported.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#htmlmediaelement.played\n *\n * @return {number}\n * A decimal between 0 and 1 representing the percent\n * that is played 0 being 0% and 1 being 100%\n */\n playedPercent() {\n if (!Number.isFinite(this.duration())) return NaN;\n\n let timePlayed = 0;\n\n for (let i = 0; i != this.played().length; i++) {\n timePlayed += this.played().end(i) - this.played().start(i);\n }\n\n const percentPlayed = timePlayed / this.duration();\n\n return percentPlayed;\n }\n\n /**\n * Get an array of ranges based on the `played` data.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#htmlmediaelement.played\n *\n * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of played ranges.\n */\n playedRanges() {\n const ranges = [];\n\n for (let i = 0; i < this.played().length; i++) {\n const start = this.played().start(i);\n const end = this.played().end(i);\n\n ranges.push({ start, end });\n }\n\n return ranges;\n }\n\n /**\n * Calculates an array of ranges based on the `seekable()` data.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seekable\n *\n * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of seekable ranges.\n */\n seekableRanges() {\n const ranges = [];\n\n for (let i = 0; i < this.seekable().length; i++) {\n const start = this.seekable().start(i);\n const end = this.seekable().end(i);\n\n ranges.push({ start, end });\n }\n\n return ranges;\n }\n\n /**\n * A getter/setter for the media's text track.\n * Activates the text track according to the language and kind properties.\n * Falls back on the first text track found if the kind property is not satisfied.\n * Disables all subtitle tracks that are `showing` if the `trackSelector` is truthy but does not satisfy any condition.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TextTrack/kind\n * @see https://developer.mozilla.org/en-US/docs/Web/API/textTrack/language\n *\n * @param {TrackSelector} [trackSelector]\n *\n * @example\n * // Get the current text track\n * player.textTrack();\n *\n * @example\n * // Disable all text tracks has a side effect\n * player.textTrack('off');\n * player.textTrack({});\n *\n * @example\n * // Activate an text track based on language and kind properties\n * player.textTrack({language:'en', kind:'captions'});\n *\n * @example\n * // Activate first text track found corresponding to language\n * player.textTrack({language:'fr'});\n *\n * @return {TextTrack | undefined} The\n * currently enabled text track. See {@link https://docs.videojs.com/texttrack}.\n */\n textTrack(trackSelector) {\n const textTracks = Array.from(this.player().textTracks()).filter(\n (textTrack) => !['chapters', 'metadata'].includes(textTrack.kind)\n );\n\n if (!trackSelector) {\n return textTracks.find((textTrack) => textTrack.mode === 'showing');\n }\n\n textTracks.forEach((textTrack) => (textTrack.mode = 'disabled'));\n\n const { kind, language } = trackSelector;\n const textTrack =\n textTracks.find((textTrack) => {\n if (textTrack.language === language && textTrack.kind === kind) {\n textTrack.mode = 'showing';\n }\n\n return textTrack.mode === 'showing';\n }) ||\n textTracks.find((textTrack) => {\n if (textTrack.language === language) {\n textTrack.mode = 'showing';\n }\n\n return textTrack.mode === 'showing';\n });\n\n return textTrack;\n }\n}\n\nvideojs.registerComponent('player', Player);\n\nexport default Player;\n","import videojs from 'video.js';\n\n/** @import MenuItem from 'video.js/dist/types/menu/menu-item' */\n\n/**\n * @ignore\n */\nconst VJSAudioTrackButton = videojs.getComponent('AudioTrackButton');\n\n/**\n * @ignore\n * @type {typeof MenuItem}\n */\nconst MenuItem = videojs.getComponent('MenuItem');\n\n/**\n * An {@link AudioTrack} {@link MenuItem}\n *\n * This is a temporary workaround.\n *\n * @extends MenuItem\n */\nclass AudioTrackMenuItem extends MenuItem {\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n constructor(player, options) {\n const track = options.track;\n const tracks = player.audioTracks();\n\n // Modify options for parent MenuItem class's init.\n options.label = track.label || track.language || 'Unknown';\n options.selected = track.enabled;\n\n super(player, options);\n\n this.track = track;\n\n this.addClass(`vjs-${track.kind}-menu-item`);\n\n const changeHandler = (...args) => {\n this.handleTracksChange.apply(this, args);\n };\n\n tracks.addEventListener('change', changeHandler);\n this.on('dispose', () => {\n tracks.removeEventListener('change', changeHandler);\n });\n }\n\n createEl(type, props, attrs) {\n const el = super.createEl(type, props, attrs);\n const parentSpan = el.querySelector('.vjs-menu-item-text');\n\n if (['main-desc', 'descriptions', 'description'].indexOf(this.options_.track.kind) >= 0) {\n parentSpan.appendChild(videojs.dom.createEl('span', {\n className: 'vjs-icon-placeholder'\n }, {\n 'aria-hidden': true\n }));\n parentSpan.appendChild(videojs.dom.createEl('span', {\n className: 'vjs-control-text',\n textContent: ' ' + this.localize('Descriptions')\n }));\n }\n\n return el;\n }\n\n /**\n * This gets called when an `AudioTrackMenuItem is \"clicked\". See {@link ClickableComponent}\n * for more detailed information on what a click can be.\n *\n * @param {Event} [event]\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n handleClick(event) {\n super.handleClick(event);\n\n // the audio track list will automatically toggle other tracks\n // off for us.\n this.track.enabled = true;\n\n if (!this.player_.tech_.featuresNativeAudioTracks) return;\n\n // when native audio tracks are used, we want to make sure that other tracks are turned off\n const tracks = this.player_.audioTracks();\n\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n\n // skip the current track since we enabled it above\n if (track === this.track) {\n continue;\n }\n\n track.enabled = track === this.track;\n }\n\n }\n\n /**\n * Handle any {@link AudioTrack} change.\n *\n * @param {Event} [event]\n * The {@link AudioTrackList#change} event that caused this to run.\n *\n * @listens AudioTrackList#change\n */\n handleTracksChange() {\n this.selected(this.track.enabled);\n }\n}\n\n/**\n * The base class for buttons that toggle specific {@link AudioTrack} types.\n *\n * @extends VJSAudioTrackButton\n */\nclass AudioTrackButton extends VJSAudioTrackButton {\n\n\n /**\n * Create a menu item for each audio track\n *\n * @param {AudioTrackMenuItem[]} [items=[]]\n * An array of existing menu items to use.\n *\n * @return {AudioTrackMenuItem[]}\n * An array of menu items\n */\n createItems(items = []) {\n // if there's only one audio track, there no point in showing it\n this.hideThreshold_ = 1;\n\n const tracks = this.player_.audioTracks();\n\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n\n items.push(new AudioTrackMenuItem(this.player_, {\n track,\n // MenuItem is selectable\n selectable: true,\n // MenuItem is NOT multiSelectable (i.e. only one can be marked \"selected\" at a time)\n multiSelectable: false\n }));\n }\n\n return items;\n }\n}\n\nvideojs.registerComponent('AudioTrackMenuItem', AudioTrackMenuItem);\nvideojs.registerComponent('AudioTrackButton', AudioTrackButton);\n","import { version } from '../package.json';\nimport videojs from 'video.js';\nimport './components/player.js';\nimport './components/audio-track-menu-item.js';\n\n/**\n * Pillarbox is an alias for the video.js namespace with additional options.\n *\n * @namespace\n * @see https://docs.videojs.com/module-videojs-videojs\n * @type {videojs}\n */\nconst pillarbox = videojs;\n\npillarbox.VERSION = {\n pillarbox: version,\n videojs: videojs.VERSION,\n [videojs.VhsSourceHandler.name]: videojs.VhsSourceHandler.VERSION,\n eme: videojs.getPlugin('eme').VERSION,\n};\n\n/**\n * Enable smooth seeking for Pillarbox.\n *\n * @see [Video.js enableSmoothSeeking Option]{@link https://videojs.com/guides/options/#enablesmoothseeking}\n * @type {boolean}\n * @default true\n */\npillarbox.options.enableSmoothSeeking = true;\n/**\n * Enable fill mode for the video player, allowing it to expand to fill the container.\n *\n * @see [Video.js Fill Option]{@link https://videojs.com/guides/layout/#fill-mode}\n * @type {boolean}\n * @default true\n */\npillarbox.options.fill = true;\n/**\n * Configuration options for HTML5 settings in Pillarbox.\n *\n * @see [VHS useForcedSubtitles Option]{@link https://github.com/videojs/http-streaming/blob/main/README.md#useforcedsubtitles}\n * @see [VHS overrideNative Option]{@link https://github.com/videojs/http-streaming#overridenative}\n * @type {Object}\n * @property {Object} vhs - Configuration for the Video.js HTTP Streaming.\n * @property {boolean} useForcedSubtitles - Enables the player to display forced subtitles by default.\n * Forced subtitles are pieces of information intended for display when no other text representation\n * is selected. They are used to clarify dialogue, provide alternate languages, display texted graphics,\n * or present location/person IDs that are not otherwise covered in the dubbed/localized audio.\n * @property {boolean} overrideNative - Try to use videojs-http-streaming even on platforms that\n * provide some level of HLS support natively\n */\npillarbox.options.html5 = {\n vhs: {\n useForcedSubtitles: true,\n overrideNative: !pillarbox.browser.IS_SAFARI\n }\n};\n/**\n * Configuration for the live tracker.\n *\n * @see [Video.js liveTracker Option]{@link https://videojs.com/guides/options/#livetrackertrackingthreshold}\n * @type {Object}\n * @property {number} trackingThreshold - A threshold that controls when the liveui should be shown.\n * @property {number} liveTolerance - An option that controls how far from the seekable end should be considered live playback.\n */\npillarbox.options.liveTracker = {\n trackingThreshold: 120,\n liveTolerance: 15,\n};\n/**\n * Allows the player to use the live ui that includes:\n *\n * - A progress bar for seeking within the live window\n * - A button that can be clicked to seek to the live edge with a circle indicating if you are at the live edge or not.\n *\n * @see [Video.js liveui Option]{@link https://videojs.com/guides/options/#liveui}\n * @type {boolean}\n */\npillarbox.options.liveui = true;\n/**\n * Indicates that the video is to be played \"inline\", that is within the element's playback area.\n *\n * @see [Video element playsinline attribute]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video#playsinline}\n * @type {boolean}\n */\npillarbox.options.playsinline = true;\n/**\n * Enable responsive mode, this will cause the player to customize itself based on responsive breakpoints.\n *\n * @see [Video.js Responsive Option]{@link https://videojs.com/guides/options/#responsive}\n * @type {boolean}\n */\npillarbox.options.responsive = true;\n/**\n * A placeholder for accessing trackers directly from the player.\n *\n * @type {Object}\n */\npillarbox.options.trackers = {};\n\nexport default pillarbox;\n"],"names":["vjsPlayer","videojs","getComponent","Player","constructor","tag","options","ready","obj","merge","plugins","eme","audioTrack","trackSelector","audioTracks","Array","from","player","find","enabled","kind","language","bufferedRanges","ranges","i","buffered","length","start","end","push","playedPercent","Number","isFinite","duration","NaN","timePlayed","played","percentPlayed","playedRanges","seekableRanges","seekable","textTrack","textTracks","filter","includes","mode","forEach","registerComponent","VJSAudioTrackButton","MenuItem","AudioTrackMenuItem","track","tracks","label","selected","addClass","changeHandler","args","handleTracksChange","apply","addEventListener","on","removeEventListener","createEl","type","props","attrs","el","parentSpan","querySelector","indexOf","options_","appendChild","dom","className","textContent","localize","handleClick","event","player_","tech_","featuresNativeAudioTracks","AudioTrackButton","createItems","items","hideThreshold_","selectable","multiSelectable","pillarbox","VERSION","version","VhsSourceHandler","name","getPlugin","enableSmoothSeeking","fill","html5","vhs","useForcedSubtitles","overrideNative","browser","IS_SAFARI","liveTracker","trackingThreshold","liveTolerance","liveui","playsinline","responsive","trackers"],"mappings":"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"}
1
+ {"version":3,"file":"pillarbox-core.cjs","sources":["../src/components/player.js","../src/components/audio-track-menu-item.js","../src/components/picture-in-picture-toggle.js","../src/pillarbox.js"],"sourcesContent":["import videojs from 'video.js';\nimport 'videojs-contrib-eme';\n\n/** @import VJSPlayer from 'video.js/dist/types/player' */\n/** @import AudioTrack from 'video.js/dist/types/tracks/audio-track' */\n/** @import TextTrack from 'video.js/dist/types/tracks/text-track' */\n/** @import {TrackSelector} from './typedef' */\n\n/**\n * @ignore\n * @type {typeof VJSPlayer}\n */\nconst vjsPlayer = videojs.getComponent('player');\n\n/**\n * This class extends the video.js Player.\n *\n * @class Player\n * @see https://docs.videojs.com/player\n */\nclass Player extends vjsPlayer {\n constructor(tag, options, ready) {\n /**\n * Configuration for plugins.\n *\n * @see [Video.js Plugins Option]{@link https://videojs.com/guides/options/#plugins}\n * @type {Object}\n * @property {boolean} eme - Enable the EME (Encrypted Media Extensions) plugin.\n */\n options = videojs.obj.merge(options, { plugins: { eme: true }});\n super(tag, options, ready);\n }\n\n /**\n * A getter/setter for the media's audio track.\n * Activates the audio track according to the language and kind properties.\n * Falls back on the first audio track found if the kind property is not satisfied.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AudioTrack/kind\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AudioTrack/language\n *\n * @param {TrackSelector} [trackSelector]\n *\n * @example\n * // Get the current audio track\n * player.audioTrack();\n *\n * @example\n * // Activate an audio track based on language and kind properties\n * player.audioTrack({language:'en', kind:'description'});\n *\n * @example\n * // Activate first audio track found corresponding to language\n * player.audioTrack({language:'fr'});\n *\n * @return {AudioTrack | undefined} The\n * currently enabled audio track. See {@link https://docs.videojs.com/audiotrack}.\n */\n audioTrack(trackSelector) {\n const audioTracks = Array.from(this.player().audioTracks());\n\n if (!trackSelector) {\n return audioTracks.find((audioTrack) => audioTrack.enabled);\n }\n\n const { kind, language } = trackSelector;\n const audioTrack =\n audioTracks.find(\n (audioTrack) =>\n audioTrack.language === language && audioTrack.kind === kind\n ) || audioTracks.find((audioTrack) => audioTrack.language === language);\n\n if (audioTrack) {\n audioTrack.enabled = true;\n }\n\n return audioTrack;\n }\n\n /**\n * Calculates an array of ranges based on the `buffered()` data.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/buffered\n *\n * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of buffered ranges.\n */\n bufferedRanges() {\n const ranges = [];\n\n for (let i = 0; i < this.buffered().length; i++) {\n const start = this.buffered().start(i);\n const end = this.buffered().end(i);\n\n ranges.push({ start, end });\n }\n\n return ranges;\n }\n\n /**\n * Create a floating video window always on top of other windows so that users may\n * continue consuming media while they interact with other content sites, or\n * applications on their device.\n *\n * This can use document picture-in-picture or element picture in picture\n *\n * Set `enableDocumentPictureInPicture` to `true` to use docPiP on a supported browser\n * Else set `disablePictureInPicture` to `false` to disable elPiP on a supported browser\n *\n *\n * @see [Spec]{@link https://w3c.github.io/picture-in-picture/}\n * @see [Spec]{@link https://wicg.github.io/document-picture-in-picture/}\n *\n * @fires Player#enterpictureinpicture\n *\n * @return {Promise}\n * A promise with a Picture-in-Picture window.\n */\n /* eslint-disable */\n requestPictureInPicture() {\n if (this.options_.enableDocumentPictureInPicture && window.documentPictureInPicture) {\n const pipContainer = document.createElement(this.el().tagName);\n\n pipContainer.classList = this.el().classList;\n pipContainer.classList.add('vjs-pip-container');\n if (this.posterImage) {\n pipContainer.appendChild(this.posterImage.el().cloneNode(true));\n }\n if (this.titleBar) {\n pipContainer.appendChild(this.titleBar.el().cloneNode(true));\n }\n pipContainer.appendChild(videojs.dom.createEl('p', { className: 'vjs-pip-text' }, {}, this.localize('Playing in picture-in-picture')));\n\n return window.documentPictureInPicture.requestWindow({\n // The aspect ratio won't be correct, Chrome bug https://crbug.com/1407629\n width: this.videoWidth(),\n height: this.videoHeight()\n }).then(pipWindow => {\n videojs.dom.copyStyleSheetsToWindow(pipWindow);\n this.el_.parentNode.insertBefore(pipContainer, this.el_);\n\n pipWindow.document.body.appendChild(this.el_);\n pipWindow.document.body.classList.add('vjs-pip-window');\n\n this.player_.isInPictureInPicture(true);\n this.player_.trigger({ type: 'enterpictureinpicture', pipWindow });\n\n // Listen for the PiP closing event to move the video back.\n pipWindow.addEventListener('pagehide', (event) => {\n console.log(event.target);\n const pipVideo = event.target.querySelector('.vjs-v8');\n\n pipContainer.parentNode.replaceChild(pipVideo, pipContainer);\n this.player_.isInPictureInPicture(false);\n this.player_.trigger('leavepictureinpicture');\n });\n\n return pipWindow;\n });\n }\n if ('pictureInPictureEnabled' in document && this.disablePictureInPicture() === false) {\n /**\n * This event fires when the player enters picture in picture mode\n *\n * @event Player#enterpictureinpicture\n * @type {Event}\n */\n return this.techGet_('requestPictureInPicture');\n }\n\n return Promise.reject('No PiP mode is available');\n }\n /* eslint-enable */\n\n /**\n * Get the percent (as a decimal) of the media that's been played.\n * This method is not a part of the native HTML video API.\n *\n * Live streams with DVR are not currently supported.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#htmlmediaelement.played\n *\n * @return {number}\n * A decimal between 0 and 1 representing the percent\n * that is played 0 being 0% and 1 being 100%\n */\n playedPercent() {\n if (!Number.isFinite(this.duration())) return NaN;\n\n let timePlayed = 0;\n\n for (let i = 0; i != this.played().length; i++) {\n timePlayed += this.played().end(i) - this.played().start(i);\n }\n\n const percentPlayed = timePlayed / this.duration();\n\n return percentPlayed;\n }\n\n /**\n * Get an array of ranges based on the `played` data.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#htmlmediaelement.played\n *\n * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of played ranges.\n */\n playedRanges() {\n const ranges = [];\n\n for (let i = 0; i < this.played().length; i++) {\n const start = this.played().start(i);\n const end = this.played().end(i);\n\n ranges.push({ start, end });\n }\n\n return ranges;\n }\n\n /**\n * Calculates an array of ranges based on the `seekable()` data.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seekable\n *\n * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of seekable ranges.\n */\n seekableRanges() {\n const ranges = [];\n\n for (let i = 0; i < this.seekable().length; i++) {\n const start = this.seekable().start(i);\n const end = this.seekable().end(i);\n\n ranges.push({ start, end });\n }\n\n return ranges;\n }\n\n /**\n * A getter/setter for the media's text track.\n * Activates the text track according to the language and kind properties.\n * Falls back on the first text track found if the kind property is not satisfied.\n * Disables all subtitle tracks that are `showing` if the `trackSelector` is truthy but does not satisfy any condition.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TextTrack/kind\n * @see https://developer.mozilla.org/en-US/docs/Web/API/textTrack/language\n *\n * @param {TrackSelector} [trackSelector]\n *\n * @example\n * // Get the current text track\n * player.textTrack();\n *\n * @example\n * // Disable all text tracks has a side effect\n * player.textTrack('off');\n * player.textTrack({});\n *\n * @example\n * // Activate an text track based on language and kind properties\n * player.textTrack({language:'en', kind:'captions'});\n *\n * @example\n * // Activate first text track found corresponding to language\n * player.textTrack({language:'fr'});\n *\n * @return {TextTrack | undefined} The\n * currently enabled text track. See {@link https://docs.videojs.com/texttrack}.\n */\n textTrack(trackSelector) {\n const textTracks = Array.from(this.player().textTracks()).filter(\n (textTrack) => !['chapters', 'metadata'].includes(textTrack.kind)\n );\n\n if (!trackSelector) {\n return textTracks.find((textTrack) => textTrack.mode === 'showing');\n }\n\n textTracks.forEach((textTrack) => (textTrack.mode = 'disabled'));\n\n const { kind, language } = trackSelector;\n const textTrack =\n textTracks.find((textTrack) => {\n if (textTrack.language === language && textTrack.kind === kind) {\n textTrack.mode = 'showing';\n }\n\n return textTrack.mode === 'showing';\n }) ||\n textTracks.find((textTrack) => {\n if (textTrack.language === language) {\n textTrack.mode = 'showing';\n }\n\n return textTrack.mode === 'showing';\n });\n\n return textTrack;\n }\n}\n\nvideojs.registerComponent('player', Player);\n\nexport default Player;\n","import videojs from 'video.js';\n\n/** @import MenuItem from 'video.js/dist/types/menu/menu-item' */\n\n/**\n * @ignore\n */\nconst VJSAudioTrackButton = videojs.getComponent('AudioTrackButton');\n\n/**\n * @ignore\n * @type {typeof MenuItem}\n */\nconst MenuItem = videojs.getComponent('MenuItem');\n\n/**\n * An {@link AudioTrack} {@link MenuItem}\n *\n * This is a temporary workaround.\n *\n * @extends MenuItem\n */\nclass AudioTrackMenuItem extends MenuItem {\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n constructor(player, options) {\n const track = options.track;\n const tracks = player.audioTracks();\n\n // Modify options for parent MenuItem class's init.\n options.label = track.label || track.language || 'Unknown';\n options.selected = track.enabled;\n\n super(player, options);\n\n this.track = track;\n\n this.addClass(`vjs-${track.kind}-menu-item`);\n\n const changeHandler = (...args) => {\n this.handleTracksChange.apply(this, args);\n };\n\n tracks.addEventListener('change', changeHandler);\n this.on('dispose', () => {\n tracks.removeEventListener('change', changeHandler);\n });\n }\n\n createEl(type, props, attrs) {\n const el = super.createEl(type, props, attrs);\n const parentSpan = el.querySelector('.vjs-menu-item-text');\n\n if (['main-desc', 'descriptions', 'description'].indexOf(this.options_.track.kind) >= 0) {\n parentSpan.appendChild(videojs.dom.createEl('span', {\n className: 'vjs-icon-placeholder'\n }, {\n 'aria-hidden': true\n }));\n parentSpan.appendChild(videojs.dom.createEl('span', {\n className: 'vjs-control-text',\n textContent: ' ' + this.localize('Descriptions')\n }));\n }\n\n return el;\n }\n\n /**\n * This gets called when an `AudioTrackMenuItem is \"clicked\". See {@link ClickableComponent}\n * for more detailed information on what a click can be.\n *\n * @param {Event} [event]\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n handleClick(event) {\n super.handleClick(event);\n\n // the audio track list will automatically toggle other tracks\n // off for us.\n this.track.enabled = true;\n\n if (!this.player_.tech_.featuresNativeAudioTracks) return;\n\n // when native audio tracks are used, we want to make sure that other tracks are turned off\n const tracks = this.player_.audioTracks();\n\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n\n // skip the current track since we enabled it above\n if (track === this.track) {\n continue;\n }\n\n track.enabled = track === this.track;\n }\n\n }\n\n /**\n * Handle any {@link AudioTrack} change.\n *\n * @param {Event} [event]\n * The {@link AudioTrackList#change} event that caused this to run.\n *\n * @listens AudioTrackList#change\n */\n handleTracksChange() {\n this.selected(this.track.enabled);\n }\n}\n\n/**\n * The base class for buttons that toggle specific {@link AudioTrack} types.\n *\n * @extends VJSAudioTrackButton\n */\nclass AudioTrackButton extends VJSAudioTrackButton {\n\n\n /**\n * Create a menu item for each audio track\n *\n * @param {AudioTrackMenuItem[]} [items=[]]\n * An array of existing menu items to use.\n *\n * @return {AudioTrackMenuItem[]}\n * An array of menu items\n */\n createItems(items = []) {\n // if there's only one audio track, there no point in showing it\n this.hideThreshold_ = 1;\n\n const tracks = this.player_.audioTracks();\n\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n\n items.push(new AudioTrackMenuItem(this.player_, {\n track,\n // MenuItem is selectable\n selectable: true,\n // MenuItem is NOT multiSelectable (i.e. only one can be marked \"selected\" at a time)\n multiSelectable: false\n }));\n }\n\n return items;\n }\n}\n\nvideojs.registerComponent('AudioTrackMenuItem', AudioTrackMenuItem);\nvideojs.registerComponent('AudioTrackButton', AudioTrackButton);\n","import videojs from 'video.js';\n\n/**\n * @ignore\n */\nconst VJSPictureInPictureToggle = videojs.getComponent('PictureInPictureToggle');\n\nclass PictureInPictureToggle extends VJSPictureInPictureToggle {\n /**\n * Displays or hides the button depending on the audio mode detection.\n * Exits picture-in-picture if it is enabled when switching to audio mode.\n */\n /* eslint-disable */\n handlePictureInPictureAudioModeChange() {\n // This audio detection will not detect HLS or DASH audio-only streams because there was no reliable way to detect them at the time\n const isSourceAudio = this.player_.currentType().substring(0, 5) === 'audio';\n const isAudioMode =\n isSourceAudio || this.player_.audioPosterMode() || this.player_.audioOnlyMode();\n\n if (!isAudioMode || (this.player_.options_.enableDocumentPictureInPicture && 'documentPictureInPicture' in window)) {\n this.show();\n\n return;\n }\n\n if (this.player_.isInPictureInPicture()) {\n this.player_.exitPictureInPicture();\n }\n\n this.hide();\n }\n /* eslint-enable */\n\n /**\n * Show the `Component`s element if it is hidden by removing the\n * 'vjs-hidden' class name from it only in browsers that support the Picture-in-Picture API.\n */\n show() {\n // Does not allow to display the pictureInPictureToggle in browsers that do not support the Picture-in-Picture or DocumentPictureInPicture API.\n if (\n typeof document.exitPictureInPicture !== 'function' &&\n !(this.player_.options_.enableDocumentPictureInPicture && 'documentPictureInPicture' in window)\n ) {\n return;\n }\n\n this.removeClass('vjs-hidden');\n }\n}\n\nvideojs.registerComponent('PictureInPictureToggle', PictureInPictureToggle);\nexport default PictureInPictureToggle;\n","import { version } from '../package.json';\nimport videojs from 'video.js';\nimport './components/player.js';\nimport './components/audio-track-menu-item.js';\nimport './components/picture-in-picture-toggle.js';\n\n/**\n * Pillarbox is an alias for the video.js namespace with additional options.\n *\n * @namespace\n * @see https://docs.videojs.com/module-videojs-videojs\n * @type {videojs}\n */\nconst pillarbox = videojs;\n\npillarbox.VERSION = {\n pillarbox: version,\n videojs: videojs.VERSION,\n [videojs.VhsSourceHandler.name]: videojs.VhsSourceHandler.VERSION,\n eme: videojs.getPlugin('eme').VERSION,\n};\n\n/**\n * Enable smooth seeking for Pillarbox.\n *\n * @see [Video.js enableSmoothSeeking Option]{@link https://videojs.com/guides/options/#enablesmoothseeking}\n * @type {boolean}\n * @default true\n */\npillarbox.options.enableSmoothSeeking = true;\n/**\n * Enable fill mode for the video player, allowing it to expand to fill the container.\n *\n * @see [Video.js Fill Option]{@link https://videojs.com/guides/layout/#fill-mode}\n * @type {boolean}\n * @default true\n */\npillarbox.options.fill = true;\n/**\n * Configuration options for HTML5 settings in Pillarbox.\n *\n * @see [VHS useForcedSubtitles Option]{@link https://github.com/videojs/http-streaming/blob/main/README.md#useforcedsubtitles}\n * @see [VHS overrideNative Option]{@link https://github.com/videojs/http-streaming#overridenative}\n * @type {Object}\n * @property {Object} vhs - Configuration for the Video.js HTTP Streaming.\n * @property {boolean} useForcedSubtitles - Enables the player to display forced subtitles by default.\n * Forced subtitles are pieces of information intended for display when no other text representation\n * is selected. They are used to clarify dialogue, provide alternate languages, display texted graphics,\n * or present location/person IDs that are not otherwise covered in the dubbed/localized audio.\n * @property {boolean} overrideNative - Try to use videojs-http-streaming even on platforms that\n * provide some level of HLS support natively\n */\npillarbox.options.html5 = {\n vhs: {\n useForcedSubtitles: true,\n overrideNative: !pillarbox.browser.IS_SAFARI\n }\n};\n/**\n * Configuration for the live tracker.\n *\n * @see [Video.js liveTracker Option]{@link https://videojs.com/guides/options/#livetrackertrackingthreshold}\n * @type {Object}\n * @property {number} trackingThreshold - A threshold that controls when the liveui should be shown.\n * @property {number} liveTolerance - An option that controls how far from the seekable end should be considered live playback.\n */\npillarbox.options.liveTracker = {\n trackingThreshold: 120,\n liveTolerance: 15,\n};\n/**\n * Allows the player to use the live ui that includes:\n *\n * - A progress bar for seeking within the live window\n * - A button that can be clicked to seek to the live edge with a circle indicating if you are at the live edge or not.\n *\n * @see [Video.js liveui Option]{@link https://videojs.com/guides/options/#liveui}\n * @type {boolean}\n */\npillarbox.options.liveui = true;\n/**\n * Indicates that the video is to be played \"inline\", that is within the element's playback area.\n *\n * @see [Video element playsinline attribute]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video#playsinline}\n * @type {boolean}\n */\npillarbox.options.playsinline = true;\n/**\n * Enable responsive mode, this will cause the player to customize itself based on responsive breakpoints.\n *\n * @see [Video.js Responsive Option]{@link https://videojs.com/guides/options/#responsive}\n * @type {boolean}\n */\npillarbox.options.responsive = true;\n/**\n * A placeholder for accessing trackers directly from the player.\n *\n * @type {Object}\n */\npillarbox.options.trackers = {};\n\nexport default pillarbox;\n"],"names":["vjsPlayer","videojs","getComponent","Player","constructor","tag","options","ready","obj","merge","plugins","eme","audioTrack","trackSelector","audioTracks","Array","from","player","find","enabled","kind","language","bufferedRanges","ranges","i","buffered","length","start","end","push","requestPictureInPicture","options_","enableDocumentPictureInPicture","window","documentPictureInPicture","pipContainer","document","createElement","el","tagName","classList","add","posterImage","appendChild","cloneNode","titleBar","dom","createEl","className","localize","requestWindow","width","videoWidth","height","videoHeight","then","pipWindow","copyStyleSheetsToWindow","el_","parentNode","insertBefore","body","player_","isInPictureInPicture","trigger","type","addEventListener","event","console","log","target","pipVideo","querySelector","replaceChild","disablePictureInPicture","techGet_","Promise","reject","playedPercent","Number","isFinite","duration","NaN","timePlayed","played","percentPlayed","playedRanges","seekableRanges","seekable","textTrack","textTracks","filter","includes","mode","forEach","registerComponent","VJSAudioTrackButton","MenuItem","AudioTrackMenuItem","track","tracks","label","selected","addClass","changeHandler","args","handleTracksChange","apply","on","removeEventListener","props","attrs","parentSpan","indexOf","textContent","handleClick","tech_","featuresNativeAudioTracks","AudioTrackButton","createItems","items","hideThreshold_","selectable","multiSelectable","VJSPictureInPictureToggle","PictureInPictureToggle","handlePictureInPictureAudioModeChange","isSourceAudio","currentType","substring","isAudioMode","audioPosterMode","audioOnlyMode","show","exitPictureInPicture","hide","removeClass","pillarbox","VERSION","version","VhsSourceHandler","name","getPlugin","enableSmoothSeeking","fill","html5","vhs","useForcedSubtitles","overrideNative","browser","IS_SAFARI","liveTracker","trackingThreshold","liveTolerance","liveui","playsinline","responsive","trackers"],"mappings":"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,KAAK,CAAC,CAACJ;AAChC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACAD,SAAS,CAACnI,OAAO,CAACyI,mBAAmB,GAAG,IAAI;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACAN,SAAS,CAACnI,OAAO,CAAC0I,IAAI,GAAG,IAAI;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAP,SAAS,CAACnI,OAAO,CAAC2I,KAAK,GAAG;AACxBC,EAAAA,GAAG,EAAE;AACHC,IAAAA,kBAAkB,EAAE,IAAI;AACxBC,IAAAA,cAAc,EAAE,CAACX,SAAS,CAACY,OAAO,CAACC;AACrC;AACF,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAb,SAAS,CAACnI,OAAO,CAACiJ,WAAW,GAAG;AAC9BC,EAAAA,iBAAiB,EAAE,GAAG;AACtBC,EAAAA,aAAa,EAAE;AACjB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAhB,SAAS,CAACnI,OAAO,CAACoJ,MAAM,GAAG,IAAI;AAC/B;AACA;AACA;AACA;AACA;AACA;AACAjB,SAAS,CAACnI,OAAO,CAACqJ,WAAW,GAAG,IAAI;AACpC;AACA;AACA;AACA;AACA;AACA;AACAlB,SAAS,CAACnI,OAAO,CAACsJ,UAAU,GAAG,IAAI;AACnC;AACA;AACA;AACA;AACA;AACAnB,SAAS,CAACnI,OAAO,CAACuJ,QAAQ,GAAG,EAAE;;;;"}
@@ -1,7 +1,7 @@
1
1
  import videojs from 'video.js';
2
2
  import 'videojs-contrib-eme';
3
3
 
4
- const version = "1.35.0";
4
+ const version = "1.35.1";
5
5
 
6
6
  /** @import VJSPlayer from 'video.js/dist/types/player' */
7
7
  /** @import AudioTrack from 'video.js/dist/types/tracks/audio-track' */
@@ -98,6 +98,79 @@ class Player extends vjsPlayer {
98
98
  return ranges;
99
99
  }
100
100
 
101
+ /**
102
+ * Create a floating video window always on top of other windows so that users may
103
+ * continue consuming media while they interact with other content sites, or
104
+ * applications on their device.
105
+ *
106
+ * This can use document picture-in-picture or element picture in picture
107
+ *
108
+ * Set `enableDocumentPictureInPicture` to `true` to use docPiP on a supported browser
109
+ * Else set `disablePictureInPicture` to `false` to disable elPiP on a supported browser
110
+ *
111
+ *
112
+ * @see [Spec]{@link https://w3c.github.io/picture-in-picture/}
113
+ * @see [Spec]{@link https://wicg.github.io/document-picture-in-picture/}
114
+ *
115
+ * @fires Player#enterpictureinpicture
116
+ *
117
+ * @return {Promise}
118
+ * A promise with a Picture-in-Picture window.
119
+ */
120
+ /* eslint-disable */
121
+ requestPictureInPicture() {
122
+ if (this.options_.enableDocumentPictureInPicture && window.documentPictureInPicture) {
123
+ const pipContainer = document.createElement(this.el().tagName);
124
+ pipContainer.classList = this.el().classList;
125
+ pipContainer.classList.add('vjs-pip-container');
126
+ if (this.posterImage) {
127
+ pipContainer.appendChild(this.posterImage.el().cloneNode(true));
128
+ }
129
+ if (this.titleBar) {
130
+ pipContainer.appendChild(this.titleBar.el().cloneNode(true));
131
+ }
132
+ pipContainer.appendChild(videojs.dom.createEl('p', {
133
+ className: 'vjs-pip-text'
134
+ }, {}, this.localize('Playing in picture-in-picture')));
135
+ return window.documentPictureInPicture.requestWindow({
136
+ // The aspect ratio won't be correct, Chrome bug https://crbug.com/1407629
137
+ width: this.videoWidth(),
138
+ height: this.videoHeight()
139
+ }).then(pipWindow => {
140
+ videojs.dom.copyStyleSheetsToWindow(pipWindow);
141
+ this.el_.parentNode.insertBefore(pipContainer, this.el_);
142
+ pipWindow.document.body.appendChild(this.el_);
143
+ pipWindow.document.body.classList.add('vjs-pip-window');
144
+ this.player_.isInPictureInPicture(true);
145
+ this.player_.trigger({
146
+ type: 'enterpictureinpicture',
147
+ pipWindow
148
+ });
149
+
150
+ // Listen for the PiP closing event to move the video back.
151
+ pipWindow.addEventListener('pagehide', event => {
152
+ console.log(event.target);
153
+ const pipVideo = event.target.querySelector('.vjs-v8');
154
+ pipContainer.parentNode.replaceChild(pipVideo, pipContainer);
155
+ this.player_.isInPictureInPicture(false);
156
+ this.player_.trigger('leavepictureinpicture');
157
+ });
158
+ return pipWindow;
159
+ });
160
+ }
161
+ if ('pictureInPictureEnabled' in document && this.disablePictureInPicture() === false) {
162
+ /**
163
+ * This event fires when the player enters picture in picture mode
164
+ *
165
+ * @event Player#enterpictureinpicture
166
+ * @type {Event}
167
+ */
168
+ return this.techGet_('requestPictureInPicture');
169
+ }
170
+ return Promise.reject('No PiP mode is available');
171
+ }
172
+ /* eslint-enable */
173
+
101
174
  /**
102
175
  * Get the percent (as a decimal) of the media that's been played.
103
176
  * This method is not a part of the native HTML video API.
@@ -362,6 +435,45 @@ class AudioTrackButton extends VJSAudioTrackButton {
362
435
  videojs.registerComponent('AudioTrackMenuItem', AudioTrackMenuItem);
363
436
  videojs.registerComponent('AudioTrackButton', AudioTrackButton);
364
437
 
438
+ /**
439
+ * @ignore
440
+ */
441
+ const VJSPictureInPictureToggle = videojs.getComponent('PictureInPictureToggle');
442
+ class PictureInPictureToggle extends VJSPictureInPictureToggle {
443
+ /**
444
+ * Displays or hides the button depending on the audio mode detection.
445
+ * Exits picture-in-picture if it is enabled when switching to audio mode.
446
+ */
447
+ /* eslint-disable */
448
+ handlePictureInPictureAudioModeChange() {
449
+ // This audio detection will not detect HLS or DASH audio-only streams because there was no reliable way to detect them at the time
450
+ const isSourceAudio = this.player_.currentType().substring(0, 5) === 'audio';
451
+ const isAudioMode = isSourceAudio || this.player_.audioPosterMode() || this.player_.audioOnlyMode();
452
+ if (!isAudioMode || this.player_.options_.enableDocumentPictureInPicture && 'documentPictureInPicture' in window) {
453
+ this.show();
454
+ return;
455
+ }
456
+ if (this.player_.isInPictureInPicture()) {
457
+ this.player_.exitPictureInPicture();
458
+ }
459
+ this.hide();
460
+ }
461
+ /* eslint-enable */
462
+
463
+ /**
464
+ * Show the `Component`s element if it is hidden by removing the
465
+ * 'vjs-hidden' class name from it only in browsers that support the Picture-in-Picture API.
466
+ */
467
+ show() {
468
+ // Does not allow to display the pictureInPictureToggle in browsers that do not support the Picture-in-Picture or DocumentPictureInPicture API.
469
+ if (typeof document.exitPictureInPicture !== 'function' && !(this.player_.options_.enableDocumentPictureInPicture && 'documentPictureInPicture' in window)) {
470
+ return;
471
+ }
472
+ this.removeClass('vjs-hidden');
473
+ }
474
+ }
475
+ videojs.registerComponent('PictureInPictureToggle', PictureInPictureToggle);
476
+
365
477
  /**
366
478
  * Pillarbox is an alias for the video.js namespace with additional options.
367
479
  *
@@ -1 +1 @@
1
- {"version":3,"file":"pillarbox-core.es.js","sources":["../src/components/player.js","../src/components/audio-track-menu-item.js","../src/pillarbox.js"],"sourcesContent":["import videojs from 'video.js';\nimport 'videojs-contrib-eme';\n\n/** @import VJSPlayer from 'video.js/dist/types/player' */\n/** @import AudioTrack from 'video.js/dist/types/tracks/audio-track' */\n/** @import TextTrack from 'video.js/dist/types/tracks/text-track' */\n/** @import {TrackSelector} from './typedef' */\n\n/**\n * @ignore\n * @type {typeof VJSPlayer}\n */\nconst vjsPlayer = videojs.getComponent('player');\n\n/**\n * This class extends the video.js Player.\n *\n * @class Player\n * @see https://docs.videojs.com/player\n */\nclass Player extends vjsPlayer {\n constructor(tag, options, ready) {\n /**\n * Configuration for plugins.\n *\n * @see [Video.js Plugins Option]{@link https://videojs.com/guides/options/#plugins}\n * @type {Object}\n * @property {boolean} eme - Enable the EME (Encrypted Media Extensions) plugin.\n */\n options = videojs.obj.merge(options, { plugins: { eme: true }});\n super(tag, options, ready);\n }\n\n /**\n * A getter/setter for the media's audio track.\n * Activates the audio track according to the language and kind properties.\n * Falls back on the first audio track found if the kind property is not satisfied.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AudioTrack/kind\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AudioTrack/language\n *\n * @param {TrackSelector} [trackSelector]\n *\n * @example\n * // Get the current audio track\n * player.audioTrack();\n *\n * @example\n * // Activate an audio track based on language and kind properties\n * player.audioTrack({language:'en', kind:'description'});\n *\n * @example\n * // Activate first audio track found corresponding to language\n * player.audioTrack({language:'fr'});\n *\n * @return {AudioTrack | undefined} The\n * currently enabled audio track. See {@link https://docs.videojs.com/audiotrack}.\n */\n audioTrack(trackSelector) {\n const audioTracks = Array.from(this.player().audioTracks());\n\n if (!trackSelector) {\n return audioTracks.find((audioTrack) => audioTrack.enabled);\n }\n\n const { kind, language } = trackSelector;\n const audioTrack =\n audioTracks.find(\n (audioTrack) =>\n audioTrack.language === language && audioTrack.kind === kind\n ) || audioTracks.find((audioTrack) => audioTrack.language === language);\n\n if (audioTrack) {\n audioTrack.enabled = true;\n }\n\n return audioTrack;\n }\n\n /**\n * Calculates an array of ranges based on the `buffered()` data.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/buffered\n *\n * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of buffered ranges.\n */\n bufferedRanges() {\n const ranges = [];\n\n for (let i = 0; i < this.buffered().length; i++) {\n const start = this.buffered().start(i);\n const end = this.buffered().end(i);\n\n ranges.push({ start, end });\n }\n\n return ranges;\n }\n\n /**\n * Get the percent (as a decimal) of the media that's been played.\n * This method is not a part of the native HTML video API.\n *\n * Live streams with DVR are not currently supported.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#htmlmediaelement.played\n *\n * @return {number}\n * A decimal between 0 and 1 representing the percent\n * that is played 0 being 0% and 1 being 100%\n */\n playedPercent() {\n if (!Number.isFinite(this.duration())) return NaN;\n\n let timePlayed = 0;\n\n for (let i = 0; i != this.played().length; i++) {\n timePlayed += this.played().end(i) - this.played().start(i);\n }\n\n const percentPlayed = timePlayed / this.duration();\n\n return percentPlayed;\n }\n\n /**\n * Get an array of ranges based on the `played` data.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#htmlmediaelement.played\n *\n * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of played ranges.\n */\n playedRanges() {\n const ranges = [];\n\n for (let i = 0; i < this.played().length; i++) {\n const start = this.played().start(i);\n const end = this.played().end(i);\n\n ranges.push({ start, end });\n }\n\n return ranges;\n }\n\n /**\n * Calculates an array of ranges based on the `seekable()` data.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seekable\n *\n * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of seekable ranges.\n */\n seekableRanges() {\n const ranges = [];\n\n for (let i = 0; i < this.seekable().length; i++) {\n const start = this.seekable().start(i);\n const end = this.seekable().end(i);\n\n ranges.push({ start, end });\n }\n\n return ranges;\n }\n\n /**\n * A getter/setter for the media's text track.\n * Activates the text track according to the language and kind properties.\n * Falls back on the first text track found if the kind property is not satisfied.\n * Disables all subtitle tracks that are `showing` if the `trackSelector` is truthy but does not satisfy any condition.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TextTrack/kind\n * @see https://developer.mozilla.org/en-US/docs/Web/API/textTrack/language\n *\n * @param {TrackSelector} [trackSelector]\n *\n * @example\n * // Get the current text track\n * player.textTrack();\n *\n * @example\n * // Disable all text tracks has a side effect\n * player.textTrack('off');\n * player.textTrack({});\n *\n * @example\n * // Activate an text track based on language and kind properties\n * player.textTrack({language:'en', kind:'captions'});\n *\n * @example\n * // Activate first text track found corresponding to language\n * player.textTrack({language:'fr'});\n *\n * @return {TextTrack | undefined} The\n * currently enabled text track. See {@link https://docs.videojs.com/texttrack}.\n */\n textTrack(trackSelector) {\n const textTracks = Array.from(this.player().textTracks()).filter(\n (textTrack) => !['chapters', 'metadata'].includes(textTrack.kind)\n );\n\n if (!trackSelector) {\n return textTracks.find((textTrack) => textTrack.mode === 'showing');\n }\n\n textTracks.forEach((textTrack) => (textTrack.mode = 'disabled'));\n\n const { kind, language } = trackSelector;\n const textTrack =\n textTracks.find((textTrack) => {\n if (textTrack.language === language && textTrack.kind === kind) {\n textTrack.mode = 'showing';\n }\n\n return textTrack.mode === 'showing';\n }) ||\n textTracks.find((textTrack) => {\n if (textTrack.language === language) {\n textTrack.mode = 'showing';\n }\n\n return textTrack.mode === 'showing';\n });\n\n return textTrack;\n }\n}\n\nvideojs.registerComponent('player', Player);\n\nexport default Player;\n","import videojs from 'video.js';\n\n/** @import MenuItem from 'video.js/dist/types/menu/menu-item' */\n\n/**\n * @ignore\n */\nconst VJSAudioTrackButton = videojs.getComponent('AudioTrackButton');\n\n/**\n * @ignore\n * @type {typeof MenuItem}\n */\nconst MenuItem = videojs.getComponent('MenuItem');\n\n/**\n * An {@link AudioTrack} {@link MenuItem}\n *\n * This is a temporary workaround.\n *\n * @extends MenuItem\n */\nclass AudioTrackMenuItem extends MenuItem {\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n constructor(player, options) {\n const track = options.track;\n const tracks = player.audioTracks();\n\n // Modify options for parent MenuItem class's init.\n options.label = track.label || track.language || 'Unknown';\n options.selected = track.enabled;\n\n super(player, options);\n\n this.track = track;\n\n this.addClass(`vjs-${track.kind}-menu-item`);\n\n const changeHandler = (...args) => {\n this.handleTracksChange.apply(this, args);\n };\n\n tracks.addEventListener('change', changeHandler);\n this.on('dispose', () => {\n tracks.removeEventListener('change', changeHandler);\n });\n }\n\n createEl(type, props, attrs) {\n const el = super.createEl(type, props, attrs);\n const parentSpan = el.querySelector('.vjs-menu-item-text');\n\n if (['main-desc', 'descriptions', 'description'].indexOf(this.options_.track.kind) >= 0) {\n parentSpan.appendChild(videojs.dom.createEl('span', {\n className: 'vjs-icon-placeholder'\n }, {\n 'aria-hidden': true\n }));\n parentSpan.appendChild(videojs.dom.createEl('span', {\n className: 'vjs-control-text',\n textContent: ' ' + this.localize('Descriptions')\n }));\n }\n\n return el;\n }\n\n /**\n * This gets called when an `AudioTrackMenuItem is \"clicked\". See {@link ClickableComponent}\n * for more detailed information on what a click can be.\n *\n * @param {Event} [event]\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n handleClick(event) {\n super.handleClick(event);\n\n // the audio track list will automatically toggle other tracks\n // off for us.\n this.track.enabled = true;\n\n if (!this.player_.tech_.featuresNativeAudioTracks) return;\n\n // when native audio tracks are used, we want to make sure that other tracks are turned off\n const tracks = this.player_.audioTracks();\n\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n\n // skip the current track since we enabled it above\n if (track === this.track) {\n continue;\n }\n\n track.enabled = track === this.track;\n }\n\n }\n\n /**\n * Handle any {@link AudioTrack} change.\n *\n * @param {Event} [event]\n * The {@link AudioTrackList#change} event that caused this to run.\n *\n * @listens AudioTrackList#change\n */\n handleTracksChange() {\n this.selected(this.track.enabled);\n }\n}\n\n/**\n * The base class for buttons that toggle specific {@link AudioTrack} types.\n *\n * @extends VJSAudioTrackButton\n */\nclass AudioTrackButton extends VJSAudioTrackButton {\n\n\n /**\n * Create a menu item for each audio track\n *\n * @param {AudioTrackMenuItem[]} [items=[]]\n * An array of existing menu items to use.\n *\n * @return {AudioTrackMenuItem[]}\n * An array of menu items\n */\n createItems(items = []) {\n // if there's only one audio track, there no point in showing it\n this.hideThreshold_ = 1;\n\n const tracks = this.player_.audioTracks();\n\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n\n items.push(new AudioTrackMenuItem(this.player_, {\n track,\n // MenuItem is selectable\n selectable: true,\n // MenuItem is NOT multiSelectable (i.e. only one can be marked \"selected\" at a time)\n multiSelectable: false\n }));\n }\n\n return items;\n }\n}\n\nvideojs.registerComponent('AudioTrackMenuItem', AudioTrackMenuItem);\nvideojs.registerComponent('AudioTrackButton', AudioTrackButton);\n","import { version } from '../package.json';\nimport videojs from 'video.js';\nimport './components/player.js';\nimport './components/audio-track-menu-item.js';\n\n/**\n * Pillarbox is an alias for the video.js namespace with additional options.\n *\n * @namespace\n * @see https://docs.videojs.com/module-videojs-videojs\n * @type {videojs}\n */\nconst pillarbox = videojs;\n\npillarbox.VERSION = {\n pillarbox: version,\n videojs: videojs.VERSION,\n [videojs.VhsSourceHandler.name]: videojs.VhsSourceHandler.VERSION,\n eme: videojs.getPlugin('eme').VERSION,\n};\n\n/**\n * Enable smooth seeking for Pillarbox.\n *\n * @see [Video.js enableSmoothSeeking Option]{@link https://videojs.com/guides/options/#enablesmoothseeking}\n * @type {boolean}\n * @default true\n */\npillarbox.options.enableSmoothSeeking = true;\n/**\n * Enable fill mode for the video player, allowing it to expand to fill the container.\n *\n * @see [Video.js Fill Option]{@link https://videojs.com/guides/layout/#fill-mode}\n * @type {boolean}\n * @default true\n */\npillarbox.options.fill = true;\n/**\n * Configuration options for HTML5 settings in Pillarbox.\n *\n * @see [VHS useForcedSubtitles Option]{@link https://github.com/videojs/http-streaming/blob/main/README.md#useforcedsubtitles}\n * @see [VHS overrideNative Option]{@link https://github.com/videojs/http-streaming#overridenative}\n * @type {Object}\n * @property {Object} vhs - Configuration for the Video.js HTTP Streaming.\n * @property {boolean} useForcedSubtitles - Enables the player to display forced subtitles by default.\n * Forced subtitles are pieces of information intended for display when no other text representation\n * is selected. They are used to clarify dialogue, provide alternate languages, display texted graphics,\n * or present location/person IDs that are not otherwise covered in the dubbed/localized audio.\n * @property {boolean} overrideNative - Try to use videojs-http-streaming even on platforms that\n * provide some level of HLS support natively\n */\npillarbox.options.html5 = {\n vhs: {\n useForcedSubtitles: true,\n overrideNative: !pillarbox.browser.IS_SAFARI\n }\n};\n/**\n * Configuration for the live tracker.\n *\n * @see [Video.js liveTracker Option]{@link https://videojs.com/guides/options/#livetrackertrackingthreshold}\n * @type {Object}\n * @property {number} trackingThreshold - A threshold that controls when the liveui should be shown.\n * @property {number} liveTolerance - An option that controls how far from the seekable end should be considered live playback.\n */\npillarbox.options.liveTracker = {\n trackingThreshold: 120,\n liveTolerance: 15,\n};\n/**\n * Allows the player to use the live ui that includes:\n *\n * - A progress bar for seeking within the live window\n * - A button that can be clicked to seek to the live edge with a circle indicating if you are at the live edge or not.\n *\n * @see [Video.js liveui Option]{@link https://videojs.com/guides/options/#liveui}\n * @type {boolean}\n */\npillarbox.options.liveui = true;\n/**\n * Indicates that the video is to be played \"inline\", that is within the element's playback area.\n *\n * @see [Video element playsinline attribute]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video#playsinline}\n * @type {boolean}\n */\npillarbox.options.playsinline = true;\n/**\n * Enable responsive mode, this will cause the player to customize itself based on responsive breakpoints.\n *\n * @see [Video.js Responsive Option]{@link https://videojs.com/guides/options/#responsive}\n * @type {boolean}\n */\npillarbox.options.responsive = true;\n/**\n * A placeholder for accessing trackers directly from the player.\n *\n * @type {Object}\n */\npillarbox.options.trackers = {};\n\nexport default pillarbox;\n"],"names":["vjsPlayer","videojs","getComponent","Player","constructor","tag","options","ready","obj","merge","plugins","eme","audioTrack","trackSelector","audioTracks","Array","from","player","find","enabled","kind","language","bufferedRanges","ranges","i","buffered","length","start","end","push","playedPercent","Number","isFinite","duration","NaN","timePlayed","played","percentPlayed","playedRanges","seekableRanges","seekable","textTrack","textTracks","filter","includes","mode","forEach","registerComponent","VJSAudioTrackButton","MenuItem","AudioTrackMenuItem","track","tracks","label","selected","addClass","changeHandler","args","handleTracksChange","apply","addEventListener","on","removeEventListener","createEl","type","props","attrs","el","parentSpan","querySelector","indexOf","options_","appendChild","dom","className","textContent","localize","handleClick","event","player_","tech_","featuresNativeAudioTracks","AudioTrackButton","createItems","items","hideThreshold_","selectable","multiSelectable","pillarbox","VERSION","version","VhsSourceHandler","name","getPlugin","enableSmoothSeeking","fill","html5","vhs","useForcedSubtitles","overrideNative","browser","IS_SAFARI","liveTracker","trackingThreshold","liveTolerance","liveui","playsinline","responsive","trackers"],"mappings":"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"}
1
+ {"version":3,"file":"pillarbox-core.es.js","sources":["../src/components/player.js","../src/components/audio-track-menu-item.js","../src/components/picture-in-picture-toggle.js","../src/pillarbox.js"],"sourcesContent":["import videojs from 'video.js';\nimport 'videojs-contrib-eme';\n\n/** @import VJSPlayer from 'video.js/dist/types/player' */\n/** @import AudioTrack from 'video.js/dist/types/tracks/audio-track' */\n/** @import TextTrack from 'video.js/dist/types/tracks/text-track' */\n/** @import {TrackSelector} from './typedef' */\n\n/**\n * @ignore\n * @type {typeof VJSPlayer}\n */\nconst vjsPlayer = videojs.getComponent('player');\n\n/**\n * This class extends the video.js Player.\n *\n * @class Player\n * @see https://docs.videojs.com/player\n */\nclass Player extends vjsPlayer {\n constructor(tag, options, ready) {\n /**\n * Configuration for plugins.\n *\n * @see [Video.js Plugins Option]{@link https://videojs.com/guides/options/#plugins}\n * @type {Object}\n * @property {boolean} eme - Enable the EME (Encrypted Media Extensions) plugin.\n */\n options = videojs.obj.merge(options, { plugins: { eme: true }});\n super(tag, options, ready);\n }\n\n /**\n * A getter/setter for the media's audio track.\n * Activates the audio track according to the language and kind properties.\n * Falls back on the first audio track found if the kind property is not satisfied.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AudioTrack/kind\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AudioTrack/language\n *\n * @param {TrackSelector} [trackSelector]\n *\n * @example\n * // Get the current audio track\n * player.audioTrack();\n *\n * @example\n * // Activate an audio track based on language and kind properties\n * player.audioTrack({language:'en', kind:'description'});\n *\n * @example\n * // Activate first audio track found corresponding to language\n * player.audioTrack({language:'fr'});\n *\n * @return {AudioTrack | undefined} The\n * currently enabled audio track. See {@link https://docs.videojs.com/audiotrack}.\n */\n audioTrack(trackSelector) {\n const audioTracks = Array.from(this.player().audioTracks());\n\n if (!trackSelector) {\n return audioTracks.find((audioTrack) => audioTrack.enabled);\n }\n\n const { kind, language } = trackSelector;\n const audioTrack =\n audioTracks.find(\n (audioTrack) =>\n audioTrack.language === language && audioTrack.kind === kind\n ) || audioTracks.find((audioTrack) => audioTrack.language === language);\n\n if (audioTrack) {\n audioTrack.enabled = true;\n }\n\n return audioTrack;\n }\n\n /**\n * Calculates an array of ranges based on the `buffered()` data.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/buffered\n *\n * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of buffered ranges.\n */\n bufferedRanges() {\n const ranges = [];\n\n for (let i = 0; i < this.buffered().length; i++) {\n const start = this.buffered().start(i);\n const end = this.buffered().end(i);\n\n ranges.push({ start, end });\n }\n\n return ranges;\n }\n\n /**\n * Create a floating video window always on top of other windows so that users may\n * continue consuming media while they interact with other content sites, or\n * applications on their device.\n *\n * This can use document picture-in-picture or element picture in picture\n *\n * Set `enableDocumentPictureInPicture` to `true` to use docPiP on a supported browser\n * Else set `disablePictureInPicture` to `false` to disable elPiP on a supported browser\n *\n *\n * @see [Spec]{@link https://w3c.github.io/picture-in-picture/}\n * @see [Spec]{@link https://wicg.github.io/document-picture-in-picture/}\n *\n * @fires Player#enterpictureinpicture\n *\n * @return {Promise}\n * A promise with a Picture-in-Picture window.\n */\n /* eslint-disable */\n requestPictureInPicture() {\n if (this.options_.enableDocumentPictureInPicture && window.documentPictureInPicture) {\n const pipContainer = document.createElement(this.el().tagName);\n\n pipContainer.classList = this.el().classList;\n pipContainer.classList.add('vjs-pip-container');\n if (this.posterImage) {\n pipContainer.appendChild(this.posterImage.el().cloneNode(true));\n }\n if (this.titleBar) {\n pipContainer.appendChild(this.titleBar.el().cloneNode(true));\n }\n pipContainer.appendChild(videojs.dom.createEl('p', { className: 'vjs-pip-text' }, {}, this.localize('Playing in picture-in-picture')));\n\n return window.documentPictureInPicture.requestWindow({\n // The aspect ratio won't be correct, Chrome bug https://crbug.com/1407629\n width: this.videoWidth(),\n height: this.videoHeight()\n }).then(pipWindow => {\n videojs.dom.copyStyleSheetsToWindow(pipWindow);\n this.el_.parentNode.insertBefore(pipContainer, this.el_);\n\n pipWindow.document.body.appendChild(this.el_);\n pipWindow.document.body.classList.add('vjs-pip-window');\n\n this.player_.isInPictureInPicture(true);\n this.player_.trigger({ type: 'enterpictureinpicture', pipWindow });\n\n // Listen for the PiP closing event to move the video back.\n pipWindow.addEventListener('pagehide', (event) => {\n console.log(event.target);\n const pipVideo = event.target.querySelector('.vjs-v8');\n\n pipContainer.parentNode.replaceChild(pipVideo, pipContainer);\n this.player_.isInPictureInPicture(false);\n this.player_.trigger('leavepictureinpicture');\n });\n\n return pipWindow;\n });\n }\n if ('pictureInPictureEnabled' in document && this.disablePictureInPicture() === false) {\n /**\n * This event fires when the player enters picture in picture mode\n *\n * @event Player#enterpictureinpicture\n * @type {Event}\n */\n return this.techGet_('requestPictureInPicture');\n }\n\n return Promise.reject('No PiP mode is available');\n }\n /* eslint-enable */\n\n /**\n * Get the percent (as a decimal) of the media that's been played.\n * This method is not a part of the native HTML video API.\n *\n * Live streams with DVR are not currently supported.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#htmlmediaelement.played\n *\n * @return {number}\n * A decimal between 0 and 1 representing the percent\n * that is played 0 being 0% and 1 being 100%\n */\n playedPercent() {\n if (!Number.isFinite(this.duration())) return NaN;\n\n let timePlayed = 0;\n\n for (let i = 0; i != this.played().length; i++) {\n timePlayed += this.played().end(i) - this.played().start(i);\n }\n\n const percentPlayed = timePlayed / this.duration();\n\n return percentPlayed;\n }\n\n /**\n * Get an array of ranges based on the `played` data.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement#htmlmediaelement.played\n *\n * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of played ranges.\n */\n playedRanges() {\n const ranges = [];\n\n for (let i = 0; i < this.played().length; i++) {\n const start = this.played().start(i);\n const end = this.played().end(i);\n\n ranges.push({ start, end });\n }\n\n return ranges;\n }\n\n /**\n * Calculates an array of ranges based on the `seekable()` data.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seekable\n *\n * @returns {Array<{start: number, end: number}>} An array of objects representing start and end points of seekable ranges.\n */\n seekableRanges() {\n const ranges = [];\n\n for (let i = 0; i < this.seekable().length; i++) {\n const start = this.seekable().start(i);\n const end = this.seekable().end(i);\n\n ranges.push({ start, end });\n }\n\n return ranges;\n }\n\n /**\n * A getter/setter for the media's text track.\n * Activates the text track according to the language and kind properties.\n * Falls back on the first text track found if the kind property is not satisfied.\n * Disables all subtitle tracks that are `showing` if the `trackSelector` is truthy but does not satisfy any condition.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TextTrack/kind\n * @see https://developer.mozilla.org/en-US/docs/Web/API/textTrack/language\n *\n * @param {TrackSelector} [trackSelector]\n *\n * @example\n * // Get the current text track\n * player.textTrack();\n *\n * @example\n * // Disable all text tracks has a side effect\n * player.textTrack('off');\n * player.textTrack({});\n *\n * @example\n * // Activate an text track based on language and kind properties\n * player.textTrack({language:'en', kind:'captions'});\n *\n * @example\n * // Activate first text track found corresponding to language\n * player.textTrack({language:'fr'});\n *\n * @return {TextTrack | undefined} The\n * currently enabled text track. See {@link https://docs.videojs.com/texttrack}.\n */\n textTrack(trackSelector) {\n const textTracks = Array.from(this.player().textTracks()).filter(\n (textTrack) => !['chapters', 'metadata'].includes(textTrack.kind)\n );\n\n if (!trackSelector) {\n return textTracks.find((textTrack) => textTrack.mode === 'showing');\n }\n\n textTracks.forEach((textTrack) => (textTrack.mode = 'disabled'));\n\n const { kind, language } = trackSelector;\n const textTrack =\n textTracks.find((textTrack) => {\n if (textTrack.language === language && textTrack.kind === kind) {\n textTrack.mode = 'showing';\n }\n\n return textTrack.mode === 'showing';\n }) ||\n textTracks.find((textTrack) => {\n if (textTrack.language === language) {\n textTrack.mode = 'showing';\n }\n\n return textTrack.mode === 'showing';\n });\n\n return textTrack;\n }\n}\n\nvideojs.registerComponent('player', Player);\n\nexport default Player;\n","import videojs from 'video.js';\n\n/** @import MenuItem from 'video.js/dist/types/menu/menu-item' */\n\n/**\n * @ignore\n */\nconst VJSAudioTrackButton = videojs.getComponent('AudioTrackButton');\n\n/**\n * @ignore\n * @type {typeof MenuItem}\n */\nconst MenuItem = videojs.getComponent('MenuItem');\n\n/**\n * An {@link AudioTrack} {@link MenuItem}\n *\n * This is a temporary workaround.\n *\n * @extends MenuItem\n */\nclass AudioTrackMenuItem extends MenuItem {\n\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n constructor(player, options) {\n const track = options.track;\n const tracks = player.audioTracks();\n\n // Modify options for parent MenuItem class's init.\n options.label = track.label || track.language || 'Unknown';\n options.selected = track.enabled;\n\n super(player, options);\n\n this.track = track;\n\n this.addClass(`vjs-${track.kind}-menu-item`);\n\n const changeHandler = (...args) => {\n this.handleTracksChange.apply(this, args);\n };\n\n tracks.addEventListener('change', changeHandler);\n this.on('dispose', () => {\n tracks.removeEventListener('change', changeHandler);\n });\n }\n\n createEl(type, props, attrs) {\n const el = super.createEl(type, props, attrs);\n const parentSpan = el.querySelector('.vjs-menu-item-text');\n\n if (['main-desc', 'descriptions', 'description'].indexOf(this.options_.track.kind) >= 0) {\n parentSpan.appendChild(videojs.dom.createEl('span', {\n className: 'vjs-icon-placeholder'\n }, {\n 'aria-hidden': true\n }));\n parentSpan.appendChild(videojs.dom.createEl('span', {\n className: 'vjs-control-text',\n textContent: ' ' + this.localize('Descriptions')\n }));\n }\n\n return el;\n }\n\n /**\n * This gets called when an `AudioTrackMenuItem is \"clicked\". See {@link ClickableComponent}\n * for more detailed information on what a click can be.\n *\n * @param {Event} [event]\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n handleClick(event) {\n super.handleClick(event);\n\n // the audio track list will automatically toggle other tracks\n // off for us.\n this.track.enabled = true;\n\n if (!this.player_.tech_.featuresNativeAudioTracks) return;\n\n // when native audio tracks are used, we want to make sure that other tracks are turned off\n const tracks = this.player_.audioTracks();\n\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n\n // skip the current track since we enabled it above\n if (track === this.track) {\n continue;\n }\n\n track.enabled = track === this.track;\n }\n\n }\n\n /**\n * Handle any {@link AudioTrack} change.\n *\n * @param {Event} [event]\n * The {@link AudioTrackList#change} event that caused this to run.\n *\n * @listens AudioTrackList#change\n */\n handleTracksChange() {\n this.selected(this.track.enabled);\n }\n}\n\n/**\n * The base class for buttons that toggle specific {@link AudioTrack} types.\n *\n * @extends VJSAudioTrackButton\n */\nclass AudioTrackButton extends VJSAudioTrackButton {\n\n\n /**\n * Create a menu item for each audio track\n *\n * @param {AudioTrackMenuItem[]} [items=[]]\n * An array of existing menu items to use.\n *\n * @return {AudioTrackMenuItem[]}\n * An array of menu items\n */\n createItems(items = []) {\n // if there's only one audio track, there no point in showing it\n this.hideThreshold_ = 1;\n\n const tracks = this.player_.audioTracks();\n\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n\n items.push(new AudioTrackMenuItem(this.player_, {\n track,\n // MenuItem is selectable\n selectable: true,\n // MenuItem is NOT multiSelectable (i.e. only one can be marked \"selected\" at a time)\n multiSelectable: false\n }));\n }\n\n return items;\n }\n}\n\nvideojs.registerComponent('AudioTrackMenuItem', AudioTrackMenuItem);\nvideojs.registerComponent('AudioTrackButton', AudioTrackButton);\n","import videojs from 'video.js';\n\n/**\n * @ignore\n */\nconst VJSPictureInPictureToggle = videojs.getComponent('PictureInPictureToggle');\n\nclass PictureInPictureToggle extends VJSPictureInPictureToggle {\n /**\n * Displays or hides the button depending on the audio mode detection.\n * Exits picture-in-picture if it is enabled when switching to audio mode.\n */\n /* eslint-disable */\n handlePictureInPictureAudioModeChange() {\n // This audio detection will not detect HLS or DASH audio-only streams because there was no reliable way to detect them at the time\n const isSourceAudio = this.player_.currentType().substring(0, 5) === 'audio';\n const isAudioMode =\n isSourceAudio || this.player_.audioPosterMode() || this.player_.audioOnlyMode();\n\n if (!isAudioMode || (this.player_.options_.enableDocumentPictureInPicture && 'documentPictureInPicture' in window)) {\n this.show();\n\n return;\n }\n\n if (this.player_.isInPictureInPicture()) {\n this.player_.exitPictureInPicture();\n }\n\n this.hide();\n }\n /* eslint-enable */\n\n /**\n * Show the `Component`s element if it is hidden by removing the\n * 'vjs-hidden' class name from it only in browsers that support the Picture-in-Picture API.\n */\n show() {\n // Does not allow to display the pictureInPictureToggle in browsers that do not support the Picture-in-Picture or DocumentPictureInPicture API.\n if (\n typeof document.exitPictureInPicture !== 'function' &&\n !(this.player_.options_.enableDocumentPictureInPicture && 'documentPictureInPicture' in window)\n ) {\n return;\n }\n\n this.removeClass('vjs-hidden');\n }\n}\n\nvideojs.registerComponent('PictureInPictureToggle', PictureInPictureToggle);\nexport default PictureInPictureToggle;\n","import { version } from '../package.json';\nimport videojs from 'video.js';\nimport './components/player.js';\nimport './components/audio-track-menu-item.js';\nimport './components/picture-in-picture-toggle.js';\n\n/**\n * Pillarbox is an alias for the video.js namespace with additional options.\n *\n * @namespace\n * @see https://docs.videojs.com/module-videojs-videojs\n * @type {videojs}\n */\nconst pillarbox = videojs;\n\npillarbox.VERSION = {\n pillarbox: version,\n videojs: videojs.VERSION,\n [videojs.VhsSourceHandler.name]: videojs.VhsSourceHandler.VERSION,\n eme: videojs.getPlugin('eme').VERSION,\n};\n\n/**\n * Enable smooth seeking for Pillarbox.\n *\n * @see [Video.js enableSmoothSeeking Option]{@link https://videojs.com/guides/options/#enablesmoothseeking}\n * @type {boolean}\n * @default true\n */\npillarbox.options.enableSmoothSeeking = true;\n/**\n * Enable fill mode for the video player, allowing it to expand to fill the container.\n *\n * @see [Video.js Fill Option]{@link https://videojs.com/guides/layout/#fill-mode}\n * @type {boolean}\n * @default true\n */\npillarbox.options.fill = true;\n/**\n * Configuration options for HTML5 settings in Pillarbox.\n *\n * @see [VHS useForcedSubtitles Option]{@link https://github.com/videojs/http-streaming/blob/main/README.md#useforcedsubtitles}\n * @see [VHS overrideNative Option]{@link https://github.com/videojs/http-streaming#overridenative}\n * @type {Object}\n * @property {Object} vhs - Configuration for the Video.js HTTP Streaming.\n * @property {boolean} useForcedSubtitles - Enables the player to display forced subtitles by default.\n * Forced subtitles are pieces of information intended for display when no other text representation\n * is selected. They are used to clarify dialogue, provide alternate languages, display texted graphics,\n * or present location/person IDs that are not otherwise covered in the dubbed/localized audio.\n * @property {boolean} overrideNative - Try to use videojs-http-streaming even on platforms that\n * provide some level of HLS support natively\n */\npillarbox.options.html5 = {\n vhs: {\n useForcedSubtitles: true,\n overrideNative: !pillarbox.browser.IS_SAFARI\n }\n};\n/**\n * Configuration for the live tracker.\n *\n * @see [Video.js liveTracker Option]{@link https://videojs.com/guides/options/#livetrackertrackingthreshold}\n * @type {Object}\n * @property {number} trackingThreshold - A threshold that controls when the liveui should be shown.\n * @property {number} liveTolerance - An option that controls how far from the seekable end should be considered live playback.\n */\npillarbox.options.liveTracker = {\n trackingThreshold: 120,\n liveTolerance: 15,\n};\n/**\n * Allows the player to use the live ui that includes:\n *\n * - A progress bar for seeking within the live window\n * - A button that can be clicked to seek to the live edge with a circle indicating if you are at the live edge or not.\n *\n * @see [Video.js liveui Option]{@link https://videojs.com/guides/options/#liveui}\n * @type {boolean}\n */\npillarbox.options.liveui = true;\n/**\n * Indicates that the video is to be played \"inline\", that is within the element's playback area.\n *\n * @see [Video element playsinline attribute]{@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video#playsinline}\n * @type {boolean}\n */\npillarbox.options.playsinline = true;\n/**\n * Enable responsive mode, this will cause the player to customize itself based on responsive breakpoints.\n *\n * @see [Video.js Responsive Option]{@link https://videojs.com/guides/options/#responsive}\n * @type {boolean}\n */\npillarbox.options.responsive = true;\n/**\n * A placeholder for accessing trackers directly from the player.\n *\n * @type {Object}\n */\npillarbox.options.trackers = {};\n\nexport default pillarbox;\n"],"names":["vjsPlayer","videojs","getComponent","Player","constructor","tag","options","ready","obj","merge","plugins","eme","audioTrack","trackSelector","audioTracks","Array","from","player","find","enabled","kind","language","bufferedRanges","ranges","i","buffered","length","start","end","push","requestPictureInPicture","options_","enableDocumentPictureInPicture","window","documentPictureInPicture","pipContainer","document","createElement","el","tagName","classList","add","posterImage","appendChild","cloneNode","titleBar","dom","createEl","className","localize","requestWindow","width","videoWidth","height","videoHeight","then","pipWindow","copyStyleSheetsToWindow","el_","parentNode","insertBefore","body","player_","isInPictureInPicture","trigger","type","addEventListener","event","console","log","target","pipVideo","querySelector","replaceChild","disablePictureInPicture","techGet_","Promise","reject","playedPercent","Number","isFinite","duration","NaN","timePlayed","played","percentPlayed","playedRanges","seekableRanges","seekable","textTrack","textTracks","filter","includes","mode","forEach","registerComponent","VJSAudioTrackButton","MenuItem","AudioTrackMenuItem","track","tracks","label","selected","addClass","changeHandler","args","handleTracksChange","apply","on","removeEventListener","props","attrs","parentSpan","indexOf","textContent","handleClick","tech_","featuresNativeAudioTracks","AudioTrackButton","createItems","items","hideThreshold_","selectable","multiSelectable","VJSPictureInPictureToggle","PictureInPictureToggle","handlePictureInPictureAudioModeChange","isSourceAudio","currentType","substring","isAudioMode","audioPosterMode","audioOnlyMode","show","exitPictureInPicture","hide","removeClass","pillarbox","VERSION","version","VhsSourceHandler","name","getPlugin","enableSmoothSeeking","fill","html5","vhs","useForcedSubtitles","overrideNative","browser","IS_SAFARI","liveTracker","trackingThreshold","liveTolerance","liveui","playsinline","responsive","trackers"],"mappings":"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AAK,CAAC,CAACJ;AAChC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACAD,SAAS,CAACnI,OAAO,CAACyI,mBAAmB,GAAG,IAAI;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACAN,SAAS,CAACnI,OAAO,CAAC0I,IAAI,GAAG,IAAI;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAP,SAAS,CAACnI,OAAO,CAAC2I,KAAK,GAAG;AACxBC,EAAAA,GAAG,EAAE;AACHC,IAAAA,kBAAkB,EAAE,IAAI;AACxBC,IAAAA,cAAc,EAAE,CAACX,SAAS,CAACY,OAAO,CAACC;AACrC;AACF,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAb,SAAS,CAACnI,OAAO,CAACiJ,WAAW,GAAG;AAC9BC,EAAAA,iBAAiB,EAAE,GAAG;AACtBC,EAAAA,aAAa,EAAE;AACjB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAhB,SAAS,CAACnI,OAAO,CAACoJ,MAAM,GAAG,IAAI;AAC/B;AACA;AACA;AACA;AACA;AACA;AACAjB,SAAS,CAACnI,OAAO,CAACqJ,WAAW,GAAG,IAAI;AACpC;AACA;AACA;AACA;AACA;AACA;AACAlB,SAAS,CAACnI,OAAO,CAACsJ,UAAU,GAAG,IAAI;AACnC;AACA;AACA;AACA;AACA;AACAnB,SAAS,CAACnI,OAAO,CAACuJ,QAAQ,GAAG,EAAE;;;;"}