source: Klonkt/test/ap-track-fields.test.js@ 3ccca13

main
Last change on this file since 3ccca13 was cf5073b, checked in by Robin <roboburr@…>, 5 weeks ago

Onze Audio inhoudelijk gelijk aan die van Funkwhale

Dezelfde track aan beide kanten naast elkaar gelegd -- 0METAL MARIO, bij hen op
the_ceeesg en bij ons op dev -- en de uitkomst was gunstiger dan verwacht.

OP ELK VELD WAAR AS2 IETS ZEGT ZIJN WIJ CONFORM EN ZIJ NIET, en dat is precies
een veld: duration. AS2 zegt MUST xsd:duration ("PT103S"), schema.org zegt
hetzelfde in ISO 8601, Funkwhale stuurt 103. Daar bewegen we dus niet.

Al hun EXTRA velden bleken geen eigen verzinsel maar termen die schema.org
gewoon heeft -- en schema.org stond al in onze context. Overgenomen zonder
concessie: de SLEUTELS zijn die van Funkwhale, want daar leest hij op, de
BETEKENIS komt van schema.org. Geen vreemd vocabulaire binnengehaald.

to op het OBJECT, niet alleen op de omhullende Create: een los

opgehaalde track moet zelf kunnen zeggen dat hij openbaar is

position het nummer op de plaat
license schema:license
size schema:contentSize, OP DE LINK -- het is die representatie die
bitrate schema:bitrate zoveel bytes is, niet het nummer
image naast icon; allebei AS2-kern, wij lazen icon, zij lezen image

BITRATE IS AFGELEID, niet gegokt: bytes maal acht gedeeld door seconden IS de
gemiddelde bitrate van een bestand. Alleen als we allebei de getallen hebben --
liever geen veld dan een verzonnen getal.

LICENTIE IS DE ENIGE MET EEN VERTAALSLAG. Bij ons is het vrije tekst uit een
keuzelijst ("CC BY 4.0"), bij hen een URI. Alleen de waarden die onze eigen
keuzelijst aanbiedt worden vertaald -- die kennen we exact. "Alle rechten
voorbehouden" heeft geen URI en levert dus niets op, en een al ingevulde URI
gaat ongemoeid door. Een zelfbedachte licentie-URI is erger dan geen: een lezer
gelooft hem.

Onderweg: t.position en t.license moesten alsnog in de trackquery, die
selecteerde ze niet.

7 tests.

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

  • Property mode set to 100644
File size: 4.2 KB
Line 
1// Onze Audio inhoudelijk gelijk aan die van Funkwhale (shaer-0nh).
2//
3// Vergelijking van dezelfde track aan beide kanten leerde: op elk veld waar AS2
4// iets zegt zijn WIJ conform en zij niet -- en dat is precies een veld,
5// duration. Al hun extra velden bestaan gewoon in schema.org, dat Klonkt al in
6// zijn context had. Dus we konden ze alle vier overnemen zonder concessie: de
7// SLEUTELS zijn die van Funkwhale, de BETEKENIS komt van schema.org.
8import { test } from 'node:test';
9import assert from 'node:assert/strict';
10
11process.env.DATABASE_PATH = ':memory:';
12process.env.PUBLIC_BASE_URL = 'https://test.example';
13
14const dbMod = await import('../src/config/database.js');
15const db = dbMod.default;
16dbMod.initializeDatabase();
17const AP = (await import('../src/services/ActivityPubService.js')).default;
18
19const BASE = 'https://test.example';
20db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
21 .run('u1', 'u1', 'u1@t', 'x', 'god');
22db.prepare('INSERT INTO sites (id, slug, title, owner_id, is_public, is_primary) VALUES (?,?,?,?,1,1)')
23 .run('s1', 'band', 'De Band', 'u1');
24
25db.prepare('INSERT INTO media (id, site_id, filename, storage_path, mime_type, size) VALUES (?,?,?,?,?,?)')
26 .run('m1', 's1', 'nummer.mp3', 'audio/nummer.mp3', 'audio/mpeg', 1653698);
27db.prepare(`INSERT INTO audio_tracks (id, site_id, title, artist, duration, media_id, cover_url, position, license, fedi_open, created_at)
28 VALUES (?,?,?,?,?,?,?,?,?,1,?)`)
29 .run('t1', 's1', '0METAL MARIO', 'De Band', 103, 'm1', '/media/hoes.jpg', 1, 'CC BY 4.0', '2026-08-08 04:38:34');
30
31const track = () => AP.siteOpenTracks('s1')[0];
32const audio = () => AP.buildTrackAudio(BASE, { slug: 'band' }, track());
33
34test('de bestandsgegevens zitten op de LINK, niet op het object', () => {
35 const a = audio();
36 assert.equal(a.url.length, 1);
37 assert.equal(a.url[0].size, 1653698, 'bytes horen bij deze representatie');
38 assert.equal(a.url[0].bitrate, Math.round((1653698 * 8) / 103), 'afgeleid uit bytes en seconden, niet gegokt');
39 assert.equal(a.size, undefined, 'het NUMMER is geen bestand');
40 assert.equal(a.bitrate, undefined);
41});
42
43test('to staat op het object zelf, niet alleen op de Create', () => {
44 assert.deepEqual(audio().to, ['https://www.w3.org/ns/activitystreams#Public'],
45 'een los opgehaalde track moet zelf kunnen zeggen dat hij openbaar is');
46});
47
48test('position en license komen mee', () => {
49 const a = audio();
50 assert.equal(a.position, 1);
51 assert.equal(a.license, 'http://creativecommons.org/licenses/by/4.0/', 'de tekst uit onze keuzelijst wordt de canonieke URI');
52});
53
54test('de hoes staat onder icon EN image -- allebei AS2-kern', () => {
55 const a = audio();
56 assert.equal(a.icon.url, 'https://test.example/media/hoes.jpg');
57 assert.deepEqual(a.image, a.icon, 'dezelfde hoes, twee namen; wij lazen icon, Funkwhale leest image');
58});
59
60test('duration blijft de spec volgen -- daar wijken we bewust af van Funkwhale', () => {
61 // AS2 zegt MUST xsd:duration, schema.org zegt ISO 8601. Funkwhale stuurt een
62 // getal. Op dit ene veld hebben wij gelijk, dus hier bewegen we niet.
63 assert.equal(audio().duration, 'PT103S');
64});
65
66test('een licentie die we niet kennen levert GEEN veld op', () => {
67 db.prepare("UPDATE audio_tracks SET license = 'Alle rechten voorbehouden' WHERE id = 't1'").run();
68 assert.equal(audio().license, undefined, 'een zelfbedachte licentie-URI is erger dan geen: een lezer gelooft hem');
69 db.prepare("UPDATE audio_tracks SET license = 'https://voorbeeld.example/licentie' WHERE id = 't1'").run();
70 assert.equal(audio().license, 'https://voorbeeld.example/licentie', 'een ingevulde URI gaat wel door');
71 db.prepare("UPDATE audio_tracks SET license = 'CC BY 4.0' WHERE id = 't1'").run();
72});
73
74test('zonder duur of grootte geen verzonnen bitrate', () => {
75 // media.size is NOT NULL, dus 0 als "onbekend" -- dat is ook wat de kolom in
76 // de praktijk krijgt als de grootte niet bepaald kon worden.
77 db.prepare("UPDATE media SET size = 0 WHERE id = 'm1'").run();
78 const a = audio();
79 assert.equal(a.url[0].bitrate, undefined);
80 assert.equal(a.url[0].size, undefined);
81 assert.equal(a.duration, 'PT103S', 'de duur staat er nog wel');
82 db.prepare('UPDATE media SET size = 1653698 WHERE id = ?').run('m1');
83});
Note: See TracBrowser for help on using the repository browser.