Changeset c25eff7 in Klonkt for src/routes/activitypub.js


Ignore:
Timestamp:
08/07/2026 06:08:37 PM (5 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
c1df3e9
Parents:
ed5e7ab
git-author:
Robin <roboburr@…> (08/07/2026 06:08:25 PM)
git-committer:
Robin <roboburr@…> (08/07/2026 06:08:37 PM)
Message:

Een playlist federeert als AP-collectie (shaer-ayc, stap 1)

De eerste stap van het Funkwhale-spoor, en playlists gaan voor omdat zij als
enige al een id hebben -- een album is nog een tekstveld en kan nergens aan
hangen.

GET /ap/users/:slug/playlists/:id geeft een OrderedCollection van Audio-
objecten, dezelfde rijvorm die een post als attachment meestuurt, zodat elke
client die post-audio speelt dit ook speelt. Kaal AS2, geen eigen vocab:
artiest is summary, duur is PT..S, hoes is icon en een track zonder eigen
hoes erft die van de playlist.

De poortregel verandert niet: alleen fedi_open-tracks staan erin, met echte
bestands-URL. Een gated track is geen lege rij maar afwezig, en totalItems
telt alleen het open deel -- wie leest kan niet aftellen hoeveel er achter
de poort staat, en ziet titel noch bestandsnaam.

Tests: bestaan/vorm, poort (inclusief niet-lekken van titel en bestandsnaam),
volgorde (de gated track staat er middenin, dus meetellen zou ook de volgorde
breken), tenancy (playlist van site A op actor B is 404).

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    red5e7ab rc25eff7  
    630630});
    631631
     632// ── Playlist als dereferenceerbare AP-collectie (shaer-ayc) ───────
     633// De eerste stap van het Funkwhale-spoor: een playlist heeft een id, dus een
     634// stabiele URI. Alleen het fedi_open-deel staat erin (de poort is per bestand
     635// en eenrichtings; zie setAudioFediOpen in routes/posts.js) — een collectie
     636// zonder open tracks bestaat wel maar is leeg, want de playlist zelf is niet
     637// geheim, alleen de bestanden erachter.
     638router.get('/ap/users/:slug/playlists/:id', (req, res) => {
     639  const site = publicSite(req.params.slug);
     640  if (!site) return res.status(404).end();
     641  const pl = db.prepare('SELECT id, title, artist, year, cover_url, kind FROM playlists WHERE id = ? AND site_id = ?')
     642    .get(req.params.id, site.id);
     643  if (!pl) return res.status(404).end();
     644  AP.sendAP(res, AP.buildPlaylistCollection(baseUrl(req), site, pl, AP.playlistOpenTracks(pl.id)));
     645});
     646
    632647// ── Note ──────────────────────────────────────────────────────────
    633648router.get('/ap/notes/:id', async (req, res) => {
Note: See TracChangeset for help on using the changeset viewer.