Ignore:
Timestamp:
08/13/2026 01:09:55 PM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
c3e736c
Parents:
013e16c
Message:

Jouw teksten, en de twee dingen die ze beloofden (shaer-mbz)

De titel is nu "MusicBrainz Koppeling" met jouw omschrijving eronder, in drie
talen. Maar die omschrijving belooft twee dingen die de code nog niet deed, en
een label dat liegt is erger dan een lelijk label. Dus allebei gebouwd.

"OF JE MUSICBRAINZ ID ALS JE DIE KENT". Plak je een UUID, dan wordt hij
rechtstreeks opgezocht in plaats van gezocht. Dat is geen luxe: een
zoekopdracht OP een UUID levert bij MusicBrainz niets op, dus zonder deze tak
gaf plakken juist het slechtste resultaat.

"MET TERUG-WEG VALIDATIE". Een koppeling van onze kant is een bewering --
iedereen kan een id in een veld typen. Pas als de MusicBrainz-pagina TERUGWIJST
naar dit domein is het een paar, en dan weet een lezer dat dezelfde persoon aan
allebei de kanten stond. Dezelfde gedachte als rel="me". Het paneel zegt
"wederzijds" of "nog eenzijdig", en bij dat laatste staat erbij WAT je moet doen:
het domein op je MusicBrainz-pagina zetten onder "social networking".

Wij zetten die terugwijzing niet zelf. Kan niet via hun API, en hoort ook niet.

ECHT GEMETEN, en dat gaf de test zijn vorm: robo-burr staat in MusicBrainz met
score 100 (24abe2be-c0bc-4c63-9642-d6f89ec6a00a, "AKA roboburr") en heeft
precies EEN url-relatie -- type "social network", naar sound-fabrics.com. Voor
dev.klonkt.com is de terug-weg dus false, en dat is precies de waarde van de
controle. Die vorm staat nu in een test.

Bij een storing komt er false EN een lege lijst uit: niet kunnen kijken is niet
hetzelfde als niet gevonden, en nooit stilletjes "wederzijds".

Een controle erbij die eist dat alle drie de talen dezelfde mb_-sleutels
hebben. Bij het herschrijven waren er zeven weggevallen die het scherm nog
gebruikt -- een gat in een vertaling geeft een leeg label en dat valt nooit
vanzelf op.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/MusicBrainzService.js

    r013e16c rf50a84b  
    8080}
    8181
     82/**
     83 * Een MBID rechtstreeks opzoeken. Wie zijn id al kent hoeft niet te zoeken --
     84 * en een zoekopdracht op een UUID levert bij MusicBrainz niets op, dus zonder
     85 * deze tak zou plakken juist het slechtste resultaat geven.
     86 */
     87export async function haalArtiest(mbid) {
     88  if (!isMbid(mbid)) return null;
     89  const url = `${BASIS}/artist/${encodeURIComponent(mbid)}?inc=url-rels&fmt=json`;
     90  try {
     91    await opDeBeurt();
     92    const r = await safeFetch(url, { headers: { Accept: 'application/json', 'User-Agent': userAgent() } });
     93    if (!r || !r.ok) return null;
     94    return kandidaat(await r.json());
     95  } catch {
     96    return null;
     97  }
     98}
     99
     100/**
     101 * DE TERUG-WEG. Noemt de MusicBrainz-pagina van deze artiest ons domein?
     102 *
     103 * Een koppeling van onze kant is een bewering: iedereen kan een MBID in een
     104 * veld typen. Pas als de artiestenpagina TERUGWIJST is het een paar, en dan
     105 * weet een lezer dat dezelfde persoon aan allebei de kanten stond. Dat is
     106 * dezelfde gedachte als rel="me" bij Mastodon.
     107 *
     108 * Wij zetten die terugwijzing NIET zelf: via hun API kan het niet, en het hoort
     109 * ook niet -- de artiest doet dat op musicbrainz.org onder "social networking".
     110 * Wij kijken alleen of hij er staat.
     111 *
     112 * Geeft { verified, urls } -- bij een storing verified:false en een lege lijst,
     113 * want niet kunnen kijken is niet hetzelfde als niet gevonden.
     114 */
     115export async function controleerTerugweg(mbid, domein) {
     116  const leeg = { verified: false, urls: [] };
     117  if (!isMbid(mbid) || !domein) return leeg;
     118  let host;
     119  try { host = new URL(domein).host.toLowerCase(); } catch { return leeg; }
     120  const url = `${BASIS}/artist/${encodeURIComponent(mbid)}?inc=url-rels&fmt=json`;
     121  try {
     122    await opDeBeurt();
     123    const r = await safeFetch(url, { headers: { Accept: 'application/json', 'User-Agent': userAgent() } });
     124    if (!r || !r.ok) return leeg;
     125    const doc = await r.json();
     126    const urls = (doc.relations || [])
     127      .map((rel) => rel && rel.url && rel.url.resource)
     128      .filter((u) => typeof u === 'string');
     129    const wijst = urls.some((u) => { try { return new URL(u).host.toLowerCase() === host; } catch { return false; } });
     130    return { verified: wijst, urls };
     131  } catch {
     132    return leeg;
     133  }
     134}
     135
    82136/** Een kandidaat, teruggebracht tot wat een mens nodig heeft om te kiezen. */
    83137function kandidaat(a) {
     
    104158// ze precies wonen.
    105159export { isMbid, artiestUrl };
    106 export default { zoekArtiesten, isMbid, artiestUrl };
     160export default { zoekArtiesten, haalArtiest, controleerTerugweg, isMbid, artiestUrl };
Note: See TracChangeset for help on using the changeset viewer.