{"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;;;;"}