Changeset 98acb97 in Klonkt for test/archive-audio.test.js


Ignore:
Timestamp:
08/14/2026 12:03:55 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
eb071a7
Parents:
9529d7b
Message:

Hoezen en playlists reisden nog niet mee

Robin, na de vorige ronde: "de audio tracks hadden images, die zijn niet
meegegaan, de playlists zijn ook nog niet meegegaan via peer to peer."

Allebei terecht, en de eerste is dezelfde fout als bij de audio zelf, een laag
hoger. cover_url ging wel mee als STRING en het bestand niet. Dus kwam een
nummer aan met een verwijzing naar een plaatje dat er niet was: precies de
halve waarheid die deze hele reeks moest opruimen, en ik liep er zelf opnieuw
in.

De playlists gingen wel via de zip en niet via de ophaalknop. Die liep de
tracks-collectie af en de playlist-collectie niet, en dan heb je alle muziek
en geen enkele plaat. De volgorde staat nergens anders.

Wat er nog meer boven kwam bij het naspelen: over AP komt de duur als
ISO-8601 ("PT212S") binnen en de database wil seconden, en de artiest zit in
summary, niet in een artist-veld. Zonder die twee kwamen nummers naamloos en
zonder duur aan.

En de bronkant moest ook hier open: playlistOpenTracks filtert op fedi_open,
dus de doel-actor kreeg een plaat met gaten. Nu geldt daar dezelfde regel als
bij de outbox en de tracks.

Bewezen op twee draaiende instanties, 3 nummers met hoes plus een plaat in de
volgorde c-a-b:

peer to peer mp3 2503b, hoes 74b, artiest, duur, plaat C -> A -> B
zip idem, plus kind=album

Changed files:
src/services/ArchiveExportService.js

  • hoesToevoegen(): de BYTES van een hoes in het archief, voor tracks en playlists, met shaer:coverFile ernaast

src/services/ArchiveImportService.js

  • hoesTerug(): de hoes op schijf en cover_url daarheen; geen bestand betekent geen cover_url, liever niets dan een img die 404't

src/services/MigrationService.js

  • de ingest haalt de hoes op uit icon/image, ONDERTEKEND
  • de playlists erbij, met hun volgorde en een kaart bron-URI -> nieuw id
  • duurSeconden(): PT212S naar 212; artiest uit summary

src/services/music/index.js

  • playlistOpenTracks({ alles }) voor de doel-actor van een Move

src/routes/activitypub.js

  • de playlist-route geeft die doel-actor de volledige plaat

remarks: over AP komt kind (album/playlist) niet mee, want de AP-collectie
draagt dat veld niet; via de zip wel. Klein verschil, apart te repareren als het
hindert.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/archive-audio.test.js

    r9529d7b r98acb97  
    188188});
    189189
     190
     191test('de hoes van een nummer reist mee als BESTAND, niet als losse verwijzing', () => {
     192  // Robin na de tweede ronde: "de audio tracks hadden images, die zijn niet
     193  // meegegaan". cover_url ging wel mee als string en het bestand niet, dus kwam
     194  // een nummer aan met een verwijzing naar een plaatje dat er niet was.
     195  // Dezelfde fout als bij de audio zelf, een laag hoger.
     196  leeg();
     197  const hoesDir = path.join(MEDIA, 'hoes');
     198  fs.mkdirSync(hoesDir, { recursive: true });
     199  const PNG = Buffer.from('nep-png-bytes');
     200  fs.writeFileSync(path.join(hoesDir, 'a.png'), PNG);
     201  track('h1', 'Met hoes');
     202  db.prepare("UPDATE audio_tracks SET cover_url = '/media/hoes/a.png' WHERE id = 'h1'").run();
     203  db.prepare("INSERT INTO playlists (id, site_id, title, cover_url) VALUES ('plh','s1','Plaat','/media/hoes/a.png')").run();
     204  db.prepare("INSERT INTO playlist_tracks (playlist_id, track_id, position) VALUES ('plh','h1',0)").run();
     205
     206  const uit = AX.buildArchive('me');
     207  const rij = JSON.parse(uit.files.get('tracks.json').toString('utf8')).orderedItems[0];
     208  assert.ok(rij['shaer:coverFile'], 'de hoes hoort een plek in het archief te hebben');
     209  assert.deepEqual(uit.files.get(rij['shaer:coverFile']), PNG, 'met de echte bytes erin');
     210  const pl = JSON.parse(uit.files.get('playlists.json').toString('utf8')).orderedItems[0];
     211  assert.ok(pl['shaer:coverFile'], 'en de hoes van de plaat ook');
     212
     213  leeg();
     214  AI.importArchive(uit.files, { slug: 'me', origin: 'https://nieuw.test' });
     215  const t = db.prepare("SELECT cover_url FROM audio_tracks WHERE id = 'h1'").get();
     216  assert.ok(t.cover_url, 'na de import wijst het nummer naar een hoes');
     217  const opSchijf = path.join(MEDIA, t.cover_url.replace(/^\/media\//, ''));
     218  assert.deepEqual(fs.readFileSync(opSchijf), PNG, 'en die staat er ook echt');
     219});
     220
     221test('een hoes die niet in het archief zit levert GEEN kapotte verwijzing op', () => {
     222  // Liever geen hoes dan een <img> die 404't. Dezelfde regel als bij de tracks.
     223  leeg();
     224  track('h2', 'Hoes zoek');
     225  db.prepare("UPDATE audio_tracks SET cover_url = '/media/bestaat/niet.png' WHERE id = 'h2'").run();
     226  const uit = AX.buildArchive('me');
     227  const rij = JSON.parse(uit.files.get('tracks.json').toString('utf8')).orderedItems[0];
     228  assert.equal(rij['shaer:coverFile'], undefined);
     229
     230  leeg();
     231  AI.importArchive(uit.files, { slug: 'me', origin: 'https://nieuw.test' });
     232  assert.equal(db.prepare("SELECT cover_url FROM audio_tracks WHERE id = 'h2'").get().cover_url, null,
     233    'geen verwijzing naar een plaatje dat er niet is');
     234});
     235
    190236test.after(() => { try { fs.rmSync(TMP, { recursive: true, force: true }); } catch { /* niets */ } });
Note: See TracChangeset for help on using the changeset viewer.