From 042ce0b0954c793a0d99d9a2b06e570f0c9ecfa4 Mon Sep 17 00:00:00 2001 From: Honey Date: Sat, 25 Apr 2026 17:16:29 +0200 Subject: [PATCH] Fix Android media notification: add setPositionState + seek handlers - setPositionState synced every second via updateProgress so the notification shows progress bar and timestamps - seekto handler enables dragging the notification progress bar - seekbackward/seekforward handlers enable 10s skip buttons Co-Authored-By: Claude Sonnet 4.6 --- app.js | 12 ++++++++++++ sw.js | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index 858ade4..a3233ad 100644 --- a/app.js +++ b/app.js @@ -987,6 +987,17 @@ function updateMediaSession(s){ navigator.mediaSession.setActionHandler('pause',togglePlay); navigator.mediaSession.setActionHandler('previoustrack',prevSong); navigator.mediaSession.setActionHandler('nexttrack',nextSong); + navigator.mediaSession.setActionHandler('seekbackward',d=>{audio.currentTime=Math.max(0,audio.currentTime-(d.seekOffset||10))}); + navigator.mediaSession.setActionHandler('seekforward',d=>{audio.currentTime=Math.min(audio.duration||0,audio.currentTime+(d.seekOffset||10))}); + navigator.mediaSession.setActionHandler('seekto',d=>{if(d.seekTime!=null)audio.currentTime=d.seekTime}); +} +let _msPosLast=0; +function syncMediaSessionPosition(){ + if(!navigator.mediaSession?.setPositionState||!audio.duration||isNaN(audio.duration))return; + const now=Date.now(); + if(now-_msPosLast<1000)return; + _msPosLast=now; + try{navigator.mediaSession.setPositionState({duration:audio.duration,playbackRate:audio.playbackRate||1,position:Math.min(audio.currentTime,audio.duration)});}catch{} } function togglePlay(){if(audio.src)audio.paused?audio.play():audio.pause()} function setPlayIcon(playing){ @@ -1031,6 +1042,7 @@ function expandArtistBio(){ } function updateProgress(){ if(!audio.duration)return; + syncMediaSessionPosition(); const p=(audio.currentTime/audio.duration)*100; document.getElementById('progress-fill').style.width=p+'%'; document.getElementById('time-cur').textContent=formatDur(audio.currentTime); diff --git a/sw.js b/sw.js index 0e243ab..ef6d9be 100644 --- a/sw.js +++ b/sw.js @@ -1,4 +1,4 @@ -const CACHE = 'ns-v15'; +const CACHE = 'ns-v16'; const PRECACHE = ['/', 'index.html', 'styles.css', 'app.js', 'sw.js']; const SKIP_URLS = ['/rest/stream', '/rest/download', '/config.js'];