Changeset a117862 in Klonkt


Ignore:
Timestamp:
08/13/2026 01:08:32 PM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
5300652
Parents:
8455dac
git-author:
Robin <roboburr@…> (08/13/2026 12:06:21 PM)
git-committer:
Robin <roboburr@…> (08/13/2026 01:08:32 PM)
Message:

Stap 1: een artiest kan zichzelf opzoeken in MusicBrainz (shaer-mbz)

Waarom dit geen dialect is en Funkwhale's Track/ArtistCredit wel: een MBID is
geen vocabulaire maar een REGISTER. Ernaar verwijzen is als een ISBN noemen --
je neemt niemands model over en je wijst naar iets dat al bestaat. En het is de
brug die Funkwhale zelf al kent, want hun Track draagt musicbrainzId.

WAT ER STAAT

  • MusicBrainzService: zoeken op artiestennaam, kandidaten met hun disambiguatie, soort, land en jaren erbij. De naam alleen is niet genoeg om te kiezen -- er zijn drie bands die Nirvana heten, en dat is precies waar hun disambiguation-veld voor is.
  • mb_artist_id en mb_artist_name op sites. De naam erbij zodat het scherm kan tonen WAT er gekoppeld is zonder ervoor te netwerken, en zodat een verkeerde koppeling opvalt.
  • GET /admin/audio/api/musicbrainz, dat standaard zoekt op de artiestennaam die al in de site staat.

HUN TWEE HARDE REGELS, INGEBAKKEN EN GETEST. Overtreden leidt tot een BLOKKADE
en niet tot een foutmelding, dus "het werkte toen ik het probeerde" is er geen
bewijs voor:

  • hoogstens EEN verzoek per seconde, over de hele applicatie. Daarom draait de zoekopdracht server-side: die regel geldt per applicatie en niet per bezoeker, dus twee tabbladen zouden hem samen overtreden. Een test doet twee zoekopdrachten tegelijk en eist een gat van een seconde.
  • een echte User-Agent met contactgegevens. Een test leest hem uit het verzoek.

DE KEUZE BLIJFT VAN DE ARTIEST. We tonen kandidaten; we kiezen er niet zelf een,
ook niet als er maar een treffer is. Een verkeerd geraden MBID koppelt iemand aan
het werk van een ander, en dat is erger dan geen koppeling.

WAT ER NIET IN ZIT: schrijven naar MusicBrainz. Kan niet via hun API voor
artiesten -- alleen tags, ratings, ISRC's en barcodes -- en zou ook niet moeten.

Zonder netwerk getest: globalThis.fetch vervangen en musicbrainz.org in
AP_ALLOW_HOSTS, zodat er geen DNS aan te pas komt. Anders test het of deze
machine internet heeft.

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

Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • src/config/database.js

    r8455dac ra117862  
    134134  ensureColumn('ap_follow_reviews', 'target_handle', 'TEXT');
    135135  ensureColumn('sites', 'profile_photo', 'TEXT');
     136  // De MusicBrainz-koppeling van de artiest (shaer-mbz). Een MBID is een
     137  // verwijzing naar hun register, geen kopie ervan -- de naam staat erbij zodat
     138  // het beheerscherm kan tonen WAT er gekoppeld is zonder ervoor te moeten
     139  // netwerken, en zodat een verkeerde koppeling opvalt.
     140  ensureColumn('sites', 'mb_artist_id', 'TEXT');
     141  ensureColumn('sites', 'mb_artist_name', 'TEXT');
    136142  ensureColumn('audio_tracks', 'cover_url', 'TEXT');
    137143  ensureColumn('audio_tracks', 'album', 'TEXT');
  • src/routes/admin-audio.js

    r8455dac ra117862  
    2323import { audioUrl } from '../services/AudioStreamService.js';
    2424import { mediaDir } from '../config/paths.js';
     25import MusicBrainz from '../services/MusicBrainzService.js';
    2526
    2627const __dirname = path.dirname(fileURLToPath(import.meta.url));
     
    383384
    384385/** GET /admin/audio/api/albums — distinct list of album names (for datalist) */
     386/**
     387 * "Ben jij dit?" -- kandidaten uit MusicBrainz (shaer-mbz, stap 1).
     388 *
     389 * De zoekopdracht draait HIER en niet in de browser: MusicBrainz staat een
     390 * verzoek per seconde toe per APPLICATIE, en dat is alleen af te dwingen als
     391 * alles langs een plek gaat. Bovendien eisen ze een User-Agent met contact, en
     392 * die kan een browser niet zetten.
     393 *
     394 * De keuze blijft van de artiest. Wij tonen kandidaten met hun toelichting; we
     395 * kiezen er niet zelf een, ook niet als er maar een treffer is -- een verkeerd
     396 * geraden MBID koppelt iemand aan het werk van een ander.
     397 */
     398router.get('/api/musicbrainz', requireGod, async (req, res) => {
     399  const site = res.locals.site;
     400  if (!site) return res.status(404).json({ error: 'no_site' });
     401  // Standaard de artiestennaam die al in de site staat: negen van de tien keer
     402  // is dat precies waar iemand op zou zoeken.
     403  const q = String(req.query.q || site.author || site.title || '').trim();
     404  if (!q) return res.json({ ok: true, q: '', kandidaten: [] });
     405  const kandidaten = await MusicBrainz.zoekArtiesten(q);
     406  res.json({
     407    ok: true,
     408    q,
     409    gekoppeld: site.mb_artist_id
     410      ? { mbid: site.mb_artist_id, naam: site.mb_artist_name || '', url: MusicBrainz.artiestUrl(site.mb_artist_id) }
     411      : null,
     412    kandidaten,
     413  });
     414});
     415
    385416router.get('/api/albums', requireGod, (req, res) => {
    386417  const site = res.locals.site;
Note: See TracChangeset for help on using the changeset viewer.