Changeset b406d25 in Klonkt for src/services/music/index.js


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

Het type volgt de muziek, en de regel staat nog maar op een plek (shaer-cyg)

Robins regel zegt dat de post de soort van zijn muziek overneemt bij een enkele
insluiting. Dat deed hij nog niet: je koos het type zelf en de afleiding draaide
alleen bij de migratie. Nu verspringt de balk mee zodra je een playlist invoegt,
en zie je wat je aan het maken bent in plaats van het zelf bij te houden.

DE REGEL VERHUIST NAAR assets/js/shared/post-music-type.js. Hij wordt nu op twee
plaatsen gebruikt -- de server leidt het type van bestaande posts ermee af, de
editor laat het live volgen -- en dat MOET dezelfde regel zijn. Twee kopieen
zouden niet luidruchtig kapotgaan maar stil uit elkaar lopen: de editor zegt
album, de server zegt playlist, en niemand merkt het. De browser kan alleen bij
/assets en de server kan overal bij, dus staat hij daar en importeert
services/music hem. De module is puur: geen db, geen DOM, geen fetch -- wie hem
gebruikt levert zelf een opzoeker voor de soort van een playlist.

DRIE DINGEN DIE HIJ MET RUST LAAT. Klik je zelf een type aan, dan wint die
keuze en wordt er daarna niets meer voor je omgezet. Foto en Video zijn een
bewuste andere keuze over dezelfde post en worden nooit overschreven. En bij het
OPENEN van een post gebeurt er niets: de eerste afleiding wordt alleen als
ijkpunt onthouden, anders zou een oude post van type veranderen door hem te
bekijken.

De editor leidt af uit precies de tekst die straks wordt opgeslagen (chips terug
naar shortcodes via serializeChips), zodat hij niet iets anders ziet dan de
server. Zonder de playlist-soorten leidt de regel niets af in plaats van te
gokken.

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

File:
1 edited

Legend:

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

    rd7e72b8 rb406d25  
    1515import db from '../../config/database.js';
    1616import { AP_CONTEXT, PUBLIC, actorId, noteId, safeUrl, guessMediaType } from '../ap-core.js';
     17import { afleidenUitInsluitingen } from '../../assets/js/shared/post-music-type.js';
    1718
    1819// m.size hoort erbij voor de RSS-enclosure: die eist een lengte in bytes.
     
    333334}
    334335
    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.
    339346 *
    340347 * WAARVOOR DIT WEL EN NIET IS (Robins afbakening, 9-8). Nieuwe posts krijgen
    341348 * 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.
    377351 *
    378352 * @param {string} content   de HTML/tekst van de post
     
    380354 */
    381355export 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));
    428357}
    429358
Note: See TracChangeset for help on using the changeset viewer.