Changeset c832064 in Klonkt for src/services
- Timestamp:
- 08/09/2026 07:37:31 AM (4 weeks ago)
- Branches:
- main
- Children:
- d7e72b8
- Parents:
- e667d26
- File:
-
- 1 edited
-
src/services/music/index.js (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/services/music/index.js
re667d26 rc832064 336 336 337 337 /** 338 * Het type van een post afleiden uit de muziek die erin staat. 338 * Het type van een BESTAANDE post afleiden uit de muziek die erin staat. 339 * 340 * WAARVOOR DIT WEL EN NIET IS (Robins afbakening, 9-8). Nieuwe posts krijgen 341 * hun type uit de keuze: album of playlist wordt gekozen als de playlist wordt 342 * gemaakt, en de post neemt dat over. Deze functie is er voor wat er al staat -- 343 * de posts met type=audio uit de tijd voor die keuze bestond. Daarmee is de 344 * vraag "wie wint, de keuze of de afleiding?" geen vraag meer: ze komen elkaar 345 * niet tegen. De afleiding draait eenmalig, de keuze draait daarna. 339 346 * 340 347 * DE REGEL GAAT OVER IDENTITEIT, NIET OVER TELLEN (Robins herformulering, 9-8): … … 357 364 * letterlijk een album; hem als losse tracks tellen zou een albumpost tot 358 365 * playlist maken. Telt hij straks anders, dan is dat hier een regel. 359 */ 360 export function postMusicType(content) { 366 * 367 * WIE KIEST ALBUM OF PLAYLIST: dat gebeurt wanneer de PLAYLIST wordt gemaakt, 368 * en die keuze staat al in playlists.kind. Bij een enkele insluiting neemt de 369 * post dus die soort over -- een post om een album is een album, ook al heet de 370 * shortcode [[playlist:...]]. De soort van een playlist wordt hier dus 371 * OPGEZOCHT en niet afgeleid. 372 * 373 * EN ALS WE HET NIET WETEN: een gewone post met insluitingen die de post als 374 * context hebben. Dat is geen noodgreep maar de rustende toestand -- tracks 375 * wijzen met `context` toch al terug naar hun post, dus er gaat niets verloren 376 * als het label 'post' wordt. 377 * 378 * @param {string} content de HTML/tekst van de post 379 * @param {string} siteId nodig om playlists.kind te kunnen opzoeken 380 */ 381 export function postMusicType(content, siteId) { 361 382 const c = String(content || ''); 362 383 const uniek = (re) => [...new Set([...c.matchAll(re)].map((m) => m[1].trim()))]; 363 384 364 const playlists = uniek(/\[\[playlist:([A-Za-z0-9_-]+)\]\]/g); 385 // Dezelfde patronen als de renderer in AudioEmbedService: wat daar niet 386 // insluit, telt hier niet mee. Anders zou een shortcode die niets oplevert 387 // wel het type van de post kunnen bepalen. 388 const playlists = uniek(/\[\[playlist:([a-z0-9][a-z0-9-]*)\]\]/gi); 365 389 const albums = uniek(/\[\[album:([^\]]+)\]\]/g); 366 390 const tracks = uniek(/\[\[track:([A-Za-z0-9_-]+)\]\]/g); 367 391 392 if (!playlists.length && !albums.length && !tracks.length) return null; 393 394 // De soort van een playlist is een gegeven, geen afleiding. 395 let onbekend = []; 396 const uitPlaylists = playlists.map((id) => { 397 const kind = playlistKind(id, siteId); 398 if (!kind) { onbekend.push(id); return null; } 399 return { soort: kind, id }; 400 }).filter(Boolean); 401 368 402 const collecties = [ 369 ... playlists.map((id) => ({ soort: 'playlist', id })),403 ...uitPlaylists, 370 404 ...albums.map((naam) => ({ soort: 'album', naam })), 371 405 ]; 372 406 373 if (!collecties.length && !tracks.length) return null; // geen muziek 407 // Onbekende situatie -> gewone post. De insluitingen blijven staan en houden 408 // de post als context; alleen het label wordt niet verzonnen. 409 if (onbekend.length) { 410 return { type: 'post', collecties, tracks, bonus: [], onbekend, leentMetadata: false }; 411 } 374 412 375 413 if (!collecties.length) { … … 389 427 return { type: 'post', collecties, tracks, bonus: [], leentMetadata: false }; 390 428 } 429 430 /** 431 * De gekozen soort van een playlist: 'album' | 'playlist', of null als hij niet 432 * (op deze site) bestaat. Zelfde normalisatie als PlaylistService: alles wat 433 * geen 'playlist' zegt is een album. 434 */ 435 function playlistKind(id, siteId) { 436 if (!siteId) return null; 437 try { 438 const r = db.prepare('SELECT kind FROM playlists WHERE id = ? AND site_id = ?').get(id, siteId); 439 if (!r) return null; 440 return r.kind === 'playlist' ? 'playlist' : 'album'; 441 } catch { return null; } 442 }
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)