Ignore:
Timestamp:
08/13/2026 01:09:24 PM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
f50a84b
Parents:
f59a46c
git-author:
Robin <roboburr@…> (08/13/2026 01:01:18 PM)
git-committer:
Robin <roboburr@…> (08/13/2026 01:09:24 PM)
Message:

Naar SEO & social, want sameAs is schema.org (Robins vraag)

Hij vroeg of het niet onder SEO en social hoort, "omdat het ook een soort
koppeling is". Dat is het, en sterker dan dat: op die pagina staat een blok
"Uitgever (JSON-LD / rich results)", en sameAs IS een schema.org-eigenschap.
Zelfde vocabulaire, zelfde plek. Het paneel staat nu direct onder Uitgever.

DAARDOOR VOEDT EEN KOPPELING NU TWEE UITGANGEN. Naast schema:sameAs op de
fediverse-actor komt hij in de JSON-LD van de pagina zelf, in _publisher. Dat
is hetzelfde feit, verteld aan de andere lezer -- en het was gratis, want het
blok stond er al.

BETERE LABELS, want de oude waren geschreven voor het audioscherm. "Ben jij dit
in MusicBrainz?" werd "MusicBrainz (dezelfde artiest elders)" als legenda, met
een hint die zegt wat het OPLEVERT in plaats van alleen wat het is: je komt als
sameAs in de JSON-LD en in je fediverse-profiel, en er verandert niets bij
MusicBrainz zelf. Dat laatste is de geruststelling die er hoort te staan. Plus
een veldlabel ("Zoek jezelf op") met de toelichting "de naam waaronder je muziek
uitbrengt" -- want dat is de vraag, niet je sitenaam. Drie talen.

Het zoekveld begint nu op publisher_name en valt terug op de sitetitel: op deze
pagina heb je die naam net ingevuld.

Meeverhuisd: het endpoint (/admin/seo/api/musicbrainz) en het clientblok, in een
nieuwe mod/admin-seo.js. Die pagina had nog geen JavaScript; opzoeken vraagt er
wel om. Het profielscherm is weer helemaal schoon.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/assets/js/mod/admin-site-edit.js

    rf59a46c r013e16c  
    135135})();
    136136
    137   // MusicBrainz-paneel (shaer-mbz). Binnen run(), niet op moduleniveau: deze
    138   // modules krijgen bij elke paginawissel opnieuw init(), en een blok dat maar
    139   // een keer per sessie draait is precies wat shaer-5s1 opleverde.
    140   wireMusicBrainz();
    141137}
    142 
    143 // ── MusicBrainz: ben jij dit? (shaer-mbz) ─────────────────────────
    144 //
    145 // De kandidaten komen van de server, want MusicBrainz eist een verzoek per
    146 // seconde per APPLICATIE en een User-Agent met contact -- allebei niet vanuit
    147 // een browser af te dwingen.
    148 //
    149 // WIJ KIEZEN NIET. Ook niet als er precies een treffer is: een verkeerd geraden
    150 // MBID zet jouw naam onder andermans werk. De knop staat er, de klik is van de
    151 // artiest. En de keuze gaat mee met de Opslaan-knop van de pagina -- een eigen
    152 // formulier kan hier niet, want deze pagina IS er een.
    153 function wireMusicBrainz() {
    154   const knop = document.getElementById('mb-zoek-btn');
    155   const veld = document.getElementById('mb-q');
    156   const uit = document.getElementById('mb-uit');
    157   const idVeld = document.getElementById('mb-id');
    158   const naamVeld = document.getElementById('mb-naam');
    159   const huidig = document.getElementById('mb-huidig');
    160   if (!knop || !veld || !uit || !idVeld || knop.__wired) return;
    161   knop.__wired = true;
    162 
    163   const el = (tag, cls, tekst) => {
    164     const e = document.createElement(tag);
    165     if (cls) e.className = cls;
    166     // textContent en nooit innerHTML: dit is tekst uit een vreemd register.
    167     if (tekst != null) e.textContent = tekst;
    168     return e;
    169   };
    170 
    171   function zet(mbid, naam) {
    172     idVeld.value = mbid || '';
    173     naamVeld.value = naam || '';
    174     if (huidig) {
    175       huidig.hidden = !mbid;
    176       const n = document.getElementById('mb-huidig-naam');
    177       const a = document.getElementById('mb-huidig-link');
    178       if (n) n.textContent = naam || mbid || '';
    179       if (a) a.href = mbid ? `https://musicbrainz.org/artist/${mbid}` : '#';
    180     }
    181     uit.hidden = true;
    182     uit.replaceChildren();
    183   }
    184 
    185   const wis = document.getElementById('mb-wis');
    186   if (wis) wis.addEventListener('click', () => zet('', ''));
    187 
    188   async function zoek() {
    189     const q = (veld.value || '').trim();
    190     if (!q) return;
    191     uit.hidden = false;
    192     uit.replaceChildren(el('p', 'form-hint', T.asite_mb_busy || 'Zoeken…'));
    193     knop.disabled = true;
    194     try {
    195       const r = await fetch(`api/musicbrainz?q=${encodeURIComponent(q)}`, { credentials: 'same-origin' });
    196       const j = await r.json();
    197       toon((j && j.kandidaten) || []);
    198     } catch {
    199       uit.replaceChildren(el('p', 'form-hint', T.asite_mb_fail || 'MusicBrainz is even niet bereikbaar.'));
    200     } finally {
    201       knop.disabled = false;
    202     }
    203   }
    204 
    205   function toon(kandidaten) {
    206     if (!kandidaten.length) {
    207       uit.replaceChildren(el('p', 'form-hint', T.asite_mb_none || 'Niets gevonden.'));
    208       return;
    209     }
    210     const lijst = el('ul', 'mb-lijst');
    211     for (const k of kandidaten) {
    212       const li = el('li', 'mb-kandidaat');
    213       li.appendChild(el('strong', null, k.naam));
    214       // De toelichting is het hele punt: er zijn drie bands die Nirvana heten,
    215       // en zonder dit veld kiest iemand de verkeerde.
    216       const bij = [k.toelichting, k.soort, k.land, k.jaren].filter(Boolean).join(' · ');
    217       if (bij) li.appendChild(el('small', 'mb-bij', bij));
    218       const open = el('a', 'mb-open', T.asite_mb_open || 'Bekijk op MusicBrainz');
    219       open.href = k.url; open.target = '_blank'; open.rel = 'noopener';
    220       li.appendChild(open);
    221       const b = el('button', 'btn', T.asite_mb_pick || 'Dit ben ik');
    222       b.type = 'button';
    223       b.addEventListener('click', () => zet(k.mbid, k.naam));
    224       li.appendChild(b);
    225       lijst.appendChild(li);
    226     }
    227     uit.replaceChildren(lijst);
    228   }
    229 
    230   knop.addEventListener('click', zoek);
    231   veld.addEventListener('keydown', (e) => { if (e.key === 'Enter') { e.preventDefault(); zoek(); } });
    232 }
Note: See TracChangeset for help on using the changeset viewer.