source: Klonkt/scripts/funkwhale-gat.mjs@ d8f7d9c

main
Last change on this file since d8f7d9c was 38d5e40, checked in by Robin <roboburr@…>, 3 weeks ago

Gereedschap: meet het gat naar Funkwhale's bibliotheek-ingest

"Zijn we er al?" is nu een commando in plaats van een gevoel. Het script
loopt de eisen na uit hun serializers.py (develop, 16-8) en zegt per veld
of het er staat -- lijst uit hun bron, waarden uit onze eigen uitvoer.

Stand op dev vandaag: 5 velden te gaan. bitrate en size top-level als
fw:, en op het track-object published, artist_credit en album.

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

  • Property mode set to 100644
File size: 2.8 KB
RevLine 
[38d5e40]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 */
17const BRON = process.argv[2] || 'https://dev.klonkt.com/ap/users/dev/library';
18
19const 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
26const 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
42const 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
50const lib = await haal(BRON);
51const pagina = lib.first ? await haal(lib.first) : lib;
52const items = pagina.items || pagina.orderedItems || [];
53if (!items.length) { console.log('geen items in de bibliotheek'); process.exit(1); }
54const a = items[0];
55
56console.log(`bron: ${BRON}\nitem: ${a.name}\n`);
57let gaten = 0;
58const 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};
66console.log('UploadSerializer (regel 1741):');
67toon(UPLOAD, a);
68console.log('\nTrackSerializer (regel 1569 + MusicEntity 1278):');
69toon(TRACK, a.track);
70
71console.log(`\n${gaten === 0 ? 'niets meer nodig voor hun ingest' : gaten + ' veld(en) te gaan'}`);
Note: See TracBrowser for help on using the repository browser.