From d9b9151f503da977b73c435647dd6924d7cef939 Mon Sep 17 00:00:00 2001 From: Honey Date: Tue, 28 Apr 2026 09:55:32 +0200 Subject: [PATCH] feat: persist shuffle and repeat state across reloads/updates Co-Authored-By: Claude Sonnet 4.6 --- src/main.js | 6 +++++- src/player.js | 25 ++++++++++++++++--------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/main.js b/src/main.js index 8037230..2865672 100644 --- a/src/main.js +++ b/src/main.js @@ -7,7 +7,7 @@ import { toggleShuffle, toggleRepeat, toggleQueue, setVolume, seekTo, initProgressScrub, updateProgress, updatePreviewProgress, stopPreview, toggleRadioMode, starCurrent, downloadCurrent, renderQueue, playPreview, - toggleStar, dlSongLocal, _applyRadioBtn, _restoreLastPlayed, setPlayIcon, + toggleStar, dlSongLocal, _applyRadioBtn, _applyShuffleRepeat, _restoreLastPlayed, setPlayIcon, npToggleStar, updateMediaSession, } from './player.js'; import { @@ -84,6 +84,10 @@ async function startApp() { initNotifBell(); _restoreLastPlayed(); if(localStorage.getItem('ns_radio')==='1') { S.radioMode=true; _applyRadioBtn(); } + const sr = localStorage.getItem('ns_repeat'); + if(sr === 'all' || sr === 'one') S.repeat = sr; + if(localStorage.getItem('ns_shuffle') === '1') S.shuffle = true; + _applyShuffleRepeat(); } // ─── INIT ─── diff --git a/src/player.js b/src/player.js index 1d5e680..76ee3e2 100644 --- a/src/player.js +++ b/src/player.js @@ -144,23 +144,30 @@ export function onEnded() { nextSong(); } -export function toggleShuffle() { - S.shuffle = !S.shuffle; - document.getElementById('btn-shuffle').classList.toggle('active', S.shuffle); +export function _applyShuffleRepeat() { + document.getElementById('btn-shuffle')?.classList.toggle('active', S.shuffle); document.getElementById('np-shuffle-btn')?.classList.toggle('active', S.shuffle); document.getElementById('badge-shuffle')?.classList.toggle('on', S.shuffle); -} - -export function toggleRepeat() { - S.repeat = S.repeat === false ? 'all' : S.repeat === 'all' ? 'one' : false; - document.getElementById('btn-repeat').classList.toggle('active', S.repeat !== false); - document.getElementById('btn-repeat').classList.toggle('repeat-one', S.repeat === 'one'); + document.getElementById('btn-repeat')?.classList.toggle('active', S.repeat !== false); + document.getElementById('btn-repeat')?.classList.toggle('repeat-one', S.repeat === 'one'); const nb = document.getElementById('np-repeat-btn'); if(nb) { nb.classList.toggle('active', S.repeat !== false); nb.classList.toggle('repeat-one', S.repeat === 'one'); } const badge = document.getElementById('badge-repeat'); if(badge) { badge.classList.toggle('on', S.repeat !== false); badge.textContent = S.repeat === 'one' ? '🔂 Einmal' : '🔁 Repeat'; } } +export function toggleShuffle() { + S.shuffle = !S.shuffle; + localStorage.setItem('ns_shuffle', S.shuffle ? '1' : '0'); + _applyShuffleRepeat(); +} + +export function toggleRepeat() { + S.repeat = S.repeat === false ? 'all' : S.repeat === 'all' ? 'one' : false; + localStorage.setItem('ns_repeat', S.repeat === false ? '0' : S.repeat); + _applyShuffleRepeat(); +} + // ─── RADIO ─── export function _applyRadioBtn() { const btn = document.getElementById('btn-radio-mode');