cloudinary-video-player 3.0.2-edge.1 → 3.0.2

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.
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Cloudinary Video Player v3.0.2-edge.1
3
- * Built on 2025-06-22T09:09:59.428Z
2
+ * Cloudinary Video Player v3.0.2
3
+ * Built on 2025-06-24T09:40:45.653Z
4
4
  * https://github.com/cloudinary/cloudinary-video-player
5
5
  */
6
6
  (self["cloudinaryVideoPlayerChunkLoading"] = self["cloudinaryVideoPlayerChunkLoading"] || []).push([["adaptive-streaming"],{
@@ -375,14 +375,66 @@ const qualityLevels = (player, options) => {
375
375
  }
376
376
  };
377
377
 
378
+ // Helper to synchronise Video.js AudioTrackList with hls.js active track
379
+ const updateVjsAudioTracksEnabled = activeIndex => {
380
+ const list = player.audioTracks();
381
+ if (!list) return;
382
+ for (let i = 0; i < list.length; i++) {
383
+ list[i].enabled = i === activeIndex;
384
+ }
385
+ // Sync complete – log for debug
386
+ logAudioTrackInfo();
387
+ };
388
+
389
+ // Flush buffered audio by performing a tiny seek outside current range
390
+ const flushBufferedAudio = () => {
391
+ try {
392
+ const cur = player.currentTime();
393
+ const delta = 0.5; // 500 ms gap to escape current buffer
394
+ const target = Math.min(cur + delta, player.duration() - 0.1);
395
+ player.currentTime(target);
396
+ player.currentTime(cur);
397
+ } catch (e) {
398
+ debugLog('Error while flushing buffered audio', e);
399
+ }
400
+ };
401
+
402
+ // Force hls.js to switch track and immediately start loading fragments for it
403
+ const selectAudioTrack = index => {
404
+ var tech = player.tech({
405
+ IWillNotUseThisInPlugins: true
406
+ });
407
+ if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {
408
+ const hls = tech.sourceHandler_.hls;
409
+ if (hls.audioTrack === index) {
410
+ return;
411
+ }
412
+ hls.audioTrack = index;
413
+ // Quickly restart loading to fill the buffer of the new audio group
414
+ if (hls.media) {
415
+ try {
416
+ hls.stopLoad();
417
+ hls.startLoad(0);
418
+ } catch (e) {
419
+ debugLog('Error while reloading after audioTrack switch', e);
420
+ }
421
+ }
422
+ logAudioTrackInfo();
423
+ // will flush once switch is confirmed (AUDIO_TRACK_SWITCHED)
424
+ hls.once(hls_js__WEBPACK_IMPORTED_MODULE_1__["default"].Events.AUDIO_TRACK_SWITCHED, () => {
425
+ flushBufferedAudio();
426
+ });
427
+ }
428
+ };
429
+
378
430
  // Audio track handling
379
- const addAudioTrackVideojs = track => {
380
- var vjsTrack = new (video_js__WEBPACK_IMPORTED_MODULE_0___default().AudioTrack)({
431
+ const addAudioTrackVideojs = (track, hls) => {
432
+ const vjsTrack = new (video_js__WEBPACK_IMPORTED_MODULE_0___default().AudioTrack)({
381
433
  id: `${track.type}-id_${track.id}-groupId_${track.groupId}-${track.name}`,
382
434
  kind: 'translation',
383
435
  label: track.name,
384
436
  language: track.lang,
385
- enabled: track.enabled,
437
+ enabled: hls.audioTrack === hls.audioTracks.indexOf(track),
386
438
  default: track.default
387
439
  });
388
440
 
@@ -397,7 +449,7 @@ const qualityLevels = (player, options) => {
397
449
  const hls = tech.sourceHandler_.hls;
398
450
  const len = hls.audioTracks.length;
399
451
  for (let i = 0; i < len; i++) {
400
- addAudioTrackVideojs(hls.audioTracks[i]);
452
+ addAudioTrackVideojs(hls.audioTracks[i], hls);
401
453
  }
402
454
  }
403
455
 
@@ -408,11 +460,10 @@ const qualityLevels = (player, options) => {
408
460
  IWillNotUseThisInPlugins: true
409
461
  });
410
462
  if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {
411
- const hls = tech.sourceHandler_.hls;
412
463
  for (var i = 0; i < audioTrackList.length; i++) {
413
464
  var track = audioTrackList[i];
414
465
  if (track.enabled) {
415
- hls.audioTrack = i;
466
+ selectAudioTrack(i);
416
467
  return;
417
468
  }
418
469
  }
@@ -432,22 +483,32 @@ const qualityLevels = (player, options) => {
432
483
  // HLS
433
484
  if (typeof tech.sourceHandler_ != 'undefined' && typeof tech.sourceHandler_.hls != 'undefined' && tech.sourceHandler_.hls != null) {
434
485
  const hls = tech.sourceHandler_.hls;
435
- hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__["default"].Events.MANIFEST_LOADED, (eventName, data) => {
486
+ const manifestLoadedHandler = (eventName, data) => {
436
487
  debugLog(`HLS event: ${eventName}`, data);
437
488
  populateLevels(hls.levels, 'hls');
438
- });
489
+ initAudioTrackInfo();
490
+ hls.off(hls_js__WEBPACK_IMPORTED_MODULE_1__["default"].Events.MANIFEST_LOADED, manifestLoadedHandler);
491
+ };
492
+
493
+ // If manifest is already loaded, populate levels immediately.
494
+ if (hls.levels && hls.levels.length > 0) {
495
+ manifestLoadedHandler('MANUAL_MANIFEST_LOADED', {});
496
+ } else {
497
+ hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__["default"].Events.MANIFEST_LOADED, manifestLoadedHandler);
498
+ }
439
499
  hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__["default"].Events.LEVEL_SWITCHED, (eventName, data) => {
440
500
  debugLog(`HLS event: ${eventName}`, data);
441
501
  populateQualityLevelsChange(data.level);
442
502
  populateQualityChangedEvent(data.level);
443
503
  });
444
- hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__["default"].Events.AUDIO_TRACKS_UPDATED, (eventName, data) => {
445
- debugLog(`HLS event: ${eventName}`, data);
446
- initAudioTrackInfo();
447
- });
448
504
  hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__["default"].Events.AUDIO_TRACK_SWITCHED, (eventName, data) => {
449
505
  debugLog(`HLS event: ${eventName}`, data);
450
- logAudioTrackInfo();
506
+ // Make sure Video.js AudioTracks reflect the newly-selected HLS track
507
+ if (typeof data.id !== 'undefined') {
508
+ updateVjsAudioTracksEnabled(data.id);
509
+ }
510
+ // Ensure buffer flushed when switch originates from hls.js (e.g. default track)
511
+ flushBufferedAudio();
451
512
  });
452
513
  hls.on(hls_js__WEBPACK_IMPORTED_MODULE_1__["default"].Events.ERROR, (eventName, data) => {
453
514
  debugLog(`HLS event: ${eventName}`, data);