From 8ae43999220cc0a8fb2d3833f85a30638f8ca1b7 Mon Sep 17 00:00:00 2001 From: Constanza Dibueno Date: Fri, 26 Sep 2025 12:32:22 -0300 Subject: [PATCH 01/12] WIP playback ended --- .../controllers/AlternativeMediaController.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/streaming/controllers/AlternativeMediaController.js b/src/streaming/controllers/AlternativeMediaController.js index ff3abfa9bb..2485e71d92 100644 --- a/src/streaming/controllers/AlternativeMediaController.js +++ b/src/streaming/controllers/AlternativeMediaController.js @@ -55,6 +55,7 @@ function AlternativeMediaController() { videoModel = null, alternativeContext = null, hideAlternativePlayerControls = false, + alternativePlaybackEnded = false, alternativeVideoElement = null; function setConfig(config) { @@ -217,6 +218,8 @@ function AlternativeMediaController() { const altPlayer = mediaManager.getAlternativePlayer(); if (altPlayer) { altPlayer.on(MediaPlayerEvents.PLAYBACK_TIME_UPDATED, _onAlternativePlaybackTimeUpdated, this); + altPlayer.on(MediaPlayerEvents.DYNAMIC_TO_STATIC, _onPlyabackEnded(), this) + altPlayer.on(MediaPlayerEvents.PLAYBACK_ENDED, _onPlyabackEnded(), this) } } catch (err) { logger.error('Error handling alternative event:', err); @@ -273,9 +276,10 @@ function AlternativeMediaController() { alternativeSwitched = true; calculatedMaxDuration = altPlayer.isDynamic() ? deltaTime + maxDuration : maxDuration; } + console.log(alternativePlaybackEnded) const shouldSwitchBack = // Check if the alternative content has finished playing - (Math.round(altPlayer.duration() - e.time) === 0) || + alternativePlaybackEnded || // Check if the alternative content reached the max duration (clip && actualEventPresentationTime + deltaTime >= presentationTime + calculatedMaxDuration) || (calculatedMaxDuration && calculatedMaxDuration <= e.time); @@ -295,6 +299,10 @@ function AlternativeMediaController() { } } + function _onPlyabackEnded(e){ + alternativePlaybackEnded = e.isLast + } + function _calculateSeekTime(currentEvent, altPlayer) { let seekTime; if (currentEvent.mode === Constants.ALTERNATIVE_MPD.MODES.REPLACE) { @@ -320,6 +328,7 @@ function AlternativeMediaController() { timeToSwitch = 0; alternativeSwitched = false; calculatedMaxDuration = 0; + alternativePlaybackEnded = false; } function reset() { From ce43e1cb6f7ae9d396dc4b619c2fa7ca83f53038 Mon Sep 17 00:00:00 2001 From: Constanza Dibueno Date: Fri, 26 Sep 2025 12:42:04 -0300 Subject: [PATCH 02/12] add dynamic to static listener --- src/streaming/controllers/AlternativeMediaController.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/streaming/controllers/AlternativeMediaController.js b/src/streaming/controllers/AlternativeMediaController.js index 2485e71d92..7143bde6c7 100644 --- a/src/streaming/controllers/AlternativeMediaController.js +++ b/src/streaming/controllers/AlternativeMediaController.js @@ -219,7 +219,7 @@ function AlternativeMediaController() { if (altPlayer) { altPlayer.on(MediaPlayerEvents.PLAYBACK_TIME_UPDATED, _onAlternativePlaybackTimeUpdated, this); altPlayer.on(MediaPlayerEvents.DYNAMIC_TO_STATIC, _onPlyabackEnded(), this) - altPlayer.on(MediaPlayerEvents.PLAYBACK_ENDED, _onPlyabackEnded(), this) + altPlayer.on(MediaPlayerEvents.PLAYBACK_ENDED, _onDynamicToStatic(), this) } } catch (err) { logger.error('Error handling alternative event:', err); @@ -303,6 +303,10 @@ function AlternativeMediaController() { alternativePlaybackEnded = e.isLast } + function _onDynamicToStatic(){ + alternativePlaybackEnded = true; + } + function _calculateSeekTime(currentEvent, altPlayer) { let seekTime; if (currentEvent.mode === Constants.ALTERNATIVE_MPD.MODES.REPLACE) { From 25d1e8a53c8b9f061c687d72230d357d4c4d643c Mon Sep 17 00:00:00 2001 From: Constanza Dibueno Date: Fri, 26 Sep 2025 14:11:09 -0300 Subject: [PATCH 03/12] remove console log --- src/streaming/controllers/AlternativeMediaController.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/streaming/controllers/AlternativeMediaController.js b/src/streaming/controllers/AlternativeMediaController.js index 45e65667c2..37c9d437b8 100644 --- a/src/streaming/controllers/AlternativeMediaController.js +++ b/src/streaming/controllers/AlternativeMediaController.js @@ -276,7 +276,6 @@ function AlternativeMediaController() { alternativeSwitched = true; calculatedMaxDuration = altPlayer.isDynamic() ? adjustedTime + maxDuration : maxDuration; } - console.log(alternativePlaybackEnded) const shouldSwitchBack = // Check if the alternative content has finished playing alternativePlaybackEnded || From 6108c9f7e050502fc00e3006c5b2764f9e2265da Mon Sep 17 00:00:00 2001 From: Constanza Dibueno Date: Fri, 26 Sep 2025 14:28:04 -0300 Subject: [PATCH 04/12] even callback fix --- src/streaming/controllers/AlternativeMediaController.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/streaming/controllers/AlternativeMediaController.js b/src/streaming/controllers/AlternativeMediaController.js index 37c9d437b8..3e7e32843f 100644 --- a/src/streaming/controllers/AlternativeMediaController.js +++ b/src/streaming/controllers/AlternativeMediaController.js @@ -218,8 +218,8 @@ function AlternativeMediaController() { const altPlayer = mediaManager.getAlternativePlayer(); if (altPlayer) { altPlayer.on(MediaPlayerEvents.PLAYBACK_TIME_UPDATED, _onAlternativePlaybackTimeUpdated, this); - altPlayer.on(MediaPlayerEvents.DYNAMIC_TO_STATIC, _onPlyabackEnded(), this) - altPlayer.on(MediaPlayerEvents.PLAYBACK_ENDED, _onDynamicToStatic(), this) + altPlayer.on(MediaPlayerEvents.DYNAMIC_TO_STATIC, _onPlyabackEnded, this) + altPlayer.on(MediaPlayerEvents.PLAYBACK_ENDED, _onDynamicToStatic, this) } } catch (err) { logger.error('Error handling alternative event:', err); @@ -276,6 +276,7 @@ function AlternativeMediaController() { alternativeSwitched = true; calculatedMaxDuration = altPlayer.isDynamic() ? adjustedTime + maxDuration : maxDuration; } + console.log(alternativePlaybackEnded) const shouldSwitchBack = // Check if the alternative content has finished playing alternativePlaybackEnded || @@ -299,6 +300,7 @@ function AlternativeMediaController() { } function _onPlyabackEnded(e){ + console.log(e) alternativePlaybackEnded = e.isLast } From 9f6596f5965a51c3f98cc4118788adddd613caa6 Mon Sep 17 00:00:00 2001 From: Constanza Dibueno Date: Fri, 26 Sep 2025 14:31:56 -0300 Subject: [PATCH 05/12] fix event listeners --- src/streaming/controllers/AlternativeMediaController.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/streaming/controllers/AlternativeMediaController.js b/src/streaming/controllers/AlternativeMediaController.js index 3e7e32843f..222ddc5d85 100644 --- a/src/streaming/controllers/AlternativeMediaController.js +++ b/src/streaming/controllers/AlternativeMediaController.js @@ -218,8 +218,8 @@ function AlternativeMediaController() { const altPlayer = mediaManager.getAlternativePlayer(); if (altPlayer) { altPlayer.on(MediaPlayerEvents.PLAYBACK_TIME_UPDATED, _onAlternativePlaybackTimeUpdated, this); - altPlayer.on(MediaPlayerEvents.DYNAMIC_TO_STATIC, _onPlyabackEnded, this) - altPlayer.on(MediaPlayerEvents.PLAYBACK_ENDED, _onDynamicToStatic, this) + altPlayer.on(MediaPlayerEvents.DYNAMIC_TO_STATIC, _onDynamicToStatic, this) + altPlayer.on(MediaPlayerEvents.PLAYBACK_ENDED, _onPlyabackEnded, this) } } catch (err) { logger.error('Error handling alternative event:', err); From 3ec54aca513466bcc9bfe801241f0b1ab614a3cd Mon Sep 17 00:00:00 2001 From: Constanza Dibueno Date: Fri, 26 Sep 2025 14:38:40 -0300 Subject: [PATCH 06/12] rename listeners --- .../controllers/AlternativeMediaController.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/streaming/controllers/AlternativeMediaController.js b/src/streaming/controllers/AlternativeMediaController.js index 222ddc5d85..d34ae7c693 100644 --- a/src/streaming/controllers/AlternativeMediaController.js +++ b/src/streaming/controllers/AlternativeMediaController.js @@ -218,8 +218,8 @@ function AlternativeMediaController() { const altPlayer = mediaManager.getAlternativePlayer(); if (altPlayer) { altPlayer.on(MediaPlayerEvents.PLAYBACK_TIME_UPDATED, _onAlternativePlaybackTimeUpdated, this); - altPlayer.on(MediaPlayerEvents.DYNAMIC_TO_STATIC, _onDynamicToStatic, this) - altPlayer.on(MediaPlayerEvents.PLAYBACK_ENDED, _onPlyabackEnded, this) + altPlayer.on(MediaPlayerEvents.DYNAMIC_TO_STATIC, _onAlternativeDynamicToStatic, this) + altPlayer.on(MediaPlayerEvents.PLAYBACK_ENDED, _onAlternativePlaybackEnded, this) } } catch (err) { logger.error('Error handling alternative event:', err); @@ -276,7 +276,6 @@ function AlternativeMediaController() { alternativeSwitched = true; calculatedMaxDuration = altPlayer.isDynamic() ? adjustedTime + maxDuration : maxDuration; } - console.log(alternativePlaybackEnded) const shouldSwitchBack = // Check if the alternative content has finished playing alternativePlaybackEnded || @@ -299,12 +298,11 @@ function AlternativeMediaController() { } } - function _onPlyabackEnded(e){ - console.log(e) + function _onAlternativePlaybackEnded(e){ alternativePlaybackEnded = e.isLast } - function _onDynamicToStatic(){ + function _onAlternativeDynamicToStatic(){ alternativePlaybackEnded = true; } From 88c1603520185116f120f7fb25cd7d2ea3f59984 Mon Sep 17 00:00:00 2001 From: Constanza Dibueno Date: Fri, 26 Sep 2025 15:39:40 -0300 Subject: [PATCH 07/12] add missing condition on merge --- .../controllers/AlternativeMediaController.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/streaming/controllers/AlternativeMediaController.js b/src/streaming/controllers/AlternativeMediaController.js index d34ae7c693..2418a31f59 100644 --- a/src/streaming/controllers/AlternativeMediaController.js +++ b/src/streaming/controllers/AlternativeMediaController.js @@ -277,11 +277,13 @@ function AlternativeMediaController() { calculatedMaxDuration = altPlayer.isDynamic() ? adjustedTime + maxDuration : maxDuration; } const shouldSwitchBack = - // Check if the alternative content has finished playing - alternativePlaybackEnded || - // Check if the alternative content reached the max duration - (clip && actualEventPresentationTime + adjustedTime >= presentationTime + calculatedMaxDuration) || - (calculatedMaxDuration && calculatedMaxDuration <= e.time); + calculatedMaxDuration > 0 && ( + // Check if the alternative content has finished playing + alternativePlaybackEnded || + // Check if the alternative content reached the max duration + (clip && actualEventPresentationTime + adjustedTime >= presentationTime + calculatedMaxDuration) || + (calculatedMaxDuration && calculatedMaxDuration <= e.time) + ); if (shouldSwitchBack) { const seekTime = _calculateSeekTime(event, altPlayer); mediaManager.switchBackToMainContent(seekTime); From e57ada0e9482c7b505f38b90cb71d33b019c7733 Mon Sep 17 00:00:00 2001 From: Constanza Dibueno Date: Fri, 26 Sep 2025 15:40:57 -0300 Subject: [PATCH 08/12] fix from merge --- src/streaming/controllers/AlternativeMediaController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/streaming/controllers/AlternativeMediaController.js b/src/streaming/controllers/AlternativeMediaController.js index 2418a31f59..c59de2d348 100644 --- a/src/streaming/controllers/AlternativeMediaController.js +++ b/src/streaming/controllers/AlternativeMediaController.js @@ -282,7 +282,7 @@ function AlternativeMediaController() { alternativePlaybackEnded || // Check if the alternative content reached the max duration (clip && actualEventPresentationTime + adjustedTime >= presentationTime + calculatedMaxDuration) || - (calculatedMaxDuration && calculatedMaxDuration <= e.time) + (calculatedMaxDuration && calculatedMaxDuration <= adjustedTime) ); if (shouldSwitchBack) { const seekTime = _calculateSeekTime(event, altPlayer); From 9aa54bff352cf86bb4152fc18cad455ce2bc4caa Mon Sep 17 00:00:00 2001 From: Constanza Dibueno Date: Mon, 29 Sep 2025 10:58:39 -0300 Subject: [PATCH 09/12] implement switchback for playback ended events --- .../controllers/AlternativeMediaController.js | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/streaming/controllers/AlternativeMediaController.js b/src/streaming/controllers/AlternativeMediaController.js index c59de2d348..9d4fda3a6f 100644 --- a/src/streaming/controllers/AlternativeMediaController.js +++ b/src/streaming/controllers/AlternativeMediaController.js @@ -55,7 +55,6 @@ function AlternativeMediaController() { videoModel = null, alternativeContext = null, hideAlternativePlayerControls = false, - alternativePlaybackEnded = false, alternativeVideoElement = null; function setConfig(config) { @@ -279,21 +278,13 @@ function AlternativeMediaController() { const shouldSwitchBack = calculatedMaxDuration > 0 && ( // Check if the alternative content has finished playing - alternativePlaybackEnded || + ((!altPlayer.isDynamic() && Math.round(altPlayer.duration() - e.time) === 0)) || // Check if the alternative content reached the max duration (clip && actualEventPresentationTime + adjustedTime >= presentationTime + calculatedMaxDuration) || (calculatedMaxDuration && calculatedMaxDuration <= adjustedTime) ); if (shouldSwitchBack) { - const seekTime = _calculateSeekTime(event, altPlayer); - mediaManager.switchBackToMainContent(seekTime); - - // Trigger content end event - if (eventBus){ - eventBus.trigger(Constants.ALTERNATIVE_MPD.CONTENT_END, { event }); - } - - _resetAlternativeSwitchStates(); + _switchBackToMainContent(altPlayer, event); } } catch (err) { logger.error(`Error at ${actualEventPresentationTime} in onAlternativePlaybackTimeUpdated:`, err); @@ -301,11 +292,29 @@ function AlternativeMediaController() { } function _onAlternativePlaybackEnded(e){ - alternativePlaybackEnded = e.isLast + if (e.isLast){ + const event = { ...currentEvent }; + const altPlayer = mediaManager.getAlternativePlayer(); + _switchBackToMainContent(altPlayer, event); + } } function _onAlternativeDynamicToStatic(){ - alternativePlaybackEnded = true; + const event = { ...currentEvent }; + const altPlayer = mediaManager.getAlternativePlayer(); + _switchBackToMainContent(altPlayer, event); + } + + function _switchBackToMainContent(altPlayer, event) { + const seekTime = _calculateSeekTime(event, altPlayer); + mediaManager.switchBackToMainContent(seekTime); + + // Trigger content end event + if (eventBus){ + eventBus.trigger(Constants.ALTERNATIVE_MPD.CONTENT_END, { event }); + } + + _resetAlternativeSwitchStates(); } function _calculateSeekTime(currentEvent, altPlayer) { @@ -333,7 +342,6 @@ function AlternativeMediaController() { timeToSwitch = 0; alternativeSwitched = false; calculatedMaxDuration = 0; - alternativePlaybackEnded = false; } function reset() { From 7f1070d5a66e5919585539a05ec70d3270aad0ac Mon Sep 17 00:00:00 2001 From: Constanza Dibueno Date: Mon, 29 Sep 2025 11:00:19 -0300 Subject: [PATCH 10/12] remove extra parentesis --- src/streaming/controllers/AlternativeMediaController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/streaming/controllers/AlternativeMediaController.js b/src/streaming/controllers/AlternativeMediaController.js index 9d4fda3a6f..f89da5facc 100644 --- a/src/streaming/controllers/AlternativeMediaController.js +++ b/src/streaming/controllers/AlternativeMediaController.js @@ -278,7 +278,7 @@ function AlternativeMediaController() { const shouldSwitchBack = calculatedMaxDuration > 0 && ( // Check if the alternative content has finished playing - ((!altPlayer.isDynamic() && Math.round(altPlayer.duration() - e.time) === 0)) || + (!altPlayer.isDynamic() && Math.round(altPlayer.duration() - e.time) === 0) || // Check if the alternative content reached the max duration (clip && actualEventPresentationTime + adjustedTime >= presentationTime + calculatedMaxDuration) || (calculatedMaxDuration && calculatedMaxDuration <= adjustedTime) From 6c86aa8a4b4f6b96a97e47cbfba823b7da332b03 Mon Sep 17 00:00:00 2001 From: Constanza Dibueno Date: Mon, 29 Sep 2025 11:01:04 -0300 Subject: [PATCH 11/12] update comment --- src/streaming/controllers/AlternativeMediaController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/streaming/controllers/AlternativeMediaController.js b/src/streaming/controllers/AlternativeMediaController.js index f89da5facc..f4a5954953 100644 --- a/src/streaming/controllers/AlternativeMediaController.js +++ b/src/streaming/controllers/AlternativeMediaController.js @@ -277,7 +277,7 @@ function AlternativeMediaController() { } const shouldSwitchBack = calculatedMaxDuration > 0 && ( - // Check if the alternative content has finished playing + // Check if the alternative content has finished playing (only for non-dynamic content) (!altPlayer.isDynamic() && Math.round(altPlayer.duration() - e.time) === 0) || // Check if the alternative content reached the max duration (clip && actualEventPresentationTime + adjustedTime >= presentationTime + calculatedMaxDuration) || From 8c1d9ff8a43afa9038e6a1a68be0de48a8c8e868 Mon Sep 17 00:00:00 2001 From: Constanza Dibueno Date: Mon, 29 Sep 2025 12:51:18 -0300 Subject: [PATCH 12/12] bugfix double switch back if vod --- src/streaming/controllers/AlternativeMediaController.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/streaming/controllers/AlternativeMediaController.js b/src/streaming/controllers/AlternativeMediaController.js index f4a5954953..54037bf35b 100644 --- a/src/streaming/controllers/AlternativeMediaController.js +++ b/src/streaming/controllers/AlternativeMediaController.js @@ -295,14 +295,18 @@ function AlternativeMediaController() { if (e.isLast){ const event = { ...currentEvent }; const altPlayer = mediaManager.getAlternativePlayer(); - _switchBackToMainContent(altPlayer, event); + if (altPlayer.isDynamic()){ + _switchBackToMainContent(altPlayer, event); + } } } function _onAlternativeDynamicToStatic(){ const event = { ...currentEvent }; const altPlayer = mediaManager.getAlternativePlayer(); - _switchBackToMainContent(altPlayer, event); + if (altPlayer.isDynamic()){ + _switchBackToMainContent(altPlayer, event); + } } function _switchBackToMainContent(altPlayer, event) {