source: Klonkt/test/apple-music-embed.test.js@ e854ace

main
Last change on this file since e854ace was e854ace, checked in by Bart <bart@…>, 3 weeks ago

Een Apple Music-afspeellijst is geen album: het id is geen getal

Barts melding (17-8): het concept "The Mixtape" op boiert.eu toonde in preview
letterlijk [[embed:https://music.apple.com/nl/playlist/romance/pl.u-...]].

Twee fouten achter elkaar. detectProvider herkent Apple Music aan /playlist/ en
kijkt niet verder, maar applemusicIframe eiste [0-9]+ als id. Dat klopt voor een
album of een nummer; een afspeellijst heet pl.u-LdbqzVvI3go5g. Dus null, en
embedMediaShortcodes viel terug op de shortcode zelf.

Die terugval is de tweede fout, en hij maakte de eerste onbegrijpelijk. Een
lezer ziet geen "dit kan ik niet", hij ziet rommel op de pagina. Onherkend gaf
al netjes een melding; herkend-maar-niet-te-bouwen geeft nu dezelfde, want voor
de lezer is het hetzelfde geval.

De vangst blijft krap -- geen slash, vraagteken of hekje -- want hij gaat
rechtstreeks achter embed.music.apple.com/ aan. Een test loopt drie
ontsnappingspogingen langs.

Co-Authored-By: Claude Opus 5 <claude@…>

  • Property mode set to 100644
File size: 2.7 KB
Line 
1// Een Apple Music-AFSPEELLIJST kreeg geen embed maar de kale shortcode.
2//
3// Barts melding (17-8): het concept "The Mixtape" toonde in preview letterlijk
4// [[embed:https://music.apple.com/nl/playlist/romance/pl.u-LdbqzVvI3go5g]].
5//
6// De keten: detectProvider herkende hem wel (die kijkt niet verder dan
7// /playlist/), applemusicIframe eiste een NUMMER als id -- goed voor een album
8// of nummer, maar een afspeellijst heet pl.u-LdbqzVvI3go5g -- en gaf null,
9// waarna embedMediaShortcodes terugviel op de shortcode zelf. Twee fouten dus,
10// en de tweede maakte de eerste onbegrijpelijk: een lezer ziet geen "dit kan
11// ik niet", hij ziet rommel.
12import { test } from 'node:test';
13import assert from 'node:assert/strict';
14
15const { default: AudioEmbedService } = await import('../src/services/AudioEmbedService.js');
16
17const PLAYLIST = 'https://music.apple.com/nl/playlist/romance/pl.u-LdbqzVvI3go5g';
18const ALBUM = 'https://music.apple.com/nl/album/abbey-road/1441164426';
19
20test('een afspeellijst wordt een echte iframe, geen shortcode', () => {
21 const out = AudioEmbedService.embedMediaShortcodes(`[[embed:${PLAYLIST}]]`);
22 assert.ok(!out.includes('[[embed:'), 'de shortcode staat er niet meer');
23 assert.match(out, /embed\.music\.apple\.com\/nl\/playlist\/romance\/pl\.u-LdbqzVvI3go5g/);
24 assert.match(out, /<iframe/);
25});
26
27test('een album met een numeriek id blijft werken', () => {
28 // De reparatie mag de vorm die het WEL deed niet kwijtraken.
29 const out = AudioEmbedService.embedMediaShortcodes(`[[embed:${ALBUM}]]`);
30 assert.match(out, /embed\.music\.apple\.com\/nl\/album\/abbey-road\/1441164426/);
31 assert.ok(!out.includes('[[embed:'));
32});
33
34test('wat we niet kunnen bouwen zegt dat, in plaats van de shortcode te tonen', () => {
35 // Herkend als Apple Music (de detectie kijkt tot /playlist/), maar het id is
36 // onbruikbaar. Vroeger: de kale shortcode op de pagina.
37 const raar = 'https://music.apple.com/nl/playlist/romance/@@@';
38 const out = AudioEmbedService.embedMediaShortcodes(`[[embed:${raar}]]`);
39 assert.ok(!out.includes('[[embed:'), 'nooit de shortcode aan de lezer');
40 assert.match(out, /post-embed-missing/);
41});
42
43test('het pad kan niet uit de embed-host breken', () => {
44 // Wat gevangen wordt gaat rechtstreeks achter embed.music.apple.com/ aan,
45 // dus geen slash, vraagteken of hekje in het id.
46 for (const kwaad of [
47 'https://music.apple.com/nl/playlist/x/pl.a/../../evil',
48 'https://music.apple.com/nl/playlist/x/pl.a?next=https://evil.example',
49 'https://music.apple.com/nl/playlist/x/pl.a#https://evil.example',
50 ]) {
51 const out = AudioEmbedService.embedMediaShortcodes(`[[embed:${kwaad}]]`);
52 assert.ok(!/evil\.example/.test(out), `geen vreemde host uit ${kwaad}`);
53 }
54});
Note: See TracBrowser for help on using the repository browser.