cloudinary-video-player 2.3.4-edge.5 → 2.3.4-edge.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1413,7 +1413,7 @@ class CloudinaryAnalytics {
1413
1413
  this.cloudinaryAnalytics.startManualTracking(metadata, {
1414
1414
  ...(lodash_isPlainObject__WEBPACK_IMPORTED_MODULE_1___default()(this.analyticsOptions) ? this.analyticsOptions : {}),
1415
1415
  videoPlayerType: 'cloudinary video player',
1416
- videoPlayerVersion: "2.3.4-edge.5"
1416
+ videoPlayerVersion: "2.3.4-edge.7"
1417
1417
  });
1418
1418
  } else if (this.currentVideMetadata.cloudName !== metadata.cloudName || this.currentVideMetadata.publicId !== metadata.publicId) {
1419
1419
  this.cloudinaryAnalytics.stopManualTracking();
@@ -1786,7 +1786,7 @@ class CloudinaryContext {
1786
1786
  options.sourceTypes = options.sourceTypes || _this.sourceTypes();
1787
1787
  options.poster = options.poster || posterOptionsForCurrent();
1788
1788
  options.queryParams = Object.assign(options.queryParams || {}, options.usageReport ? {
1789
- _s: `vp-${"2.3.4-edge.5"}`
1789
+ _s: `vp-${"2.3.4-edge.7"}`
1790
1790
  } : {});
1791
1791
  if (options.sourceTypes.indexOf('audio') > -1) {
1792
1792
  builtSrc = new _models_audio_source_audio_source__WEBPACK_IMPORTED_MODULE_7__["default"](publicId, options);
@@ -3041,7 +3041,7 @@ const contextMenuContent = player => {
3041
3041
  const isFullscreen = player.isFullscreen();
3042
3042
  const aboutMenuItem = {
3043
3043
  class: 'player-version',
3044
- label: 'Cloudinary Player v' + "2.3.4-edge.5"
3044
+ label: 'Cloudinary Player v' + "2.3.4-edge.7"
3045
3045
  };
3046
3046
  if (!player.controls()) {
3047
3047
  return [aboutMenuItem];
@@ -4959,6 +4959,7 @@ const getAnalyticsFromPlayerOptions = playerOptions => filterDefaultsAndNulls({
4959
4959
  width: playerOptions.width,
4960
4960
  withCredentials: playerOptions.withCredentials,
4961
4961
  debug: playerOptions.debug,
4962
+ type: playerOptions.type,
4962
4963
  colors: playerOptions.colors && JSON.stringify(playerOptions.colors),
4963
4964
  controlBar: JSON.stringify(playerOptions.controlBar) !== JSON.stringify(config_defaults__WEBPACK_IMPORTED_MODULE_0__["default"].controlBar) && JSON.stringify(playerOptions.controlBar),
4964
4965
  ...getCloudinaryOptions(playerOptions.cloudinary),
@@ -5190,6 +5191,41 @@ function sliceAndUnsetProperties(obj) {
5190
5191
  }
5191
5192
 
5192
5193
 
5194
+ /***/ }),
5195
+
5196
+ /***/ "./utils/video-retry.js":
5197
+ /*!******************************!*\
5198
+ !*** ./utils/video-retry.js ***!
5199
+ \******************************/
5200
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
5201
+
5202
+ "use strict";
5203
+ __webpack_require__.r(__webpack_exports__);
5204
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
5205
+ /* harmony export */ checkIfVideoIsAvailable: () => (/* binding */ checkIfVideoIsAvailable),
5206
+ /* harmony export */ isVideoInReadyState: () => (/* binding */ isVideoInReadyState)
5207
+ /* harmony export */ });
5208
+ const checkIfVideoIsAvailable = function (videoUrl) {
5209
+ let videoType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'default';
5210
+ return new Promise((resolve, reject) => {
5211
+ const tempVideo = document.createElement('video');
5212
+ tempVideo.setAttribute('crossorigin', 'anonymous');
5213
+ const targetEvent = videoType === 'live' ? 'onprogress' : 'canplay';
5214
+ tempVideo[targetEvent] = () => {
5215
+ tempVideo.onerror = null;
5216
+ tempVideo[targetEvent] = null;
5217
+ resolve();
5218
+ };
5219
+ tempVideo.onerror = () => reject();
5220
+ tempVideo.src = videoUrl;
5221
+ tempVideo.load();
5222
+ });
5223
+ };
5224
+ const isVideoInReadyState = readyState => {
5225
+ return readyState >= (/iPad|iPhone|iPod/.test(navigator.userAgent) ? 1 : 4);
5226
+ };
5227
+
5228
+
5193
5229
  /***/ }),
5194
5230
 
5195
5231
  /***/ "./validators/validators-functions.js":
@@ -5308,7 +5344,7 @@ __webpack_require__.r(__webpack_exports__);
5308
5344
  /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
5309
5345
 
5310
5346
  const CLOUDINARY_PARAMS = ['cloudinaryConfig', 'transformation', 'sourceTypes', 'sourceTransformation', 'posterOptions', 'autoShowRecommendations', 'fontFace', 'secure'];
5311
- const PLAYER_PARAMS = CLOUDINARY_PARAMS.concat(['_internalAnalyticsMetadata', 'debug', 'publicId', 'source', 'autoplayMode', 'playedEventPercents', 'playedEventTimes', 'analytics', 'cloudinaryAnalytics', 'allowUsageReport', 'fluid', 'ima', 'playlistWidget', 'hideContextMenu', 'colors', 'floatingWhenNotVisible', 'ads', 'showJumpControls', 'chaptersButton', 'pictureInPictureToggle', 'textTracks', 'qualitySelector', 'fetchErrorUsingGet', 'withCredentials', 'seekThumbnails', 'aiHighlightsGraph', 'chapters', 'queryParams']);
5347
+ const PLAYER_PARAMS = CLOUDINARY_PARAMS.concat(['_internalAnalyticsMetadata', 'debug', 'publicId', 'source', 'autoplayMode', 'playedEventPercents', 'playedEventTimes', 'analytics', 'cloudinaryAnalytics', 'allowUsageReport', 'fluid', 'ima', 'playlistWidget', 'hideContextMenu', 'colors', 'floatingWhenNotVisible', 'ads', 'showJumpControls', 'chaptersButton', 'pictureInPictureToggle', 'textTracks', 'qualitySelector', 'fetchErrorUsingGet', 'withCredentials', 'seekThumbnails', 'aiHighlightsGraph', 'chapters', 'queryParams', 'type']);
5312
5348
  const CLOUDINARY_CONFIG_PARAM = ['cloud_name', 'secure', 'private_cdn', 'secure_distribution', 'cdn_subdomain', 'secure_cdn_subdomain', 'cname', 'shorten', 'sign_url', 'api_secret', 'url_suffix', 'use_root_path', 'auth_token'];
5313
5349
  const DEFAULT_HLS_OPTIONS = {
5314
5350
  html5: {
@@ -5354,7 +5390,7 @@ __webpack_require__.r(__webpack_exports__);
5354
5390
  /* harmony export */ });
5355
5391
  /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
5356
5392
  /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
5357
- /* harmony import */ var uuid__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! uuid */ "../node_modules/uuid/dist/esm-browser/v4.js");
5393
+ /* harmony import */ var uuid__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! uuid */ "../node_modules/uuid/dist/esm-browser/v4.js");
5358
5394
  /* harmony import */ var lodash_isEmpty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isEmpty */ "../node_modules/lodash/isEmpty.js");
5359
5395
  /* harmony import */ var lodash_isEmpty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isEmpty__WEBPACK_IMPORTED_MODULE_1__);
5360
5396
  /* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/get */ "../node_modules/lodash/get.js");
@@ -5380,6 +5416,8 @@ __webpack_require__.r(__webpack_exports__);
5380
5416
  /* harmony import */ var _utils_consts__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./utils/consts */ "./utils/consts.js");
5381
5417
  /* harmony import */ var _utils_get_analytics_player_options__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./utils/get-analytics-player-options */ "./utils/get-analytics-player-options.js");
5382
5418
  /* harmony import */ var _plugins_cloudinary_common__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./plugins/cloudinary/common */ "./plugins/cloudinary/common.js");
5419
+ /* harmony import */ var _utils_video_retry__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./utils/video-retry */ "./utils/video-retry.js");
5420
+
5383
5421
 
5384
5422
 
5385
5423
 
@@ -5406,6 +5444,7 @@ __webpack_require__.r(__webpack_exports__);
5406
5444
  // #endif
5407
5445
 
5408
5446
  const INTERNAL_ANALYTICS_URL = 'https://analytics-api-s.cloudinary.com';
5447
+ const RETRY_DEFAULT_TIMEOUT = 5 * 1000;
5409
5448
 
5410
5449
  // Register all plugins
5411
5450
  Object.keys(_plugins__WEBPACK_IMPORTED_MODULE_8__["default"]).forEach(key => {
@@ -5425,7 +5464,6 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
5425
5464
  }
5426
5465
  constructor(elem, initOptions, ready) {
5427
5466
  super();
5428
- this.nbCalls = 0;
5429
5467
  this.videoElement = (0,_video_player_utils__WEBPACK_IMPORTED_MODULE_14__.getResolveVideoElement)(elem);
5430
5468
  this.options = (0,_video_player_utils__WEBPACK_IMPORTED_MODULE_14__.extractOptions)(this.videoElement, initOptions);
5431
5469
  this._videojsOptions = this.options.videojsOptions;
@@ -5466,7 +5504,7 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
5466
5504
  }
5467
5505
  getVPInstanceId() {
5468
5506
  if (!this.vpInstanceId) {
5469
- this.vpInstanceId = (0,uuid__WEBPACK_IMPORTED_MODULE_20__["default"])();
5507
+ this.vpInstanceId = (0,uuid__WEBPACK_IMPORTED_MODULE_21__["default"])();
5470
5508
  }
5471
5509
  return this.vpInstanceId;
5472
5510
  }
@@ -5481,7 +5519,7 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
5481
5519
  const analyticsData = (0,_utils_get_analytics_player_options__WEBPACK_IMPORTED_MODULE_18__.getAnalyticsFromPlayerOptions)(options);
5482
5520
  const analyticsParams = new URLSearchParams(analyticsData).toString();
5483
5521
  const baseParams = new URLSearchParams({
5484
- vpVersion: "2.3.4-edge.5",
5522
+ vpVersion: "2.3.4-edge.7",
5485
5523
  vpInstanceId: this.getVPInstanceId(),
5486
5524
  // #if (process.env.WEBPACK_BUILD_LIGHT)
5487
5525
  vpLightBuild: true,
@@ -5494,8 +5532,9 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
5494
5532
  console.warn(err);
5495
5533
  }
5496
5534
  }
5497
- _clearTimeOut = () => {
5498
- this.videojs.clearTimeout(this.reTryId);
5535
+ _resetReTryVideoState = () => {
5536
+ this.reTryVideoStateRetriesCount = 0;
5537
+ this.videojs.clearTimeout(this.reTryVideoStateTimeoutId);
5499
5538
  };
5500
5539
  _setVideoJsListeners(ready) {
5501
5540
  this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.ERROR, () => {
@@ -5505,27 +5544,35 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
5505
5544
 
5506
5545
  /*
5507
5546
  error codes :
5508
- 3 - media playback was aborted due to a corruption problem
5509
- 4 - media error, media source not supported
5547
+ 3 - media playback was aborted due to a corruption problem
5548
+ 4 - media error, media source not supported
5510
5549
  */
5511
5550
  const isCorrupted = error.code === 3 && (video_js__WEBPACK_IMPORTED_MODULE_0___default().browser).IS_SAFARI;
5512
5551
  if ([isCorrupted, error.code === 4].includes(true) && [_utils_consts__WEBPACK_IMPORTED_MODULE_17__.SOURCE_TYPE.AUDIO, _utils_consts__WEBPACK_IMPORTED_MODULE_17__.SOURCE_TYPE.VIDEO].includes(type)) {
5513
- this.videojs.error(null);
5514
- _utils__WEBPACK_IMPORTED_MODULE_9__["default"].handleCldError(this, this.playerOptions);
5552
+ if (this.isLiveStream) {
5553
+ this.videojs.error({
5554
+ code: _plugins_cloudinary_common__WEBPACK_IMPORTED_MODULE_19__.ERROR_CODE.CUSTOM,
5555
+ message: 'Live Stream not started'
5556
+ });
5557
+ this.reloadVideoUntilAvailable();
5558
+ } else {
5559
+ this.videojs.error(null);
5560
+ _utils__WEBPACK_IMPORTED_MODULE_9__["default"].handleCldError(this, this.playerOptions);
5561
+ }
5515
5562
  } else {
5516
- this._clearTimeOut();
5563
+ this._resetReTryVideoState();
5517
5564
  }
5518
5565
  }
5519
5566
  });
5520
5567
  this.videojs.tech_.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.RETRY_PLAYLIST, () => {
5521
5568
  const mediaRequestsErrored = lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(this.videojs, 'hls.stats.mediaRequestsErrored', 0);
5522
5569
  if (mediaRequestsErrored > 0) {
5523
- this._clearTimeOut();
5570
+ this._resetReTryVideoState();
5524
5571
  _utils__WEBPACK_IMPORTED_MODULE_9__["default"].handleCldError(this, this.playerOptions);
5525
5572
  }
5526
5573
  });
5527
- this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.PLAY, this._clearTimeOut);
5528
- this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.CAN_PLAY_THROUGH, this._clearTimeOut);
5574
+ this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.PLAY, this._resetReTryVideoState);
5575
+ this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.CAN_PLAY_THROUGH, this._resetReTryVideoState);
5529
5576
  this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.CLD_SOURCE_CHANGED, this._onSourceChange.bind(this));
5530
5577
  this.videojs.ready(() => {
5531
5578
  this._onReady();
@@ -5756,24 +5803,43 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
5756
5803
  this.videojs.cloudinaryAnalytics(options);
5757
5804
  }
5758
5805
  }
5759
- reTryVideo(maxNumberOfCalls, timeout) {
5760
- if (!this.isVideoReady()) {
5761
- if (this.nbCalls < maxNumberOfCalls) {
5762
- this.nbCalls++;
5763
- this.reTryId = this.videojs.setTimeout(() => this.reTryVideo(maxNumberOfCalls, timeout), timeout);
5806
+ reTryVideoStateUntilAvailable() {
5807
+ let maxNumberOfCalls = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Number.POSITIVE_INFINITY;
5808
+ let timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : RETRY_DEFAULT_TIMEOUT;
5809
+ if (typeof this.reTryVideoStateRetriesCount !== 'number') {
5810
+ this.reTryVideoStateRetriesCount = 0;
5811
+ }
5812
+ if (!(0,_utils_video_retry__WEBPACK_IMPORTED_MODULE_20__.isVideoInReadyState)(this.videojs.readyState())) {
5813
+ if (this.reTryVideoStateRetriesCount < maxNumberOfCalls) {
5814
+ this.reTryVideoStateRetriesCount++;
5815
+ this.reTryVideoStateTimeoutId = this.videojs.setTimeout(() => this.reTryVideoStateUntilAvailable(maxNumberOfCalls, timeout), timeout);
5764
5816
  } else {
5765
5817
  let e = new Error('Video is not ready please try later');
5766
5818
  this.videojs.trigger('error', e);
5767
5819
  }
5820
+ } else {
5821
+ this.reTryVideoStateRetriesCount = 0;
5768
5822
  }
5769
5823
  }
5770
- isVideoReady() {
5771
- const s = this.videojs.readyState();
5772
- if (s >= (/iPad|iPhone|iPod/.test(navigator.userAgent) ? 1 : 4)) {
5773
- this.nbCalls = 0;
5774
- return true;
5824
+ _resetReloadVideo = () => {
5825
+ this.reloadVideoRetriesCount = 0;
5826
+ this.videojs.clearTimeout(this.reloadVideoTimeoutId);
5827
+ };
5828
+ reloadVideoUntilAvailable() {
5829
+ let maxNumberOfCalls = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Number.POSITIVE_INFINITY;
5830
+ let timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : RETRY_DEFAULT_TIMEOUT;
5831
+ if (typeof this.reloadVideoRetriesCount !== 'number') {
5832
+ this.reloadVideoRetriesCount = 0;
5833
+ }
5834
+ if (this.reloadVideoRetriesCount < maxNumberOfCalls) {
5835
+ this.reloadVideoRetriesCount++;
5836
+ this.reloadVideoTimeoutId = this.videojs.setTimeout(() => {
5837
+ const videoUrl = this.currentSourceUrl();
5838
+ (0,_utils_video_retry__WEBPACK_IMPORTED_MODULE_20__.checkIfVideoIsAvailable)(videoUrl, this.isLiveStream ? 'live' : 'default').then(() => this.source(videoUrl)).catch(() => this.reloadVideoUntilAvailable(maxNumberOfCalls, timeout));
5839
+ }, timeout);
5840
+ } else {
5841
+ this.videojs.trigger('error', new Error('Sorry, we could not load your video'));
5775
5842
  }
5776
- return false;
5777
5843
  }
5778
5844
  _initAutoplay() {
5779
5845
  const autoplayMode = this.playerOptions.autoplayMode;
@@ -5809,6 +5875,7 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
5809
5875
  }
5810
5876
  _onSourceChange(e, _ref5) {
5811
5877
  let {
5878
+ source,
5812
5879
  sourceOptions
5813
5880
  } = _ref5;
5814
5881
  this._sendInternalAnalytics({
@@ -5819,6 +5886,7 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
5819
5886
  // #if (!process.env.WEBPACK_BUILD_LIGHT)
5820
5887
  // this._initQualitySelector();
5821
5888
  // #endif
5889
+ this.isLiveStream = source.resourceConfig().type === 'live';
5822
5890
  }
5823
5891
  _setExtendedEvents() {
5824
5892
  const events = [];
@@ -5888,11 +5956,11 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
5888
5956
  if (this.playerOptions.withCredentials) {
5889
5957
  options.withCredentials = true;
5890
5958
  }
5891
- clearTimeout(this.reTryId);
5892
- this.nbCalls = 0;
5959
+ this._resetReloadVideo();
5960
+ this._resetReTryVideoState();
5893
5961
  const maxTries = this.videojs.options_.maxTries || 3;
5894
5962
  const videoReadyTimeout = this.videojs.options_.videoTimeout || 55000;
5895
- this.reTryVideo(maxTries, videoReadyTimeout);
5963
+ this.reTryVideoStateUntilAvailable(maxTries, videoReadyTimeout);
5896
5964
  return this.videojs.cloudinary.source(publicId, options);
5897
5965
  }
5898
5966
  posterOptions(options) {