Changeset b406d25 in Klonkt for src/services/music/index.js
- Timestamp:
- 08/09/2026 07:57:50 AM (4 weeks ago)
- Branches:
- main
- Children:
- b2adc20
- Parents:
- d7e72b8
- File:
-
- 1 edited
-
src/services/music/index.js (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/services/music/index.js
rd7e72b8 rb406d25 15 15 import db from '../../config/database.js'; 16 16 import { AP_CONTEXT, PUBLIC, actorId, noteId, safeUrl, guessMediaType } from '../ap-core.js'; 17 import { afleidenUitInsluitingen } from '../../assets/js/shared/post-music-type.js'; 17 18 18 19 // m.size hoort erbij voor de RSS-enclosure: die eist een lengte in bytes. … … 333 334 } 334 335 335 // ── Welk soort muzikale uitgave is deze post? (shaer-cyg) ───────────────── 336 337 /** 338 * Het type van een BESTAANDE post afleiden uit de muziek die erin staat. 336 // ── Welk soort muzikale uitgave is deze post? (shaer-cyg) ───────────── 337 338 /** 339 * Het type van een post afleiden uit de muziek die erin staat. 340 * 341 * DE REGEL ZELF staat in assets/js/shared/post-music-type.js, want de editor 342 * gebruikt hem ook -- daar volgt het type live mee terwijl je schrijft. Twee 343 * kopieen zouden stil uit elkaar lopen, dus is er er een. Hier komt alleen het 344 * stuk bij dat de server kan en de browser niet: de gekozen soort van een 345 * playlist opzoeken. 339 346 * 340 347 * WAARVOOR DIT WEL EN NIET IS (Robins afbakening, 9-8). Nieuwe posts krijgen 341 348 * 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. 346 * 347 * DE REGEL GAAT OVER IDENTITEIT, NIET OVER TELLEN (Robins herformulering, 9-8): 348 * een post neemt het type van zijn muziek over als hij precies EEN muzikale 349 * eenheid bevat. Zijn het er meer, dan is de post een post die naar muziek 350 * verwijst, en houden de collecties hun eigen identiteit. 351 * 352 * losse track(s) -> playlist metadata van de post geleend 353 * een collectie -> die soort metadata van de post geleend 354 * een collectie + losse tracks -> album de losse zijn BONUS-TRACKS 355 * twee of meer collecties -> post NIETS geleend 356 * 357 * Waarom de lening bij de laatste vervalt: die bestaat omdat een collectie soms 358 * dun is -- geen eigen hoes, geen eigen titel. Bij twee is de post niet meer de 359 * drager van EEN identiteit, en vervalt de reden vanzelf. Dezelfde regel zet 360 * zichzelf uit. 361 * 362 * EEN COLLECTIE IS EEN PLAYLIST OF EEN ALBUM-INSLUITING. Robins regel noemde 363 * alleen playlists, maar [[album:naam]] groepeert net zo goed tracks en is 364 * letterlijk een album; hem als losse tracks tellen zou een albumpost tot 365 * playlist maken. Telt hij straks anders, dan is dat hier een regel. 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. 349 * gemaakt, en de post neemt dat over. Op de server is dit vooral voor wat er al 350 * staat -- de posts met type=audio uit de tijd voor die keuze bestond. 377 351 * 378 352 * @param {string} content de HTML/tekst van de post … … 380 354 */ 381 355 export function postMusicType(content, siteId) { 382 const c = String(content || ''); 383 const uniek = (re) => [...new Set([...c.matchAll(re)].map((m) => m[1].trim()))]; 384 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); 389 const albums = uniek(/\[\[album:([^\]]+)\]\]/g); 390 const tracks = uniek(/\[\[track:([A-Za-z0-9_-]+)\]\]/g); 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 402 const collecties = [ 403 ...uitPlaylists, 404 ...albums.map((naam) => ({ soort: 'album', naam })), 405 ]; 406 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 } 412 413 if (!collecties.length) { 414 // Ook EEN losse track wordt een playlist: naar buiten toe is er dan altijd 415 // een collectie om naar te wijzen. Hoe Klonkt dat toont is een aparte vraag. 416 return { type: 'playlist', collectie: null, tracks, bonus: [], leentMetadata: true }; 417 } 418 419 if (collecties.length === 1) { 420 const c0 = collecties[0]; 421 // Losse tracks naast een collectie zijn geen rommelrestje maar bonus-tracks, 422 // en dat maakt het geheel een album. 423 if (tracks.length) return { type: 'album', collectie: c0, tracks: [], bonus: tracks, leentMetadata: true }; 424 return { type: c0.soort, collectie: c0, tracks: [], bonus: [], leentMetadata: true }; 425 } 426 427 return { type: 'post', collecties, tracks, bonus: [], leentMetadata: false }; 356 return afleidenUitInsluitingen(content, (id) => playlistKind(id, siteId)); 428 357 } 429 358
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)