@srgssr/pillarbox-web 1.14.1 → 1.15.1

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.
package/README.md ADDED
@@ -0,0 +1,117 @@
1
+ # Pillarbox Web Player
2
+
3
+ [![Pillarbox logo](docs/README-images/logo.jpg)](https://github.com/SRGSSR/pillarbox-web)
4
+
5
+ ## About
6
+
7
+ The Pillarbox Web Player is a web-based video player that extends Video.js to enable playback of
8
+ SRGSSR content through a custom data provider. This player is designed to enhance the viewing
9
+ experience of SRGSSR content, making it more accessible and feature-rich.
10
+
11
+ ## Quick Start
12
+
13
+ To get started with Pillarbox, install it through the following command:
14
+
15
+ ```bash
16
+ npm install --save @srgssr/pillarbox-web
17
+ ```
18
+
19
+ In your HTML file, add the following code to initialize Pillarbox:
20
+
21
+ ```html
22
+ <video-js id="my-player" class="pillarbox-js" controls></video-js>
23
+ ```
24
+
25
+ Import the CSS file in your HTML to apply Pillarbox default theme:
26
+
27
+ ```html
28
+ <link rel="stylesheet" href="node_modules/@srgssr/pillarbox-web/dist/pillarbox.min.css"/>
29
+ ```
30
+
31
+ Finally, import Pillarbox and set up the player:
32
+
33
+ ```javascript
34
+ import Pillarbox from '@srgssr/pillarbox-web';
35
+
36
+ const player = new Pillarbox('my-player', {/* options... */ });
37
+ player.src({ src: 'urn:swi:video:48115940', type: 'srgssr/urn' });
38
+ ```
39
+
40
+ ## Documentation
41
+
42
+ For detailed information on how to use the Pillarbox Web Player, checkout
43
+ the [API Documentation](https://web.pillarbox.ch/api).
44
+
45
+ A live demo of the player is available
46
+ here: [Pillarbox Web Demo](https://demo.pillarbox.ch).
47
+
48
+ To expand the features that Pillarbox offers out of the box, visit the [Pillarbox Web
49
+ Suite](https://github.com/SRGSSR/pillarbox-web-suite). You are welcome to contribute and share your
50
+ own components there.
51
+
52
+ You can create your own theme with
53
+ the [Pillarbox Theme Editor](https://editor.pillarbox.ch).
54
+
55
+ ## Pillarbox flavours
56
+
57
+ Pillarbox comes in two variants:
58
+
59
+ - `pillarbox-core`: is the core library that provides a rich set of features on top of the Video.js
60
+ API. It does not include any SRGSSR-specific business logic, so it can be used by any developer
61
+ who wants to customize their own video player.
62
+ - `pillarbox` is the complete package that includes the core library as well as the SRGSSR data
63
+ provider and analytics. It is designed for SRGSSR applications that need to integrate with the
64
+ SRGSSR media platform and tracking behavior.
65
+
66
+ ## TypeScript Support
67
+
68
+ TypeScript is a language that extends JavaScript with static types and other features. It helps to
69
+ write more reliable and maintainable code. `Pillarbox` is written in plain JavaScript, but it
70
+ provides type declarations for TypeScript users. These declarations are carefully generated and
71
+ included in the bundled package.
72
+
73
+ ## Contributing
74
+
75
+ If you want to contribute to this project, you are welcome to do so. Please follow the code style
76
+ and linting rules defined in this project. You can use the following commands to check and fix your
77
+ code:
78
+
79
+ Check your javascript code:
80
+
81
+ ```shell
82
+ npm run eslint
83
+ ```
84
+
85
+ Check your CSS and SCSS code:
86
+
87
+ ```shell
88
+ npm run stylelint
89
+ ```
90
+
91
+ Fix your CSS and SCSS code:
92
+
93
+ ```shell
94
+ npm run stylelint:fix
95
+ ```
96
+
97
+ This project also has a pre-commit hook that runs the linting check automatically before you commit
98
+ your changes. You can enable this hook by running the `prepare` script: `npm run prepare`.
99
+
100
+ Before submitting a pull request, please make sure that your code builds successfully. You can use
101
+ the following commands to build the project:
102
+
103
+ ```shell
104
+ npm run build
105
+ ```
106
+
107
+ If you want to enhance our demo application you can get involved
108
+ here: https://github.com/SRGSSR/pillarbox-web-demo
109
+ To contribute to the theme editor go to: https://github.com/SRGSSR/pillarbox-web-theme-editor
110
+
111
+ ## License
112
+
113
+ See the [LICENSE](LICENSE) file for more information.
114
+
115
+ [token-settings]: https://github.com/settings/tokens
116
+
117
+ [token-guide]: https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry#authenticating-with-a-personal-access-token
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var videojs = require('video.js');
3
+ const videojs = require('video.js');
4
4
  require('videojs-contrib-eme');
5
5
 
6
- var version = "1.14.0";
6
+ const version = "1.15.0";
7
7
 
8
8
  /**
9
9
  * @ignore
@@ -305,3 +305,4 @@ pillarbox.options.responsive = true;
305
305
  pillarbox.options.trackers = {};
306
306
 
307
307
  module.exports = pillarbox;
308
+ //# sourceMappingURL=pillarbox-core.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pillarbox-core.cjs.js","sources":["../src/components/player.js","../src/pillarbox.js"],"sourcesContent":["import videojs from 'video.js';\nimport 'videojs-contrib-eme';\n\n/**\n * @ignore\n * @type {typeof import('video.js/dist/types/player').default}\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 {import('./typedef').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 {import('video.js/dist/types/tracks/audio-track').default | 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 {import('./typedef').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 {import('video.js/dist/types/tracks/text-track').default | 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 { version } from '../package.json';\nimport videojs from 'video.js';\nimport './components/player.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","pillarbox","VERSION","version","VhsSourceHandler","name","getPlugin","enableSmoothSeeking","fill","html5","vhs","useForcedSubtitles","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
- var version = "1.14.0";
4
+ const version = "1.15.0";
5
5
 
6
6
  /**
7
7
  * @ignore
@@ -303,3 +303,4 @@ pillarbox.options.responsive = true;
303
303
  pillarbox.options.trackers = {};
304
304
 
305
305
  export { pillarbox as default };
306
+ //# sourceMappingURL=pillarbox-core.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pillarbox-core.es.js","sources":["../src/components/player.js","../src/pillarbox.js"],"sourcesContent":["import videojs from 'video.js';\nimport 'videojs-contrib-eme';\n\n/**\n * @ignore\n * @type {typeof import('video.js/dist/types/player').default}\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 {import('./typedef').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 {import('video.js/dist/types/tracks/audio-track').default | 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 {import('./typedef').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 {import('video.js/dist/types/tracks/text-track').default | 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 { version } from '../package.json';\nimport videojs from 'video.js';\nimport './components/player.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","pillarbox","VERSION","version","VhsSourceHandler","name","getPlugin","enableSmoothSeeking","fill","html5","vhs","useForcedSubtitles","liveTracker","trackingThreshold","liveTolerance","liveui","playsinline","responsive","trackers"],"mappings":"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"}