Changeset f704237 in Klonkt for test/archive-audio.test.js


Ignore:
Timestamp:
08/14/2026 02:35:06 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
47f1183
Parents:
fc664ce
Message:

Een track zonder bestand is niet hetzelfde als een kapotte track

Robin, over het ene nummer dat niet meekwam: "ah, dat was een no audio 'audio'
voor alleen spotify en youtube links". Dat is een bestaand Klonkt-type, geen
ongelukje: geen gehost bestand, wel externe links, en buildNote maakt er een
embed-kaart van (trackEmbedLinks). Mijn regel "geen bestand, geen track" was te
grof en gooide hem weg.

"Geen bestand" en "niets om te tonen" zijn niet hetzelfde. De regel blijft
staan waar hij hoort: een track zonder bestand EN zonder links wordt nog steeds
geweigerd, want die kan niets.

Het archiefformaat heeft nu drie staten in plaats van twee: included, missing,
en linkOnly. Een link-only track telt dus ook niet meer als "ontbrekend", want
er ontbreekt niets.

EN EEN TWEEDE FOUT DIE HIERONDER LAG. De pull viste de audio-URL uit de
url-lijst met element NUL. buildTrackAudio zet daar een text/html-link naar de
post voor het bestand: wie blind de eerste pakt downloadt een HTML-pagina en
schrijft die weg als mp3. Nu wordt de link met mediaType audio/* gezocht, met
/audio/stream/ als terugval. Dat het bij Robin niet misging is geluk: zijn
tracks hadden geen host-post in die lijst.

Changed files:
src/services/ArchiveExportService.js

  • shaer:availability kent linkOnly; die telt niet als audioMissing

src/services/ArchiveImportService.js

  • link-only tracks komen mee, met media_id NULL zoals op de bron
  • de schrijftak kan een track zonder bestand aan

src/services/MigrationService.js

  • de pull vist de audio-link uit de lijst in plaats van element nul
  • een track met alleen externe links wordt gewoon aangemaakt

test/archive-audio.test.js

  • link-only reist mee; zonder bestand en zonder links blijft geweigerd

test/fep1580-migration.test.js

  • hetzelfde voor de ophaalknop, plus: de audio-link wordt gevist

remarks: Robins Youngstown-nummer komt hiermee alsnog over. Suite 1009 groen;
tegenproef op beide, en de eerste poging daarvan kwam niet aan (te slordige
sabotage), dus opnieuw gedaan met twee rode tests als bewijs.

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

File:
1 edited

Legend:

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

    rfc664ce rf704237  
    258258});
    259259
     260test('een track met alleen Spotify/YouTube-links reist gewoon mee', () => {
     261  // Robins Youngstown-nummer. Klonkt kent link-only tracks: geen gehost
     262  // bestand, wel externe links, en buildNote maakt daar een embed-kaart van.
     263  // Mijn regel "geen bestand, geen track" gooide die weg, en dat was te grof:
     264  // "geen bestand" en "niets om te tonen" zijn niet hetzelfde.
     265  leeg();
     266  db.prepare(`INSERT INTO audio_tracks (id, site_id, title, artist, media_id, link_spotify, link_youtube)
     267              VALUES ('lo','s1','Alleen links','Youngstown',NULL,
     268                      'https://open.spotify.com/track/abc','https://www.youtube.com/watch?v=xyz')`).run();
     269
     270  const uit = AX.buildArchive('me');
     271  const rij = JSON.parse(uit.files.get('tracks.json').toString('utf8')).orderedItems.find((x) => x.id === 'lo');
     272  assert.equal(rij['shaer:availability'], 'linkOnly', 'een eigen staat, niet "missing"');
     273  assert.equal(uit.counts.audioMissing, 0, 'en hij telt niet als ontbrekend: er mist niets');
     274  assert.deepEqual(rij.url, ['https://open.spotify.com/track/abc', 'https://www.youtube.com/watch?v=xyz']);
     275
     276  leeg();
     277  const r = AI.importArchive(uit.files, { slug: 'me', origin: 'https://nieuw.test' });
     278  assert.equal(r.tracks, 1);
     279  assert.equal(r.tracksMissing, 0);
     280  const t = db.prepare("SELECT title, artist, media_id, link_spotify, link_youtube FROM audio_tracks WHERE id = 'lo'").get();
     281  assert.ok(t, 'de track hoort er te staan');
     282  assert.equal(t.media_id, null, 'zonder mediarij, precies zoals op de bron');
     283  assert.equal(t.title, 'Alleen links');
     284  assert.equal(t.link_spotify, 'https://open.spotify.com/track/abc');
     285  assert.equal(t.link_youtube, 'https://www.youtube.com/watch?v=xyz');
     286});
     287
     288test('een track zonder bestand EN zonder links blijft wel geweigerd', () => {
     289  // De oorspronkelijke regel blijft staan waar hij hoort: dit is een track die
     290  // niets kan tonen en niets kan afspelen.
     291  leeg();
     292  track('kapot', 'Kapot', { padInDb: '/weg/kapot.mp3', schrijf: false });
     293  const uit = AX.buildArchive('me');
     294  assert.equal(uit.counts.audioMissing, 1);
     295  leeg();
     296  const r = AI.importArchive(uit.files, { slug: 'me', origin: 'https://nieuw.test' });
     297  assert.equal(r.tracks, 0);
     298  assert.equal(r.tracksMissing, 1);
     299  assert.equal(db.prepare('SELECT COUNT(*) n FROM audio_tracks').get().n, 0);
     300});
     301
    260302test.after(() => { try { fs.rmSync(TMP, { recursive: true, force: true }); } catch { /* niets */ } });
Note: See TracChangeset for help on using the changeset viewer.