Changeset c832064 in Klonkt for src/services


Ignore:
Timestamp:
08/09/2026 07:37:31 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
d7e72b8
Parents:
e667d26
Message:

De soort van een playlist wordt opgezocht, niet afgeleid (shaer-cyg)

Robins afbakening maakt twee dingen tegelijk simpeler. Album of playlist wordt
gekozen wanneer de PLAYLIST wordt gemaakt -- die keuze staat al in
playlists.kind -- en de post neemt bij een enkele insluiting die soort over. Een
post om een album is dus een album, ook al heet de shortcode [[playlist:...]].

En de afleiding is er voor BESTAANDE posts; nieuwe krijgen hun type uit de
keuze. Daarmee is "wie wint, de keuze of de afleiding?" geen vraag meer: ze
komen elkaar niet tegen. De afleiding draait eenmalig, de keuze daarna.

Onbekende situatie -> gewone post met insluitingen die de post als context
hebben. Een onvindbare playlist, of een van een andere site, verzint dus geen
type meer.

De patronen zijn nu die van AudioEmbedService: wat daar niet insluit, telt hier
niet mee. Mijn playlist-patroon accepteerde underscores die de renderer weigert,
en zo'n shortcode had wel het type van de post kunnen bepalen.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/music/index.js

    re667d26 rc832064  
    336336
    337337/**
    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.
    339346 *
    340347 * DE REGEL GAAT OVER IDENTITEIT, NIET OVER TELLEN (Robins herformulering, 9-8):
     
    357364 * letterlijk een album; hem als losse tracks tellen zou een albumpost tot
    358365 * 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 */
     381export function postMusicType(content, siteId) {
    361382  const c = String(content || '');
    362383  const uniek = (re) => [...new Set([...c.matchAll(re)].map((m) => m[1].trim()))];
    363384
    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);
    365389  const albums    = uniek(/\[\[album:([^\]]+)\]\]/g);
    366390  const tracks    = uniek(/\[\[track:([A-Za-z0-9_-]+)\]\]/g);
    367391
     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
    368402  const collecties = [
    369     ...playlists.map((id) => ({ soort: 'playlist', id })),
     403    ...uitPlaylists,
    370404    ...albums.map((naam) => ({ soort: 'album', naam })),
    371405  ];
    372406
    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  }
    374412
    375413  if (!collecties.length) {
     
    389427  return { type: 'post', collecties, tracks, bonus: [], leentMetadata: false };
    390428}
     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 */
     435function 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.