Changeset eb071a7 in Klonkt for src/services/MigrationService.js


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
  • src/services/MigrationService.js

    r98acb97 reb071a7  
    8484export function alGemigreerd(slug, origin) {
    8585  try { return !!db.prepare('SELECT 1 FROM ap_migration WHERE slug = ? AND origin = ?').get(slug, String(origin)); } catch { return false; }
     86}
     87
     88/**
     89 * Waar kwam deze bron-URI hier terecht? Null als hij nog niet gemigreerd is.
     90 *
     91 * Bestaat omdat "al gehad" en "overslaan" niet hetzelfde horen te zijn. Een
     92 * tweede ronde na een uitgebreide ingest (hoezen, duur, playlists erbij) moet
     93 * de bestaande nummers KUNNEN AANVULLEN in plaats van ze te passeren. Deed hij
     94 * dat niet, dan zat je vast: opnieuw ophalen sloeg alles over, en opruimen hielp
     95 * niet omdat deze tabel de blokkade in stand hield.
     96 */
     97export function migrationTarget(slug, origin) {
     98  try {
     99    const r = db.prepare('SELECT target FROM ap_migration WHERE slug = ? AND origin = ?').get(slug, String(origin));
     100    return r ? r.target : null;
     101  } catch { return null; }
    86102}
    87103
     
    346362  const rapport = {
    347363    bron: bronActor.id, posts: 0, overgeslagen: 0, media: 0, mediaMislukt: 0,
    348     blocks: 0, tracksBinnen: 0, tracksMislukt: 0, overgeslagenTracks: 0,
     364    blocks: 0, tracksBinnen: 0, tracksMislukt: 0, tracksBijgewerkt: 0, overgeslagenTracks: 0,
    349365    playlistsBinnen: 0, playlistsMislukt: 0, waarschuwingen: [],
    350366  };
     
    480496        if (!a || !a.id) continue;
    481497        if (a.type && a.type !== 'Audio') continue;
    482         if (alGemigreerd(site.slug, a.id)) { rapport.overgeslagenTracks++; continue; }
     498        // AL BINNEN? Dan AANVULLEN, niet overslaan. Een tweede ronde bestaat
     499        // juist omdat er iets bij is gekomen (hoezen, duur, playlists), en een
     500        // pull die dan alles passeert laat je met een half resultaat zitten
     501        // zonder uitweg: opruimen hielp niet, want deze tabel hield de blokkade
     502        // in stand.
     503        //
     504        // Alleen LEGE velden worden gevuld. Wat jij zelf hebt aangepast blijft
     505        // staan; een migratie hoort je correcties niet terug te draaien.
     506        const eerder = migrationTarget(site.slug, a.id);
     507        if (eerder) {
     508          const lokaalId = String(eerder).split('/').pop();
     509          const rij = db.prepare('SELECT id, cover_url, duration, artist FROM audio_tracks WHERE id = ? AND site_id = ?')
     510            .get(lokaalId, site.id);
     511          if (rij) {
     512            trackKaart.set(String(a.id), rij.id);   // MOET, anders vinden de playlists hem niet
     513            const duur = rij.duration ? null : duurSeconden(a.duration);
     514            const artiest = rij.artist ? null : (a.summary || a.artist || null);
     515            let hoes = null;
     516            const hUrl = (a.icon && (a.icon.url || a.icon)) || (a.image && (a.image.url || a.image)) || null;
     517            if (!rij.cover_url && hUrl && /^https?:\/\//i.test(String(hUrl)) && safeFetch && fs && path && mediaRoot) {
     518              const h = await haalBijlage(String(hUrl), {
     519                safeFetch, mediaRoot, fs, path, maxBytes,
     520                headers: signHeaders ? signHeaders(site.slug, String(hUrl), '*/*') : null,
     521              }).catch(() => null);
     522              if (h) { hoes = h.url; rapport.media++; }
     523            }
     524            if (duur || artiest || hoes) {
     525              db.prepare(`UPDATE audio_tracks SET
     526                            duration = COALESCE(?, duration),
     527                            artist = COALESCE(?, artist),
     528                            cover_url = COALESCE(?, cover_url)
     529                          WHERE id = ?`).run(duur, artiest, hoes, rij.id);
     530              rapport.tracksBijgewerkt++;
     531            } else {
     532              rapport.overgeslagenTracks++;
     533            }
     534            continue;
     535          }
     536          // De rij is weg maar de mapping staat er nog. Dan is opnieuw ophalen
     537          // precies wat je wilt, dus we vallen door naar de gewone tak.
     538        }
    483539        const bron = a.url && (typeof a.url === 'string' ? a.url : (Array.isArray(a.url) ? (a.url[0] && (a.url[0].href || a.url[0])) : a.url.href));
    484540        if (!bron || !/^https?:\/\//i.test(String(bron))) { rapport.tracksMislukt++; continue; }
     
    549605          continue;
    550606        }
    551         const plId = crypto.randomUUID();
     607        // Bestond hij al? Dan dezelfde rij bijwerken. Zonder deze stap levert
     608        // elke tweede ronde een dubbele plaat op.
     609        const eerderPl = migrationTarget(site.slug, uri);
     610        const plId = (() => {
     611          if (!eerderPl) return crypto.randomUUID();
     612          const bestaand = String(eerderPl).split('/').pop();
     613          return db.prepare('SELECT 1 FROM playlists WHERE id = ? AND site_id = ?').get(bestaand, site.id)
     614            ? bestaand : crypto.randomUUID();
     615        })();
    552616        try {
    553           db.prepare('INSERT INTO playlists (id, site_id, title, artist, year, kind) VALUES (?,?,?,?,?,?)')
    554             .run(plId, site.id, plc.name || 'zonder titel', plc.attributedTo && plc.artist || plc.artist || null,
     617          db.prepare(`INSERT INTO playlists (id, site_id, title, artist, year, kind) VALUES (?,?,?,?,?,?)
     618                      ON CONFLICT(id) DO UPDATE SET title = excluded.title, artist = COALESCE(playlists.artist, excluded.artist)`)
     619            .run(plId, site.id, plc.name || 'zonder titel', plc.artist || null,
    555620              plc.year || null, plc['shaer:kind'] || null);
     621          // De volgorde opnieuw zetten: die IS de plaat, en een halve
     622          // bijgewerkte volgorde is erger dan een verse.
     623          db.prepare('DELETE FROM playlist_tracks WHERE playlist_id = ?').run(plId);
    556624          const ins = db.prepare('INSERT OR IGNORE INTO playlist_tracks (playlist_id, track_id, position) VALUES (?,?,?)');
    557625          nummers.forEach((tid, i) => ins.run(plId, tid, i));
     626          recordMigrated(site.slug, { origin: uri, target: `${me}/ap/playlists/${plId}`, sourceActor: bronActor.id, isPublic: false });
    558627          rapport.playlistsBinnen++;
    559628          const kwijt = (plc.orderedItems || plc.items || []).length - nummers.length;
Note: See TracChangeset for help on using the changeset viewer.