cloudinary-video-player
Version:
Cloudinary Video Player
1,186 lines (1,090 loc) • 1.7 MB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["cloudinary-video-player"] = factory();
else
root["cloudinary-video-player"] = factory();
})(self, () => {
return /******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./components/component-utils.js":
/*!***************************************!*\
!*** ./components/component-utils.js ***!
\***************************************/
/***/ ((module) => {
const hide = el => {
el.style.display = 'none';
};
const show = el => {
el.style.display = '';
};
const setText = (el, text) => {
if (!text || text.length <= 0) {
el.innerText = '';
hide(el);
return;
}
el.innerText = text;
show(el);
};
module.exports = {
hide,
show,
setText
};
/***/ }),
/***/ "./components/index.js":
/*!*****************************!*\
!*** ./components/index.js ***!
\*****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ JumpBackButton: () => (/* reexport safe */ _jumpButtons_jump_10_minus__WEBPACK_IMPORTED_MODULE_1__["default"]),
/* harmony export */ JumpForwardButton: () => (/* reexport safe */ _jumpButtons_jump_10_plus__WEBPACK_IMPORTED_MODULE_0__["default"]),
/* harmony export */ LogoButton: () => (/* reexport safe */ _logoButton_logo_button__WEBPACK_IMPORTED_MODULE_2__["default"]),
/* harmony export */ ProgressControlEventsBlocker: () => (/* reexport safe */ _progress_control_events_blocker_progress_control_events_blocker__WEBPACK_IMPORTED_MODULE_3__["default"]),
/* harmony export */ TitleBar: () => (/* reexport safe */ _title_bar_title_bar__WEBPACK_IMPORTED_MODULE_4__["default"])
/* harmony export */ });
/* harmony import */ var _jumpButtons_jump_10_plus__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jumpButtons/jump-10-plus */ "./components/jumpButtons/jump-10-plus.js");
/* harmony import */ var _jumpButtons_jump_10_minus__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jumpButtons/jump-10-minus */ "./components/jumpButtons/jump-10-minus.js");
/* harmony import */ var _logoButton_logo_button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./logoButton/logo-button */ "./components/logoButton/logo-button.js");
/* harmony import */ var _progress_control_events_blocker_progress_control_events_blocker__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./progress-control-events-blocker/progress-control-events-blocker */ "./components/progress-control-events-blocker/progress-control-events-blocker.js");
/* harmony import */ var _title_bar_title_bar__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./title-bar/title-bar */ "./components/title-bar/title-bar.js");
/***/ }),
/***/ "./components/jumpButtons/jump-10-minus.js":
/*!*************************************************!*\
!*** ./components/jumpButtons/jump-10-minus.js ***!
\*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
const ClickableComponent = video_js__WEBPACK_IMPORTED_MODULE_0___default().getComponent('ClickableComponent');
class JumpBackButton extends ClickableComponent {
handleClick(event) {
super.handleClick(event);
this.player().currentTime(this.player().currentTime() - 10);
}
createEl() {
return video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('button', {
className: 'vjs-control vjs-icon-skip-10-min vjs-icon-replay-10 vjs-button',
ariaLabel: 'Jump back 10 seconds'
});
}
}
video_js__WEBPACK_IMPORTED_MODULE_0___default().registerComponent('JumpBackButton', JumpBackButton);
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (JumpBackButton);
/***/ }),
/***/ "./components/jumpButtons/jump-10-plus.js":
/*!************************************************!*\
!*** ./components/jumpButtons/jump-10-plus.js ***!
\************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
const ClickableComponent = video_js__WEBPACK_IMPORTED_MODULE_0___default().getComponent('ClickableComponent');
class JumpForwardButton extends ClickableComponent {
handleClick(event) {
super.handleClick(event);
this.player().currentTime(this.player().currentTime() + 10);
}
createEl() {
return video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('button', {
className: 'vjs-control vjs-icon-skip-10-plus vjs-icon-forward-10 vjs-button',
ariaLabel: 'Jump forward 10 seconds'
});
}
}
video_js__WEBPACK_IMPORTED_MODULE_0___default().registerComponent('JumpForwardButton', JumpForwardButton);
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (JumpForwardButton);
/***/ }),
/***/ "./components/logoButton/logo-button.js":
/*!**********************************************!*\
!*** ./components/logoButton/logo-button.js ***!
\**********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _logo_button_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./logo-button.scss */ "./components/logoButton/logo-button.scss");
// support VJS5 & VJS6 at the same time
const ClickableComponent = video_js__WEBPACK_IMPORTED_MODULE_0___default().getComponent('ClickableComponent');
class LogoButton extends ClickableComponent {
createEl() {
const opts = this.options_.playerOptions;
const display = opts.showLogo ? 'block' : 'none';
const bgImage = opts.logoImageUrl ? `background-image: url(${opts.logoImageUrl})` : '';
return video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('a', {}, {
class: 'vjs-control vjs-cloudinary-button vjs-button',
href: opts.logoOnclickUrl,
target: '_blank',
style: `display: ${display}; ${bgImage}`,
'aria-label': 'Logo link'
});
}
}
video_js__WEBPACK_IMPORTED_MODULE_0___default().registerComponent('logoButton', LogoButton);
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LogoButton);
/***/ }),
/***/ "./components/progress-control-events-blocker/progress-control-events-blocker.js":
/*!***************************************************************************************!*\
!*** ./components/progress-control-events-blocker/progress-control-events-blocker.js ***!
\***************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
const Component = video_js__WEBPACK_IMPORTED_MODULE_0___default().getComponent('Component');
class ProgressControlEventsBlocker extends Component {
constructor(player) {
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
super(player, options);
}
createEl() {
return super.createEl('div', {
className: 'vjs-progress-control-events-blocker'
});
}
}
video_js__WEBPACK_IMPORTED_MODULE_0___default().registerComponent('progressControlEventsBlocker', ProgressControlEventsBlocker);
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ProgressControlEventsBlocker);
/***/ }),
/***/ "./components/recommendations-overlay/index.js":
/*!*****************************************************!*\
!*** ./components/recommendations-overlay/index.js ***!
\*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ lazyRecommendationsOverlayComponent)
/* harmony export */ });
async function lazyRecommendationsOverlayComponent(player) {
try {
if (!player.getChild('recommendationsOverlay')) {
await Promise.all(/*! import() | recommendations-overlay */[__webpack_require__.e("styles"), __webpack_require__.e("recommendations-overlay")]).then(__webpack_require__.bind(__webpack_require__, /*! ./recommendations-overlay */ "./components/recommendations-overlay/recommendations-overlay.js"));
player.addChild('recommendationsOverlay');
}
return player;
} catch (error) {
console.error('Failed to load plugin:', error);
}
}
/***/ }),
/***/ "./components/title-bar/title-bar.js":
/*!*******************************************!*\
!*** ./components/title-bar/title-bar.js ***!
\*******************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var assets_styles_components_title_bar_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! assets/styles/components/title-bar.scss */ "./assets/styles/components/title-bar.scss");
/* harmony import */ var _component_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../component-utils */ "./components/component-utils.js");
/* harmony import */ var _component_utils__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_component_utils__WEBPACK_IMPORTED_MODULE_2__);
// support VJS5 & VJS6 at the same time
const dom = (video_js__WEBPACK_IMPORTED_MODULE_0___default().dom) || (video_js__WEBPACK_IMPORTED_MODULE_0___default());
const Component = video_js__WEBPACK_IMPORTED_MODULE_0___default().getComponent('Component');
class TitleBar extends Component {
constructor(player) {
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
super(player, options);
this.on(player, 'cldsourcechanged', (_, _ref) => {
let {
source
} = _ref;
return this.setItem(source);
});
}
setItem(source) {
if (!source) {
this.setTitle('');
this.setSubtitle('');
return;
}
const info = source.info();
this.setTitle(info.title);
this.setSubtitle(info.subtitle);
}
setTitle(text) {
_component_utils__WEBPACK_IMPORTED_MODULE_2___default().setText(this.titleEl, text);
this.refresh();
return text;
}
setSubtitle(text) {
_component_utils__WEBPACK_IMPORTED_MODULE_2___default().setText(this.subtitleEl, text);
this.refresh();
return text;
}
refresh() {
const titleValue = () => this.titleEl.innerText;
const subtitleValue = () => this.subtitleEl.innerText;
if (!titleValue() && !subtitleValue()) {
this.hide();
return;
}
this.show();
}
createEl() {
this.titleEl = dom.createEl('div', {
className: 'vjs-title-bar-title'
});
this.subtitleEl = dom.createEl('div', {
className: 'vjs-title-bar-subtitle'
});
const el = super.createEl('div', {
append: this.titleEl,
className: 'vjs-title-bar'
});
el.appendChild(this.titleEl);
el.appendChild(this.subtitleEl);
return el;
}
}
video_js__WEBPACK_IMPORTED_MODULE_0___default().registerComponent('titleBar', TitleBar);
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TitleBar);
/***/ }),
/***/ "./config/defaults.js":
/*!****************************!*\
!*** ./config/defaults.js ***!
\****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _plugins_context_menu_contextMenuContent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../plugins/context-menu/contextMenuContent */ "./plugins/context-menu/contextMenuContent.js");
/* harmony import */ var _video_player_const__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../video-player.const */ "./video-player.const.js");
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
logoOnclickUrl: 'https://cloudinary.com/',
showLogo: true,
showJumpControls: false,
playsinline: (video_js__WEBPACK_IMPORTED_MODULE_0___default().browser).IS_IOS,
skin: 'dark',
controls: false,
chaptersButton: false,
pictureInPictureToggle: false,
seekThumbnails: true,
aiHighlightsGraph: false,
preload: _video_player_const__WEBPACK_IMPORTED_MODULE_2__.PRELOAD.AUTO,
textTrackSettings: false,
loop: false,
muted: false,
posterOptions: {},
sourceTypes: ['auto'],
contextMenu: {
content: _plugins_context_menu_contextMenuContent__WEBPACK_IMPORTED_MODULE_1__["default"]
},
floatingWhenNotVisible: _video_player_const__WEBPACK_IMPORTED_MODULE_2__.FLOATING_TO.NONE,
hideContextMenu: false,
analytics: false,
cloudinaryAnalytics: true,
allowUsageReport: true,
playedEventPercents: [25, 50, 75, 100],
html5: {
handlePartialData: false,
nativeTextTracks: false,
vhs: {
overrideNative: (video_js__WEBPACK_IMPORTED_MODULE_0___default())?.browser ? !(video_js__WEBPACK_IMPORTED_MODULE_0___default().browser).IS_IOS && !(video_js__WEBPACK_IMPORTED_MODULE_0___default().browser).IS_SAFARI : true
}
},
disableSeekWhileScrubbingOnMobile: true
});
/***/ }),
/***/ "./extended-events.js":
/*!****************************!*\
!*** ./extended-events.js ***!
\****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
/* harmony export */ normalizeEventsParam: () => (/* binding */ normalizeEventsParam)
/* harmony export */ });
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! events */ "../node_modules/events/events.js");
/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var lodash_isObject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/isObject */ "../node_modules/lodash/isObject.js");
/* harmony import */ var lodash_isObject__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_isObject__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _utils_consts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/consts */ "./utils/consts.js");
const EVENT_DEFAULTS = {
percentsplayed: {
percents: [25, 50, 75, 100]
}
};
const DEFAULT_EVENTS = [_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PERCENTS_PLAYED, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PAUSE_NO_SEEK, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.SEEK, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.MUTE, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.UNMUTE, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.QUALITY_CHANGED];
const DEFAULT_OPTIONS = {
events: DEFAULT_EVENTS
};
// Emits the following additional events:
// percentsplayed, timeplayed, pausenoseek, seek, mute, unmute
class ExtendedEvents extends (events__WEBPACK_IMPORTED_MODULE_1___default()) {
constructor(player) {
let initOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
super();
this.player = player;
const options = video_js__WEBPACK_IMPORTED_MODULE_0___default().obj.merge(DEFAULT_OPTIONS, initOptions);
let _muteData = {
lastState: undefined
};
let _seekStart = 0;
let _seekEnd = 0;
let _seeking = false;
let _percentsTracked = [];
let _timesTracked = [];
let _currentSource = null;
let _ended = false;
const volumechange = event => {
if (this.player.muted() && _muteData.lastState !== 'muted') {
_muteData.lastState = 'muted';
this.emit(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.MUTE, event);
} else if (!this.player.muted() && _muteData.lastState !== 'unmuted') {
_muteData.lastState = 'unmuted';
this.emit(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.UNMUTE, event);
}
};
const timeupdate = event => {
const currentTime = this.player.currentTime();
const duration = this.player.duration();
const _emit = (type, data) => {
data.originalType = 'timeupdate';
this.emit(type, event, data);
};
if (this.events.percentsplayed) {
this.events.percentsplayed.percents.forEach(percent => {
if (playedAtPercentage(currentTime, duration, percent) && _percentsTracked.indexOf(percent) === -1) {
_percentsTracked.push(percent);
_emit(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PERCENTS_PLAYED, {
percent
});
}
});
}
if (this.events.timeplayed) {
const timeplayed = this.events.timeplayed;
const times = timeplayed.interval ? [Math.floor(currentTime / timeplayed.interval) * timeplayed.interval] : timeplayed.times;
times.forEach(time => {
if (playedAtTime(currentTime, time) && _timesTracked.indexOf(time) === -1) {
_timesTracked.push(time);
_emit(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.TIME_PLAYED, {
time
});
}
});
}
if (this.events.seek) {
_seekStart = _seekEnd;
_seekEnd = currentTime;
if (Math.abs(_seekStart - _seekEnd) > 1) {
_seeking = true;
// should empty _timesTracked array on seek, needed for 'timeplayed' event
resetPerVideoState();
_emit(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.SEEK, {
seekStart: _seekStart,
seekEnd: _seekEnd
});
}
}
};
const pause = event => {
const currentTime = Math.round(this.player.currentTime());
const duration = Math.round(this.player.duration());
if (currentTime !== duration && !_seeking) {
this.emit(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PAUSE_NO_SEEK, event);
}
};
const play = () => {
_seeking = false;
};
const replay = () => {
if (_ended) {
this.player.trigger('replay');
_ended = false;
}
};
const loadedmetadata = () => {
if (this.player.currentSource().src !== _currentSource) {
resetPerVideoState();
_currentSource = this.player.currentSource().src;
}
};
const adaptiveEvents = event => {
let ee = this;
let tracks = this.player.textTracks();
let segmentMetadataTrack = null;
for (let i = 0; i < tracks.length; i++) {
if (tracks[i].label === 'segment-metadata') {
segmentMetadataTrack = tracks[i];
}
}
let previousResolution = null;
if (segmentMetadataTrack) {
segmentMetadataTrack.on('cuechange', function () {
let activeCue = segmentMetadataTrack.activeCues[0];
if (activeCue) {
let currentRes = activeCue.value.resolution;
if (previousResolution !== currentRes) {
let data = {
from: previousResolution,
to: currentRes
};
ee.emit(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.QUALITY_CHANGED, event, data);
}
previousResolution = currentRes;
}
});
}
};
const resetState = () => {
_muteData = {
lastState: undefined
};
_seekStart = _seekEnd = 0;
_seeking = false;
resetPerVideoState();
};
const resetPerVideoState = () => {
_percentsTracked = [];
_timesTracked = [];
};
const ended = () => {
_ended = true;
};
this.events = normalizeEventsParam(options.events, EVENT_DEFAULTS);
resetState();
this.player.on(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PLAY, replay.bind(this));
this.player.on(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.ENDED, ended.bind(this));
if (this.events.percentsplayed || this.events.timeplayed || this.events.seek || this.events.totaltimeplayed) {
this.player.on(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.TIME_UPDATE, timeupdate.bind(this));
}
if (this.events.mute || this.events.unmute) {
this.player.on(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.VOLUME_CHANGE, volumechange.bind(this));
}
if (this.events.pausenoseek) {
this.player.on(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PAUSE, pause.bind(this));
this.player.on(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PLAY, play.bind(this));
}
this.player.on(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.LOADED_METADATA, loadedmetadata.bind(this));
this.player.on(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.LOADED_DATA, adaptiveEvents.bind(this));
}
}
const normalizeEventsParam = (events, defaults) => {
let normalized = events;
if (events.constructor.name === 'Array') {
normalized = events.reduce((agg, item) => {
const eventDefaults = defaults[item] || {};
if (lodash_isObject__WEBPACK_IMPORTED_MODULE_2___default()(item)) {
agg[item.type] = Object.assign({}, eventDefaults, item);
} else {
agg[item] = eventDefaults;
}
return agg;
}, {});
}
return normalized;
};
const playedAtPercentage = function (currentTime, duration, percentageCheckpoint) {
let graceRangeSeconds = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.5;
const checkPoint = duration * percentageCheckpoint / 100;
return playedAtTime(currentTime, checkPoint, graceRangeSeconds);
};
const playedAtTime = function (currentTime, checkpoint) {
let graceRangeSeconds = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.5;
return currentTime <= checkpoint + graceRangeSeconds && currentTime >= checkpoint - graceRangeSeconds;
};
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ExtendedEvents);
/***/ }),
/***/ "./index.js":
/*!******************!*\
!*** ./index.js ***!
\******************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
/* harmony export */ player: () => (/* binding */ player),
/* harmony export */ players: () => (/* binding */ players),
/* harmony export */ videoPlayer: () => (/* binding */ videoPlayer),
/* harmony export */ videoPlayers: () => (/* binding */ videoPlayers)
/* harmony export */ });
/* harmony import */ var assets_styles_main_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! assets/styles/main.scss */ "./assets/styles/main.scss");
/* harmony import */ var lodash_pick__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/pick */ "../node_modules/lodash/pick.js");
/* harmony import */ var lodash_pick__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_pick__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _video_player__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./video-player */ "./video-player.js");
/* harmony import */ var _player__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./player */ "./player.js");
/* harmony import */ var _utils_object__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils/object */ "./utils/object.js");
/* harmony import */ var _video_player_const__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./video-player.const */ "./video-player.const.js");
const getConfig = function () {
let playerOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
let cloudinaryConfig = arguments.length > 1 ? arguments[1] : undefined;
const snakeCaseCloudinaryConfig = lodash_pick__WEBPACK_IMPORTED_MODULE_1___default()((0,_utils_object__WEBPACK_IMPORTED_MODULE_4__.convertKeysToSnakeCase)(playerOptions), _video_player_const__WEBPACK_IMPORTED_MODULE_5__.CLOUDINARY_CONFIG_PARAM);
// pick cld-configurations and assign them to cloudinaryConfig
return Object.assign(playerOptions, {
cloudinaryConfig: cloudinaryConfig || snakeCaseCloudinaryConfig
});
};
const getVideoPlayer = config => (id, playerOptions, ready) => new _video_player__WEBPACK_IMPORTED_MODULE_2__["default"](id, getConfig(playerOptions, config), ready);
const getVideoPlayers = config => (selector, playerOptions, ready) => _video_player__WEBPACK_IMPORTED_MODULE_2__["default"].all(selector, getConfig(playerOptions, config), ready);
const getPlayer = config => (id, playerOptions, ready) => (0,_player__WEBPACK_IMPORTED_MODULE_3__["default"])(id, getConfig(playerOptions, config), ready);
const getPlayers = config => (selector, playerOptions, ready) => {
const nodeList = document.querySelectorAll(selector);
const playerConfig = getConfig(playerOptions, config);
return [...nodeList].map(node => (0,_player__WEBPACK_IMPORTED_MODULE_3__["default"])(node, playerConfig, ready));
};
const videoPlayer = getVideoPlayer();
const videoPlayers = getVideoPlayers();
const player = getPlayer();
const players = getPlayers();
const cloudinaryVideoPlayerLegacyConfig = config => {
console.warn('Cloudinary.new() is deprecated and will be removed. Please use cloudinary.videoPlayer() instead.');
return {
videoPlayer: getVideoPlayer(config),
videoPlayers: getVideoPlayers(config)
};
};
const cloudinary = {
...(window.cloudinary || {}),
videoPlayer,
videoPlayers,
player,
players,
Cloudinary: {
// Backwards compatibility with SDK v1
new: cloudinaryVideoPlayerLegacyConfig
}
};
window.cloudinary = cloudinary;
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (cloudinary);
/***/ }),
/***/ "./mixins/eventable.js":
/*!*****************************!*\
!*** ./mixins/eventable.js ***!
\*****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
const Eventable = superclass => class extends superclass {
constructor() {
var _this;
super();
_this = this;
const eventable = {
data: {},
handlers: {}
};
this.on = function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
const lastIndex = args.length - 1;
const func = args[lastIndex];
eventable.handlers[func] = function (event) {
event.Player = _this;
for (var _len2 = arguments.length, _args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
_args[_key2 - 1] = arguments[_key2];
}
func(event, ..._args);
};
args[lastIndex] = eventable.handlers[func];
return _this.videojs.on(...args);
};
this.one = function () {
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
const lastIndex = args.length - 1;
const func = args[lastIndex];
eventable.handlers[func] = function (event) {
event.Player = _this;
for (var _len4 = arguments.length, _args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
_args[_key4 - 1] = arguments[_key4];
}
func(event, ..._args);
delete eventable.handlers[func];
};
args[lastIndex] = eventable.handlers[func];
return _this.videojs.one(...args);
};
this.off = function () {
for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
args[_key5] = arguments[_key5];
}
const lastIndex = args.length - 1;
const func = args[lastIndex];
args[lastIndex] = eventable.handlers[func];
const res = _this.videojs.off(...args);
delete eventable.handlers[func];
return res;
};
this.trigger = function () {
_this.videojs.trigger(...arguments);
};
}
};
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Eventable);
/***/ }),
/***/ "./player.js":
/*!*******************!*\
!*** ./player.js ***!
\*******************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
/* harmony export */ getProfile: () => (/* binding */ getProfile)
/* harmony export */ });
/* harmony import */ var _video_player__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./video-player */ "./video-player.js");
/* harmony import */ var cloudinary_video_player_profiles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! cloudinary-video-player-profiles */ "../node_modules/cloudinary-video-player-profiles/dist/index.js");
/* harmony import */ var cloudinary_video_player_profiles__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(cloudinary_video_player_profiles__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _plugins_cloudinary_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./plugins/cloudinary/common */ "./plugins/cloudinary/common.js");
/* harmony import */ var _cloudinary_url_gen_backwards_utils_unsigned_url_prefix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @cloudinary/url-gen/backwards/utils/unsigned_url_prefix */ "../node_modules/@cloudinary/url-gen/backwards/utils/unsigned_url_prefix.js");
const isDefaultProfile = profileName => !!cloudinary_video_player_profiles__WEBPACK_IMPORTED_MODULE_1__.defaultProfiles.find(_ref => {
let {
name
} = _ref;
return profileName === name;
});
const getDefaultProfileConfig = profileName => {
const profile = cloudinary_video_player_profiles__WEBPACK_IMPORTED_MODULE_1__.defaultProfiles.find(_ref2 => {
let {
name
} = _ref2;
return profileName === name;
});
if (!profile) {
throw new Error(`Default profile with name ${profileName} does not exist`);
}
return profile.config;
};
const getProfile = async (profile, initOptions) => {
if (isDefaultProfile(profile)) {
return getDefaultProfileConfig(profile);
}
const urlPrefix = (0,_cloudinary_url_gen_backwards_utils_unsigned_url_prefix__WEBPACK_IMPORTED_MODULE_3__.unsigned_url_prefix)(null, initOptions.cloudName ?? initOptions.cloud_name, initOptions.private_cdn, initOptions.cdn_subdomain, initOptions.secure_cdn_subdomain, initOptions.cname, initOptions.secure ?? true, initOptions.secure_distribution);
const profileUrl = (0,_plugins_cloudinary_common__WEBPACK_IMPORTED_MODULE_2__.isRawUrl)(profile) ? profile : `${urlPrefix}/_applet_/video_service/video_player_profiles/${profile.replaceAll(' ', '+')}.json`;
return fetch(profileUrl, {
method: 'GET'
}).then(res => res.json());
};
const player = async (elem, initOptions, ready) => {
const {
profile,
...otherInitOptions
} = initOptions;
try {
const profileOptions = profile ? await getProfile(profile, otherInitOptions) : {};
const options = Object.assign({}, profileOptions.playerOptions, otherInitOptions, {
_internalAnalyticsMetadata: {
newPlayerMethod: true,
profile: isDefaultProfile(profile) ? profile : !!profile
}
});
const videoPlayer = new _video_player__WEBPACK_IMPORTED_MODULE_0__["default"](elem, options, ready);
const nativeVideoPlayerSourceMethod = videoPlayer.source;
videoPlayer.source = (id, options) => {
const extendedOptions = Object.assign({}, profileOptions.sourceOptions, options);
return nativeVideoPlayerSourceMethod.call(videoPlayer, id, extendedOptions);
};
return videoPlayer;
} catch (e) {
const videoPlayer = new _video_player__WEBPACK_IMPORTED_MODULE_0__["default"](elem, otherInitOptions);
videoPlayer.videojs.error('Invalid profile');
throw e;
}
};
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (player);
/***/ }),
/***/ "./plugins/ai-highlights-graph/index.js":
/*!**********************************************!*\
!*** ./plugins/ai-highlights-graph/index.js ***!
\**********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _ai_highlights_graph_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ai-highlights-graph.scss */ "./plugins/ai-highlights-graph/ai-highlights-graph.scss");
// Default options for the plugin.
let defaults = {};
/**
* Function to invoke when the player is ready.
*
* @function onPlayerReady
* @param {Player} player
* A Video.js player object.
*
* @param {Object} [options={}]
* A plain object containing options for the plugin.
*/
const onPlayerReady = function onPlayerReady(player, options) {
player.addClass('vjs-ai-highlights-graph');
player.aiHighlightsGraph = new HighlightsGraphPlugin(player, options);
};
/**
* A video.js plugin.
*
* In the plugin function, the value of `this` is a video.js `Player`
* instance. You cannot rely on the player being in a "ready" state here,
* depending on how the plugin is invoked. This may or may not be important
* to you; if not, remove the wait for "ready"!
*
* @function aiHighlightsGraph
* @param {Object} [options={}]
* An object of options left to the plugin author to define.
*/
function aiHighlightsGraph(options) {
this.ready(() => {
onPlayerReady(this, video_js__WEBPACK_IMPORTED_MODULE_0___default().obj.merge(defaults, options));
});
}
/**
* HighlightsGraphPlugin class.
*
* This class performs all functions related to displaying the AI highlights graph.
*/
const HighlightsGraphPlugin = function () {
/**
* Plugin class constructor, called by videojs on
* ready event.
*
* @function constructor
* @param {Player} player
* A Video.js player object.
*
* @param {Object} [options={}]
* A plain object containing options for the plugin.
*/
function HighlightsGraphPlugin(player, options) {
this.player = player;
this.options = options;
this.initializeHighlightsGraph();
return this;
}
HighlightsGraphPlugin.prototype.src = function src(source) {
this.resetPlugin();
this.options.src = source;
this.initializeHighlightsGraph();
};
HighlightsGraphPlugin.prototype.detach = function detach() {
this.resetPlugin();
};
HighlightsGraphPlugin.prototype.resetPlugin = function resetPlugin() {
if (this.graphHolder) {
this.graphHolder.parentNode.removeChild(this.graphHolder);
}
delete this.progressBar;
delete this.graphHolder;
delete this.lastStyle;
};
/**
* Bootstrap the plugin.
*/
HighlightsGraphPlugin.prototype.initializeHighlightsGraph = function initializeHighlightsGraph() {
if (!this.options.src) {
return;
}
fetch(this.options.src, {
credentials: this.player.cloudinary.source?.().withCredentials ? 'include' : 'omit'
}).then(res => {
return res.json();
}).then(res => {
this.setupHighlightsGraphElement();
if (this.graphHolder) {
this.createHighlightsGraph(res);
}
});
};
HighlightsGraphPlugin.prototype.setupHighlightsGraphElement = function setupHighlightsGraphElement() {
this.progressBar = this.player.$('.vjs-progress-control');
if (!this.progressBar) {
return;
}
const graphHolder = this.player.$('.vjs-highlights-graph-display') || document.createElement('div');
graphHolder.setAttribute('class', 'vjs-highlights-graph-display');
this.progressBar.appendChild(graphHolder);
this.graphHolder = graphHolder;
};
/**
* Function to create the SVG path element
*/
HighlightsGraphPlugin.prototype.createPath = function createPath(dataArray, containerWidth, containerHeight) {
// Calculate the x and y coordinates for each point
const stepX = containerWidth / (dataArray.length - 1);
const points = dataArray.map((value, index) => ({
x: index * stepX,
y: containerHeight - value * containerHeight
}));
// Create a smooth line path
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
path.setAttribute('fill', 'lightblue');
// Generate the smooth line path data
let d = `M ${points[0].x},${points[0].y}`;
for (let i = 0; i < points.length - 1; i++) {
const xc = (points[i].x + points[i + 1].x) / 2;
const yc = (points[i].y + points[i + 1].y) / 2;
d += ` Q ${points[i].x},${points[i].y} ${xc},${yc}`;
}
d += ` Q ${points[points.length - 1].x},${points[points.length - 1].y} ${points[points.length - 1].x},${points[points.length - 1].y}`;
// Close the path to fill the region under the line
d += ` L ${points[points.length - 1].x},${containerHeight} L ${points[0].x},${containerHeight} Z`;
path.setAttribute('d', d);
return path;
};
HighlightsGraphPlugin.prototype.createHighlightsGraph = function createHighlightsGraph(info) {
const data = info.data;
const svgWidth = 600;
const svgHeight = 20;
const svg = this.player.$('.vjs-highlights-graph-display > svg') || document.createElementNS('http://www.w3.org/2000/svg', 'svg');
svg.setAttribute('viewBox', `0 0 ${svgWidth} ${svgHeight}`);
svg.setAttribute('preserveAspectRatio', 'none');
svg.setAttribute('width', svgWidth);
svg.setAttribute('height', svgHeight);
svg.innerHTML = '';
const path = this.createPath(data, svgWidth, svgHeight);
svg.appendChild(path);
this.graphHolder.appendChild(svg);
};
return HighlightsGraphPlugin;
}();
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (aiHighlightsGraph);
/***/ }),
/***/ "./plugins/analytics/index.js":
/*!************************************!*\
!*** ./plugins/analytics/index.js ***!
\************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var utils_slicing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! utils/slicing */ "./utils/slicing.js");
/* harmony import */ var extended_events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! extended-events */ "./extended-events.js");
/* harmony import */ var _utils_consts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/consts */ "./utils/consts.js");
const DEFAULT_EVENTS = [_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PLAY, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PAUSE, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.ENDED, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.VOLUME_CHANGE, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.RESIZE, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.ERROR, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.FULL_SCREEN_CHANGE, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.START, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.VIDEO_LOAD, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PERCENTS_PLAYED, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.SEEK, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PLAYER_LOAD];
const EVENT_DEFAULTS = {
percentsplayed: {
percents: [25, 50, 75, 100]
}
};
const DEFAULT_OPTIONS = {
events: DEFAULT_EVENTS,
category: 'Video',
defaultLabel: player => player.cloudinary && player.cloudinary.currentPublicId() || player.currentSource().src
};
class AnalyticsPlugin {
constructor(player) {
let initOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
this.player = player;
this.options = video_js__WEBPACK_IMPORTED_MODULE_0___default().obj.merge(DEFAULT_OPTIONS, initOptions);
this.events = (0,extended_events__WEBPACK_IMPORTED_MODULE_2__.normalizeEventsParam)(this.options.events, EVENT_DEFAULTS);
const extendedEvents = (0,utils_slicing__WEBPACK_IMPORTED_MODULE_1__.sliceProperties)(this.events, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PERCENTS_PLAYED, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.TIME_PLAYED, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PAUSE, _utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.SEEK);
if (extendedEvents.pause) {
delete extendedEvents.pause;
extendedEvents.pausenoseek = {};
}
this._extendedEvents = new extended_events__WEBPACK_IMPORTED_MODULE_2__["default"](player, {
events: extendedEvents
});
this._currentSource = null;
this._startTracked = null;
this._endTracked = null;
this.resetState();
}
init() {
const playerLoad = () => {
this.track({
action: 'Player Load',
label: window.location.href,
nonInteraction: true
});
};
const play = () => {
this.track({
action: 'Play'
});
};
const start = () => {
if (this._startTracked) {
this.track({
action: 'Start'
});
this._startTracked = true;
}
};
const pause = () => {
this.track({
action: 'Pause'
});
};
const ended = () => {
if (!this._endTracked) {
this.track({
action: 'Ended',
nonInteraction: true
});
this._endTracked = true;
}
};
const error = () => {
this.track({
action: 'Error',
nonInteraction: true
});
};
const volumechange = () => {
const value = this.player.muted() ? 0 : this.player.volume();
this.track({
action: 'Volume Change',
value
});
};
const resize = () => {
const action = `Resize - ${this.player.width()}x${this.player.height()}}`;
this.track({
action
});
};
const fullscreenchange = () => {
const action = this.player.isFullscreen() ? 'Enter Fullscreen' : 'Exit Fullscreen';
this.track({
action
});
};
const percentsPlayed = (event, data) => {
const {
percent
} = data;
this.track({
action: `${percent} Percents Played`,
nonInteraction: true
});
};
const timePlayed = (event, data) => {
const {
time
} = data;
this.track({
action: `${time} Seconds Played`,
value: time,
nonInteraction: true
});
};
const seek = (event, data) => {
const {
seekStart,
seekEnd
} = data;
this.track({
action: 'Seek Start',
value: seekStart
});
this.track({
action: 'Seek End',
value: seekEnd
});
};
const shoppableProductHover = (event, data) => {
this.track({
action: 'productHover',
label: data.productName
});
};
const shoppableProductClick = (event, data) => {
this.track({
action: 'productClick',
label: data.productName
});
};
const shoppableBarMax = () => {
this.track({
action: 'shoppableBar',
label: 'opened'
});
};
const shoppableBarMin = () => {
this.track({
action: 'shoppableBar',
label: 'closed'
});
};
const shoppableReplay = () => {
this.track({
action: 'replay'
});
};
const shoppableProductClickPost = (event, data) => {
this.track({
action: 'productClickPostPlay',
label: data.productName
});
};
const shoppableProductHoverPost = (event, data) => {
this.track({
action: 'productHoverPostPlay',
label: data.productName
});
};
if (this.events.shoppable) {
this.player.on('productHover', shoppableProductHover.bind(this));
this.player.on('productClick', shoppableProductClick.bind(this));
this.player.on('productHoverPost', shoppableProductHoverPost.bind(this));
this.player.on('productClickPost', shoppableProductClickPost.bind(this));
this.player.on('productBarMin', shoppableBarMin.bind(this));
this.player.on('productBarMax', shoppableBarMax.bind(this));
this.player.on('replay', shoppableReplay.bind(this));
}
if (this.events.play) {
this.player.on(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.PLAY, play.bind(this));
}
if (this.events.ended) {
this.player.on(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.ENDED, ended.bind(this));
}
if (this.events.volumechange) {
this.player.on(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.VOLUME_CHANGE, volumechange.bind(this));
}
if (this.events.resize) {
this.player.on(_utils_consts__WEBPACK_IMPORTED_MODULE_3__.PLAYER_EVENT.RESIZE, resize.bind(this));
}
if (this.events.er