Changeset 7090fd2 in Klonkt for src


Ignore:
Timestamp:
08/16/2026 02:12:14 PM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
9026de5
Parents:
aebde2b
Message:

Album: geen epoch-datum, en een naam die overal hetzelfde is

Gevonden door de twee representaties van hetzelfde id naast elkaar te
leggen, met een echte album-playlist op dev (Robin, 16-8).

EEN ID, TWEE NAMEN. Het ingesloten Album heette "Cartoon Epic" en zijn
eigen URI "Geen koffie, wel thee!". buildPlaylistCollection laat
leenVanPost de titel van de uitgavepost overnemen -- de post IS de
uitgave -- en buildAlbumObject deed dat niet. Nu leent hij dezelfde
titel, met de eigen titel als alsoKnownAs, precies zoals leenVanPost.
De uitgavepost wordt EEN keer per album opgezocht en niet per track:
uitgavePost() leest de typering van de post, en een site heeft veel meer
nummers dan platen.

PUBLISHED 1970-01-01. buildAlbumObject viel terug op epoch als
created_at ontbrak, en dat gebeurde: de AP-route selecteerde id, title,
artist, year, cover_url en kind -- en de rest niet. Daarmee ontbraken
released en musicbrainzId daar trouwens ook.

Twee dingen gerepareerd, en de terugval zelf is het derde: er komt nu
GEEN published meer als er geen datum is. Het veld is bij hen verplicht,
dus dat kost ons een item -- maar 1970 is een antwoord en geen ontbrekend
veld, en een lezer kan een gat opmerken en een leugen niet. Ontbreekt het
nog, dan is er een leespad dat de kolom laat vallen, en dat willen we
zien.

Ook PlaylistService.get() geeft created_at nu terug.

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

Location:
src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    raebde2b r7090fd2  
    12021202  const site = publicSite(req.params.slug);
    12031203  if (!site) return res.status(404).end();
    1204   const pl = db.prepare('SELECT id, title, artist, year, cover_url, kind FROM playlists WHERE id = ? AND site_id = ?')
     1204  const pl = db.prepare('SELECT id, title, artist, year, cover_url, kind, release_date, mb_release_id, created_at FROM playlists WHERE id = ? AND site_id = ?')
    12051205    .get(req.params.id, site.id);
    12061206  if (!pl) return res.status(404).end();
  • src/services/PlaylistService.js

    raebde2b r7090fd2  
    155155      cover: p.cover_url || fallbackCover,
    156156      kind: (p.kind === 'playlist') ? 'playlist' : 'album',
     157      // created_at hoort erbij omdat de AP-kant er `published` van maakt. Zonder
     158      // dit veld viel buildAlbumObject terug op 1970, en dat stond op 16-8
     159      // gewoon op de federatie.
     160      created_at: p.created_at,
    157161      // Leeg als het een afspeellijst is -- de opslag houdt ze daar al leeg,
    158162      // maar dit is de plek waar de editor leest en die mag niet afhangen van
  • src/services/music/index.js

    raebde2b r7090fd2  
    451451  const uit = new Map();
    452452  for (const r of rijen) if (!uit.has(r.tid)) uit.set(r.tid, r);
     453  // De post die deze plaat uitbrengt, EEN keer per album opgezocht en niet per
     454  // track: uitgavePost() doet er echt werk voor (hij leest de typering van de
     455  // post) en een site heeft veel meer nummers dan platen.
     456  //
     457  // WAAROM DIT ERBIJ MOET: buildPlaylistCollection laat leenVanPost de naam van
     458  // de post overnemen -- de post IS de uitgave. Zonder dezelfde lening hier zou
     459  // het ingesloten Album "Cartoon Epic" heten en zijn eigen URI "Geen koffie,
     460  // wel thee!". Een id met twee namen, en dat is precies wat op 16-8 uit de
     461  // meting rolde.
     462  const perAlbum = new Map();
     463  for (const r of uit.values()) {
     464    if (perAlbum.has(r.id)) continue;
     465    perAlbum.set(r.id, uitgavePost(siteId, r.id));
     466  }
     467  for (const r of uit.values()) r._post = perAlbum.get(r.id) || null;
    453468  return uit;
    454469}
     
    470485  if (!pl) return null;
    471486  const abs = (u) => !u ? null : (/^https?:/i.test(u) ? u : `${base}${u.startsWith('/') ? '' : '/'}${u}`);
    472   const wanneer = pl.created_at ? new Date(pl.created_at).toISOString() : new Date(0).toISOString();
     487  // GEEN epoch als terugval. `published` is bij hen verplicht, maar 1970 is een
     488  // ANTWOORD en geen ontbrekend veld -- en dat is erger: een lezer kan een gat
     489  // opmerken, een leugen niet. playlists.created_at heeft een default, dus als
     490  // hij hier ontbreekt is er een leespad dat de kolom laat vallen. Dat willen we
     491  // zien, niet maskeren. (Zo kwam op 16-8 de route boven water die id, title,
     492  // artist, year, cover_url en kind selecteerde en de rest niet.)
     493  const wanneer = pl.created_at ? new Date(pl.created_at).toISOString() : null;
     494  // Dezelfde lening als in buildPlaylistCollection: de post die de plaat
     495  // uitbrengt geeft zijn titel, en de eigen titel blijft als alsoKnownAs staan.
     496  const titel = (pl._post && pl._post.title) || pl.title;
    473497  const album = {
    474498    type: 'Album',
    475499    id: `${actorId(base, site.slug)}/playlists/${pl.id}`,
    476     name: pl.title,
    477     published: wanneer,
     500    name: titel,
     501    ...(wanneer ? { published: wanneer } : {}),
    478502    attributedTo: actorId(base, site.slug),
    479     artist_credit: artistCredit(base, site, pl.artist, wanneer),
     503    artist_credit: artistCredit(base, site, pl.artist, wanneer || new Date().toISOString()),
    480504  };
     505  if (titel !== pl.title) album.alsoKnownAs = pl.title;
    481506  // `released` alleen als er een ECHTE datum is. `year` vult hem niet aan: een
    482507  // jaartal is geen dag, en dat is de reden dat release_date bestaat.
Note: See TracChangeset for help on using the changeset viewer.