UNPKG

cloudinary-video-player

Version:

Cloudinary Video Player

1,186 lines (1,090 loc) 1.7 MB
(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