Changeset eb071a7 in Klonkt for test


Ignore:
Timestamp:
08/14/2026 12:12:58 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
919b82d
Parents:
98acb97
Message:

Een tweede ronde vult aan in plaats van over te slaan

Robin vroeg of hij eerst moest opschonen. Bij het uitzoeken bleek dat het
antwoord "ja" had moeten zijn, en dat dat een val in mijn eigen ontwerp was.

De ingest onthield per bron-URI dat hij hem gehad had, en passeerde hem daarna
altijd. Dat is prima zolang er niets verandert, maar er kwam juist iets bij:
hoezen, duur en playlists. Wie al opgehaald had zat vast. Opnieuw drukken sloeg
alles over, en opruimen hielp niet, want die blokkade zat in ap_migration en
niet in de tracks. Je zou drie dingen tegelijk moeten wissen om er los te komen,
en dat is geen opdracht die je een gebruiker geeft.

Nu kijkt hij op waar een bron-URI hier terechtkwam, en vult LEGE velden aan op
de rij die er al staat. Wat je zelf hebt aangepast blijft staan: een migratie
hoort je correcties niet terug te draaien. Het geluidsbestand wordt niet opnieuw
gedownload. Playlists werken hetzelfde: dezelfde rij, en de volgorde opnieuw
gezet, want een half bijgewerkte volgorde is erger dan een verse.

Gemeten op de gemeten stand van soundfabrics.nl (139 nummers met bestand, geen
hoes, geen duur, geen playlist), nagebouwd met 3 nummers:

ronde 1 3 nummers binnen, geen hoes, duur 212s uit PT212S
ronde 2 0 erbij, 3 aangevuld, 1 playlist, geen dubbele, mp3 niet opnieuw
ronde 3 0 aangevuld, alles compleet, niets verandert

Changed files:
src/services/MigrationService.js

  • migrationTarget(): waar kwam deze bron-URI terecht
  • tracks worden aangevuld in plaats van gepasseerd; alleen lege velden
  • de trackkaart wordt OOK in die tak gevuld, anders vinden de playlists hun nummers niet en komt er geen plaat
  • playlists werken dezelfde kant op, met hun eigen mapping

src/views/pages/admin-migrate.ejs

  • "nummers aangevuld" en playlists in het ophaalverslag; anders meldt een ronde die drie nummers compleet maakte "0 erbij gekomen"

src/services/i18n.js

  • mig.r_tracks_updated in nl/en/de

remarks: het verslag zegt ook "1 playlists" als er niets aan die plaat
veranderde, want de volgorde wordt elke ronde opnieuw gezet. Klopt wel, leest
iets te groot. Robin hoeft nu niets op te schonen: een keer ophalen na de uitrol
volstaat.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/fep1580-migration.test.js

    r98acb97 reb071a7  
    398398});
    399399
     400test('een tweede ronde VULT AAN en slaat niet over', async () => {
     401  // De val die Robin bijna in liep: de eerste versie van de ingest onthield per
     402  // bron-URI "al gehad" en passeerde die daarna altijd. Kwam er later iets bij
     403  // (hoezen, duur, playlists), dan kon je opnieuw drukken zoveel je wilde en
     404  // gebeurde er niets. Opruimen hielp ook niet, want ap_migration hield de
     405  // blokkade in stand. Dus: aanvullen, niet overslaan.
     406  const s = site({ aliases: [BRON] });
     407  const AUDIO = `${BRON}/audio/x.mp3`;
     408  const HOES = `${BRON}/media/hoes.png`;
     409  const maakKaart = (metHoes) => new Map([
     410    [BRON, { id: BRON, type: 'Person', movedTo: IK, outbox: `${BRON}/outbox`, streams: [`${BRON}/tracks`] }],
     411    [`${BRON}/outbox`, { type: 'OrderedCollection', orderedItems: [] }],
     412    [`${BRON}/tracks`, {
     413      type: 'OrderedCollection',
     414      orderedItems: [{
     415        id: `${BRON}/tracks/t1`, type: 'Audio', name: 'Nummer', summary: 'Robo', duration: 'PT212S',
     416        url: [{ type: 'Link', href: AUDIO, mediaType: 'audio/mpeg' }],
     417        ...(metHoes ? { icon: { type: 'Image', url: HOES } } : {}),
     418      }],
     419    }],
     420  ]);
     421  const gehaald = [];
     422  const deps = (metHoes) => ({
     423    getJson: async (_slug, url) => maakKaart(metHoes).get(url) || null,
     424    noteId: (b, id) => `${b}/ap/notes/${id}`,
     425    noteVisibility: AP.noteVisibility,
     426    audioRoot: '/nep/audio', mediaRoot: '/nep/media',
     427    signHeaders: () => ({ Signature: 'nep' }),
     428    safeFetch: async (url) => {
     429      gehaald.push(url);
     430      return { ok: true, arrayBuffer: async () => Buffer.from('x'), headers: { get: () => 'audio/mpeg' } };
     431    },
     432    fs: { mkdirSync() {}, writeFileSync() {} },
     433    path,
     434  });
     435
     436  // Ronde 1: zonder hoes, zoals de eerste uitrol.
     437  const r1 = await stil(() => Mig.ingestFromSource(s, { deps: deps(false) }));
     438  assert.equal(r1.tracksBinnen, 1);
     439  const na1 = db.prepare('SELECT id, cover_url, duration FROM audio_tracks').get();
     440  assert.equal(na1.cover_url, null);
     441  assert.equal(na1.duration, 212, 'PT212S hoort 212 seconden te worden');
     442
     443  // Ronde 2: nu MET hoes. Hij moet aanvullen, niet passeren en niet verdubbelen.
     444  const voor = gehaald.length;
     445  const r2 = await stil(() => Mig.ingestFromSource(s, { deps: deps(true) }));
     446  assert.equal(r2.tracksBinnen, 0, 'er komt niets nieuws bij');
     447  assert.equal(r2.tracksBijgewerkt, 1, 'maar het bestaande nummer wordt wel aangevuld');
     448  assert.equal(db.prepare('SELECT COUNT(*) n FROM audio_tracks').get().n, 1, 'geen dubbele');
     449  const na2 = db.prepare('SELECT id, cover_url FROM audio_tracks').get();
     450  assert.equal(na2.id, na1.id, 'dezelfde rij, niet een nieuwe');
     451  assert.ok(na2.cover_url, 'en de hoes is er nu wel');
     452  assert.ok(!gehaald.slice(voor).includes(AUDIO), 'het geluidsbestand wordt NIET opnieuw gedownload');
     453
     454  // Ronde 3: alles compleet, dus er valt niets meer aan te vullen.
     455  const r3 = await stil(() => Mig.ingestFromSource(s, { deps: deps(true) }));
     456  assert.equal(r3.tracksBijgewerkt, 0);
     457  assert.equal(r3.overgeslagenTracks, 1);
     458});
     459
    400460test('een niet-publiek bericht komt wel mee maar niet in de publieke tabel', async () => {
    401461  const s = site({ aliases: [BRON] });
Note: See TracChangeset for help on using the changeset viewer.