Changeset 749605a in Klonkt for src/services/ap-core.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/services/ap-core.js

    ra5515b4 r749605a  
    5757    // zou een verhuizing kunnen laten mislukken.
    5858    sameAs: { '@id': 'schema:sameAs', '@type': '@id' },
     59    // ── Wat we uit Funkwhale's vocabulaire overnemen, en waarom ──
     60    //
     61    // LIBRARY. Gemeten op 13-8: open.audio had onze vier tracks binnengehaald
     62    // via hun AP-id, met een artist_credit dat het zelf uit onze attributedTo
     63    // afleidde -- maar uploads LEEG en is_playable false. Bij Funkwhale hangt
     64    // een upload aan een library; zonder die bak blijft een track een naam
     65    // zonder geluid.
     66    //
     67    // TRACK. Hier stond dat we deze NIET namen, met als reden: hij vraagt een
     68    // entiteit waar wij tekst hebben, en er een id voor verzinnen belooft wat
     69    // we niet waarmaken. Die redenering klopte half, en de Emissary-meting van
     70    // 16-8 (shaer-3f8a) laat zien welke helft. Een TRACK heeft bij ons wel
     71    // degelijk een eigen identiteit -- het is een rij met een titel en een
     72    // plaats in een uitgave. Wat wij niet hebben is een ALBUM als entiteit, en
     73    // dat is een andere vraag (shaer-k37k). Emissary stuurt precies die kleine
     74    // vorm: type, id, name, position. Wij ook, en album blijft eruit tot het
     75    // een echt object is -- een verzonnen album-URI is nu juist wel de belofte
     76    // die we niet kunnen waarmaken.
     77    //
     78    // Twee onafhankelijke implementaties zenden dit nu, en het is de kant waar
     79    // FEP-be68 heen beweegt. ArtistCredit blijft eruit: dat is nog steeds een
     80    // entiteit die wij niet hebben.
     81    //
     82    // De vorm van de termen is letterlijk die van hun contexts.py (regel
     83    // 293-306), zodat een lezer die hun context laadt en een lezer die de onze
     84    // leest op dezelfde IRI's uitkomen.
     85    fw: 'https://funkwhale.audio/ns#',
     86    Library: 'fw:Library',
     87    library: { '@id': 'fw:library', '@type': '@id' },
     88    Track: 'fw:Track',
     89    track: { '@id': 'fw:track', '@type': '@id' },
     90    // ARTIEST-CREDIT. Hun TrackSerializer eist minstens een artist_credit, en
     91    // dat leek lang onmogelijk: het vraagt een Artist met een eigen id, en bij
     92    // ons was een artiest tekst. Sinds de MusicBrainz-koppeling (shaer-mbz) is
     93    // dat niet meer waar -- de site-ACTOR is de artiest. Een echte, opvraagbare
     94    // URI, met de sitetitel als naam en een musicbrainzId als hij gekoppeld is.
     95    // Er valt hier niets te verzinnen; open.audio leidde dit zelfs al zelf af
     96    // uit onze attributedTo (gemeten 13-8).
     97    //
     98    // `@container: @list` is GEEN opsmuk. Ze lezen dit veld met
     99    // first_attr(FW.artist_credit, "@list"), en zonder die declaratie expandeert
     100    // onze array niet naar een @list -- dan staat er iets dat er goed uitziet en
     101    // door hun lezer niet gevonden wordt. Letterlijk hun contexts.py regel 311.
     102    Artist: 'fw:Artist',
     103    ArtistCredit: 'fw:ArtistCredit',
     104    artist: { '@id': 'fw:artist', '@type': '@id' },
     105    artist_credit: { '@id': 'fw:artist_credit', '@type': '@id', '@container': '@list' },
     106    credit: 'fw:credit',
     107    musicbrainzId: 'fw:musicbrainzId',
    59108    position: 'schema:position',
    60109    bitrate: 'schema:bitrate',
     
    249298 * en zonder `next`. Hem naar de laatste pagina terugbuigen zou opnieuw een
    250299 * antwoord zijn dat over zichzelf liegt.
    251  */
    252 export function pagedCollection(id, items, { totalItems, page = false, perPage = PAGINA_GROOTTE, alGesneden = false, extra = {} } = {}) {
     300 *
     301 * `ongeordend` maakt er de NIET-geordende vorm van: `Collection` met
     302 * `CollectionPage` en `items`, in plaats van `OrderedCollection` met
     303 * `OrderedCollectionPage` en `orderedItems`. Dat is geen dialect maar de andere
     304 * helft van AS2 -- en de bibliotheek hoort daar: een platenkast heeft geen
     305 * volgorde die iets betekent, en `Library` is bij Funkwhale expliciet een
     306 * `Collection`. Onze outbox is wél geordend (chronologie is daar de inhoud) en
     307 * blijft dus zoals hij was.
     308 *
     309 * De pagina draagt in die vorm ook `first` en `last`. AS2 staat dat toe --
     310 * CollectionPage erft van Collection -- en een lezer die halverwege binnenkomt
     311 * kan zo terug naar het begin zonder eerst de wortel op te halen.
     312 */
     313export function pagedCollection(id, items, { totalItems, page = false, perPage = PAGINA_GROOTTE, alGesneden = false, ongeordend = false, extra = {} } = {}) {
    253314  const lijst = items || [];
    254315  const telling = totalItems === undefined ? lijst.length : totalItems;
     
    267328      '@context': AP_CONTEXT,
    268329      id: url(n),
    269       type: 'OrderedCollectionPage',
     330      type: ongeordend ? 'CollectionPage' : 'OrderedCollectionPage',
    270331      partOf: id,
    271332      totalItems: telling,
     333      ...(ongeordend ? { first: url(1), last: url(paginas) } : {}),
     334      ...(extra.attributedTo ? { attributedTo: extra.attributedTo } : {}),
    272335      ...(n > 1 ? { prev: url(n - 1) } : {}),
    273336      ...(n < paginas ? { next: url(n + 1) } : {}),
    274       orderedItems: deel,
     337      ...(ongeordend ? { items: deel } : { orderedItems: deel }),
    275338    };
    276339  }
     
    278341    '@context': AP_CONTEXT,
    279342    id,
    280     type: 'OrderedCollection',
     343    type: ongeordend ? 'Collection' : 'OrderedCollection',
    281344    ...extra,
    282345    totalItems: telling,
    283346    first: url(1),
    284347    last: url(paginas),
    285     orderedItems: lijst,
     348    ...(ongeordend ? { items: lijst } : { orderedItems: lijst }),
    286349  };
    287350}
Note: See TracChangeset for help on using the changeset viewer.