Changeset 2091647 in Klonkt
- Timestamp:
- 08/15/2026 07:03:06 AM (4 weeks ago)
- Branches:
- main
- Children:
- 732272a
- Parents:
- eac3229
- Files:
-
- 1 added
- 4 edited
-
src/routes/activitypub.js (modified) (1 diff)
-
src/services/ActivityPubService.js (modified) (3 diffs)
-
src/services/ap-core.js (modified) (1 diff)
-
src/services/music/index.js (modified) (2 diffs)
-
test/ap-library.test.js (added)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/activitypub.js
reac3229 r2091647 1142 1142 }); 1143 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 router.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. 1160 router.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 1144 1166 // Eén track, los op te halen. Een gesloten track is AFWEZIG, niet leeg: 404, 1145 1167 // dezelfde regel als in de collectie, zodat het bestaan van een gated nummer -
src/services/ActivityPubService.js
reac3229 r2091647 39 39 buildPlaylistCollection, listPlaylistsAP, playlistLinkTags, 40 40 buildPostTrackCollection, uitgavePost, 41 buildLibrary, libraryId, 41 42 licentieUri, channelCategory, 42 43 } from './music/index.js'; … … 46 47 buildPlaylistCollection, listPlaylistsAP, playlistLinkTags, licentieUri, 47 48 buildPostTrackCollection, uitgavePost, 49 buildLibrary, libraryId, 48 50 }; 49 51 … … 6809 6811 buildPlaylistCollection, playlistOpenTracks, listPlaylistsAP, playlistLinkTags, 6810 6812 buildPostTrackCollection, uitgavePost, 6813 buildLibrary, libraryId, 6811 6814 followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate, deliverDelete, deliverUpdate, deliverActorUpdate, resyncFeaturedPins, 6812 6815 feedCursor, feedChangesSince, waitForFeedChange, -
src/services/ap-core.js
reac3229 r2091647 57 57 // zou een verhuizing kunnen laten mislukken. 58 58 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' }, 59 75 position: 'schema:position', 60 76 bitrate: 'schema:bitrate', -
src/services/music/index.js
reac3229 r2091647 168 168 url: [...(post ? [{ type: 'Link', href: `${base}/${post.slug}`, mediaType: 'text/html' }] : []), bestand], 169 169 }; 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); 170 174 if (r.artist) a.summary = r.artist; // artiest als summary: kaal AS2, geen eigen vocab 171 175 // AS2-kern `context`: "de context waarbinnen dit object bestaat". Voor een … … 211 215 if (/^https?:\/\//i.test(s)) return safeUrl(s); // iemand vulde al een URI in 212 216 return LICENTIES[s.toLowerCase()] || null; // "Alle rechten voorbehouden" heeft er geen 217 } 218 219 /** Het AS2-id van de bibliotheek van een site. */ 220 export 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 */ 246 export 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 }); 213 261 } 214 262
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)