From b52cb34319495ca117788530a6f70654cfdcebda Mon Sep 17 00:00:00 2001 From: Vasily Date: Wed, 8 Apr 2020 00:46:56 +0300 Subject: [PATCH] Merge pull request #1040 from JustAMan/fix-native-hls-resume Fix native hls resume (cherry picked from commit 2223a168138c207ba69c31643259a47731c3a505) Signed-off-by: Joshua M. Boniface --- src/components/htmlMediaHelper.js | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index 338b8e6fef..1968ecb7d8 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -171,13 +171,29 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve // Appending #t=xxx to the query string doesn't seem to work with HLS // For plain video files, not all browsers support it either - var delay = browser.safari ? 2500 : 0; - if (delay) { - setTimeout(function () { - setCurrentTimeIfNeeded(element, seconds); - }, delay); - } else { + + if (element.duration >= seconds) { + // media is ready, seek immediately setCurrentTimeIfNeeded(element, seconds); + } else { + // update video player position when media is ready to be sought + var events = ["durationchange", "loadeddata", "play", "loadedmetadata"]; + var onMediaChange = function(e) { + if (element.currentTime === 0 && element.duration >= seconds) { + // seek only when video position is exactly zero, + // as this is true only if video hasn't started yet or + // user rewound to the very beginning + // (but rewinding cannot happen as the first event with media of non-empty duration) + console.debug(`seeking to ${seconds} on ${e.type} event`); + setCurrentTimeIfNeeded(element, seconds); + events.map(function(name) { + element.removeEventListener(name, onMediaChange); + }); + } + }; + events.map(function (name) { + element.addEventListener(name, onMediaChange); + }); } } }