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

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.
@@ -9384,7 +9384,7 @@ class CloudinaryAnalytics {
9384
9384
  this.cloudinaryAnalytics.startManualTracking(metadata, {
9385
9385
  ...(lodash_isPlainObject__WEBPACK_IMPORTED_MODULE_1___default()(this.analyticsOptions) ? this.analyticsOptions : {}),
9386
9386
  videoPlayerType: 'cloudinary video player',
9387
- videoPlayerVersion: "2.3.4-edge.5"
9387
+ videoPlayerVersion: "2.3.4-edge.6"
9388
9388
  });
9389
9389
  } else if (this.currentVideMetadata.cloudName !== metadata.cloudName || this.currentVideMetadata.publicId !== metadata.publicId) {
9390
9390
  this.cloudinaryAnalytics.stopManualTracking();
@@ -9757,7 +9757,7 @@ class CloudinaryContext {
9757
9757
  options.sourceTypes = options.sourceTypes || _this.sourceTypes();
9758
9758
  options.poster = options.poster || posterOptionsForCurrent();
9759
9759
  options.queryParams = Object.assign(options.queryParams || {}, options.usageReport ? {
9760
- _s: `vp-${"2.3.4-edge.5"}`
9760
+ _s: `vp-${"2.3.4-edge.6"}`
9761
9761
  } : {});
9762
9762
  if (options.sourceTypes.indexOf('audio') > -1) {
9763
9763
  builtSrc = new _models_audio_source_audio_source__WEBPACK_IMPORTED_MODULE_7__["default"](publicId, options);
@@ -11012,7 +11012,7 @@ const contextMenuContent = player => {
11012
11012
  const isFullscreen = player.isFullscreen();
11013
11013
  const aboutMenuItem = {
11014
11014
  class: 'player-version',
11015
- label: 'Cloudinary Player v' + "2.3.4-edge.5"
11015
+ label: 'Cloudinary Player v' + "2.3.4-edge.6"
11016
11016
  };
11017
11017
  if (!player.controls()) {
11018
11018
  return [aboutMenuItem];
@@ -13217,6 +13217,7 @@ const getAnalyticsFromPlayerOptions = playerOptions => filterDefaultsAndNulls({
13217
13217
  width: playerOptions.width,
13218
13218
  withCredentials: playerOptions.withCredentials,
13219
13219
  debug: playerOptions.debug,
13220
+ type: playerOptions.type,
13220
13221
  colors: playerOptions.colors && JSON.stringify(playerOptions.colors),
13221
13222
  controlBar: JSON.stringify(playerOptions.controlBar) !== JSON.stringify(config_defaults__WEBPACK_IMPORTED_MODULE_0__["default"].controlBar) && JSON.stringify(playerOptions.controlBar),
13222
13223
  ...getCloudinaryOptions(playerOptions.cloudinary),
@@ -13448,6 +13449,41 @@ function sliceAndUnsetProperties(obj) {
13448
13449
  }
13449
13450
 
13450
13451
 
13452
+ /***/ }),
13453
+
13454
+ /***/ "./utils/video-retry.js":
13455
+ /*!******************************!*\
13456
+ !*** ./utils/video-retry.js ***!
13457
+ \******************************/
13458
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
13459
+
13460
+ "use strict";
13461
+ __webpack_require__.r(__webpack_exports__);
13462
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13463
+ /* harmony export */ checkIfVideoIsAvailable: () => (/* binding */ checkIfVideoIsAvailable),
13464
+ /* harmony export */ isVideoInReadyState: () => (/* binding */ isVideoInReadyState)
13465
+ /* harmony export */ });
13466
+ const checkIfVideoIsAvailable = function (videoUrl) {
13467
+ let videoType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'default';
13468
+ return new Promise((resolve, reject) => {
13469
+ const tempVideo = document.createElement('video');
13470
+ tempVideo.setAttribute('crossorigin', 'anonymous');
13471
+ const targetEvent = videoType === 'live' ? 'onprogress' : 'canplay';
13472
+ tempVideo[targetEvent] = () => {
13473
+ tempVideo.onerror = null;
13474
+ tempVideo[targetEvent] = null;
13475
+ resolve();
13476
+ };
13477
+ tempVideo.onerror = () => reject();
13478
+ tempVideo.src = videoUrl;
13479
+ tempVideo.load();
13480
+ });
13481
+ };
13482
+ const isVideoInReadyState = readyState => {
13483
+ return readyState >= (/iPad|iPhone|iPod/.test(navigator.userAgent) ? 1 : 4);
13484
+ };
13485
+
13486
+
13451
13487
  /***/ }),
13452
13488
 
13453
13489
  /***/ "./validators/validators-functions.js":
@@ -13566,7 +13602,7 @@ __webpack_require__.r(__webpack_exports__);
13566
13602
  /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
13567
13603
 
13568
13604
  const CLOUDINARY_PARAMS = ['cloudinaryConfig', 'transformation', 'sourceTypes', 'sourceTransformation', 'posterOptions', 'autoShowRecommendations', 'fontFace', 'secure'];
13569
- 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']);
13605
+ 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']);
13570
13606
  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'];
13571
13607
  const DEFAULT_HLS_OPTIONS = {
13572
13608
  html5: {
@@ -13612,7 +13648,7 @@ __webpack_require__.r(__webpack_exports__);
13612
13648
  /* harmony export */ });
13613
13649
  /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/video.es-exposed.js");
13614
13650
  /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
13615
- /* harmony import */ var uuid__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! uuid */ "../node_modules/uuid/dist/esm-browser/v4.js");
13651
+ /* harmony import */ var uuid__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! uuid */ "../node_modules/uuid/dist/esm-browser/v4.js");
13616
13652
  /* harmony import */ var lodash_isEmpty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isEmpty */ "../node_modules/lodash/isEmpty.js");
13617
13653
  /* harmony import */ var lodash_isEmpty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isEmpty__WEBPACK_IMPORTED_MODULE_1__);
13618
13654
  /* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/get */ "../node_modules/lodash/get.js");
@@ -13638,7 +13674,9 @@ __webpack_require__.r(__webpack_exports__);
13638
13674
  /* harmony import */ var _utils_consts__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./utils/consts */ "./utils/consts.js");
13639
13675
  /* 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");
13640
13676
  /* harmony import */ var _plugins_cloudinary_common__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./plugins/cloudinary/common */ "./plugins/cloudinary/common.js");
13641
- /* harmony import */ var _components_qualitySelector_qualitySelector_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./components/qualitySelector/qualitySelector.js */ "./components/qualitySelector/qualitySelector.js");
13677
+ /* harmony import */ var _utils_video_retry__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./utils/video-retry */ "./utils/video-retry.js");
13678
+ /* harmony import */ var _components_qualitySelector_qualitySelector_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./components/qualitySelector/qualitySelector.js */ "./components/qualitySelector/qualitySelector.js");
13679
+
13642
13680
 
13643
13681
 
13644
13682
 
@@ -13665,6 +13703,7 @@ __webpack_require__.r(__webpack_exports__);
13665
13703
  // #endif
13666
13704
 
13667
13705
  const INTERNAL_ANALYTICS_URL = 'https://analytics-api-s.cloudinary.com';
13706
+ const RETRY_DEFAULT_TIMEOUT = 5 * 1000;
13668
13707
 
13669
13708
  // Register all plugins
13670
13709
  Object.keys(_plugins__WEBPACK_IMPORTED_MODULE_8__["default"]).forEach(key => {
@@ -13684,7 +13723,6 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
13684
13723
  }
13685
13724
  constructor(elem, initOptions, ready) {
13686
13725
  super();
13687
- this.nbCalls = 0;
13688
13726
  this.videoElement = (0,_video_player_utils__WEBPACK_IMPORTED_MODULE_14__.getResolveVideoElement)(elem);
13689
13727
  this.options = (0,_video_player_utils__WEBPACK_IMPORTED_MODULE_14__.extractOptions)(this.videoElement, initOptions);
13690
13728
  this._videojsOptions = this.options.videojsOptions;
@@ -13725,7 +13763,7 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
13725
13763
  }
13726
13764
  getVPInstanceId() {
13727
13765
  if (!this.vpInstanceId) {
13728
- this.vpInstanceId = (0,uuid__WEBPACK_IMPORTED_MODULE_21__["default"])();
13766
+ this.vpInstanceId = (0,uuid__WEBPACK_IMPORTED_MODULE_22__["default"])();
13729
13767
  }
13730
13768
  return this.vpInstanceId;
13731
13769
  }
@@ -13740,7 +13778,7 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
13740
13778
  const analyticsData = (0,_utils_get_analytics_player_options__WEBPACK_IMPORTED_MODULE_18__.getAnalyticsFromPlayerOptions)(options);
13741
13779
  const analyticsParams = new URLSearchParams(analyticsData).toString();
13742
13780
  const baseParams = new URLSearchParams({
13743
- vpVersion: "2.3.4-edge.5",
13781
+ vpVersion: "2.3.4-edge.6",
13744
13782
  vpInstanceId: this.getVPInstanceId(),
13745
13783
  // #if (process.env.WEBPACK_BUILD_LIGHT)
13746
13784
  // vpLightBuild: true,
@@ -13753,8 +13791,9 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
13753
13791
  console.warn(err);
13754
13792
  }
13755
13793
  }
13756
- _clearTimeOut = () => {
13757
- this.videojs.clearTimeout(this.reTryId);
13794
+ _resetReTryVideoState = () => {
13795
+ this.reTryVideoStateRetriesCount = 0;
13796
+ this.videojs.clearTimeout(this.reTryVideoStateTimeoutId);
13758
13797
  };
13759
13798
  _setVideoJsListeners(ready) {
13760
13799
  this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.ERROR, () => {
@@ -13764,27 +13803,35 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
13764
13803
 
13765
13804
  /*
13766
13805
  error codes :
13767
- 3 - media playback was aborted due to a corruption problem
13768
- 4 - media error, media source not supported
13806
+ 3 - media playback was aborted due to a corruption problem
13807
+ 4 - media error, media source not supported
13769
13808
  */
13770
13809
  const isCorrupted = error.code === 3 && (video_js__WEBPACK_IMPORTED_MODULE_0___default().browser).IS_SAFARI;
13771
13810
  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)) {
13772
- this.videojs.error(null);
13773
- _utils__WEBPACK_IMPORTED_MODULE_9__["default"].handleCldError(this, this.playerOptions);
13811
+ if (this.isLiveStream) {
13812
+ this.videojs.error({
13813
+ code: _plugins_cloudinary_common__WEBPACK_IMPORTED_MODULE_19__.ERROR_CODE.CUSTOM,
13814
+ message: 'Live Stream not started'
13815
+ });
13816
+ this.reloadVideoUntilAvailable();
13817
+ } else {
13818
+ this.videojs.error(null);
13819
+ _utils__WEBPACK_IMPORTED_MODULE_9__["default"].handleCldError(this, this.playerOptions);
13820
+ }
13774
13821
  } else {
13775
- this._clearTimeOut();
13822
+ this._resetReTryVideoState();
13776
13823
  }
13777
13824
  }
13778
13825
  });
13779
13826
  this.videojs.tech_.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.RETRY_PLAYLIST, () => {
13780
13827
  const mediaRequestsErrored = lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(this.videojs, 'hls.stats.mediaRequestsErrored', 0);
13781
13828
  if (mediaRequestsErrored > 0) {
13782
- this._clearTimeOut();
13829
+ this._resetReTryVideoState();
13783
13830
  _utils__WEBPACK_IMPORTED_MODULE_9__["default"].handleCldError(this, this.playerOptions);
13784
13831
  }
13785
13832
  });
13786
- this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.PLAY, this._clearTimeOut);
13787
- this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.CAN_PLAY_THROUGH, this._clearTimeOut);
13833
+ this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.PLAY, this._resetReTryVideoState);
13834
+ this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.CAN_PLAY_THROUGH, this._resetReTryVideoState);
13788
13835
  this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.CLD_SOURCE_CHANGED, this._onSourceChange.bind(this));
13789
13836
  this.videojs.ready(() => {
13790
13837
  this._onReady();
@@ -13950,12 +13997,12 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
13950
13997
  default: 'auto'
13951
13998
  });
13952
13999
  this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.LOADED_METADATA, () => {
13953
- _components_qualitySelector_qualitySelector_js__WEBPACK_IMPORTED_MODULE_20__["default"].init(this.videojs);
14000
+ _components_qualitySelector_qualitySelector_js__WEBPACK_IMPORTED_MODULE_21__["default"].init(this.videojs);
13954
14001
  });
13955
14002
 
13956
14003
  // Show only if more than one option available
13957
14004
  this.videojs.on(_utils_consts__WEBPACK_IMPORTED_MODULE_17__.PLAYER_EVENT.LOADED_DATA, () => {
13958
- _components_qualitySelector_qualitySelector_js__WEBPACK_IMPORTED_MODULE_20__["default"].setVisibility(this.videojs);
14005
+ _components_qualitySelector_qualitySelector_js__WEBPACK_IMPORTED_MODULE_21__["default"].setVisibility(this.videojs);
13959
14006
  });
13960
14007
  }
13961
14008
  }
@@ -14016,24 +14063,43 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
14016
14063
  this.videojs.cloudinaryAnalytics(options);
14017
14064
  }
14018
14065
  }
14019
- reTryVideo(maxNumberOfCalls, timeout) {
14020
- if (!this.isVideoReady()) {
14021
- if (this.nbCalls < maxNumberOfCalls) {
14022
- this.nbCalls++;
14023
- this.reTryId = this.videojs.setTimeout(() => this.reTryVideo(maxNumberOfCalls, timeout), timeout);
14066
+ reTryVideoStateUntilAvailable() {
14067
+ let maxNumberOfCalls = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Number.POSITIVE_INFINITY;
14068
+ let timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : RETRY_DEFAULT_TIMEOUT;
14069
+ if (typeof this.reTryVideoStateRetriesCount !== 'number') {
14070
+ this.reTryVideoStateRetriesCount = 0;
14071
+ }
14072
+ if (!(0,_utils_video_retry__WEBPACK_IMPORTED_MODULE_20__.isVideoInReadyState)(this.videojs.readyState())) {
14073
+ if (this.reTryVideoStateRetriesCount < maxNumberOfCalls) {
14074
+ this.reTryVideoStateRetriesCount++;
14075
+ this.reTryVideoStateTimeoutId = this.videojs.setTimeout(() => this.reTryVideoStateUntilAvailable(maxNumberOfCalls, timeout), timeout);
14024
14076
  } else {
14025
14077
  let e = new Error('Video is not ready please try later');
14026
14078
  this.videojs.trigger('error', e);
14027
14079
  }
14080
+ } else {
14081
+ this.reTryVideoStateRetriesCount = 0;
14028
14082
  }
14029
14083
  }
14030
- isVideoReady() {
14031
- const s = this.videojs.readyState();
14032
- if (s >= (/iPad|iPhone|iPod/.test(navigator.userAgent) ? 1 : 4)) {
14033
- this.nbCalls = 0;
14034
- return true;
14084
+ _resetReloadVideo = () => {
14085
+ this.reloadVideoRetriesCount = 0;
14086
+ this.videojs.clearTimeout(this.reloadVideoTimeoutId);
14087
+ };
14088
+ reloadVideoUntilAvailable() {
14089
+ let maxNumberOfCalls = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Number.POSITIVE_INFINITY;
14090
+ let timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : RETRY_DEFAULT_TIMEOUT;
14091
+ if (typeof this.reloadVideoRetriesCount !== 'number') {
14092
+ this.reloadVideoRetriesCount = 0;
14093
+ }
14094
+ if (this.reloadVideoRetriesCount < maxNumberOfCalls) {
14095
+ this.reloadVideoRetriesCount++;
14096
+ this.reloadVideoTimeoutId = this.videojs.setTimeout(() => {
14097
+ const videoUrl = this.currentSourceUrl();
14098
+ (0,_utils_video_retry__WEBPACK_IMPORTED_MODULE_20__.checkIfVideoIsAvailable)(videoUrl, this.isLiveStream ? 'live' : 'default').then(() => this.source(videoUrl)).catch(() => this.reloadVideoUntilAvailable(maxNumberOfCalls, timeout));
14099
+ }, timeout);
14100
+ } else {
14101
+ this.videojs.trigger('error', new Error('Sorry, we could not load your video'));
14035
14102
  }
14036
- return false;
14037
14103
  }
14038
14104
  _initAutoplay() {
14039
14105
  const autoplayMode = this.playerOptions.autoplayMode;
@@ -14069,6 +14135,7 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
14069
14135
  }
14070
14136
  _onSourceChange(e, _ref5) {
14071
14137
  let {
14138
+ source,
14072
14139
  sourceOptions
14073
14140
  } = _ref5;
14074
14141
  this._sendInternalAnalytics({
@@ -14079,6 +14146,7 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
14079
14146
  // #if (!process.env.WEBPACK_BUILD_LIGHT)
14080
14147
  this._initQualitySelector();
14081
14148
  // #endif
14149
+ this.isLiveStream = source.resourceConfig().type === 'live';
14082
14150
  }
14083
14151
  _setExtendedEvents() {
14084
14152
  const events = [];
@@ -14148,11 +14216,11 @@ class VideoPlayer extends _utils__WEBPACK_IMPORTED_MODULE_9__["default"].mixin(_
14148
14216
  if (this.playerOptions.withCredentials) {
14149
14217
  options.withCredentials = true;
14150
14218
  }
14151
- clearTimeout(this.reTryId);
14152
- this.nbCalls = 0;
14219
+ this._resetReloadVideo();
14220
+ this._resetReTryVideoState();
14153
14221
  const maxTries = this.videojs.options_.maxTries || 3;
14154
14222
  const videoReadyTimeout = this.videojs.options_.videoTimeout || 55000;
14155
- this.reTryVideo(maxTries, videoReadyTimeout);
14223
+ this.reTryVideoStateUntilAvailable(maxTries, videoReadyTimeout);
14156
14224
  return this.videojs.cloudinary.source(publicId, options);
14157
14225
  }
14158
14226
  posterOptions(options) {
@@ -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.6"
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.6"}`
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.6"
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.6",
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) {