Changeset f704237 in Klonkt for src/services/MigrationService.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
  • src/services/MigrationService.js

    rfc664ce rf704237  
    512512  const rapport = {
    513513    bron: bronActor.id, posts: 0, overgeslagen: 0, opnieuw: 0, postsBijgewerkt: 0, media: 0, mediaMislukt: 0,
    514     blocks: 0, tracksBinnen: 0, tracksMislukt: 0, tracksBijgewerkt: 0, overgeslagenTracks: 0,
     514    blocks: 0, tracksBinnen: 0, tracksMislukt: 0, tracksBijgewerkt: 0, tracksLinks: 0, overgeslagenTracks: 0,
    515515    playlistsBinnen: 0, playlistsMislukt: 0, waarschuwingen: [],
    516516  };
     
    769769          }
    770770        }
    771         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));
    772         if (!bron || !/^https?:\/\//i.test(String(bron))) { rapport.tracksMislukt++; continue; }
     771        // Uit de url-lijst de LINK NAAR HET BESTAND vissen, niet zomaar de eerste:
     772        // buildTrackAudio zet er ook een text/html-link naar de post voor. En een
     773        // LINK-ONLY track (alleen Spotify of YouTube, nooit een gehost bestand)
     774        // heeft er helemaal geen. Die hoort gewoon mee, met media_id NULL.
     775        // Weggooien kostte Robin een nummer dat het op de oude site prima deed.
     776        const urls = [].concat(a.url || []).map((u) => (typeof u === 'string' ? { href: u } : u)).filter((u) => u && u.href);
     777        const bestandLink = urls.find((u) => /^audio\//i.test(String(u.mediaType || '')))
     778          || urls.find((u) => /\/audio\/stream\//.test(String(u.href)));
     779        const externe = urls.map((u) => String(u.href)).filter((h) => /spotify|youtube|youtu\.be|soundcloud|bandcamp/i.test(h));
     780        const bron = bestandLink && bestandLink.href;
     781        if (!bron || !/^https?:\/\//i.test(String(bron))) {
     782          if (externe.length) {
     783            const trackIdL = ruwId(a.id) || crypto.randomUUID();
     784            try {
     785              db.prepare(`INSERT OR REPLACE INTO audio_tracks
     786                  (id, site_id, title, artist, media_id, link_spotify, link_youtube, link_soundcloud, fedi_open)
     787                VALUES (?,?,?,?,NULL,?,?,?,0)`)
     788                .run(trackIdL, site.id, a.name || 'zonder titel', a.summary || a.artist || null,
     789                  externe.find((u) => /spotify/i.test(u)) || null,
     790                  externe.find((u) => /youtube|youtu\.be/i.test(u)) || null,
     791                  externe.find((u) => /soundcloud/i.test(u)) || null);
     792              recordMigrated(site.slug, { origin: a.id, target: `${me}/ap/tracks/${trackIdL}`, sourceActor: bronActor.id, isPublic: false });
     793              trackKaart.set(String(a.id), trackIdL);
     794              ruwKaart.set(ruwId(a.id), trackIdL);
     795              rapport.tracksLinks++;
     796              rapport.tracksBinnen++;
     797            } catch (e) {
     798              rapport.tracksMislukt++;
     799              rapport.waarschuwingen.push(`nummer niet opgeslagen: ${a.name || a.id} (${e && e.message})`);
     800            }
     801            continue;
     802          }
     803          rapport.tracksMislukt++;
     804          continue;
     805        }
    773806        const g = await haalBijlage(String(bron), {
    774807          safeFetch, mediaRoot: audioRoot, fs, path, maxBytes, submap: '',
Note: See TracChangeset for help on using the changeset viewer.