cloudinary-video-player 3.1.2-edge.2 → 3.1.2-edge.4

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.
Files changed (52) hide show
  1. package/dist/adaptive-streaming.js +18 -36920
  2. package/dist/adaptive-streaming.min.js +3 -4
  3. package/dist/chapters.js +13 -217
  4. package/dist/chapters.min.js +3 -4
  5. package/dist/cld-video-player.css +24 -4
  6. package/dist/cld-video-player.js +317 -46291
  7. package/dist/cld-video-player.light.js +317 -46291
  8. package/dist/cld-video-player.light.min.js +4 -5
  9. package/dist/cld-video-player.min.css +3 -4
  10. package/dist/cld-video-player.min.js +4 -5
  11. package/dist/colors.js +13 -67
  12. package/dist/colors.min.js +3 -4
  13. package/dist/dash.js +15 -69999
  14. package/dist/dash.min.js +3 -4
  15. package/dist/debug.js +17 -377
  16. package/dist/debug.min.js +3 -4
  17. package/dist/ima.js +24 -7049
  18. package/dist/ima.min.js +3 -4
  19. package/dist/interaction-areas.js +20 -640
  20. package/dist/interaction-areas.min.js +3 -4
  21. package/dist/node_modules_lodash_throttle_js.js +17 -395
  22. package/dist/playlist.js +40 -1504
  23. package/dist/playlist.min.js +3 -4
  24. package/dist/recommendations-overlay.js +19 -391
  25. package/dist/recommendations-overlay.min.js +3 -4
  26. package/dist/share.js +47 -0
  27. package/dist/share.min.js +6 -0
  28. package/dist/shoppable.js +21 -762
  29. package/dist/shoppable.min.js +3 -4
  30. package/dist/srt-text-tracks.js +13 -189
  31. package/dist/srt-text-tracks.min.js +3 -4
  32. package/dist/visual-search.js +16 -271
  33. package/dist/visual-search.min.js +3 -4
  34. package/lib/adaptive-streaming.js +1 -2
  35. package/lib/all.js +1 -2
  36. package/lib/chapters.js +1 -2
  37. package/lib/cld-video-player.js +1 -2
  38. package/lib/cld-video-player.min.css +1 -2
  39. package/lib/colors.js +1 -2
  40. package/lib/dash.js +1 -2
  41. package/lib/debug.js +1 -2
  42. package/lib/ima.js +1 -2
  43. package/lib/interaction-areas.js +1 -2
  44. package/lib/player.js +1 -2
  45. package/lib/playlist.js +1 -2
  46. package/lib/recommendations-overlay.js +1 -2
  47. package/lib/share.js +1 -0
  48. package/lib/shoppable.js +1 -2
  49. package/lib/srt-text-tracks.js +1 -2
  50. package/lib/videoPlayer.js +1 -2
  51. package/lib/visual-search.js +1 -2
  52. package/package.json +2 -3
@@ -1,9 +1,17 @@
1
1
  /*!
2
- * Cloudinary Video Player v3.1.2-edge.2
3
- * Built on 2025-07-29T06:41:23.669Z
2
+ * Cloudinary Video Player v3.1.2-edge.4
3
+ * Built on 2025-08-11T06:41:19.174Z
4
4
  * https://github.com/cloudinary/cloudinary-video-player
5
5
  */
6
6
  "use strict";
7
+ /*
8
+ * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
9
+ * This devtool is neither made for production nor for readable output files.
10
+ * It uses "eval()" calls to create a separate source file in the browser devtools.
11
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
12
+ * or disable the default devtool with "devtool: false".
13
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
14
+ */
7
15
  (self["cloudinaryVideoPlayerChunkLoading"] = self["cloudinaryVideoPlayerChunkLoading"] || []).push([["visual-search"],{
8
16
 
9
17
  /***/ "./plugins/visual-search/components/SearchButton.js":
@@ -12,30 +20,7 @@
12
20
  \**********************************************************/
13
21
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
14
22
 
15
- __webpack_require__.r(__webpack_exports__);
16
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
17
- /* harmony export */ SearchButton: () => (/* binding */ SearchButton)
18
- /* harmony export */ });
19
- /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
20
- /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
21
-
22
- const SearchButton = onClick => {
23
- const button = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('button', {
24
- className: 'vjs-control vjs-button vjs-visual-search-button',
25
- title: 'Search video content',
26
- ariaLabel: 'Search video content'
27
- });
28
- const searchIcon = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('span', {
29
- className: 'vjs-icon-search'
30
- });
31
- button.appendChild(searchIcon);
32
- const spinnerIcon = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('span', {
33
- className: 'vjs-loading-spinner'
34
- });
35
- button.appendChild(spinnerIcon);
36
- button.addEventListener('click', onClick);
37
- return button;
38
- };
23
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SearchButton: () => (/* binding */ SearchButton)\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 SearchButton = onClick => {\n const button = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('button', {\n className: 'vjs-control vjs-button vjs-visual-search-button',\n title: 'Search video content',\n ariaLabel: 'Search video content'\n });\n const searchIcon = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('span', {\n className: 'vjs-icon-search'\n });\n button.appendChild(searchIcon);\n const spinnerIcon = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('span', {\n className: 'vjs-loading-spinner'\n });\n button.appendChild(spinnerIcon);\n button.addEventListener('click', onClick);\n return button;\n};\n\n//# sourceURL=webpack://cloudinary-video-player/./plugins/visual-search/components/SearchButton.js?");
39
24
 
40
25
  /***/ }),
41
26
 
@@ -45,61 +30,7 @@ const SearchButton = onClick => {
45
30
  \*********************************************************/
46
31
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
47
32
 
48
- __webpack_require__.r(__webpack_exports__);
49
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
50
- /* harmony export */ SearchInput: () => (/* binding */ SearchInput)
51
- /* harmony export */ });
52
- /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
53
- /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
54
-
55
- const SearchInput = (onSearch, onClose) => {
56
- const form = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('form', {
57
- className: 'vjs-visual-search-form'
58
- });
59
- const input = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('input', {
60
- className: 'vjs-visual-search-input',
61
- type: 'text',
62
- ariaLabel: 'Search input',
63
- tabIndex: -1
64
- });
65
- const closeButton = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('button', {
66
- className: 'vjs-control vjs-button vjs-visual-search-close',
67
- type: 'button',
68
- title: 'Close search',
69
- ariaLabel: 'Close search',
70
- tabIndex: -1
71
- });
72
-
73
- // Add close icon
74
- const closeIcon = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('span', {
75
- className: 'vjs-icon-close'
76
- });
77
- closeButton.appendChild(closeIcon);
78
- form.appendChild(input);
79
- form.appendChild(closeButton);
80
-
81
- // Handle search submission
82
- form.addEventListener('submit', e => {
83
- e.preventDefault();
84
- const query = input.value.trim();
85
- if (query) {
86
- onSearch(query);
87
- }
88
- });
89
-
90
- // Handle close button
91
- closeButton.addEventListener('click', e => {
92
- e.preventDefault();
93
- if (onClose) {
94
- onClose();
95
- }
96
- });
97
- return {
98
- element: form,
99
- input,
100
- closeButton
101
- };
102
- };
33
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SearchInput: () => (/* binding */ SearchInput)\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 SearchInput = (onSearch, onClose) => {\n const form = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('form', {\n className: 'vjs-visual-search-form'\n });\n const input = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('input', {\n className: 'vjs-visual-search-input',\n type: 'text',\n ariaLabel: 'Search input',\n tabIndex: -1\n });\n const closeButton = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('button', {\n className: 'vjs-control vjs-button vjs-visual-search-close',\n type: 'button',\n title: 'Close search',\n ariaLabel: 'Close search',\n tabIndex: -1\n });\n\n // Add close icon\n const closeIcon = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('span', {\n className: 'vjs-icon-close'\n });\n closeButton.appendChild(closeIcon);\n form.appendChild(input);\n form.appendChild(closeButton);\n\n // Handle search submission\n form.addEventListener('submit', e => {\n e.preventDefault();\n const query = input.value.trim();\n if (query) {\n onSearch(query);\n }\n });\n\n // Handle close button\n closeButton.addEventListener('click', e => {\n e.preventDefault();\n if (onClose) {\n onClose();\n }\n });\n return {\n element: form,\n input,\n closeButton\n };\n};\n\n//# sourceURL=webpack://cloudinary-video-player/./plugins/visual-search/components/SearchInput.js?");
103
34
 
104
35
  /***/ }),
105
36
 
@@ -109,79 +40,7 @@ const SearchInput = (onSearch, onClose) => {
109
40
  \***********************************************************/
110
41
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
111
42
 
112
- __webpack_require__.r(__webpack_exports__);
113
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
114
- /* harmony export */ SearchResults: () => (/* binding */ SearchResults)
115
- /* harmony export */ });
116
- /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
117
- /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
118
-
119
- const SearchResults = player => {
120
- const clearMarkers = () => {
121
- player.$$('.vjs-visual-search-marker').forEach(el => el.remove());
122
- player.$$('.vjs-visual-search-results-wrapper').forEach(el => el.remove());
123
-
124
- // Remove the class that indicates search results are displayed
125
- player.removeClass('vjs-visual-search-results-active');
126
- };
127
- const displayResults = results => {
128
- // Clear existing markers
129
- clearMarkers();
130
- const total = player.duration();
131
- const seekBar = player.controlBar.progressControl.seekBar;
132
-
133
- // Create wrapper for search results
134
- const wrapperEl = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('div', {
135
- className: 'vjs-visual-search-results-wrapper',
136
- role: 'presentation'
137
- });
138
-
139
- // Add markers for each result
140
- results.forEach(result => {
141
- const {
142
- start_time,
143
- end_time
144
- } = result;
145
- const position = start_time / total * 100;
146
- const width = (end_time - start_time) / total * 100;
147
- const time = `${Math.floor(start_time / 60)}:${Math.floor(start_time % 60).toString().padStart(2, '0')}`;
148
- const markerEl = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('div', {
149
- className: 'vjs-control vjs-visual-search-marker',
150
- style: `left: ${position}%; width: ${width}%`,
151
- tabIndex: 0,
152
- role: 'button',
153
- title: `Search result at ${time}`,
154
- ariaLabel: `Search result at ${time}`
155
- });
156
- wrapperEl.appendChild(markerEl);
157
-
158
- // Add click handler to jump to this time
159
- markerEl.addEventListener('click', () => {
160
- player.currentTime(start_time);
161
- });
162
-
163
- // Add keyboard support
164
- markerEl.addEventListener('keydown', e => {
165
- if (e.key === 'Enter' || e.key === ' ') {
166
- e.preventDefault();
167
- player.currentTime(start_time);
168
- }
169
- });
170
- });
171
-
172
- // Add wrapper to seek bar
173
- seekBar.el().appendChild(wrapperEl);
174
-
175
- // Add a class to indicate search results are displayed
176
- if (results.length > 0) {
177
- player.addClass('vjs-visual-search-results-active');
178
- }
179
- };
180
- return {
181
- displayResults,
182
- clearMarkers
183
- };
184
- };
43
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SearchResults: () => (/* binding */ SearchResults)\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 SearchResults = player => {\n const clearMarkers = () => {\n player.$$('.vjs-visual-search-marker').forEach(el => el.remove());\n player.$$('.vjs-visual-search-results-wrapper').forEach(el => el.remove());\n\n // Remove the class that indicates search results are displayed\n player.removeClass('vjs-visual-search-results-active');\n };\n const displayResults = results => {\n // Clear existing markers\n clearMarkers();\n const total = player.duration();\n const seekBar = player.controlBar.progressControl.seekBar;\n\n // Create wrapper for search results\n const wrapperEl = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('div', {\n className: 'vjs-visual-search-results-wrapper',\n role: 'presentation'\n });\n\n // Add markers for each result\n results.forEach(result => {\n const {\n start_time,\n end_time\n } = result;\n const position = start_time / total * 100;\n const width = (end_time - start_time) / total * 100;\n const time = `${Math.floor(start_time / 60)}:${Math.floor(start_time % 60).toString().padStart(2, '0')}`;\n const markerEl = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('div', {\n className: 'vjs-control vjs-visual-search-marker',\n style: `left: ${position}%; width: ${width}%`,\n tabIndex: 0,\n role: 'button',\n title: `Search result at ${time}`,\n ariaLabel: `Search result at ${time}`\n });\n wrapperEl.appendChild(markerEl);\n\n // Add click handler to jump to this time\n markerEl.addEventListener('click', () => {\n player.currentTime(start_time);\n });\n\n // Add keyboard support\n markerEl.addEventListener('keydown', e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n player.currentTime(start_time);\n }\n });\n });\n\n // Add wrapper to seek bar\n seekBar.el().appendChild(wrapperEl);\n\n // Add a class to indicate search results are displayed\n if (results.length > 0) {\n player.addClass('vjs-visual-search-results-active');\n }\n };\n return {\n displayResults,\n clearMarkers\n };\n};\n\n//# sourceURL=webpack://cloudinary-video-player/./plugins/visual-search/components/SearchResults.js?");
185
44
 
186
45
  /***/ }),
187
46
 
@@ -191,118 +50,7 @@ const SearchResults = player => {
191
50
  \************************************************/
192
51
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
193
52
 
194
- __webpack_require__.r(__webpack_exports__);
195
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
196
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
197
- /* harmony export */ });
198
- /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! video.js */ "../node_modules/video.js/dist/alt/video.core-exposed.js");
199
- /* harmony import */ var video_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(video_js__WEBPACK_IMPORTED_MODULE_0__);
200
- /* harmony import */ var _components_SearchButton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/SearchButton */ "./plugins/visual-search/components/SearchButton.js");
201
- /* harmony import */ var _components_SearchInput__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/SearchInput */ "./plugins/visual-search/components/SearchInput.js");
202
- /* harmony import */ var _components_SearchResults__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/SearchResults */ "./plugins/visual-search/components/SearchResults.js");
203
- /* harmony import */ var _visual_search_scss__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./visual-search.scss */ "./plugins/visual-search/visual-search.scss");
204
-
205
-
206
-
207
-
208
-
209
- const visualSearch = (options, player) => {
210
- player.addClass('vjs-visual-search');
211
- let isSearchActive = false;
212
- const searchResults = (0,_components_SearchResults__WEBPACK_IMPORTED_MODULE_3__.SearchResults)(player);
213
- const performSearch = async query => {
214
- const searchButton = player.$('.vjs-visual-search-button');
215
- searchButton.classList.add('vjs-waiting');
216
- try {
217
- const source = player.cloudinary.source();
218
- const publicId = source.publicId();
219
- const transformation = Object.assign({}, source.transformation());
220
- transformation.flags = transformation.flags || [];
221
- transformation.flags.push(`getinfo:search_b64_${btoa(query)}`);
222
- const visualSearchSrc = source.config().url(`${publicId}`, {
223
- transformation
224
- });
225
- const response = await fetch(visualSearchSrc, {
226
- method: 'GET',
227
- headers: {
228
- 'Content-Type': 'application/json'
229
- }
230
- });
231
- if (!response.ok) {
232
- throw new Error(`Search request failed with status: ${response.status}`);
233
- }
234
- const results = await response.json();
235
- searchResults.displayResults(results.timestamps);
236
- if (results && !player.hasStarted()) {
237
- // Make sure the progress bar is visible
238
- player.play().then(() => player.pause());
239
- }
240
- } catch (error) {
241
- console.error('Error performing visual search:', error);
242
- } finally {
243
- searchButton.classList.remove('vjs-waiting');
244
- }
245
- };
246
- const clearUI = () => {
247
- isSearchActive = false;
248
- searchResults.clearMarkers();
249
- player.$('.vjs-visual-search-wrapper')?.remove();
250
- };
251
- const createSearchUI = () => {
252
- clearUI();
253
- const titleBar = player.$('.vjs-title-bar');
254
- if (titleBar) {
255
- titleBar.classList.remove('vjs-hidden');
256
- }
257
- const searchContainer = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('div', {
258
- className: 'vjs-visual-search-wrapper'
259
- });
260
-
261
- // Handle the search icon click (expand or submit)
262
- const handleSearchButtonClick = () => {
263
- if (!isSearchActive) {
264
- isSearchActive = true;
265
- searchContainer.classList.add('vjs-visual-search-active');
266
- searchInput.input.tabIndex = 0;
267
- searchInput.closeButton.tabIndex = 0;
268
- searchInput.input.focus();
269
- } else {
270
- const query = searchInput.input.value.trim();
271
- if (query) {
272
- performSearch(query);
273
- }
274
- }
275
- };
276
- const closeSearch = () => {
277
- if (isSearchActive) {
278
- isSearchActive = false;
279
- searchContainer.classList.remove('vjs-visual-search-active');
280
- searchInput.input.value = '';
281
- searchInput.input.tabIndex = -1;
282
- searchInput.closeButton.tabIndex = -1;
283
- searchResults.clearMarkers();
284
- }
285
- };
286
- const searchButton = (0,_components_SearchButton__WEBPACK_IMPORTED_MODULE_1__.SearchButton)(handleSearchButtonClick);
287
- const searchInput = (0,_components_SearchInput__WEBPACK_IMPORTED_MODULE_2__.SearchInput)(performSearch, closeSearch);
288
- searchContainer.appendChild(searchButton);
289
- searchContainer.appendChild(searchInput.element);
290
- titleBar.prepend(searchContainer);
291
- player.on('keydown', e => {
292
- if (e.key === 'Escape' && isSearchActive) {
293
- closeSearch();
294
- }
295
- });
296
- };
297
- createSearchUI();
298
-
299
- // Public methods
300
- player.visualSearch = {
301
- createSearchUI,
302
- clearUI
303
- };
304
- };
305
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (visualSearch);
53
+ 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/* harmony import */ var _components_SearchButton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/SearchButton */ \"./plugins/visual-search/components/SearchButton.js\");\n/* harmony import */ var _components_SearchInput__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/SearchInput */ \"./plugins/visual-search/components/SearchInput.js\");\n/* harmony import */ var _components_SearchResults__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/SearchResults */ \"./plugins/visual-search/components/SearchResults.js\");\n/* harmony import */ var _visual_search_scss__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./visual-search.scss */ \"./plugins/visual-search/visual-search.scss\");\n\n\n\n\n\nconst visualSearch = (options, player) => {\n player.addClass('vjs-visual-search');\n let isSearchActive = false;\n const searchResults = (0,_components_SearchResults__WEBPACK_IMPORTED_MODULE_3__.SearchResults)(player);\n const performSearch = async query => {\n const searchButton = player.$('.vjs-visual-search-button');\n searchButton.classList.add('vjs-waiting');\n try {\n const source = player.cloudinary.source();\n const publicId = source.publicId();\n const transformation = Object.assign({}, source.transformation());\n transformation.flags = transformation.flags || [];\n transformation.flags.push(`getinfo:search_b64_${btoa(query)}`);\n const visualSearchSrc = source.config().url(`${publicId}`, {\n transformation\n });\n const response = await fetch(visualSearchSrc, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n });\n if (!response.ok) {\n throw new Error(`Search request failed with status: ${response.status}`);\n }\n const results = await response.json();\n searchResults.displayResults(results.timestamps);\n if (results && !player.hasStarted()) {\n // Make sure the progress bar is visible\n player.play().then(() => player.pause());\n }\n } catch (error) {\n console.error('Error performing visual search:', error);\n } finally {\n searchButton.classList.remove('vjs-waiting');\n }\n };\n const clearUI = () => {\n isSearchActive = false;\n searchResults.clearMarkers();\n player.$('.vjs-visual-search-wrapper')?.remove();\n };\n const createSearchUI = () => {\n clearUI();\n const titleBar = player.$('.vjs-title-bar');\n if (titleBar) {\n titleBar.classList.remove('vjs-hidden');\n }\n const searchContainer = video_js__WEBPACK_IMPORTED_MODULE_0___default().dom.createEl('div', {\n className: 'vjs-visual-search-wrapper'\n });\n\n // Handle the search icon click (expand or submit)\n const handleSearchButtonClick = () => {\n if (!isSearchActive) {\n isSearchActive = true;\n searchContainer.classList.add('vjs-visual-search-active');\n searchInput.input.tabIndex = 0;\n searchInput.closeButton.tabIndex = 0;\n searchInput.input.focus();\n } else {\n const query = searchInput.input.value.trim();\n if (query) {\n performSearch(query);\n }\n }\n };\n const closeSearch = () => {\n if (isSearchActive) {\n isSearchActive = false;\n searchContainer.classList.remove('vjs-visual-search-active');\n searchInput.input.value = '';\n searchInput.input.tabIndex = -1;\n searchInput.closeButton.tabIndex = -1;\n searchResults.clearMarkers();\n }\n };\n const searchButton = (0,_components_SearchButton__WEBPACK_IMPORTED_MODULE_1__.SearchButton)(handleSearchButtonClick);\n const searchInput = (0,_components_SearchInput__WEBPACK_IMPORTED_MODULE_2__.SearchInput)(performSearch, closeSearch);\n searchContainer.appendChild(searchButton);\n searchContainer.appendChild(searchInput.element);\n titleBar.prepend(searchContainer);\n player.on('keydown', e => {\n if (e.key === 'Escape' && isSearchActive) {\n closeSearch();\n }\n });\n };\n createSearchUI();\n\n // Public methods\n player.visualSearch = {\n createSearchUI,\n clearUI\n };\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (visualSearch);\n\n//# sourceURL=webpack://cloudinary-video-player/./plugins/visual-search/visual-search.js?");
306
54
 
307
55
  /***/ }),
308
56
 
@@ -312,11 +60,8 @@ const visualSearch = (options, player) => {
312
60
  \**************************************************/
313
61
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
314
62
 
315
- __webpack_require__.r(__webpack_exports__);
316
- // extracted by mini-css-extract-plugin
317
-
63
+ eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://cloudinary-video-player/./plugins/visual-search/visual-search.scss?");
318
64
 
319
65
  /***/ })
320
66
 
321
- }]);
322
- //# sourceMappingURL=visual-search.js.map
67
+ }]);
@@ -1,7 +1,6 @@
1
1
  /*!
2
- * Cloudinary Video Player v3.1.2-edge.2
3
- * Built on 2025-07-29T06:41:04.249Z
2
+ * Cloudinary Video Player v3.1.2-edge.4
3
+ * Built on 2025-08-11T06:41:01.308Z
4
4
  * https://github.com/cloudinary/cloudinary-video-player
5
5
  */
6
- "use strict";(self.cloudinaryVideoPlayerChunkLoading=self.cloudinaryVideoPlayerChunkLoading||[]).push([[728],{9148:(e,a,s)=>{s.d(a,{default:()=>l});var t=s(6673),r=s.n(t);const l=(e,a)=>{a.addClass("vjs-visual-search");let s=!1;const t=(e=>{const a=()=>{e.$$(".vjs-visual-search-marker").forEach((e=>e.remove())),e.$$(".vjs-visual-search-results-wrapper").forEach((e=>e.remove())),e.removeClass("vjs-visual-search-results-active")};return{displayResults:s=>{a();const t=e.duration(),l=e.controlBar.progressControl.seekBar,n=r().dom.createEl("div",{className:"vjs-visual-search-results-wrapper",role:"presentation"});s.forEach((a=>{const{start_time:s,end_time:l}=a,c=s/t*100,o=(l-s)/t*100,i=`${Math.floor(s/60)}:${Math.floor(s%60).toString().padStart(2,"0")}`,d=r().dom.createEl("div",{className:"vjs-control vjs-visual-search-marker",style:`left: ${c}%; width: ${o}%`,tabIndex:0,role:"button",title:`Search result at ${i}`,ariaLabel:`Search result at ${i}`});n.appendChild(d),d.addEventListener("click",(()=>{e.currentTime(s)})),d.addEventListener("keydown",(a=>{"Enter"!==a.key&&" "!==a.key||(a.preventDefault(),e.currentTime(s))}))})),l.el().appendChild(n),s.length>0&&e.addClass("vjs-visual-search-results-active")},clearMarkers:a}})(a),l=async e=>{const s=a.$(".vjs-visual-search-button");s.classList.add("vjs-waiting");try{const s=a.cloudinary.source(),r=s.publicId(),l=Object.assign({},s.transformation());l.flags=l.flags||[],l.flags.push(`getinfo:search_b64_${btoa(e)}`);const n=s.config().url(`${r}`,{transformation:l}),c=await fetch(n,{method:"GET",headers:{"Content-Type":"application/json"}});if(!c.ok)throw new Error(`Search request failed with status: ${c.status}`);const o=await c.json();t.displayResults(o.timestamps),o&&!a.hasStarted()&&a.play().then((()=>a.pause()))}catch(e){console.error("Error performing visual search:",e)}finally{s.classList.remove("vjs-waiting")}},n=()=>{s=!1,t.clearMarkers(),a.$(".vjs-visual-search-wrapper")?.remove()},c=()=>{n();const e=a.$(".vjs-title-bar");e&&e.classList.remove("vjs-hidden");const c=r().dom.createEl("div",{className:"vjs-visual-search-wrapper"}),o=()=>{s&&(s=!1,c.classList.remove("vjs-visual-search-active"),d.input.value="",d.input.tabIndex=-1,d.closeButton.tabIndex=-1,t.clearMarkers())},i=(e=>{const a=r().dom.createEl("button",{className:"vjs-control vjs-button vjs-visual-search-button",title:"Search video content",ariaLabel:"Search video content"}),s=r().dom.createEl("span",{className:"vjs-icon-search"});a.appendChild(s);const t=r().dom.createEl("span",{className:"vjs-loading-spinner"});return a.appendChild(t),a.addEventListener("click",e),a})((()=>{if(s){const e=d.input.value.trim();e&&l(e)}else s=!0,c.classList.add("vjs-visual-search-active"),d.input.tabIndex=0,d.closeButton.tabIndex=0,d.input.focus()})),d=((e,a)=>{const s=r().dom.createEl("form",{className:"vjs-visual-search-form"}),t=r().dom.createEl("input",{className:"vjs-visual-search-input",type:"text",ariaLabel:"Search input",tabIndex:-1}),l=r().dom.createEl("button",{className:"vjs-control vjs-button vjs-visual-search-close",type:"button",title:"Close search",ariaLabel:"Close search",tabIndex:-1}),n=r().dom.createEl("span",{className:"vjs-icon-close"});return l.appendChild(n),s.appendChild(t),s.appendChild(l),s.addEventListener("submit",(a=>{a.preventDefault();const s=t.value.trim();s&&e(s)})),l.addEventListener("click",(e=>{e.preventDefault(),a&&a()})),{element:s,input:t,closeButton:l}})(l,o);c.appendChild(i),c.appendChild(d.element),e.prepend(c),a.on("keydown",(e=>{"Escape"===e.key&&s&&o()}))};c(),a.visualSearch={createSearchUI:c,clearUI:n}}}}]);
7
- //# sourceMappingURL=visual-search.min.js.map
6
+ "use strict";(self.cloudinaryVideoPlayerChunkLoading=self.cloudinaryVideoPlayerChunkLoading||[]).push([[728],{9148:(e,a,s)=>{s.d(a,{default:()=>l});var t=s(6673),r=s.n(t);const l=(e,a)=>{a.addClass("vjs-visual-search");let s=!1;const t=(e=>{const a=()=>{e.$$(".vjs-visual-search-marker").forEach((e=>e.remove())),e.$$(".vjs-visual-search-results-wrapper").forEach((e=>e.remove())),e.removeClass("vjs-visual-search-results-active")};return{displayResults:s=>{a();const t=e.duration(),l=e.controlBar.progressControl.seekBar,n=r().dom.createEl("div",{className:"vjs-visual-search-results-wrapper",role:"presentation"});s.forEach((a=>{const{start_time:s,end_time:l}=a,c=s/t*100,o=(l-s)/t*100,i=`${Math.floor(s/60)}:${Math.floor(s%60).toString().padStart(2,"0")}`,d=r().dom.createEl("div",{className:"vjs-control vjs-visual-search-marker",style:`left: ${c}%; width: ${o}%`,tabIndex:0,role:"button",title:`Search result at ${i}`,ariaLabel:`Search result at ${i}`});n.appendChild(d),d.addEventListener("click",(()=>{e.currentTime(s)})),d.addEventListener("keydown",(a=>{"Enter"!==a.key&&" "!==a.key||(a.preventDefault(),e.currentTime(s))}))})),l.el().appendChild(n),s.length>0&&e.addClass("vjs-visual-search-results-active")},clearMarkers:a}})(a),l=async e=>{const s=a.$(".vjs-visual-search-button");s.classList.add("vjs-waiting");try{const s=a.cloudinary.source(),r=s.publicId(),l=Object.assign({},s.transformation());l.flags=l.flags||[],l.flags.push(`getinfo:search_b64_${btoa(e)}`);const n=s.config().url(`${r}`,{transformation:l}),c=await fetch(n,{method:"GET",headers:{"Content-Type":"application/json"}});if(!c.ok)throw new Error(`Search request failed with status: ${c.status}`);const o=await c.json();t.displayResults(o.timestamps),o&&!a.hasStarted()&&a.play().then((()=>a.pause()))}catch(e){console.error("Error performing visual search:",e)}finally{s.classList.remove("vjs-waiting")}},n=()=>{s=!1,t.clearMarkers(),a.$(".vjs-visual-search-wrapper")?.remove()},c=()=>{n();const e=a.$(".vjs-title-bar");e&&e.classList.remove("vjs-hidden");const c=r().dom.createEl("div",{className:"vjs-visual-search-wrapper"}),o=()=>{s&&(s=!1,c.classList.remove("vjs-visual-search-active"),d.input.value="",d.input.tabIndex=-1,d.closeButton.tabIndex=-1,t.clearMarkers())},i=(e=>{const a=r().dom.createEl("button",{className:"vjs-control vjs-button vjs-visual-search-button",title:"Search video content",ariaLabel:"Search video content"}),s=r().dom.createEl("span",{className:"vjs-icon-search"});a.appendChild(s);const t=r().dom.createEl("span",{className:"vjs-loading-spinner"});return a.appendChild(t),a.addEventListener("click",e),a})((()=>{if(s){const e=d.input.value.trim();e&&l(e)}else s=!0,c.classList.add("vjs-visual-search-active"),d.input.tabIndex=0,d.closeButton.tabIndex=0,d.input.focus()})),d=((e,a)=>{const s=r().dom.createEl("form",{className:"vjs-visual-search-form"}),t=r().dom.createEl("input",{className:"vjs-visual-search-input",type:"text",ariaLabel:"Search input",tabIndex:-1}),l=r().dom.createEl("button",{className:"vjs-control vjs-button vjs-visual-search-close",type:"button",title:"Close search",ariaLabel:"Close search",tabIndex:-1}),n=r().dom.createEl("span",{className:"vjs-icon-close"});return l.appendChild(n),s.appendChild(t),s.appendChild(l),s.addEventListener("submit",(a=>{a.preventDefault();const s=t.value.trim();s&&e(s)})),l.addEventListener("click",(e=>{e.preventDefault(),a&&a()})),{element:s,input:t,closeButton:l}})(l,o);c.appendChild(i),c.appendChild(d.element),e.prepend(c),a.on("keydown",(e=>{"Escape"===e.key&&s&&o()}))};c(),a.visualSearch={createSearchUI:c,clearUI:n}}}}]);