Changeset 9a585bf in Klonkt for src/services/music/index.js


Ignore:
Timestamp:
08/16/2026 01:29:11 PM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
21257e4
Parents:
38d5e40
Message:

Track: published en artist_credit erbij

Twee van de vijf gaten naar Funkwhale's bibliotheek-ingest.

published was een omissie in de kleine Emissary-vorm, niet een keuze:
MusicEntitySerializer (regel 1278) eist het en we hebben created_at.

artist_credit leek de onmogelijke. Hun keten is Track -> ArtistCredit ->
Artist, en elke schakel wil id, name en published -- terwijl een artiest
bij ons een tekstkolom is. De MusicBrainz-koppeling van vorige week liet
zien dat dat niet klopt: de site-ACTOR is de artiest. Een echt,
opvraagbaar adres, met de sitetitel als naam en een musicbrainzId zodra
hij gekoppeld is. Er valt niets te verzinnen, en het is niet nieuw --
open.audio leidde op 13-8 al zelf een artist_credit af uit onze
attributedTo. We maken expliciet wat daar toch al gebeurde.

De artiestnaam van de track gaat naar credit en niet naar de entiteit.
Dat is waar hun model de credittekst verwacht, en er een id per
artiestnaam van maken zou identiteit uit een string zijn -- dezelfde fout
die we bij het album vermijden (shaer-756s).

@container: @list op artist_credit is geen opsmuk: ze lezen het veld met
first_attr(FW.artist_credit, "@list"), en zonder die declaratie
expandeert onze array er niet naar. Dan staat er iets dat er goed uitziet
en dat hun lezer niet vindt -- precies het soort stil gat waar deze week
al twee keer een dag in ging zitten.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/music/index.js

    r38d5e40 r9a585bf  
    1414
    1515import db from '../../config/database.js';
    16 import { AP_CONTEXT, PUBLIC, actorId, noteId, safeUrl, guessMediaType, buildHashtagList, pagedCollection } from '../ap-core.js';
     16import { AP_CONTEXT, PUBLIC, actorId, noteId, safeUrl, guessMediaType, buildHashtagList, pagedCollection, isMbid } from '../ap-core.js';
    1717import { afleidenUitInsluitingen, ingeslotenPlaylists } from '../../assets/js/shared/post-music-type.js';
    1818// De luisteraars horen bij de muziekkant; hier doorgegeven zodat
     
    195195  // een tekstkolom; er hier een adres van maken zou een ding beloven dat niet
    196196  // bestaat. Zie shaer-k37k -- dat is de keuze die daarvoor eerst moet vallen.
     197  //
     198  // WIE IS DE ARTIEST. Hun Artist is een ENTITEIT met een id, en bij ons is een
     199  // artiest een tekstkolom op de track. Die twee verzoenen we zo: de entiteit
     200  // is de site-ACTOR -- een echt, opvraagbaar adres, het account dat dit
     201  // uitbrengt -- en de tekst uit de kolom gaat naar `credit`, want dat is
     202  // precies waar hun model de credittekst verwacht.
     203  //
     204  // Dat is eerlijk en het is niet nieuw: open.audio leidde op 13-8 al zelf een
     205  // artist_credit af uit onze attributedTo. We maken alleen expliciet wat daar
     206  // toch al gebeurde.
     207  //
     208  // DE GRENS ERVAN: brengt een site werk van iemand anders uit, dan zegt dit
     209  // dat de site de artiest is. Dat stond al in attributedTo, dus we maken het
     210  // niet erger -- maar het is wel de reden dat we hier geen id per artiestnaam
     211  // verzinnen. Identiteit uit een string is dezelfde fout als bij het album
     212  // (shaer-756s).
     213  const wanneer = r.created_at ? new Date(r.created_at).toISOString()
     214    : (site.created_at ? new Date(site.created_at).toISOString() : new Date(0).toISOString());
     215  const artiest = {
     216    type: 'Artist',
     217    id: actorId(base, site.slug),
     218    name: site.title || site.slug,
     219    published: site.created_at ? new Date(site.created_at).toISOString() : wanneer,
     220  };
     221  if (isMbid(site.mb_artist_id)) artiest.musicbrainzId = String(site.mb_artist_id).trim().toLowerCase();
     222
    197223  a.track = {
    198224    type: 'Track',
    199225    id: `${a.id}#track`,
    200226    name: a.name,
     227    published: wanneer,
    201228    ...(Number(r.position) ? { position: Number(r.position) } : {}),
     229    artist_credit: [{
     230      type: 'ArtistCredit',
     231      id: `${a.id}#artist-credit`,
     232      published: wanneer,
     233      artist: artiest,
     234      ...(r.artist ? { credit: r.artist } : {}),
     235    }],
    202236  };
    203237  if (r.duration) a.duration = `PT${Math.round(r.duration)}S`;
Note: See TracChangeset for help on using the changeset viewer.