Changeset 2091647 in Klonkt for src/services/music


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@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.