| 1 | /**
|
|---|
| 2 | * Hoe ver zijn we van Funkwhale's bibliotheek-ingest?
|
|---|
| 3 | *
|
|---|
| 4 | * node scripts/funkwhale-gat.mjs https://dev.klonkt.com/ap/users/dev/library
|
|---|
| 5 | *
|
|---|
| 6 | * Loopt de eisen na die in api/funkwhale_api/federation/serializers.py staan
|
|---|
| 7 | * (develop, gelezen 16-8) en zegt per veld of het er is. Geen oordeel, geen
|
|---|
| 8 | * schatting: de lijst komt uit hun bron en de waarden uit onze eigen uitvoer.
|
|---|
| 9 | *
|
|---|
| 10 | * WAAROM DIT ER IS. "Zijn we er al?" is drie keer beantwoord met een gevoel en
|
|---|
| 11 | * drie keer bijgesteld. Deze vraag hoort een commando te zijn.
|
|---|
| 12 | *
|
|---|
| 13 | * LET OP wat dit NIET meet: de kanaal-weg. open.audio heeft onze tracks al
|
|---|
| 14 | * langs de outbox binnengehaald, met naam en artiest. Wat daar ontbreekt is
|
|---|
| 15 | * `uploads` -- en dat is precies wat deze ingest zou vullen.
|
|---|
| 16 | */
|
|---|
| 17 | const BRON = process.argv[2] || 'https://dev.klonkt.com/ap/users/dev/library';
|
|---|
| 18 |
|
|---|
| 19 | const haal = async (u) => {
|
|---|
| 20 | const r = await fetch(u, { headers: { Accept: 'application/activity+json' } });
|
|---|
| 21 | if (!r.ok) throw new Error(`${u} gaf ${r.status}`);
|
|---|
| 22 | return r.json();
|
|---|
| 23 | };
|
|---|
| 24 |
|
|---|
| 25 | // serializers.py regel 1741 -- UploadSerializer, per item in een bibliotheekpagina
|
|---|
| 26 | const UPLOAD = [
|
|---|
| 27 | ['type', (a) => a.type === 'Audio'],
|
|---|
| 28 | ['id', (a) => !!a.id],
|
|---|
| 29 | ['library', (a) => !!a.library],
|
|---|
| 30 | ['url.href', (a) => !!(Array.isArray(a.url) ? a.url[0] : a.url)?.href],
|
|---|
| 31 | ['url.mediaType', (a) => !!(Array.isArray(a.url) ? a.url[0] : a.url)?.mediaType],
|
|---|
| 32 | ['published', (a) => !!a.published],
|
|---|
| 33 | ['duration', (a) => typeof a.duration === 'string'],
|
|---|
| 34 | // fw:bitrate en fw:size, en TOP-LEVEL. Wij zetten ze op de Link (waar hun
|
|---|
| 35 | // eigen outbox ze ook zet) en binden ze aan schema: -- zie shaer-f1y4.
|
|---|
| 36 | ['bitrate (top-level)', (a) => a.bitrate !== undefined],
|
|---|
| 37 | ['size (top-level)', (a) => a.size !== undefined],
|
|---|
| 38 | ['track', (a) => !!a.track],
|
|---|
| 39 | ];
|
|---|
| 40 |
|
|---|
| 41 | // regel 1569 -- TrackSerializer, plus MusicEntitySerializer (1278) eronder
|
|---|
| 42 | const TRACK = [
|
|---|
| 43 | ['track.id', (t) => !!t?.id],
|
|---|
| 44 | ['track.name', (t) => !!t?.name],
|
|---|
| 45 | ['track.published', (t) => !!t?.published],
|
|---|
| 46 | ['track.artist_credit[>=1]', (t) => Array.isArray(t?.artist_credit) && t.artist_credit.length >= 1],
|
|---|
| 47 | ['track.album', (t) => !!t?.album],
|
|---|
| 48 | ];
|
|---|
| 49 |
|
|---|
| 50 | const lib = await haal(BRON);
|
|---|
| 51 | const pagina = lib.first ? await haal(lib.first) : lib;
|
|---|
| 52 | const items = pagina.items || pagina.orderedItems || [];
|
|---|
| 53 | if (!items.length) { console.log('geen items in de bibliotheek'); process.exit(1); }
|
|---|
| 54 | const a = items[0];
|
|---|
| 55 |
|
|---|
| 56 | console.log(`bron: ${BRON}\nitem: ${a.name}\n`);
|
|---|
| 57 | let gaten = 0;
|
|---|
| 58 | const toon = (lijst, waarde) => {
|
|---|
| 59 | for (const [naam, test] of lijst) {
|
|---|
| 60 | let ok = false;
|
|---|
| 61 | try { ok = !!test(waarde); } catch { ok = false; }
|
|---|
| 62 | if (!ok) gaten++;
|
|---|
| 63 | console.log(` ${ok ? 'OK ' : 'GAT'} ${naam}`);
|
|---|
| 64 | }
|
|---|
| 65 | };
|
|---|
| 66 | console.log('UploadSerializer (regel 1741):');
|
|---|
| 67 | toon(UPLOAD, a);
|
|---|
| 68 | console.log('\nTrackSerializer (regel 1569 + MusicEntity 1278):');
|
|---|
| 69 | toon(TRACK, a.track);
|
|---|
| 70 |
|
|---|
| 71 | console.log(`\n${gaten === 0 ? 'niets meer nodig voor hun ingest' : gaten + ' veld(en) te gaan'}`);
|
|---|