Index: src/assets/js/audio-player.js
===================================================================
--- src/assets/js/audio-player.js	(revision 71e8fa5b851e4df92019c751d54deee993d86ca2)
+++ src/assets/js/audio-player.js	(revision e056e563ec0af5d9a555414ec779ca3dc159043d)
@@ -968,6 +968,20 @@
   }
 
+  // Speel een YouTube-AFSPEELLIJST af door 'm te expanderen naar onze eigen queue
+  // van losse YouTube-tracks (elk via loadVideoById = bewezen betrouwbaar; next/
+  // prev/ended lopen via onze queue). items = [{yt,title,cover,postUrl}, …].
+  function playYouTubeList(items, startIndex) {
+    if (!Array.isArray(items) || !items.length) return;
+    setQueue(items.map((it) => ({
+      yt: it.yt,
+      title: it.title || 'YouTube',
+      artist: it.artist || '',
+      cover: it.cover || '',
+      postUrl: it.postUrl || '',
+    })), startIndex || 0);
+  }
+
   window.pcmsAudioPlayer = {
-    setQueue, play, pause, next, prev, close, openSheet, closeSheet, playYouTube,
+    setQueue, play, pause, next, prev, close, openSheet, closeSheet, playYouTube, playYouTubeList,
     isPlaying: () => isPlaying,
     currentTrack: () => queue[currentIndex] || null,
Index: src/assets/js/embed-player.js
===================================================================
--- src/assets/js/embed-player.js	(revision 71e8fa5b851e4df92019c751d54deee993d86ca2)
+++ src/assets/js/embed-player.js	(revision e056e563ec0af5d9a555414ec779ca3dc159043d)
@@ -464,7 +464,13 @@
 
     function playAt(i) {
-      if (!(window.pcmsAudioPlayer && window.pcmsAudioPlayer.playYouTube)) return;
-      const tt = (olEl.querySelector(`[data-yt-index="${i}"] .pat-title`) || {}).textContent || '';
-      window.pcmsAudioPlayer.playYouTube({ list: listId, index: i, title: tt, cover: thumb(ids[i]), postUrl: location.pathname + location.search });
+      if (!(window.pcmsAudioPlayer && window.pcmsAudioPlayer.playYouTubeList)) return;
+      // Expandeer naar losse YT-tracks (betrouwbaarder dan loadPlaylist).
+      const items = ids.map((id, j) => ({
+        yt: id,
+        title: (olEl.querySelector(`[data-yt-index="${j}"] .pat-title`) || {}).textContent || ('Track ' + (j + 1)),
+        cover: thumb(id),
+        postUrl: location.pathname + location.search,
+      }));
+      window.pcmsAudioPlayer.playYouTubeList(items, i);
     }
     coverBtn.addEventListener('click', () => playAt(0));
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision 71e8fa5b851e4df92019c751d54deee993d86ca2)
+++ src/views/shell.ejs	(revision e056e563ec0af5d9a555414ec779ca3dc159043d)
@@ -300,8 +300,8 @@
      ?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=24"></script>
+<script src="/assets/js/audio-player.js?v=25"></script>
 <!-- Eigen custom media-embeds (YouTube/SoundCloud/Spotify) via de echte
      player-API's + gedeelde mutual-exclusion registry met de site-speler. -->
-<script src="/assets/js/embed-player.js?v=13" defer></script>
+<script src="/assets/js/embed-player.js?v=14" defer></script>
 <% if (site && site.enable_audio_player && audioTracks && audioTracks.length > 0) { %>
   <script>window.PCMS_SITE_TRACKS = <%- JSON.stringify(audioTracks) %>;</script>
