cloudinary-video-player 3.6.4-edge.0 → 3.6.4-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adaptive-streaming.js +5 -5
- package/dist/adaptive-streaming.min.js +4 -4
- package/dist/chapters.js +3 -3
- package/dist/chapters.min.js +3 -3
- package/dist/cld-video-player.css +2 -2
- package/dist/cld-video-player.js +38 -38
- package/dist/cld-video-player.light.js +38 -38
- package/dist/cld-video-player.light.min.js +4 -4
- package/dist/cld-video-player.min.css +3 -3
- package/dist/cld-video-player.min.js +4 -4
- package/dist/colors.js +2 -2
- package/dist/colors.min.js +2 -2
- package/dist/dash.js +2 -2
- package/dist/dash.min.js +2 -2
- package/dist/debug.js +3 -3
- package/dist/debug.min.js +3 -3
- package/dist/ima.js +2 -2
- package/dist/ima.min.js +2 -2
- package/dist/interaction-areas.js +4 -4
- package/dist/interaction-areas.min.js +3 -3
- package/dist/node_modules_lodash_throttle_js.js +2 -2
- package/dist/playlist.js +9 -9
- package/dist/playlist.min.js +3 -3
- package/dist/recommendations-overlay.js +4 -4
- package/dist/recommendations-overlay.min.js +3 -3
- package/dist/share.js +3 -3
- package/dist/share.min.js +3 -3
- package/dist/shoppable.js +7 -7
- package/dist/shoppable.min.js +3 -3
- package/dist/visual-search.js +4 -4
- package/dist/visual-search.min.js +3 -3
- package/lib/adaptive-streaming.js +1 -1
- package/lib/all.js +1 -1
- package/lib/chapters.js +1 -1
- package/lib/cld-video-player.js +1 -1
- package/lib/debug.js +1 -1
- package/lib/interaction-areas.js +1 -1
- package/lib/player.js +1 -1
- package/lib/playlist.js +1 -1
- package/lib/recommendations-overlay.js +1 -1
- package/lib/share.js +1 -1
- package/lib/shoppable.js +1 -1
- package/lib/videoPlayer.js +1 -1
- package/lib/visual-search.js +1 -1
- package/package.json +5 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Cloudinary Video Player v3.6.4-edge.
|
|
3
|
-
* Built on
|
|
2
|
+
* Cloudinary Video Player v3.6.4-edge.1
|
|
3
|
+
* Built on 2026-01-04T08:13:28.782Z
|
|
4
4
|
* https://github.com/cloudinary/cloudinary-video-player
|
|
5
5
|
*/
|
|
6
6
|
/*
|
|
@@ -31,7 +31,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
31
31
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
32
32
|
|
|
33
33
|
"use strict";
|
|
34
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ adaptiveStreamingPlugin)\n/* harmony export */ });\n/* harmony import */ var hls_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! hls.js */ \"../node_modules/hls.js/dist/hls.mjs\");\n/* harmony import */ var videojs_contrib_quality_levels__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! videojs-contrib-quality-levels */ \"../node_modules/videojs-contrib-quality-levels/dist/videojs-contrib-quality-levels.js\");\n/* harmony import */ var videojs_contrib_quality_levels__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(videojs_contrib_quality_levels__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var videojs_contrib_quality_menu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! videojs-contrib-quality-menu */ \"../node_modules/videojs-contrib-quality-menu/dist/videojs-contrib-quality-menu.es.js\");\n/* harmony import */ var _videojs_contrib_hlsjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./videojs-contrib-hlsjs */ \"./plugins/adaptive-streaming/videojs-contrib-hlsjs.js\");\n/* harmony import */ var _quality_levels__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./quality-levels */ \"./plugins/adaptive-streaming/quality-levels.js\");\n/* harmony import */ var _abr_strategies__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./abr-strategies */ \"./plugins/adaptive-streaming/abr-strategies.js\");\
|
|
34
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ adaptiveStreamingPlugin)\n/* harmony export */ });\n/* harmony import */ var hls_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! hls.js */ \"../node_modules/hls.js/dist/hls.mjs\");\n/* harmony import */ var videojs_contrib_quality_levels__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! videojs-contrib-quality-levels */ \"../node_modules/videojs-contrib-quality-levels/dist/videojs-contrib-quality-levels.js\");\n/* harmony import */ var videojs_contrib_quality_levels__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(videojs_contrib_quality_levels__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var videojs_contrib_quality_menu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! videojs-contrib-quality-menu */ \"../node_modules/videojs-contrib-quality-menu/dist/videojs-contrib-quality-menu.es.js\");\n/* harmony import */ var _videojs_contrib_hlsjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./videojs-contrib-hlsjs */ \"./plugins/adaptive-streaming/videojs-contrib-hlsjs.js\");\n/* harmony import */ var _quality_levels__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./quality-levels */ \"./plugins/adaptive-streaming/quality-levels.js\");\n/* harmony import */ var _abr_strategies__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./abr-strategies */ \"./plugins/adaptive-streaming/abr-strategies.js\");\n\n\n\n\n\n\nasync function adaptiveStreamingPlugin(player, options) {\n const config = {\n ..._abr_strategies__WEBPACK_IMPORTED_MODULE_5__.abrStrategies[options.strategy],\n videoPreference: _abr_strategies__WEBPACK_IMPORTED_MODULE_5__.hdrSupported ? {\n preferHDR: true\n } : undefined\n };\n\n // Add xhrSetup configuration for withCredentials support\n if (options.withCredentials) {\n config.xhrSetup = function (xhr) {\n xhr.withCredentials = true;\n };\n }\n player.tech_.options_.hlsjsConfig = config;\n player.on('loadstart', () => (0,_quality_levels__WEBPACK_IMPORTED_MODULE_4__.qualityLevels)(player, options).init());\n player.qualityMenu();\n player.adaptiveStreamingLoaded = true;\n}\n\n//# sourceURL=webpack://cloudinary-video-player/./plugins/adaptive-streaming/adaptive-streaming.js?");
|
|
35
35
|
|
|
36
36
|
/***/ }),
|
|
37
37
|
|
|
@@ -42,7 +42,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
42
42
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
43
43
|
|
|
44
44
|
"use strict";
|
|
45
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ qualityLevels: () => (/* binding */ qualityLevels)\n/* harmony export */ });\n/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ \"../node_modules/video.js/dist/alt/video.core-exposed.js\");\n/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var hls_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! hls.js */ \"../node_modules/hls.js/dist/hls.mjs\");\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\nconst qualityLevels = (player, options) => {\n const levelToRenditionHls = level => {\n let levelUrl = Array.isArray(level.url) && level.url.length > 1 ? level.url[level.urlId] : level.url;\n let rendition = {\n id: levelUrl,\n width: level.width,\n height: level.height,\n bandwidth: level.bitrate,\n // bitrate => bandwidth\n frameRate: 0,\n enabled: enableRendition => {\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n const levelIndex = hls.levels.findIndex(l => (Array.isArray(l.url) && l.url.length > 1 ? l.url[l.urlId] : l.url) === levelUrl);\n if (levelIndex >= 0 && enableRendition) {\n hls.currentLevel = levelIndex;\n }\n }\n return enableRendition;\n }\n };\n return rendition;\n };\n const levelToRenditionDash = level => ({\n id: level.id,\n width: level.width,\n height: level.height,\n bandwidth: level.bandwidth,\n enabled: enableRendition => {\n const dash = player.dash;\n if (dash && dash.mediaPlayer) {\n if (enableRendition) {\n dash.mediaPlayer.updateSettings({\n streaming: {\n abr: {\n autoSwitchBitrate: {\n video: false,\n audio: false\n }\n }\n }\n });\n // Find the correct quality index by resolution\n const targetQualityIndex = findDashQualityIndex(level.width, level.height);\n if (targetQualityIndex >= 0) {\n dash.mediaPlayer.setQualityFor('video', targetQualityIndex);\n // Set audio quality if mapping exists\n if (dash.audioMapper && dash.audioMapper[targetQualityIndex] !== undefined) {\n dash.mediaPlayer.setQualityFor('audio', dash.audioMapper[targetQualityIndex]);\n }\n }\n }\n }\n return enableRendition;\n }\n });\n const getRenditionsDash = () => {\n var dash = player.dash;\n if (typeof dash != 'undefined' && dash != null && typeof dash.mediaPlayer != 'undefined' && dash.mediaPlayer != null) {\n var streamInfo = dash.mediaPlayer.getActiveStream().getStreamInfo();\n var dashAdapter = dash.mediaPlayer.getDashAdapter();\n if (dashAdapter && streamInfo) {\n const periodIdx = streamInfo.index;\n var adaptation = dashAdapter.getAdaptationForType(periodIdx, 'video', streamInfo);\n }\n return adaptation.Representation_asArray;\n }\n return [];\n };\n\n // Helper function to find DASH quality index by resolution\n const findDashQualityIndex = (targetWidth, targetHeight) => {\n var dash = player.dash;\n if (dash && dash.mediaPlayer) {\n const availableQualities = dash.mediaPlayer.getBitrateInfoListFor('video');\n const targetQuality = availableQualities.find(q => q.width === targetWidth && q.height === targetHeight);\n return targetQuality ? targetQuality.qualityIndex : -1;\n }\n return -1;\n };\n\n // Clean up quality levels and reset state for new source\n const cleanupQualityLevels = () => {\n let qualityLevels = player.qualityLevels;\n if (typeof qualityLevels === 'function') {\n qualityLevels = player.qualityLevels();\n // Clear all existing quality levels\n qualityLevels.dispose();\n debugLog('Quality levels cleaned up for new source');\n }\n\n // Clean up audio tracks from previous source\n const audioTrackList = player.audioTracks();\n if (audioTrackList && audioTrackList.length > 0) {\n // Remove all existing audio tracks\n for (let i = audioTrackList.length - 1; i >= 0; i--) {\n audioTrackList.removeTrack(audioTrackList[i]);\n }\n debugLog('Audio tracks cleaned up for new source');\n }\n\n // Clean up DASH-specific state\n const dash = player.dash;\n if (dash && dash.audioMapper) {\n delete dash.audioMapper;\n debugLog('DASH audio mapper cleaned up for new source');\n }\n\n // Reset previous resolution for qualitychanged events\n previousResolution = null;\n };\n\n // Update the QualityLevels list of renditions\n const populateLevels = (levels, abrType) => {\n // Clean up existing quality levels before adding new ones\n cleanupQualityLevels();\n let qualityLevels = player.qualityLevels;\n if (typeof qualityLevels === 'function') {\n qualityLevels = player.qualityLevels();\n debugLog('QualityLevels', qualityLevels);\n switch (abrType) {\n case 'hls':\n for (let l = 0; l < levels.length; l++) {\n let level = levels[l];\n let rendition = levelToRenditionHls(level);\n qualityLevels.addQualityLevel(rendition);\n }\n break;\n case 'dash':\n {\n // Set up audio mapping for DASH\n const dash = player.dash;\n if (!dash) break;\n const videoRates = levels;\n const audioRates = dash.mediaPlayer.getBitrateInfoListFor('audio') || [];\n const normalizeFactor = videoRates.length > 0 ? videoRates[videoRates.length - 1].bandwidth : 1;\n dash.audioMapper = videoRates.map(rate => Math.round(rate.bandwidth / normalizeFactor * (audioRates.length - 1)));\n for (let l = 0; l < levels.length; l++) {\n let level = levels[l];\n let rendition = levelToRenditionDash(level);\n qualityLevels.addQualityLevel(rendition);\n }\n break;\n }\n default:\n return;\n }\n } else {\n console.warn('QualityLevels not supported');\n }\n };\n let previousResolution = null; // for qualitychanged event data\n\n // Update the selected rendition\n const populateQualityLevelsChange = currentLevel => {\n let qualityLevels = player.qualityLevels;\n if (typeof qualityLevels === 'function') {\n qualityLevels = player.qualityLevels();\n if (qualityLevels.length == 0) {\n console.warn('ERROR - no quality levels found! Patching populate levels first');\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n populateLevels(hls.levels, 'hls');\n }\n }\n qualityLevels.selectedIndex_ = currentLevel;\n qualityLevels.trigger({\n type: 'change',\n selectedIndex: currentLevel\n });\n }\n };\n\n // Custom 'qualitychanged' event\n const populateQualityChangedEvent = currentLevel => {\n if (currentLevel < 0) {\n return;\n }\n let qualityLevels = player.qualityLevels;\n let level = null;\n // Using videojs-contrib-quality-levels\n if (typeof qualityLevels === 'function') {\n qualityLevels = player.qualityLevels();\n level = qualityLevels.levels_[currentLevel];\n debugLog('Custom qualitychanged', 'using videojs-contrib-quality-levels');\n } else {\n // hls.js directly\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n level = hls.levels[currentLevel];\n debugLog('Custom qualitychanged', 'using hls.js directly');\n if (currentLevel !== hls.currentLevel) {\n debugLog('ERROR - new level differs from hls.js');\n }\n } else {\n // dash.js directly\n var dash = player.dash;\n if (typeof dash != 'undefined' && dash != null && typeof dash.mediaPlayer != 'undefined' && dash.mediaPlayer != null) {\n let renditions = getRenditionsDash();\n level = renditions[currentLevel];\n debugLog('Custom qualitychanged', 'using dash.js directly');\n }\n }\n }\n\n // Add null check for level\n if (!level) {\n debugLog('Warning: Level is undefined in populateQualityChangedEvent', {\n currentLevel\n });\n return;\n }\n let currentRes = {\n width: level.width,\n height: level.height\n };\n if (previousResolution !== currentRes) {\n let data = {\n from: previousResolution,\n to: currentRes\n };\n // Trigger custom 'qualitychanged' event on videojs\n player.trigger({\n type: 'qualitychanged',\n eventData: data\n });\n }\n previousResolution = currentRes;\n\n // Add detailed logging of current rendition\n debugLog('Current Rendition', {\n index: currentLevel,\n resolution: \"\".concat(level.width, \"x\").concat(level.height),\n bitrate: \"\".concat(Math.round(level.bitrate / 1000), \" kbps\"),\n url: Array.isArray(level.url) ? level.url[level.urlId] : level.url,\n details: level\n });\n };\n const debugLog = (label, data) => {\n if (options.debug) {\n console.log(\"%c \".concat(label), 'background: #3498db; color: white; padding: 2px 4px; border-radius: 2px;', data);\n }\n };\n const logAudioTrackInfo = () => {\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n const audioTrackId = hls.audioTrack;\n const len = hls.audioTracks.length;\n for (let i = 0; i < len; i++) {\n if (audioTrackId === i) {\n debugLog(\"audio track [\".concat(i, \"] \").concat(hls.audioTracks[i].name, \" - enabled\"), hls.audioTracks[i]);\n } else {\n debugLog(\"audio track [\".concat(i, \"] \").concat(hls.audioTracks[i].name, \" - disabled\"), hls.audioTracks[i]);\n }\n }\n }\n };\n\n // Helper to synchronise Video.js AudioTrackList with hls.js active track\n const updateVjsAudioTracksEnabled = activeIndex => {\n const list = player.audioTracks();\n if (!list) return;\n for (let i = 0; i < list.length; i++) {\n list[i].enabled = i === activeIndex;\n }\n // Sync complete – log for debug\n logAudioTrackInfo();\n };\n\n // Flush buffered audio by performing a tiny seek outside current range\n const flushBufferedAudio = () => {\n try {\n const cur = player.currentTime();\n const delta = 0.5; // 500 ms gap to escape current buffer\n const target = Math.min(cur + delta, player.duration() - 0.1);\n player.currentTime(target);\n player.currentTime(cur);\n } catch (e) {\n debugLog('Error while flushing buffered audio', e);\n }\n };\n\n // Force hls.js to switch track and immediately start loading fragments for it\n const selectAudioTrack = index => {\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n if (hls.audioTrack === index) {\n return;\n }\n hls.audioTrack = index;\n // Quickly restart loading to fill the buffer of the new audio group\n if (hls.media) {\n try {\n hls.stopLoad();\n hls.startLoad(0);\n } catch (e) {\n debugLog('Error while reloading after audioTrack switch', e);\n }\n }\n logAudioTrackInfo();\n // will flush once switch is confirmed (AUDIO_TRACK_SWITCHED)\n hls.once(hls_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Events.AUDIO_TRACK_SWITCHED, () => {\n flushBufferedAudio();\n });\n }\n };\n\n // Audio track handling\n const addAudioTrackVideojs = (track, hls) => {\n const vjsTrack = new (video_js__WEBPACK_IMPORTED_MODULE_0___default().AudioTrack)({\n id: \"\".concat(track.type, \"-id_\").concat(track.id, \"-groupId_\").concat(track.groupId, \"-\").concat(track.name),\n kind: 'translation',\n label: track.name,\n language: track.lang,\n enabled: hls.audioTrack === hls.audioTracks.indexOf(track),\n default: track.default\n });\n\n // Add the track to the player's audio track list.\n player.audioTracks().addTrack(vjsTrack);\n };\n const initAudioTrackInfo = () => {\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n const len = hls.audioTracks.length;\n for (let i = 0; i < len; i++) {\n addAudioTrackVideojs(hls.audioTracks[i], hls);\n }\n }\n\n // Listen to the \"change\" event.\n var audioTrackList = player.audioTracks();\n audioTrackList.addEventListener('change', function () {\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n for (var i = 0; i < audioTrackList.length; i++) {\n var track = audioTrackList[i];\n if (track.enabled) {\n selectAudioTrack(i);\n return;\n }\n }\n }\n });\n };\n\n // Map hls.js events to QualityLevels\n const initQualityLevels = () => {\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech == 'undefined') {\n console.warn('ERROR - tech not found!');\n }\n\n // HLS\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n const manifestLoadedHandler = (eventName, data) => {\n debugLog(\"HLS event: \".concat(eventName), data);\n populateLevels(hls.levels, 'hls');\n initAudioTrackInfo();\n hls.off(hls_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Events.MANIFEST_LOADED, manifestLoadedHandler);\n };\n\n // If manifest is already loaded, populate levels immediately.\n if (hls.levels && hls.levels.length > 0) {\n manifestLoadedHandler('MANUAL_MANIFEST_LOADED', {});\n } else {\n hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Events.MANIFEST_LOADED, manifestLoadedHandler);\n }\n hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Events.LEVEL_SWITCHED, (eventName, data) => {\n debugLog(\"HLS event: \".concat(eventName), data);\n populateQualityLevelsChange(data.level);\n populateQualityChangedEvent(data.level);\n });\n hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Events.AUDIO_TRACK_SWITCHED, (eventName, data) => {\n debugLog(\"HLS event: \".concat(eventName), data);\n // Make sure Video.js AudioTracks reflect the newly-selected HLS track\n if (typeof data.id !== 'undefined') {\n updateVjsAudioTracksEnabled(data.id);\n }\n // Ensure buffer flushed when switch originates from hls.js (e.g. default track)\n flushBufferedAudio();\n });\n hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Events.ERROR, (eventName, data) => {\n debugLog(\"HLS event: \".concat(eventName), data);\n if (data.fatal) {\n player.error(_objectSpread({\n code: 4\n }, data));\n }\n });\n } else {\n // DASH\n var dash = player.dash;\n if (typeof dash != 'undefined' && dash != null && typeof dash.mediaPlayer != 'undefined' && dash.mediaPlayer != null) {\n let renditions = getRenditionsDash();\n populateLevels(renditions, 'dash');\n dash.mediaPlayer.on('qualityChangeRendered', evt => {\n const currentVideoQuality = dash.mediaPlayer.getQualityFor('video');\n const availableQualities = dash.mediaPlayer.getBitrateInfoListFor('video');\n const currentQualityInfo = availableQualities[currentVideoQuality];\n const renditionIndex = findDashQualityIndex(currentQualityInfo.width, currentQualityInfo.height);\n if (renditionIndex >= 0) {\n debugLog(\"DASH event: \".concat(evt.type), evt, renditions[renditionIndex]);\n populateQualityLevelsChange(renditionIndex);\n populateQualityChangedEvent(renditionIndex);\n } else {\n console.warn('Could not find matching rendition for DASH quality change');\n }\n });\n }\n }\n };\n return {\n init: initQualityLevels\n };\n};\n\n\n//# sourceURL=webpack://cloudinary-video-player/./plugins/adaptive-streaming/quality-levels.js?");
|
|
45
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ qualityLevels: () => (/* binding */ qualityLevels)\n/* harmony export */ });\n/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ \"../node_modules/video.js/dist/alt/video.core-exposed.js\");\n/* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var hls_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! hls.js */ \"../node_modules/hls.js/dist/hls.mjs\");\n\n\nconst qualityLevels = (player, options) => {\n const levelToRenditionHls = level => {\n let levelUrl = Array.isArray(level.url) && level.url.length > 1 ? level.url[level.urlId] : level.url;\n let rendition = {\n id: levelUrl,\n width: level.width,\n height: level.height,\n bandwidth: level.bitrate,\n // bitrate => bandwidth\n frameRate: 0,\n enabled: enableRendition => {\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n const levelIndex = hls.levels.findIndex(l => (Array.isArray(l.url) && l.url.length > 1 ? l.url[l.urlId] : l.url) === levelUrl);\n if (levelIndex >= 0 && enableRendition) {\n hls.currentLevel = levelIndex;\n }\n }\n return enableRendition;\n }\n };\n return rendition;\n };\n const levelToRenditionDash = level => ({\n id: level.id,\n width: level.width,\n height: level.height,\n bandwidth: level.bandwidth,\n enabled: enableRendition => {\n const dash = player.dash;\n if (dash && dash.mediaPlayer) {\n if (enableRendition) {\n dash.mediaPlayer.updateSettings({\n streaming: {\n abr: {\n autoSwitchBitrate: {\n video: false,\n audio: false\n }\n }\n }\n });\n // Find the correct quality index by resolution\n const targetQualityIndex = findDashQualityIndex(level.width, level.height);\n if (targetQualityIndex >= 0) {\n dash.mediaPlayer.setQualityFor('video', targetQualityIndex);\n // Set audio quality if mapping exists\n if (dash.audioMapper && dash.audioMapper[targetQualityIndex] !== undefined) {\n dash.mediaPlayer.setQualityFor('audio', dash.audioMapper[targetQualityIndex]);\n }\n }\n }\n }\n return enableRendition;\n }\n });\n const getRenditionsDash = () => {\n var dash = player.dash;\n if (typeof dash != 'undefined' && dash != null && typeof dash.mediaPlayer != 'undefined' && dash.mediaPlayer != null) {\n var streamInfo = dash.mediaPlayer.getActiveStream().getStreamInfo();\n var dashAdapter = dash.mediaPlayer.getDashAdapter();\n if (dashAdapter && streamInfo) {\n const periodIdx = streamInfo.index;\n var adaptation = dashAdapter.getAdaptationForType(periodIdx, 'video', streamInfo);\n }\n return adaptation.Representation_asArray;\n }\n return [];\n };\n\n // Helper function to find DASH quality index by resolution\n const findDashQualityIndex = (targetWidth, targetHeight) => {\n var dash = player.dash;\n if (dash && dash.mediaPlayer) {\n const availableQualities = dash.mediaPlayer.getBitrateInfoListFor('video');\n const targetQuality = availableQualities.find(q => q.width === targetWidth && q.height === targetHeight);\n return targetQuality ? targetQuality.qualityIndex : -1;\n }\n return -1;\n };\n\n // Clean up quality levels and reset state for new source\n const cleanupQualityLevels = () => {\n let qualityLevels = player.qualityLevels;\n if (typeof qualityLevels === 'function') {\n qualityLevels = player.qualityLevels();\n // Clear all existing quality levels\n qualityLevels.dispose();\n debugLog('Quality levels cleaned up for new source');\n }\n\n // Clean up audio tracks from previous source\n const audioTrackList = player.audioTracks();\n if (audioTrackList && audioTrackList.length > 0) {\n // Remove all existing audio tracks\n for (let i = audioTrackList.length - 1; i >= 0; i--) {\n audioTrackList.removeTrack(audioTrackList[i]);\n }\n debugLog('Audio tracks cleaned up for new source');\n }\n\n // Clean up DASH-specific state\n const dash = player.dash;\n if (dash && dash.audioMapper) {\n delete dash.audioMapper;\n debugLog('DASH audio mapper cleaned up for new source');\n }\n\n // Reset previous resolution for qualitychanged events\n previousResolution = null;\n };\n\n // Update the QualityLevels list of renditions\n const populateLevels = (levels, abrType) => {\n // Clean up existing quality levels before adding new ones\n cleanupQualityLevels();\n let qualityLevels = player.qualityLevels;\n if (typeof qualityLevels === 'function') {\n qualityLevels = player.qualityLevels();\n debugLog('QualityLevels', qualityLevels);\n switch (abrType) {\n case 'hls':\n for (let l = 0; l < levels.length; l++) {\n let level = levels[l];\n let rendition = levelToRenditionHls(level);\n qualityLevels.addQualityLevel(rendition);\n }\n break;\n case 'dash':\n {\n // Set up audio mapping for DASH\n const dash = player.dash;\n if (!dash) break;\n const videoRates = levels;\n const audioRates = dash.mediaPlayer.getBitrateInfoListFor('audio') || [];\n const normalizeFactor = videoRates.length > 0 ? videoRates[videoRates.length - 1].bandwidth : 1;\n dash.audioMapper = videoRates.map(rate => Math.round(rate.bandwidth / normalizeFactor * (audioRates.length - 1)));\n for (let l = 0; l < levels.length; l++) {\n let level = levels[l];\n let rendition = levelToRenditionDash(level);\n qualityLevels.addQualityLevel(rendition);\n }\n break;\n }\n default:\n return;\n }\n } else {\n console.warn('QualityLevels not supported');\n }\n };\n let previousResolution = null; // for qualitychanged event data\n\n // Update the selected rendition\n const populateQualityLevelsChange = currentLevel => {\n let qualityLevels = player.qualityLevels;\n if (typeof qualityLevels === 'function') {\n qualityLevels = player.qualityLevels();\n if (qualityLevels.length == 0) {\n console.warn('ERROR - no quality levels found! Patching populate levels first');\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n populateLevels(hls.levels, 'hls');\n }\n }\n qualityLevels.selectedIndex_ = currentLevel;\n qualityLevels.trigger({\n type: 'change',\n selectedIndex: currentLevel\n });\n }\n };\n\n // Custom 'qualitychanged' event\n const populateQualityChangedEvent = currentLevel => {\n if (currentLevel < 0) {\n return;\n }\n let qualityLevels = player.qualityLevels;\n let level = null;\n // Using videojs-contrib-quality-levels\n if (typeof qualityLevels === 'function') {\n qualityLevels = player.qualityLevels();\n level = qualityLevels.levels_[currentLevel];\n debugLog('Custom qualitychanged', 'using videojs-contrib-quality-levels');\n } else {\n // hls.js directly\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n level = hls.levels[currentLevel];\n debugLog('Custom qualitychanged', 'using hls.js directly');\n if (currentLevel !== hls.currentLevel) {\n debugLog('ERROR - new level differs from hls.js');\n }\n } else {\n // dash.js directly\n var dash = player.dash;\n if (typeof dash != 'undefined' && dash != null && typeof dash.mediaPlayer != 'undefined' && dash.mediaPlayer != null) {\n let renditions = getRenditionsDash();\n level = renditions[currentLevel];\n debugLog('Custom qualitychanged', 'using dash.js directly');\n }\n }\n }\n\n // Add null check for level\n if (!level) {\n debugLog('Warning: Level is undefined in populateQualityChangedEvent', {\n currentLevel\n });\n return;\n }\n let currentRes = {\n width: level.width,\n height: level.height\n };\n if (previousResolution !== currentRes) {\n let data = {\n from: previousResolution,\n to: currentRes\n };\n // Trigger custom 'qualitychanged' event on videojs\n player.trigger({\n type: 'qualitychanged',\n eventData: data\n });\n }\n previousResolution = currentRes;\n\n // Add detailed logging of current rendition\n debugLog('Current Rendition', {\n index: currentLevel,\n resolution: `${level.width}x${level.height}`,\n bitrate: `${Math.round(level.bitrate / 1000)} kbps`,\n url: Array.isArray(level.url) ? level.url[level.urlId] : level.url,\n details: level\n });\n };\n const debugLog = (label, data) => {\n if (options.debug) {\n console.log(`%c ${label}`, 'background: #3498db; color: white; padding: 2px 4px; border-radius: 2px;', data);\n }\n };\n const logAudioTrackInfo = () => {\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n const audioTrackId = hls.audioTrack;\n const len = hls.audioTracks.length;\n for (let i = 0; i < len; i++) {\n if (audioTrackId === i) {\n debugLog(`audio track [${i}] ${hls.audioTracks[i].name} - enabled`, hls.audioTracks[i]);\n } else {\n debugLog(`audio track [${i}] ${hls.audioTracks[i].name} - disabled`, hls.audioTracks[i]);\n }\n }\n }\n };\n\n // Helper to synchronise Video.js AudioTrackList with hls.js active track\n const updateVjsAudioTracksEnabled = activeIndex => {\n const list = player.audioTracks();\n if (!list) return;\n for (let i = 0; i < list.length; i++) {\n list[i].enabled = i === activeIndex;\n }\n // Sync complete – log for debug\n logAudioTrackInfo();\n };\n\n // Flush buffered audio by performing a tiny seek outside current range\n const flushBufferedAudio = () => {\n try {\n const cur = player.currentTime();\n const delta = 0.5; // 500 ms gap to escape current buffer\n const target = Math.min(cur + delta, player.duration() - 0.1);\n player.currentTime(target);\n player.currentTime(cur);\n } catch (e) {\n debugLog('Error while flushing buffered audio', e);\n }\n };\n\n // Force hls.js to switch track and immediately start loading fragments for it\n const selectAudioTrack = index => {\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n if (hls.audioTrack === index) {\n return;\n }\n hls.audioTrack = index;\n // Quickly restart loading to fill the buffer of the new audio group\n if (hls.media) {\n try {\n hls.stopLoad();\n hls.startLoad(0);\n } catch (e) {\n debugLog('Error while reloading after audioTrack switch', e);\n }\n }\n logAudioTrackInfo();\n // will flush once switch is confirmed (AUDIO_TRACK_SWITCHED)\n hls.once(hls_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Events.AUDIO_TRACK_SWITCHED, () => {\n flushBufferedAudio();\n });\n }\n };\n\n // Audio track handling\n const addAudioTrackVideojs = (track, hls) => {\n const vjsTrack = new (video_js__WEBPACK_IMPORTED_MODULE_0___default().AudioTrack)({\n id: `${track.type}-id_${track.id}-groupId_${track.groupId}-${track.name}`,\n kind: 'translation',\n label: track.name,\n language: track.lang,\n enabled: hls.audioTrack === hls.audioTracks.indexOf(track),\n default: track.default\n });\n\n // Add the track to the player's audio track list.\n player.audioTracks().addTrack(vjsTrack);\n };\n const initAudioTrackInfo = () => {\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n const len = hls.audioTracks.length;\n for (let i = 0; i < len; i++) {\n addAudioTrackVideojs(hls.audioTracks[i], hls);\n }\n }\n\n // Listen to the \"change\" event.\n var audioTrackList = player.audioTracks();\n audioTrackList.addEventListener('change', function () {\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n for (var i = 0; i < audioTrackList.length; i++) {\n var track = audioTrackList[i];\n if (track.enabled) {\n selectAudioTrack(i);\n return;\n }\n }\n }\n });\n };\n\n // Map hls.js events to QualityLevels\n const initQualityLevels = () => {\n var tech = player.tech({\n IWillNotUseThisInPlugins: true\n });\n if (typeof tech == 'undefined') {\n console.warn('ERROR - tech not found!');\n }\n\n // HLS\n if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {\n const hls = tech.sourceHandler_.hls;\n const manifestLoadedHandler = (eventName, data) => {\n debugLog(`HLS event: ${eventName}`, data);\n populateLevels(hls.levels, 'hls');\n initAudioTrackInfo();\n hls.off(hls_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Events.MANIFEST_LOADED, manifestLoadedHandler);\n };\n\n // If manifest is already loaded, populate levels immediately.\n if (hls.levels && hls.levels.length > 0) {\n manifestLoadedHandler('MANUAL_MANIFEST_LOADED', {});\n } else {\n hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Events.MANIFEST_LOADED, manifestLoadedHandler);\n }\n hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Events.LEVEL_SWITCHED, (eventName, data) => {\n debugLog(`HLS event: ${eventName}`, data);\n populateQualityLevelsChange(data.level);\n populateQualityChangedEvent(data.level);\n });\n hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Events.AUDIO_TRACK_SWITCHED, (eventName, data) => {\n debugLog(`HLS event: ${eventName}`, data);\n // Make sure Video.js AudioTracks reflect the newly-selected HLS track\n if (typeof data.id !== 'undefined') {\n updateVjsAudioTracksEnabled(data.id);\n }\n // Ensure buffer flushed when switch originates from hls.js (e.g. default track)\n flushBufferedAudio();\n });\n hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Events.ERROR, (eventName, data) => {\n debugLog(`HLS event: ${eventName}`, data);\n if (data.fatal) {\n player.error({\n code: 4,\n // MEDIA_ERR_SRC_NOT_SUPPORTED will trigger Utils.handleCldError\n ...data\n });\n }\n });\n } else {\n // DASH\n var dash = player.dash;\n if (typeof dash != 'undefined' && dash != null && typeof dash.mediaPlayer != 'undefined' && dash.mediaPlayer != null) {\n let renditions = getRenditionsDash();\n populateLevels(renditions, 'dash');\n dash.mediaPlayer.on('qualityChangeRendered', evt => {\n const currentVideoQuality = dash.mediaPlayer.getQualityFor('video');\n const availableQualities = dash.mediaPlayer.getBitrateInfoListFor('video');\n const currentQualityInfo = availableQualities[currentVideoQuality];\n const renditionIndex = findDashQualityIndex(currentQualityInfo.width, currentQualityInfo.height);\n if (renditionIndex >= 0) {\n debugLog(`DASH event: ${evt.type}`, evt, renditions[renditionIndex]);\n populateQualityLevelsChange(renditionIndex);\n populateQualityChangedEvent(renditionIndex);\n } else {\n console.warn('Could not find matching rendition for DASH quality change');\n }\n });\n }\n }\n };\n return {\n init: initQualityLevels\n };\n};\n\n\n//# sourceURL=webpack://cloudinary-video-player/./plugins/adaptive-streaming/quality-levels.js?");
|
|
46
46
|
|
|
47
47
|
/***/ }),
|
|
48
48
|
|
|
@@ -53,7 +53,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
53
53
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
54
54
|
|
|
55
55
|
"use strict";
|
|
56
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var hls_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! hls.js */ \"../node_modules/hls.js/dist/hls.mjs\");\n\n\n\n\n/**\n * hls.js source handler\n * Source: https://github.com/Peer5/videojs-contrib-hls.js\n * @param source\n * @param tech\n * @constructor\n */\nfunction Html5HlsJS(source, tech) {\n var options = tech.options_;\n var el = tech.el();\n var duration = null;\n var hls = this.hls = new hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](options.hlsjsConfig);\n\n /**\n * creates an error handler function\n * @returns {Function}\n */\n function errorHandlerFactory() {\n var _recoverDecodingErrorDate = null;\n var _recoverAudioCodecErrorDate = null;\n return function () {\n var now = Date.now();\n if (!_recoverDecodingErrorDate || now - _recoverDecodingErrorDate > 2000) {\n _recoverDecodingErrorDate = now;\n hls.recoverMediaError();\n } else if (!_recoverAudioCodecErrorDate || now - _recoverAudioCodecErrorDate > 2000) {\n _recoverAudioCodecErrorDate = now;\n hls.swapAudioCodec();\n hls.recoverMediaError();\n } else {\n console.error('Error loading media: File could not be played');\n }\n };\n }\n\n // create separate error handlers for hlsjs and the video tag\n var hlsjsErrorHandler = errorHandlerFactory();\n var videoTagErrorHandler = errorHandlerFactory();\n\n // listen to error events coming from the video tag\n el.addEventListener('error', function (e) {\n var mediaError = e.currentTarget.error;\n if (mediaError.code === mediaError.MEDIA_ERR_DECODE) {\n videoTagErrorHandler();\n } else {\n console.error('Error loading media: File could not be played');\n }\n });\n\n /**\n * Destroys the Hls instance\n */\n this.dispose = function () {\n hls.destroy();\n };\n\n /**\n * returns the duration of the stream, or Infinity if live video\n * @returns {Infinity|number}\n */\n this.duration = function () {\n return duration || el.duration || 0;\n };\n\n // update live status on level load\n hls.on(hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].Events.LEVEL_LOADED, function (event, data) {\n duration = data.details.live ? Infinity : data.details.totalduration;\n });\n\n // try to recover on fatal errors\n hls.on(hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].Events.ERROR, function (event, data) {\n if (data.fatal) {\n switch (data.type) {\n case hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].ErrorTypes.NETWORK_ERROR:\n hls.startLoad();\n break;\n case hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].ErrorTypes.MEDIA_ERROR:\n hlsjsErrorHandler();\n break;\n default:\n console.error('Error loading media: File could not be played');\n break;\n }\n }\n });\n Object.keys(hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].Events).forEach(function (key) {\n var eventName = hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].Events[key];\n hls.on(eventName, function (event, data) {\n tech.trigger(eventName, data);\n });\n });\n\n // Intercept native TextTrack calls and route to video.js directly only\n // if native text tracks are not supported on this browser.\n if (!tech.featuresNativeTextTracks) {\n Object.defineProperty(el, 'textTracks', {\n get: function () {\n try {\n return typeof tech.textTracks === 'function' ? tech.textTracks() : tech.textTracks;\n } catch
|
|
56
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var hls_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! hls.js */ \"../node_modules/hls.js/dist/hls.mjs\");\n\n\n\n\n/**\n * hls.js source handler\n * Source: https://github.com/Peer5/videojs-contrib-hls.js\n * @param source\n * @param tech\n * @constructor\n */\nfunction Html5HlsJS(source, tech) {\n var options = tech.options_;\n var el = tech.el();\n var duration = null;\n var hls = this.hls = new hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](options.hlsjsConfig);\n\n /**\n * creates an error handler function\n * @returns {Function}\n */\n function errorHandlerFactory() {\n var _recoverDecodingErrorDate = null;\n var _recoverAudioCodecErrorDate = null;\n return function () {\n var now = Date.now();\n if (!_recoverDecodingErrorDate || now - _recoverDecodingErrorDate > 2000) {\n _recoverDecodingErrorDate = now;\n hls.recoverMediaError();\n } else if (!_recoverAudioCodecErrorDate || now - _recoverAudioCodecErrorDate > 2000) {\n _recoverAudioCodecErrorDate = now;\n hls.swapAudioCodec();\n hls.recoverMediaError();\n } else {\n console.error('Error loading media: File could not be played');\n }\n };\n }\n\n // create separate error handlers for hlsjs and the video tag\n var hlsjsErrorHandler = errorHandlerFactory();\n var videoTagErrorHandler = errorHandlerFactory();\n\n // listen to error events coming from the video tag\n el.addEventListener('error', function (e) {\n var mediaError = e.currentTarget.error;\n if (mediaError.code === mediaError.MEDIA_ERR_DECODE) {\n videoTagErrorHandler();\n } else {\n console.error('Error loading media: File could not be played');\n }\n });\n\n /**\n * Destroys the Hls instance\n */\n this.dispose = function () {\n hls.destroy();\n };\n\n /**\n * returns the duration of the stream, or Infinity if live video\n * @returns {Infinity|number}\n */\n this.duration = function () {\n return duration || el.duration || 0;\n };\n\n // update live status on level load\n hls.on(hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].Events.LEVEL_LOADED, function (event, data) {\n duration = data.details.live ? Infinity : data.details.totalduration;\n });\n\n // try to recover on fatal errors\n hls.on(hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].Events.ERROR, function (event, data) {\n if (data.fatal) {\n switch (data.type) {\n case hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].ErrorTypes.NETWORK_ERROR:\n hls.startLoad();\n break;\n case hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].ErrorTypes.MEDIA_ERROR:\n hlsjsErrorHandler();\n break;\n default:\n console.error('Error loading media: File could not be played');\n break;\n }\n }\n });\n Object.keys(hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].Events).forEach(function (key) {\n var eventName = hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].Events[key];\n hls.on(eventName, function (event, data) {\n tech.trigger(eventName, data);\n });\n });\n\n // Intercept native TextTrack calls and route to video.js directly only\n // if native text tracks are not supported on this browser.\n if (!tech.featuresNativeTextTracks) {\n Object.defineProperty(el, 'textTracks', {\n get: function () {\n try {\n return typeof tech.textTracks === 'function' ? tech.textTracks() : tech.textTracks;\n } catch {\n return [];\n }\n }\n });\n el.addTextTrack = function () {\n return tech.addTextTrack.apply(tech, arguments);\n };\n }\n\n // attach hlsjs to videotag\n hls.attachMedia(el);\n hls.loadSource(source.src);\n}\nvar hlsTypeRE = /^application\\/(x-mpegURL|vnd\\.apple\\.mpegURL)$/i;\nvar hlsExtRE = /\\.m3u8/i;\nvar HlsSourceHandler = {\n canHandleSource: function (source) {\n if (source.skipContribHlsJs) {\n return '';\n } else if (hlsTypeRE.test(source.type)) {\n return 'probably';\n } else if (hlsExtRE.test(source.src)) {\n return 'maybe';\n } else {\n return '';\n }\n },\n handleSource: function (source, tech) {\n return new Html5HlsJS(source, tech);\n },\n canPlayType: function (type) {\n if (hlsTypeRE.test(type)) {\n return 'probably';\n }\n return '';\n }\n};\nif (hls_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isSupported()) {\n var videojs = window.videojs;\n\n // support es6 style import\n videojs = videojs && videojs.default || videojs;\n if (videojs) {\n var html5Tech = videojs.getTech && videojs.getTech('Html5'); // videojs6 (partially on videojs5 too)\n html5Tech = html5Tech || videojs.getComponent && videojs.getComponent('Html5'); // videojs5\n\n if (html5Tech) {\n html5Tech.registerSourceHandler(HlsSourceHandler, 0);\n }\n } else {\n console.warn('videojs-contrib-hls.js: Couldn\\'t find find window.videojs nor require(\\'video.js\\')');\n }\n}\n\n//# sourceURL=webpack://cloudinary-video-player/./plugins/adaptive-streaming/videojs-contrib-hlsjs.js?");
|
|
57
57
|
|
|
58
58
|
/***/ }),
|
|
59
59
|
|