Changeset 013e16c in Klonkt for src/routes


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@…>

Location:
src/routes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/routes/admin-seo.js

    rf59a46c r013e16c  
    1919import { requireGod } from '../middleware/auth.js';
    2020import { getPrimarySite } from '../middleware/site.js';
     21import { isMbid } from '../services/ap-core.js';
     22import MusicBrainz from '../services/MusicBrainzService.js';
    2123
    2224const router = express.Router();
     
    3739  renderPage(req, res, 'pages/admin-seo', {
    3840    pageTitleKey: 'admin.t_seo',
     41    pageJs: 'admin-seo',
    3942    bodyClass: 'on-admin',
    4043    site,
     
    4245    error: req.query.error || null,
    4346  });
     47});
     48
     49/**
     50 * "Zoek jezelf op" -- kandidaten uit MusicBrainz (shaer-mbz).
     51 *
     52 * De zoekopdracht draait HIER en niet in de browser: MusicBrainz staat een
     53 * verzoek per seconde toe per APPLICATIE, en dat is alleen af te dwingen als
     54 * alles langs een plek gaat. Bovendien eisen ze een User-Agent met contact, en
     55 * die kan een browser niet zetten.
     56 *
     57 * Wij kiezen NIET. Ook niet als er precies een treffer is: een verkeerd geraden
     58 * MBID zet jouw naam onder andermans werk.
     59 */
     60router.get('/api/musicbrainz', requireGod, async (req, res) => {
     61  const site = getPrimarySite(req);
     62  const q = String(req.query.q || (site && (site.publisher_name || site.title)) || '').trim();
     63  if (!q) return res.json({ ok: true, q: '', kandidaten: [] });
     64  res.json({ ok: true, q, kandidaten: await MusicBrainz.zoekArtiesten(q) });
    4465});
    4566
     
    7293      publisher_url = ?,
    7394      publisher_logo = ?,
     95      mb_artist_id = ?, mb_artist_name = ?,
    7496      updated_at = CURRENT_TIMESTAMP
    7597    WHERE id = ?
     98  // De MusicBrainz-koppeling (shaer-mbz). Alleen een echte MBID komt de kolom
     99  // in: zonder deze zeef sluipt er een URL of een handle in het veld dat naar
     100  // buiten gaat, en het gaat naar TWEE uitgangen -- de JSON-LD en de actor.
     101  // Leeg is een geldige keuze; dat is ontkoppelen.
     102  const mbRuw = String(f.mb_artist_id || '').trim().toLowerCase();
     103  const mbArtistId = isMbid(mbRuw) ? mbRuw : null;
     104
    76105  `).run(
    77106    f.robots_index ? 1 : 0,
     
    93122    trimOrNull(f.publisher_url, 200),
    94123    trimOrNull(f.publisher_logo, 500),
     124    mbArtistId,
     125    mbArtistId ? (String(f.mb_artist_name || '').trim().slice(0, 200) || null) : null,
    95126    primary.id,
    96127  );
  • src/routes/admin-sites.js

    rf59a46c r013e16c  
    2727import { mediaDir } from '../config/paths.js';
    2828import AP from '../services/ActivityPubService.js';
    29 import MusicBrainz from '../services/MusicBrainzService.js';
    3029
    3130
     
    323322
    324323// ==================== SAVE ====================
    325 /**
    326  * "Ben jij dit?" -- kandidaten uit MusicBrainz (shaer-mbz).
    327  *
    328  * De zoekopdracht draait HIER en niet in de browser: MusicBrainz staat een
    329  * verzoek per seconde toe per APPLICATIE, en dat is alleen af te dwingen als
    330  * alles langs een plek gaat. Bovendien eisen ze een User-Agent met contact, en
    331  * die kan een browser niet zetten.
    332  *
    333  * Wij kiezen NIET. Ook niet als er precies een treffer is: een verkeerd geraden
    334  * MBID zet jouw naam onder andermans werk.
    335  */
    336 router.get('/:slug/api/musicbrainz', requireSiteManagerBySlug, async (req, res) => {
    337   const site = db.prepare('SELECT title, mb_artist_id, mb_artist_name FROM sites WHERE slug = ?').get(req.params.slug);
    338   if (!site) return res.status(404).json({ error: 'no_site' });
    339   const q = String(req.query.q || site.title || '').trim();
    340   if (!q) return res.json({ ok: true, q: '', kandidaten: [] });
    341   res.json({ ok: true, q, kandidaten: await MusicBrainz.zoekArtiesten(q) });
    342 });
    343 
    344324router.post('/:slug/save', requireSiteManagerBySlug, async (req, res) => {
    345325  const site = db.prepare('SELECT id, ap_aliases FROM sites WHERE slug = ?').get(req.params.slug);
     
    366346  // accent: only accept colors from the curated ACCENTS list. Falls back to
    367347  // the orange default if the submitted value isn't recognised.
    368   // De MusicBrainz-koppeling (shaer-mbz). Alleen een echte MBID komt de kolom
    369   // in: zonder deze zeef sluipt er een hele URL of een handle in het veld dat
    370   // straks naar buiten gaat. Leeg is een geldige keuze -- dat is ontkoppelen.
    371   const mbRuw = String(f.mb_artist_id || '').trim().toLowerCase();
    372   const mbArtistId = MusicBrainz.isMbid(mbRuw) ? mbRuw : null;
    373 
    374348  const accent = ThemeService.validateAccent(f.accent) || '#e8b04b';
    375349
     
    381355      profile_links = ?,
    382356      ap_aliases = ?,
    383       mb_artist_id = ?, mb_artist_name = ?,
    384357      is_public = ?, robots_index = ?, require_login_to_comment = ?,
    385358      enable_audio_player = ?,
     
    401374    profileLinksJson,
    402375    apAliasesJson,
    403     mbArtistId,
    404     mbArtistId ? (String(f.mb_artist_name || '').trim().slice(0, 200) || null) : null,
    405376    f.is_public ? 1 : 0,
    406377    f.robots_index ? 1 : 0,
Note: See TracChangeset for help on using the changeset viewer.