Index: src/services/AudioEmbedService.js
===================================================================
--- src/services/AudioEmbedService.js	(revision 995b1006d95895db0cadf87fe794b03472df628d)
+++ src/services/AudioEmbedService.js	(revision e854ace08bfc7ff98105b47dc1dbb83a3cec6587)
@@ -239,5 +239,15 @@
 
   static applemusicIframe({ url }) {
-    const match = url.match(/music\.apple\.com\/([a-z]{2}\/(?:album|playlist|song)\/[^/?#]+\/[0-9]+)/i);
+    // Een album of nummer heeft een NUMMER als id, een afspeellijst niet: die
+    // heet `pl.u-LdbqzVvI3go5g`. Met alleen [0-9]+ viel elke playlist hier af
+    // en gaf deze functie null -- waarna de shortcode zelf op de pagina kwam.
+    // Barts melding (17-8): het concept "The Mixtape" toonde in preview
+    // letterlijk [[embed:https://music.apple.com/nl/playlist/...]].
+    //
+    // Bewust krap: geen slash, vraagteken of hekje in het id, want wat hier
+    // gevangen wordt gaat rechtstreeks achter https://embed.music.apple.com/ aan.
+    const match = url.match(
+      /music\.apple\.com\/([a-z]{2}\/(?:album|playlist|song)\/[^/?#]+\/(?:[0-9]+|pl\.[A-Za-z0-9_-]+))/i,
+    );
     if (!match) return null;
     const src = `https://embed.music.apple.com/${match[1]}`;
@@ -341,5 +351,11 @@
         return `<div class="post-embed-missing"><em>Embed: niet-ondersteunde of ongeldige URL.</em></div>`;
       }
-      return this.generateIframe(detected.provider, detected) || match;
+      // HERKEND maar niet te bouwen is geen reden om de shortcode zelf te
+      // tonen. Dat deed het wel, en dan leest een bezoeker "[[embed:https://...]]"
+      // op de pagina en denkt hij dat er iets stuk is. Onherkend gaf hierboven
+      // al een nette melding; herkend-maar-mislukt hoort dezelfde te geven,
+      // want voor de lezer is het hetzelfde geval.
+      return this.generateIframe(detected.provider, detected)
+        || `<div class="post-embed-missing"><em>Embed: niet-ondersteunde of ongeldige URL.</em></div>`;
     });
   }
Index: test/apple-music-embed.test.js
===================================================================
--- test/apple-music-embed.test.js	(revision e854ace08bfc7ff98105b47dc1dbb83a3cec6587)
+++ test/apple-music-embed.test.js	(revision e854ace08bfc7ff98105b47dc1dbb83a3cec6587)
@@ -0,0 +1,54 @@
+// Een Apple Music-AFSPEELLIJST kreeg geen embed maar de kale shortcode.
+//
+// Barts melding (17-8): het concept "The Mixtape" toonde in preview letterlijk
+// [[embed:https://music.apple.com/nl/playlist/romance/pl.u-LdbqzVvI3go5g]].
+//
+// De keten: detectProvider herkende hem wel (die kijkt niet verder dan
+// /playlist/), applemusicIframe eiste een NUMMER als id -- goed voor een album
+// of nummer, maar een afspeellijst heet pl.u-LdbqzVvI3go5g -- en gaf null,
+// waarna embedMediaShortcodes terugviel op de shortcode zelf. Twee fouten dus,
+// en de tweede maakte de eerste onbegrijpelijk: een lezer ziet geen "dit kan
+// ik niet", hij ziet rommel.
+import { test } from 'node:test';
+import assert from 'node:assert/strict';
+
+const { default: AudioEmbedService } = await import('../src/services/AudioEmbedService.js');
+
+const PLAYLIST = 'https://music.apple.com/nl/playlist/romance/pl.u-LdbqzVvI3go5g';
+const ALBUM = 'https://music.apple.com/nl/album/abbey-road/1441164426';
+
+test('een afspeellijst wordt een echte iframe, geen shortcode', () => {
+  const out = AudioEmbedService.embedMediaShortcodes(`[[embed:${PLAYLIST}]]`);
+  assert.ok(!out.includes('[[embed:'), 'de shortcode staat er niet meer');
+  assert.match(out, /embed\.music\.apple\.com\/nl\/playlist\/romance\/pl\.u-LdbqzVvI3go5g/);
+  assert.match(out, /<iframe/);
+});
+
+test('een album met een numeriek id blijft werken', () => {
+  // De reparatie mag de vorm die het WEL deed niet kwijtraken.
+  const out = AudioEmbedService.embedMediaShortcodes(`[[embed:${ALBUM}]]`);
+  assert.match(out, /embed\.music\.apple\.com\/nl\/album\/abbey-road\/1441164426/);
+  assert.ok(!out.includes('[[embed:'));
+});
+
+test('wat we niet kunnen bouwen zegt dat, in plaats van de shortcode te tonen', () => {
+  // Herkend als Apple Music (de detectie kijkt tot /playlist/), maar het id is
+  // onbruikbaar. Vroeger: de kale shortcode op de pagina.
+  const raar = 'https://music.apple.com/nl/playlist/romance/@@@';
+  const out = AudioEmbedService.embedMediaShortcodes(`[[embed:${raar}]]`);
+  assert.ok(!out.includes('[[embed:'), 'nooit de shortcode aan de lezer');
+  assert.match(out, /post-embed-missing/);
+});
+
+test('het pad kan niet uit de embed-host breken', () => {
+  // Wat gevangen wordt gaat rechtstreeks achter embed.music.apple.com/ aan,
+  // dus geen slash, vraagteken of hekje in het id.
+  for (const kwaad of [
+    'https://music.apple.com/nl/playlist/x/pl.a/../../evil',
+    'https://music.apple.com/nl/playlist/x/pl.a?next=https://evil.example',
+    'https://music.apple.com/nl/playlist/x/pl.a#https://evil.example',
+  ]) {
+    const out = AudioEmbedService.embedMediaShortcodes(`[[embed:${kwaad}]]`);
+    assert.ok(!/evil\.example/.test(out), `geen vreemde host uit ${kwaad}`);
+  }
+});
