cloudinary-video-player
Version:
Cloudinary Video Player
47 lines (37 loc) • 9.56 kB
JavaScript
/*!
* Cloudinary Video Player v3.2.1
* Built on 2025-08-12T18:54:00.175Z
* https://github.com/cloudinary/cloudinary-video-player
*/
"use strict";
/*
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
(self["cloudinaryVideoPlayerChunkLoading"] = self["cloudinaryVideoPlayerChunkLoading"] || []).push([["share"],{
/***/ "./plugins/share/components/download-button.js":
/*!*****************************************************!*\
!*** ./plugins/share/components/download-button.js ***!
\*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\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\nconst ClickableComponent = video_js__WEBPACK_IMPORTED_MODULE_0___default().getComponent('ClickableComponent');\nclass ShareDownloadButton extends ClickableComponent {\n constructor(player) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n super(player, options);\n }\n handleClick(event) {\n super.handleClick(event);\n // Delegate the actual download to the plugin API if present\n if (this.player().share && typeof this.player().share.download === 'function') {\n this.player().share.download();\n }\n }\n createEl() {\n const button = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('button', {\n className: 'vjs-control vjs-share-download-button vjs-button',\n ariaLabel: 'Download video',\n title: 'Download video'\n });\n const iconSpan = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('span', {\n className: 'vjs-icon-file-download vjs-icon-placeholder'\n });\n button.appendChild(iconSpan);\n const spinnerSpan = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('span', {\n className: 'vjs-loading-spinner'\n });\n button.appendChild(spinnerSpan);\n return button;\n }\n\n /**\n * Toggles the \"preparing download\" visual state (spinner + title).\n * @param {boolean} isPreparing\n */\n setPreparing(isPreparing) {\n const el = this.el();\n if (isPreparing) {\n el.classList.add('vjs-waiting');\n el.setAttribute('title', 'Download is being prepared');\n } else {\n el.classList.remove('vjs-waiting');\n el.setAttribute('title', 'Download video');\n }\n }\n}\nvideo_js__WEBPACK_IMPORTED_MODULE_0___default().registerComponent('ShareDownloadButton', ShareDownloadButton);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ShareDownloadButton);\n\n//# sourceURL=webpack://cloudinary-video-player/./plugins/share/components/download-button.js?");
/***/ }),
/***/ "./plugins/share/share.js":
/*!********************************!*\
!*** ./plugins/share/share.js ***!
\********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _components_download_button__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/download-button */ \"./plugins/share/components/download-button.js\");\n/* harmony import */ var _share_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./share.scss */ \"./plugins/share/share.scss\");\n/* harmony import */ var plugins_cloudinary_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! plugins/cloudinary/common */ \"./plugins/cloudinary/common.js\");\n/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/omit */ \"../node_modules/lodash/omit.js\");\n/* harmony import */ var lodash_omit__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_omit__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\nconst SharePlugin = function () {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let playerInstance = arguments.length > 1 ? arguments[1] : undefined;\n const player = playerInstance || this;\n player.addClass('vjs-share');\n const addDownloadButton = () => {\n const controlBar = player.getChild('ControlBar');\n if (!controlBar || controlBar.getChild('ShareDownloadButton')) {\n return;\n }\n const children = controlBar.children();\n const insertBeforeIndex = children.findIndex(c => c.name_ === 'FullscreenToggle');\n controlBar.addChild('ShareDownloadButton', {}, insertBeforeIndex !== -1 ? insertBeforeIndex : undefined);\n };\n const removeDownloadButton = () => {\n if (!player.controlBar) {\n return;\n }\n const btn = player.controlBar.getChild('ShareDownloadButton');\n if (btn) {\n player.controlBar.removeChild(btn);\n }\n };\n const getDownloadUrl = () => {\n const source = player.currentSource?.();\n if (!source) {\n return null;\n }\n\n // Strip format / codec related transformation arrays\n const STRIP_KEYS = ['format', 'video_codec', 'streaming_profile'];\n const stripKeysDeep = value => {\n if (Array.isArray(value)) {\n return value.map(stripKeysDeep);\n }\n if (value && typeof value === 'object') {\n const cleaned = lodash_omit__WEBPACK_IMPORTED_MODULE_3___default()(value, STRIP_KEYS);\n Object.keys(cleaned).forEach(k => {\n cleaned[k] = stripKeysDeep(cleaned[k]);\n });\n return cleaned;\n }\n return value;\n };\n const transformations = stripKeysDeep(player.cloudinary.transformation() || {});\n const filename = player.cloudinary.currentPublicId()?.split('/')?.pop();\n const baseOptions = {\n ...player.cloudinary.cloudinaryConfig(),\n ...transformations,\n resource_type: 'video',\n format: 'mp4',\n video_codec: 'h264',\n flags: `streaming_attachment:${filename}`\n };\n\n // For ABR - download a limited-size video\n if (source.isAdaptive) {\n Object.assign(baseOptions, {\n crop: 'limit',\n width: 1920,\n height: 1920\n });\n }\n\n // For audio sources, set the format to mp3\n if (player.cloudinary.source()?.getType() === 'AudioSource') {\n Object.assign(baseOptions, {\n format: 'mp3',\n video_codec: undefined\n });\n }\n return (0,plugins_cloudinary_common__WEBPACK_IMPORTED_MODULE_2__.getCloudinaryUrl)(player.cloudinary.currentPublicId(), baseOptions);\n };\n const download = () => {\n const url = getDownloadUrl();\n if (!url) {\n console.warn('Share plugin: Unable to resolve download URL.');\n return;\n }\n const MAX_ATTEMPTS = 60; // 60 tries / 10s interval\n const INTERVAL_MS = 10000;\n const RETRY_STATUS_CODES = [423];\n const triggerDownload = () => {\n const a = document.createElement('a');\n a.href = url;\n a.download = '';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n const btn = player.controlBar?.getChild('ShareDownloadButton');\n const setPreparingState = isPreparing => {\n btn?.setPreparing?.(isPreparing);\n };\n const wait = ms => new Promise(resolve => setTimeout(resolve, ms));\n const fetchDownload = async function () {\n let attempt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n const response = await fetch(url, {\n method: 'HEAD'\n });\n if (RETRY_STATUS_CODES.includes(response.status) && attempt < MAX_ATTEMPTS) {\n await wait(INTERVAL_MS);\n return fetchDownload(attempt + 1);\n }\n setPreparingState(false);\n triggerDownload();\n };\n setPreparingState(true);\n fetchDownload();\n };\n if (options.download) {\n addDownloadButton();\n }\n player.share = {\n download,\n addDownloadButton,\n removeDownloadButton\n };\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SharePlugin);\n\n//# sourceURL=webpack://cloudinary-video-player/./plugins/share/share.js?");
/***/ }),
/***/ "./plugins/share/share.scss":
/*!**********************************!*\
!*** ./plugins/share/share.scss ***!
\**********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://cloudinary-video-player/./plugins/share/share.scss?");
/***/ })
}]);