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 <noreply@anthropic.com>
This commit is contained in:
1 parent
87636ea774
commit
042ce0b095
2 files changed
+13
-1
No files matched your search
@@ -987,6 +987,17 @@ function updateMediaSession(s){
|
|||||||
navigator.mediaSession.setActionHandler('pause',togglePlay);
|
navigator.mediaSession.setActionHandler('pause',togglePlay);
|
||||||
navigator.mediaSession.setActionHandler('previoustrack',prevSong);
|
navigator.mediaSession.setActionHandler('previoustrack',prevSong);
|
||||||
navigator.mediaSession.setActionHandler('nexttrack',nextSong);
|
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 togglePlay(){if(audio.src)audio.paused?audio.play():audio.pause()}
|
||||||
function setPlayIcon(playing){
|
function setPlayIcon(playing){
|
||||||
@@ -1031,6 +1042,7 @@ function expandArtistBio(){
|
|||||||
}
|
}
|
||||||
function updateProgress(){
|
function updateProgress(){
|
||||||
if(!audio.duration)return;
|
if(!audio.duration)return;
|
||||||
|
syncMediaSessionPosition();
|
||||||
const p=(audio.currentTime/audio.duration)*100;
|
const p=(audio.currentTime/audio.duration)*100;
|
||||||
document.getElementById('progress-fill').style.width=p+'%';
|
document.getElementById('progress-fill').style.width=p+'%';
|
||||||
document.getElementById('time-cur').textContent=formatDur(audio.currentTime);
|
document.getElementById('time-cur').textContent=formatDur(audio.currentTime);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
const CACHE = 'ns-v15';
|
const CACHE = 'ns-v16';
|
||||||
const PRECACHE = ['/', 'index.html', 'styles.css', 'app.js', 'sw.js'];
|
const PRECACHE = ['/', 'index.html', 'styles.css', 'app.js', 'sw.js'];
|
||||||
const SKIP_URLS = ['/rest/stream', '/rest/download', '/config.js'];
|
const SKIP_URLS = ['/rest/stream', '/rest/download', '/config.js'];
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user