From de4a0cf58393c11fd5bb5d9021e0495333623796 Mon Sep 17 00:00:00 2001 From: emeric Date: Thu, 8 Feb 2024 20:56:42 +0100 Subject: [PATCH] Media Session API: added seekto + state update (duration/position) --- docroot/js/mediaplayer.js | 76 ++++++++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/docroot/js/mediaplayer.js b/docroot/js/mediaplayer.js index b5dfdeb1..f6f61110 100644 --- a/docroot/js/mediaplayer.js +++ b/docroot/js/mediaplayer.js @@ -66,6 +66,9 @@ LMS.mediaplayer = function () { navigator.mediaSession.setActionHandler("nexttrack", function() { _playNext(); }); + navigator.mediaSession.setActionHandler("seekto", function(e) { + _seekTo(e.seekTime); + }); } if (_pendingTrackParameters != null) { @@ -81,16 +84,10 @@ LMS.mediaplayer = function () { if (_elems.audio.paused) { _elems.playpause.firstElementChild.classList.remove(pauseClass); _elems.playpause.firstElementChild.classList.add(playClass); - if ("mediaSession" in navigator) { - navigator.mediaSession.playbackState = "paused"; - } } else { _elems.playpause.firstElementChild.classList.remove(playClass); _elems.playpause.firstElementChild.classList.add(pauseClass); - if ("mediaSession" in navigator) { - navigator.mediaSession.playbackState = "playing"; - } } } @@ -202,6 +199,46 @@ LMS.mediaplayer = function () { _gainNode.gain.value = Math.pow(10, (_settings.replayGain.preAmpGain + replayGain) / 20); } + let _seekTo = function(seekTime) { + _initAudioCtx(); + let mode = _getAudioMode(); + if (!mode) + return; + + switch (mode) { + case Mode.Transcoding: + _offset = seekTime; + _removeAudioSources(); + _addAudioSource(_audioTranscodingSrc + "&offset=" + _offset); + _elems.audio.load(); + _elems.audio.currentTime = 0; + _playTrack(); + break; + + case Mode.File: + _elems.audio.currentTime = seekTime; + _playTrack(); + break; + } + + _updateMediaSessionState(); + } + + let _updateMediaSessionState = function() { + if ("mediaSession" in navigator) { + navigator.mediaSession.setPositionState({ + duration: _duration, + playbackRate: 1, + position: _offset + _elems.audio.currentTime, + }); + + if (_elems.audio.paused) + navigator.mediaSession.playbackState = "paused"; + else + navigator.mediaSession.playbackState = "playing"; + } + } + let init = function(root, defaultSettings) { _root = root; @@ -228,34 +265,17 @@ LMS.mediaplayer = function () { _playNext(); }); _elems.seek.addEventListener("change", function() { - _initAudioCtx(); - let mode = _getAudioMode(); - if (!mode) - return; - - let selectedOffset = parseInt(_elems.seek.value, 10); - - switch (mode) { - case Mode.Transcoding: - _offset = selectedOffset; - _removeAudioSources(); - _addAudioSource(_audioTranscodingSrc + "&offset=" + _offset); - _elems.audio.load(); - _elems.audio.currentTime = 0; - _playTrack(); - break; - - case Mode.File: - _elems.audio.currentTime = selectedOffset; - _playTrack(); - break; - } + _seekTo(parseInt(_elems.seek.value, 10)); }); _elems.audio.addEventListener("play", _updateControls); _elems.audio.addEventListener("playing", _updateControls); _elems.audio.addEventListener("pause", _updateControls); + _elems.audio.addEventListener("play", _updateMediaSessionState); + _elems.audio.addEventListener("playing", _updateMediaSessionState); + _elems.audio.addEventListener("pause", _updateMediaSessionState); + _elems.audio.addEventListener("pause", _stopTimer); _elems.audio.addEventListener("playing", _startTimer); _elems.audio.addEventListener("waiting", _stopTimer);