@srgssr/pillarbox-web 1.34.1 → 1.35.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.34.0";
6
+ const version = "1.35.0";
7
7
 
8
8
  /** @import VJSPlayer from 'video.js/dist/types/player' */
9
9
  /** @import AudioTrack from 'video.js/dist/types/tracks/audio-track' */
@@ -399,16 +399,20 @@ pillarbox.options.fill = true;
399
399
  * Configuration options for HTML5 settings in Pillarbox.
400
400
  *
401
401
  * @see [VHS useForcedSubtitles Option]{@link https://github.com/videojs/http-streaming/blob/main/README.md#useforcedsubtitles}
402
+ * @see [VHS overrideNative Option]{@link https://github.com/videojs/http-streaming#overridenative}
402
403
  * @type {Object}
403
404
  * @property {Object} vhs - Configuration for the Video.js HTTP Streaming.
404
405
  * @property {boolean} useForcedSubtitles - Enables the player to display forced subtitles by default.
405
406
  * Forced subtitles are pieces of information intended for display when no other text representation
406
407
  * is selected. They are used to clarify dialogue, provide alternate languages, display texted graphics,
407
408
  * or present location/person IDs that are not otherwise covered in the dubbed/localized audio.
409
+ * @property {boolean} overrideNative - Try to use videojs-http-streaming even on platforms that
410
+ * provide some level of HLS support natively
408
411
  */
409
412
  pillarbox.options.html5 = {
410
413
  vhs: {
411
- useForcedSubtitles: true
414
+ useForcedSubtitles: true,
415
+ overrideNative: !pillarbox.browser.IS_SAFARI
412
416
  }
413
417
  };
414
418
  /**
@@ -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 * @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 */\npillarbox.options.html5 = {\n vhs: { useForcedSubtitles: true }\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","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/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,7 +1,7 @@
1
1
  import videojs from 'video.js';
2
2
  import 'videojs-contrib-eme';
3
3
 
4
- const version = "1.34.0";
4
+ const version = "1.35.0";
5
5
 
6
6
  /** @import VJSPlayer from 'video.js/dist/types/player' */
7
7
  /** @import AudioTrack from 'video.js/dist/types/tracks/audio-track' */
@@ -397,16 +397,20 @@ pillarbox.options.fill = true;
397
397
  * Configuration options for HTML5 settings in Pillarbox.
398
398
  *
399
399
  * @see [VHS useForcedSubtitles Option]{@link https://github.com/videojs/http-streaming/blob/main/README.md#useforcedsubtitles}
400
+ * @see [VHS overrideNative Option]{@link https://github.com/videojs/http-streaming#overridenative}
400
401
  * @type {Object}
401
402
  * @property {Object} vhs - Configuration for the Video.js HTTP Streaming.
402
403
  * @property {boolean} useForcedSubtitles - Enables the player to display forced subtitles by default.
403
404
  * Forced subtitles are pieces of information intended for display when no other text representation
404
405
  * is selected. They are used to clarify dialogue, provide alternate languages, display texted graphics,
405
406
  * or present location/person IDs that are not otherwise covered in the dubbed/localized audio.
407
+ * @property {boolean} overrideNative - Try to use videojs-http-streaming even on platforms that
408
+ * provide some level of HLS support natively
406
409
  */
407
410
  pillarbox.options.html5 = {
408
411
  vhs: {
409
- useForcedSubtitles: true
412
+ useForcedSubtitles: true,
413
+ overrideNative: !pillarbox.browser.IS_SAFARI
410
414
  }
411
415
  };
412
416
  /**
@@ -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 * @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 */\npillarbox.options.html5 = {\n vhs: { useForcedSubtitles: true }\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","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/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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"}
@@ -94,7 +94,7 @@ function _toPropertyKey(t) {
94
94
  return "symbol" == typeof i ? i : i + "";
95
95
  }
96
96
 
97
- const version = "1.34.0";
97
+ const version = "1.35.0";
98
98
 
99
99
  /** @import VJSPlayer from 'video.js/dist/types/player' */
100
100
  /** @import AudioTrack from 'video.js/dist/types/tracks/audio-track' */
@@ -490,16 +490,20 @@ pillarbox.options.fill = true;
490
490
  * Configuration options for HTML5 settings in Pillarbox.
491
491
  *
492
492
  * @see [VHS useForcedSubtitles Option]{@link https://github.com/videojs/http-streaming/blob/main/README.md#useforcedsubtitles}
493
+ * @see [VHS overrideNative Option]{@link https://github.com/videojs/http-streaming#overridenative}
493
494
  * @type {Object}
494
495
  * @property {Object} vhs - Configuration for the Video.js HTTP Streaming.
495
496
  * @property {boolean} useForcedSubtitles - Enables the player to display forced subtitles by default.
496
497
  * Forced subtitles are pieces of information intended for display when no other text representation
497
498
  * is selected. They are used to clarify dialogue, provide alternate languages, display texted graphics,
498
499
  * or present location/person IDs that are not otherwise covered in the dubbed/localized audio.
500
+ * @property {boolean} overrideNative - Try to use videojs-http-streaming even on platforms that
501
+ * provide some level of HLS support natively
499
502
  */
500
503
  pillarbox.options.html5 = {
501
504
  vhs: {
502
- useForcedSubtitles: true
505
+ useForcedSubtitles: true,
506
+ overrideNative: !pillarbox.browser.IS_SAFARI
503
507
  }
504
508
  };
505
509
  /**
@@ -1395,8 +1399,7 @@ class SRGAnalytics {
1395
1399
  media_quality: this.srcMediaData.mediaData.quality,
1396
1400
  // TODO use media_is_dvr, media_is_live to define peach media_stream_type
1397
1401
  media_subtitles_on: this.isTextTrackEnabled(),
1398
- media_volume: (this.player.volume() * 100).toFixed(0),
1399
- navigation_environment: this.environment
1402
+ media_volume: (this.player.volume() * 100).toFixed(0)
1400
1403
  };
1401
1404
  if (this.isAudioTrackEnabled()) {
1402
1405
  labels.media_audio_track = this.getCurrentAudioTrack();
@@ -1435,7 +1438,8 @@ class SRGAnalytics {
1435
1438
  media_player_name: 'pillarbox-web',
1436
1439
  // TODO add a property playerName in the constructor with a default value ?
1437
1440
  media_player_version: this.playerVersion,
1438
- media_url: this.srcMediaData.src
1441
+ media_url: this.srcMediaData.src,
1442
+ navigation_environment: this.environment
1439
1443
  };
1440
1444
  const analyticsMetadata = this.srcMediaData.mediaData.analyticsMetadata || {};
1441
1445
  window.tc_vars = Object.assign({}, window.tc_vars, data, analyticsMetadata);
@@ -2926,9 +2930,6 @@ class MediaComposition {
2926
2930
  if (!this.mainChapter) {
2927
2931
  this.mainChapter = this.findChapterByUrn(this.chapterUrn);
2928
2932
  }
2929
- if (!this.mainChapter && this.chapterList && this.chapterList.length > 0) {
2930
- [this.mainChapter] = this.chapterList;
2931
- }
2932
2933
  return this.mainChapter;
2933
2934
  }
2934
2935
 
@@ -4542,6 +4543,7 @@ pillarbox.options.srgOptions = {
4542
4543
  };
4543
4544
 
4544
4545
  exports.DataProvider = DataProvider;
4546
+ exports.ImageUtils = Image;
4545
4547
  exports.MediaComposition = MediaComposition;
4546
4548
  exports.PillarboxMonitoring = PillarboxMonitoring;
4547
4549
  exports.Player = Player;