Changeset 6401681 in Klonkt for src/routes


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

Het paneel hoort bij wie je bent, niet bij je bestanden (Robins correctie)

Verhuisd van Beheer -> Audio naar het profielscherm van de site-eigenaar, en
daar staat het NAAST de aliassen -- want dat is dezelfde vraag. Een alias zegt
wie je elders in de fediverse bent, een MBID zegt wie je in het muziekregister
bent. Bij de audiobestanden ging het over beheer van spullen; hier gaat het over
identiteit, en daar hoort het thuis.

DE VERHUIZING VERANDERDE DE VORM, en dat is de moeite waard om te weten. Het
profielscherm IS een formulier, en een formulier in een formulier bestaat niet
in HTML. Dus geen eigen opslaan-knop meer: de keuze zet een verborgen veld en
gaat mee met de Opslaan van de pagina, precies zoals de profielfoto. Dat leest
ook beter -- een halve wijziging die je nog kunt herzien voor je opslaat.

Ontkoppelen is nu het veld leegmaken, geen aparte route. Minder oppervlak.

Het zoek-endpoint ging mee naar /admin/sites/:slug/api/musicbrainz. Een endpoint
onder /admin/audio laten staan voor een scherm in /admin/sites is precies zo'n
naad die later niemand meer kan plaatsen. De teksten heten nu asite.mb_* in
plaats van aaud.mb_*, in alle drie de talen, met een placeholder erbij.

Wat NIET veranderde: de zoekopdracht draait server-side (hun regel geldt per
applicatie), wij kiezen niet voor de artiest, en alleen een echte MBID komt de
kolom in.

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

Location:
src/routes
Files:
2 edited

Legend:

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

    r5300652 r6401681  
    2323import { audioUrl } from '../services/AudioStreamService.js';
    2424import { mediaDir } from '../config/paths.js';
    25 import MusicBrainz from '../services/MusicBrainzService.js';
    2625
    2726const __dirname = path.dirname(fileURLToPath(import.meta.url));
     
    384383
    385384/** 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  */
    398 router.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 
    416 /**
    417  * De keuze vastleggen. Alleen een echte MBID komt de kolom in: de naam die we
    418  * ernaast bewaren is voor het scherm, de MBID is het enige dat naar buiten gaat.
    419  */
    420 router.post('/musicbrainz/link', requireGod, (req, res) => {
    421   const site = res.locals.site;
    422   if (!site) return res.status(404).end();
    423   const mbid = String(req.body.mbid || '').trim().toLowerCase();
    424   const naam = String(req.body.naam || '').trim().slice(0, 200);
    425   const terug = (res.locals.siteUrlBase || '') + '/admin/audio';
    426   if (!MusicBrainz.isMbid(mbid)) return res.redirect(`${terug}?error=` + encodeURIComponent('Geen geldige MusicBrainz-id.'));
    427   db.prepare('UPDATE sites SET mb_artist_id = ?, mb_artist_name = ? WHERE id = ?').run(mbid, naam || null, site.id);
    428   res.redirect(`${terug}?success=` + encodeURIComponent('Gekoppeld aan MusicBrainz.'));
    429 });
    430 
    431 /** Terugdraaien. Een verkeerde koppeling zet jouw naam onder andermans werk. */
    432 router.post('/musicbrainz/unlink', requireGod, (req, res) => {
    433   const site = res.locals.site;
    434   if (!site) return res.status(404).end();
    435   db.prepare('UPDATE sites SET mb_artist_id = NULL, mb_artist_name = NULL WHERE id = ?').run(site.id);
    436   res.redirect((res.locals.siteUrlBase || '') + '/admin/audio?success=' + encodeURIComponent('Ontkoppeld.'));
    437 });
    438 
    439385router.get('/api/albums', requireGod, (req, res) => {
    440386  const site = res.locals.site;
  • src/routes/admin-sites.js

    r5300652 r6401681  
    2727import { mediaDir } from '../config/paths.js';
    2828import AP from '../services/ActivityPubService.js';
     29import MusicBrainz from '../services/MusicBrainzService.js';
    2930
    3031
     
    322323
    323324// ==================== 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 */
     336router.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
    324344router.post('/:slug/save', requireSiteManagerBySlug, async (req, res) => {
    325345  const site = db.prepare('SELECT id, ap_aliases FROM sites WHERE slug = ?').get(req.params.slug);
     
    346366  // accent: only accept colors from the curated ACCENTS list. Falls back to
    347367  // 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
    348374  const accent = ThemeService.validateAccent(f.accent) || '#e8b04b';
    349375
     
    355381      profile_links = ?,
    356382      ap_aliases = ?,
     383      mb_artist_id = ?, mb_artist_name = ?,
    357384      is_public = ?, robots_index = ?, require_login_to_comment = ?,
    358385      enable_audio_player = ?,
     
    374401    profileLinksJson,
    375402    apAliasesJson,
     403    mbArtistId,
     404    mbArtistId ? (String(f.mb_artist_name || '').trim().slice(0, 200) || null) : null,
    376405    f.is_public ? 1 : 0,
    377406    f.robots_index ? 1 : 0,
Note: See TracChangeset for help on using the changeset viewer.