Index: src/views/pages/admin-audio.ejs
===================================================================
--- src/views/pages/admin-audio.ejs	(revision 8681239c58e5a6f4b403f6d90aa3c3ef9c99c5da)
+++ src/views/pages/admin-audio.ejs	(revision 21522aeeeadc321d1358c416b7223a6300a03996)
@@ -583,8 +583,12 @@
     function resyncAll() {
       const audio = document.getElementById('audio-element');
+      const player = window.pcmsAudioPlayer;
       const playing = audio && !audio.paused && !audio.ended;
-      const currentSrc = audio ? audio.src : '';
+      // audio.src is now a blob: URL (Spotify-style playback), so compare
+      // against the player's logical track URL, not the element src.
+      const cur = player && player.currentTrack();
+      const curUrl = cur ? cur.url : '';
       buttons.forEach(b => {
-        const isThisOne = playing && currentSrc.endsWith(b.dataset.streamUrl);
+        const isThisOne = playing && curUrl === b.dataset.streamUrl;
         setIcon(b, isThisOne);
       });
@@ -617,10 +621,10 @@
         };
 
-        // If this exact track is already playing, toggle pause/play instead
-        // of restarting from zero.
-        const audio = document.getElementById('audio-element');
-        if (audio && audio.src.endsWith(url)) {
-          if (audio.paused) player.play();
-          else              player.pause();
+        // If this exact track is already current, toggle pause/play instead
+        // of restarting from zero. Compare logical URLs (audio.src is a blob:).
+        const cur = player.currentTrack();
+        if (cur && cur.url === url) {
+          if (player.isPlaying()) player.pause();
+          else                    player.play();
           return;
         }
Index: src/views/partials/track-editor.ejs
===================================================================
--- src/views/partials/track-editor.ejs	(revision 8681239c58e5a6f4b403f6d90aa3c3ef9c99c5da)
+++ src/views/partials/track-editor.ejs	(revision 21522aeeeadc321d1358c416b7223a6300a03996)
@@ -445,6 +445,9 @@
       };
       const isOurTrack = () => {
-        const audio = document.getElementById('audio-element');
-        return audio && track.stream_url && audio.src.endsWith(track.stream_url);
+        // audio.src is a blob: URL (Spotify-style playback) — compare against
+        // the player's logical current-track URL instead.
+        const player = window.pcmsAudioPlayer;
+        const cur = player && player.currentTrack();
+        return !!(cur && track.stream_url && cur.url === track.stream_url);
       };
       const resync = () => {
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision 8681239c58e5a6f4b403f6d90aa3c3ef9c99c5da)
+++ src/views/shell.ejs	(revision 21522aeeeadc321d1358c416b7223a6300a03996)
@@ -277,5 +277,5 @@
      ?v=N — cache-buster: bump bij elke audio-player.js wijziging zodat
      Cloudflare (max-age=1y) niet de oude versie blijft serveren. -->
-<script src="/assets/js/audio-player.js?v=3"></script>
+<script src="/assets/js/audio-player.js?v=5"></script>
 <% if (site && site.enable_audio_player && audioTracks && audioTracks.length > 0) { %>
   <script>window.PCMS_SITE_TRACKS = <%- JSON.stringify(audioTracks) %>;</script>
