Changeset aebde2b in Klonkt for test/ap-fw-track.test.js


Ignore:
Timestamp:
08/16/2026 02:03:14 PM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
7090fd2
Parents:
d68ee3a
Message:

Album als eigen object op de draad (shaer-756s, stap 2)

De uitgave -- een playlist met kind='album' -- gaat nu als fw:Album mee op
elke track die erop staat: type, id, name, published, released,
musicbrainzId, image en een eigen artist_credit.

INGESLOTEN EN NIET ALS URI, en dat is de kern. Hun TrackSerializer heeft
album = AlbumSerializer(): een object met eigen verplichte velden. Een
kale URI expandeert naar een knoop met alleen een @id en valt daar af --
precies waarom Emissary's tracks bij Funkwhale net zo goed stranden,
terwijl ze het veld wel sturen. Als URI staat het album daarnaast op het
Audio-object zelf, zoals Funkwhale 2.0 en Emissary allebei doen.

Het id is de BESTAANDE playlist-collectie. Geen tweede adres voor een
ding dat er al een heeft, en die URI draagt nu dezelfde albumvelden zodat
er hetzelfde staat als in het ingesloten object.

type op die collectie blijft OrderedCollection, en blijft een STRING.
Er stond hier even ['OrderedCollection','Album'] -- geldig AS2, en het is
ook werkelijk allebei -- maar een bestaande test viel erover en had
gelijk: een lezer die type als tekst uitpakt (Shaer) verliest dan in
stilte de hele playlist. Het kost niets, want hun AlbumSerializer
declareert geen type-veld en valideert het dus niet.

trackAlbums() zoekt in EEN query op, zoals trackHostPosts: per track
vragen wordt bij tweehonderd nummers tweehonderd queries. Alleen
kind='album' telt mee -- een mixtape is geen uitgave, en zou hij hier wel
een album opleveren dan was dat onderscheid decoratie.

artistCredit() is nu gedeeld door track en album. Twee keer los bouwen is
hoe een nummer en de plaat waar hij op staat een verschillende artiest
krijgen.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/ap-fw-track.test.js

    rd68ee3a raebde2b  
    5555});
    5656
    57 test('geen album zolang het bij ons geen object is', () => {
    58   // Een tekstkolom als URI meesturen is een adres beloven dat niet bestaat.
    59   assert.equal(audio('t1').track.album, undefined);
     57test('een track zonder uitgave draagt GEEN album', () => {
     58  // Dit stond er in stap 1 als "nog geen album, want we hebben er geen object
     59  // voor". Sinds stap 2 hebben we dat wel -- de album-playlist -- en is de regel
     60  // scherper: geen uitgave, geen veld. De tekstkolom `album` op de track blijft
     61  // buiten de draad, want dat is een label en geen adres.
     62  db.prepare("INSERT INTO media (id, site_id, filename, storage_path, mime_type, size) VALUES ('m9','s1','los.mp3','a/los.mp3','audio/mpeg',10)").run();
     63  db.prepare("INSERT INTO audio_tracks (id, site_id, title, album, media_id, fedi_open) VALUES ('t9','s1','Losse track','Een Albumnaam','m9',1)").run();
     64  const a = audio('t9');
     65  assert.equal(a.track.album, undefined, 'een albumNAAM is geen album');
     66  assert.equal(a.album, undefined);
    6067});
    6168
     
    136143  db.prepare("UPDATE sites SET mb_artist_id = NULL WHERE id = 's1'").run();
    137144});
     145
     146// ── het album ingesloten (shaer-756s, stap 2) ────────────────────────
     147//
     148// Hun TrackSerializer heeft `album = AlbumSerializer()`: een OBJECT met name,
     149// published en een eigen artist_credit. Een kale URI expandeert naar een knoop
     150// met alleen een @id en valt daar af -- dat is precies waarom Emissary's tracks
     151// bij Funkwhale ook stranden.
     152
     153db.prepare(`INSERT INTO playlists (id, site_id, title, artist, year, cover_url, kind, release_date, mb_release_id, created_at)
     154            VALUES ('de-plaat','s1','De Plaat','De Band',2024,'/media/hoes.jpg','album','2024-03-15','7c5a9b2e-1111-4222-8333-944455556666','2026-01-01T00:00:00Z')`).run();
     155db.prepare("INSERT INTO playlist_tracks (playlist_id, track_id, position) VALUES ('de-plaat','t1',1)").run();
     156// t2 zit in een MIXTAPE en hoort dus geen album te krijgen.
     157db.prepare("INSERT INTO playlists (id, site_id, title, kind) VALUES ('de-mix','s1','De Mix','playlist')").run();
     158db.prepare("INSERT INTO playlist_tracks (playlist_id, track_id, position) VALUES ('de-mix','t2',1)").run();
     159
     160test('een track op een uitgave draagt het album als OBJECT', () => {
     161  const a = audio('t1');
     162  const al = a.track.album;
     163  assert.ok(al && typeof al === 'object', 'album is geen object');
     164  assert.equal(al.type, 'Album');
     165  assert.equal(al.id, `${BASE}/ap/users/band/playlists/de-plaat`, 'het id is de bestaande collectie');
     166  assert.equal(al.name, 'De Plaat');
     167  assert.ok(al.published, 'MusicEntitySerializer eist published');
     168  assert.equal(al.released, '2024-03-15');
     169  assert.equal(al.musicbrainzId, '7c5a9b2e-1111-4222-8333-944455556666');
     170  assert.ok(Array.isArray(al.artist_credit) && al.artist_credit.length >= 1, 'album zonder artist_credit');
     171  assert.equal(al.image.type, 'Image');
     172  // Ook als URI op de Audio zelf -- Funkwhale 2.0 en Emissary doen dat allebei.
     173  assert.equal(a.album, al.id);
     174});
     175
     176test('een track in een MIXTAPE krijgt geen album', () => {
     177  // Een afspeellijst is geen uitgave. Zou hij hier een album krijgen, dan was
     178  // het onderscheid album/playlist decoratie.
     179  const a = audio('t2');
     180  assert.equal(a.track.album, undefined);
     181  assert.equal(a.album, undefined);
     182});
     183
     184test('track en album delen dezelfde artiest', () => {
     185  // Twee keer los bouwen is hoe ze uit elkaar gaan lopen; er is een functie.
     186  const a = audio('t1');
     187  assert.deepEqual(a.track.artist_credit[0].artist, a.track.album.artist_credit[0].artist);
     188});
     189
     190test('de playlist-collectie draagt de albumvelden, met type als STRING', () => {
     191  const pl = db.prepare("SELECT * FROM playlists WHERE id = 'de-plaat'").get();
     192  const col = AP.buildPlaylistCollection(BASE, site, pl, AP.playlistOpenTracks('de-plaat'));
     193  assert.equal(typeof col.type, 'string', 'een array breekt lezers die type als tekst uitpakken');
     194  assert.equal(col.type, 'OrderedCollection');
     195  assert.equal(col.released, '2024-03-15');
     196  assert.equal(col.musicbrainzId, '7c5a9b2e-1111-4222-8333-944455556666');
     197  assert.ok(col.artist_credit);
     198});
     199
     200test('een mixtape-collectie krijgt GEEN albumvelden', () => {
     201  const pl = db.prepare("SELECT * FROM playlists WHERE id = 'de-mix'").get();
     202  const col = AP.buildPlaylistCollection(BASE, site, pl, AP.playlistOpenTracks('de-mix'));
     203  assert.equal(col.released, undefined);
     204  assert.equal(col.artist_credit, undefined);
     205});
Note: See TracChangeset for help on using the changeset viewer.