Changeset 749605a in Klonkt for src/routes/activitypub.js


Ignore:
Timestamp:
08/16/2026 03:06:18 PM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
a5caa73
Parents:
a5515b4 (diff), 9026de5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Bibliotheek en album-federatie terug op main (shaer-0nh, shaer-756s)

Achttien commits, in drie brokken.

DE BIBLIOTHEEK. Een Library-skelet met een eigen volgerssoort: wie de
bibliotheek volgt krijgt de muziek en met opzet niet de gewone posts, en
die staan daarom in een eigen tabel -- een vlag die iemand vergeet te
filteren bezorgt stilletjes de Krant aan mensen die er niet om vroegen.
Daarna wat er nodig bleek om werkelijk gelezen te worden: audience
(zonder dat gaf hun create() een KeyError en dus een 500 op onze URL),
de ongeordende collectievorm, en paginering op elke collectie die first
belooft -- die laatste vond meteen dat featured hetzelfde gat had.

HET VOCABULAIRE. fw:track in de kleine vorm die Emissary ook stuurt,
artist_credit met de site-actor als Artist (mogelijk geworden door de
MusicBrainz-koppeling), en het album als ingesloten fw:Album met
released, musicbrainzId en een eigen artist_credit. Daarvoor kwamen er
twee kolommen op playlists, alleen bij kind='album' en afgedwongen in
PlaylistService -- niet in het scherm, want de API ligt open.

HET BEHEER. De vijf mediapagina's stonden op drie verschillende
ontwerpen; nu op een gedeelde ax-romp, met de primitieven op een plek in
plaats van in acht kopieen. De playlist-modal ging alsnog door i18n: die
teksten stonden hard in het script, wat niet opviel omdat het toevallig
de brontaal was.

WAT ER NIET IN ZIT: bitrate en size top-level als fw:. Dat is bewust
(shaer-3f8a). Hun eigen outbox zet ze op de Link, net als wij, en het
wordt een gesprek in plaats van een aanpassing -- briefing in
~/bewaard/funkwhale-briefing-en.md.

Gereedschap dat meekomt: scripts/funkwhale-gat.mjs meet het gat naar hun
ingest, admin-css.mjs en admin-css-gelijk.mjs ontleden en vergelijken de
beheer-CSS, render-admin-views.mjs rendert de views gevuld en leeg. Die
laatste drie omdat de testsuite geen enkele view aanraakt.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    ra5515b4 r749605a  
    11151115     ORDER BY pinned DESC, COALESCE(published_at, created_at) ASC LIMIT 20`
    11161116  ).all(site.id);
    1117   AP.sendAP(res, AP.buildFeatured(baseUrl(req), site, posts));
     1117  AP.sendAP(res, AP.buildFeatured(baseUrl(req), site, posts, { page: paginaNr(req) }));
    11181118});
    11191119
     
    11301130  const site = publicSite(req.params.slug);
    11311131  if (!site) return res.status(404).end();
    1132   AP.sendAP(res, AP.listPlaylistsAP(baseUrl(req), site, wantsEnriched(req, res)));
     1132  AP.sendAP(res, AP.listPlaylistsAP(baseUrl(req), site, wantsEnriched(req, res), { page: paginaNr(req) }));
    11331133});
    11341134
     
    11391139  const site = publicSite(req.params.slug);
    11401140  if (!site) return res.status(404).end();
    1141   AP.sendAP(res, AP.buildTrackCollection(baseUrl(req), site, AP.siteOpenTracks(site.id, { alles: await magAlles(req, site.slug) })));
     1141  AP.sendAP(res, AP.buildTrackCollection(baseUrl(req), site, AP.siteOpenTracks(site.id, { alles: await magAlles(req, site.slug) }), { page: paginaNr(req) }));
     1142});
     1143
     1144// De bibliotheek van deze site (shaer-0nh). Funkwhale's Audio draagt een
     1145// `library`, en dat is bij hen het haakje waar een UPLOAD aan komt te hangen --
     1146// zonder die bak blijft een binnengehaalde track daar een naam zonder geluid.
     1147// Gemeten op 13-8: open.audio had onze vier tracks wel, met onze eigen AP-id's,
     1148// maar uploads leeg en is_playable false.
     1149//
     1150// Openbaar, want alles erin is fedi_open. Er valt dus niets goed te keuren en de
     1151// volgerslijst blijft leeg: wie ons volgt volgt de ACTOR, niet de bak.
     1152//
     1153// `?page=` MOET hier doorgegeven worden. Zonder dat adverteert de wortel een
     1154// `first` die op zichzelf uitkomt: de lezer volgt hem, krijgt weer een `Library`
     1155// in plaats van een pagina, en klapt eruit -- open.audio gaf op 15-8 een 500 op
     1156// precies deze URL. Dezelfde les als bij de outbox (shaer-sk4): een `first`
     1157// beloven is een pagina beloven.
     1158router.get('/ap/users/:slug/library', (req, res) => {
     1159  const site = publicSite(req.params.slug);
     1160  if (!site) return res.status(404).end();
     1161  AP.sendAP(res, AP.buildLibrary(baseUrl(req), site, AP.siteOpenTracks(site.id), { page: paginaNr(req) }));
     1162});
     1163
     1164// De volgerscollectie die hun docs als vereist noemen. Leeg en eerlijk: er is
     1165// geen goedkeuringspad omdat de bibliotheek openbaar is.
     1166router.get('/ap/users/:slug/library/followers', (req, res) => {
     1167  const site = publicSite(req.params.slug);
     1168  if (!site) return res.status(404).end();
     1169  AP.sendAP(res, AP.pagedCollection(`${AP.libraryId(baseUrl(req), site)}/followers`, [], { page: paginaNr(req) }));
    11421170});
    11431171
     
    11741202  const site = publicSite(req.params.slug);
    11751203  if (!site) return res.status(404).end();
    1176   const pl = db.prepare('SELECT id, title, artist, year, cover_url, kind FROM playlists WHERE id = ? AND site_id = ?')
     1204  const pl = db.prepare('SELECT id, title, artist, year, cover_url, kind, release_date, mb_release_id, created_at FROM playlists WHERE id = ? AND site_id = ?')
    11771205    .get(req.params.id, site.id);
    11781206  if (!pl) return res.status(404).end();
     
    13611389router.post(['/ap/users/:slug/inbox', '/ap/inbox'], apInboxLimiter, apJson, async (req, res) => {
    13621390  try { return res.status(await AP.handleInbox(req, req.params.slug || null) || 202).end(); }
    1363   catch (e) { console.warn('[AP inbox] error:', e.message); return res.status(202).end(); }
     1391  // Met de STACK erbij. Hier stond alleen `e.message`, en op 15-8 leverde dat
     1392  // zes keer "[AP inbox] error: slug is not defined" op zonder één aanwijzing
     1393  // waar -- een ReferenceError in een handler van duizenden regels, met een
     1394  // naam die overal voorkomt. Een fout die je niet kunt plaatsen is niet
     1395  // gemeld. Het type en de activiteit erbij, want dat zegt welke tak liep.
     1396  catch (e) {
     1397    const soort = req.body && req.body.type;
     1398    console.warn('[AP inbox] error:', e.message, '| type:', soort, '| slug:', req.params.slug || '(gedeeld)');
     1399    console.warn(e.stack);
     1400    return res.status(202).end();
     1401  }
    13641402});
    13651403
Note: See TracChangeset for help on using the changeset viewer.