Changeset 2091647 in Klonkt


Ignore:
Timestamp:
08/15/2026 07:03:06 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
732272a
Parents:
eac3229
Message:

Een Library-skelet, want zonder bak blijft een track een naam zonder geluid

GEMETEN, en dat gaf dit zijn richting. open.audio heeft onze vier tracks
binnengehaald langs de AP-weg -- met ONZE track-id's als fid, en met een
artist_credit dat Funkwhale zelf uit onze attributedTo afleidde. Precies het
object waarvan ons gevraagd werd het te sturen; dat hoefde dus niet, hij leidt
het af. Maar uploads is leeg en is_playable false.

Het audiobestand is niet het probleem: /audio/stream geeft 200, audio/mpeg,
2722880 bytes, ook anoniem en met een vreemde User-Agent. Ze hebben het niet
opgehaald. Bij Funkwhale hangt een upload aan een LIBRARY, en die hadden we niet.

DE VORM IS DIE UIT HUN DOCS: type Library, id, name, followers, totalItems,
first, last, plus attributedTo en summary. Onze pagedCollection deed het meeste
al; wat erbij komt is de naam, de volgers en het type.

DE ENIGE TERM DIE WE UIT HUN VOCABULAIRE OVERNEMEN, en het verschil met
track/ArtistCredit is de reden dat dit wel mag: die twee vragen ENTITEITEN waar
wij tekst hebben -- een artiest en een album zijn bij ons kolommen, en er een id
voor verzinnen zou beloven wat we niet kunnen waarmaken. Een library is precies
wat er al staat: onze open tracks, met een echte telling en een echt id. Er valt
niets te verzinnen.

SKELET, letterlijk. Er is GEEN volg-afhandeling. Onze bibliotheek is openbaar --
alles erin heeft fedi_open -- dus er valt niets goed te keuren en de
volgerslijst is leeg en eerlijk. Komt er ooit een besloten variant, dan hoort
daar het Follow/Accept-werk bij en dat is een eigen stuk.

Een test bewaakt dat een GESLOTEN track er niet in komt. De bak is openbaar, en
dat kan alleen als er niets in zit dat het niet is -- anders overrulet de
openbaarheid van de bak de poort van de track.

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

Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    reac3229 r2091647  
    11421142});
    11431143
     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.
     1152router.get('/ap/users/:slug/library', (req, res) => {
     1153  const site = publicSite(req.params.slug);
     1154  if (!site) return res.status(404).end();
     1155  AP.sendAP(res, AP.buildLibrary(baseUrl(req), site, AP.siteOpenTracks(site.id)));
     1156});
     1157
     1158// De volgerscollectie die hun docs als vereist noemen. Leeg en eerlijk: er is
     1159// geen goedkeuringspad omdat de bibliotheek openbaar is.
     1160router.get('/ap/users/:slug/library/followers', (req, res) => {
     1161  const site = publicSite(req.params.slug);
     1162  if (!site) return res.status(404).end();
     1163  AP.sendAP(res, AP.pagedCollection(`${AP.libraryId(baseUrl(req), site)}/followers`, []));
     1164});
     1165
    11441166// Eén track, los op te halen. Een gesloten track is AFWEZIG, niet leeg: 404,
    11451167// dezelfde regel als in de collectie, zodat het bestaan van een gated nummer
  • src/services/ActivityPubService.js

    reac3229 r2091647  
    3939  buildPlaylistCollection, listPlaylistsAP, playlistLinkTags,
    4040  buildPostTrackCollection, uitgavePost,
     41  buildLibrary, libraryId,
    4142  licentieUri, channelCategory,
    4243} from './music/index.js';
     
    4647  buildPlaylistCollection, listPlaylistsAP, playlistLinkTags, licentieUri,
    4748  buildPostTrackCollection, uitgavePost,
     49  buildLibrary, libraryId,
    4850};
    4951
     
    68096811  buildPlaylistCollection, playlistOpenTracks, listPlaylistsAP, playlistLinkTags,
    68106812  buildPostTrackCollection, uitgavePost,
     6813  buildLibrary, libraryId,
    68116814  followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate, deliverDelete, deliverUpdate, deliverActorUpdate, resyncFeaturedPins,
    68126815  feedCursor, feedChangesSince, waitForFeedChange,
  • src/services/ap-core.js

    reac3229 r2091647  
    5757    // zou een verhuizing kunnen laten mislukken.
    5858    sameAs: { '@id': 'schema:sameAs', '@type': '@id' },
     59    // ── De ENIGE term die we uit Funkwhale's eigen vocabulaire overnemen ──
     60    //
     61    // Waarom deze wel en track/ArtistCredit niet (shaer-0nh): die twee vragen
     62    // ENTITEITEN waar wij tekst hebben -- een artiest en een album zijn bij ons
     63    // kolommen, en er een id voor verzinnen zou beloven wat we niet kunnen
     64    // waarmaken. Een Library is iets anders: het is precies wat we AL hebben,
     65    // een verzameling van onze eigen open tracks met een echte telling.
     66    //
     67    // En hij doet iets. Gemeten op 13-8: open.audio heeft onze vier tracks
     68    // binnengehaald via hun AP-id, met artist_credit dat het zelf uit onze
     69    // attributedTo afleidde -- maar uploads is LEEG en is_playable false. Bij
     70    // Funkwhale hangt een upload aan een library; zonder library is er geen bak
     71    // om het bestand in te hangen, en blijft een track een naam zonder geluid.
     72    fw: 'https://funkwhale.audio/ns#',
     73    Library: 'fw:Library',
     74    library: { '@id': 'fw:library', '@type': '@id' },
    5975    position: 'schema:position',
    6076    bitrate: 'schema:bitrate',
  • src/services/music/index.js

    reac3229 r2091647  
    168168    url: [...(post ? [{ type: 'Link', href: `${base}/${post.slug}`, mediaType: 'text/html' }] : []), bestand],
    169169  };
     170  // De bak waar dit bestand in hangt (shaer-0nh). Voor Funkwhale is dit het
     171  // haakje waaraan een upload komt te zitten; zonder dit veld blijft een track
     172  // daar een naam zonder geluid.
     173  a.library = libraryId(base, site);
    170174  if (r.artist) a.summary = r.artist;              // artiest als summary: kaal AS2, geen eigen vocab
    171175  // AS2-kern `context`: "de context waarbinnen dit object bestaat". Voor een
     
    211215  if (/^https?:\/\//i.test(s)) return safeUrl(s);   // iemand vulde al een URI in
    212216  return LICENTIES[s.toLowerCase()] || null;        // "Alle rechten voorbehouden" heeft er geen
     217}
     218
     219/** Het AS2-id van de bibliotheek van een site. */
     220export function libraryId(base, site) {
     221  return `${actorId(base, site.slug)}/library`;
     222}
     223
     224/**
     225 * De site als Funkwhale-LIBRARY (skelet).
     226 *
     227 * WAAROM DIT GEEN DIALECT IS ZOALS track EN ArtistCredit DAT WEL ZIJN. Die twee
     228 * vragen entiteiten waar wij tekst hebben; hiervoor hoeven we niets te
     229 * verzinnen. Een library is precies wat er al staat: onze open tracks, met een
     230 * echte telling en een echt id.
     231 *
     232 * WAAROM HET NODIG IS, gemeten op 13-8. open.audio heeft onze vier tracks
     233 * binnengehaald langs de AP-weg -- met ONZE track-id's, en met een artist_credit
     234 * dat Funkwhale zelf uit onze attributedTo afleidde. Maar `uploads` is leeg en
     235 * `is_playable` false. Bij hen hangt een upload aan een library; zonder library
     236 * is er geen bak om het bestand in te hangen. Het audiobestand zelf is wel
     237 * gewoon op te halen (200, audio/mpeg, ook anoniem) -- ze hebben het niet
     238 * geprobeerd.
     239 *
     240 * SKELET, en dat woord is letterlijk bedoeld. Dit is de vorm uit hun docs:
     241 * type, id, name, followers, totalItems, first, last, plus attributedTo en
     242 * summary. Wat er NIET is: de volg-afhandeling. Onze bibliotheek is openbaar --
     243 * elke track erin heeft fedi_open -- dus er valt niets goed te keuren. Komt er
     244 * ooit een besloten variant, dan hoort daar het Follow/Accept-werk bij.
     245 */
     246export function buildLibrary(base, site, rows) {
     247  const id = libraryId(base, site);
     248  const hostPosts = site.id ? trackHostPosts(site.id) : null;
     249  const items = (rows || []).map((r) => buildTrackAudio(base, site, r, { hostPosts }));
     250  return pagedCollection(id, items, {
     251    extra: {
     252      type: 'Library',
     253      name: site.title || site.slug,
     254      attributedTo: actorId(base, site.slug),
     255      // Vereist volgens hun docs. Openbaar, dus de telling is eerlijk en de
     256      // lijst blijft leeg -- wie ons volgt volgt de ACTOR, niet de bak.
     257      followers: `${id}/followers`,
     258      ...(site.description ? { summary: String(site.description).slice(0, 500) } : {}),
     259    },
     260  });
    213261}
    214262
Note: See TracChangeset for help on using the changeset viewer.