Changeset 59d963f in Klonkt


Ignore:
Timestamp:
08/10/2026 09:38:43 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
c34ef26
Parents:
86ec01b
Message:

De hele site als muziekkanaal: /tracks.xml (Robins vraag, 10-8)

Hij vroeg om een "hele site, open tracks"-library, in de hoop dat Funkwhale er
iets mee zou kunnen. Als AS2-object doet zo'n ding daar niets: een
Funkwhale-KANAAL (federation/actors/tnd, opgehaald en nagelopen) noemt nergens
een library, en hun library is een eigen actor met inbox en sleutel -- de optie
die op 7 augustus bewust is afgewezen.

Maar de vorm waarin Funkwhale een kanaal WEL uitgeeft is RSS 2.0 met de
iTunes-namespace en een enclosure per item. Naast onze feed gelegd:

Funkwhale 1 item, 1 enclosure audio/mpeg itunes + atom
Klonkt 8 items, 4 enclosures audio/mpeg itunes + atom

Dezelfde vorm dus, en die had Klonkt al. Het enige verschil was dat onze feed
ook gewone posts draagt, en een muziekkanaal met blogberichten ertussen is er
geen. Vandaar een tweede ingang op dezelfde bouwer in plaats van een nieuw
object: /tracks.xml, alleen de open tracks.

Twee dingen die geen detail zijn. De self-link wijst naar ZICHZELF -- anders
stuurt een lezer die opnieuw ophaalt zichzelf naar de gemengde variant en staan
de posts er alsnog in. En de titel krijgt " -- muziek" erachter, want twee
feeds met dezelfde naam zijn in een podcast-app niet te scheiden.

Wat NIET verandert: de actor blijft /feed.xml adverteren. Die is door Apple
Podcasts gevalideerd en werkt; een tweede rss-link erbij zou een podcast-app
laten kiezen tussen twee kanaalfeeds. /tracks.xml is een URL om te plakken.

En dicht blijft dicht: dezelfde poortregel als overal, siteOpenTracks beslist.

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

Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/feed.js

    r86ec01b r59d963f  
    4444
    4545// ==================== RSS 2.0 ====================
    46 router.get('/feed.xml', (req, res) => {
     46/**
     47 * Twee feeds, een bouwer.
     48 *
     49 *   /feed.xml    de site: posts EN open tracks door elkaar, chronologisch
     50 *   /tracks.xml  alleen de open tracks -- de hele site als muziekkanaal
     51 *
     52 * WAAROM DIE TWEEDE (Robins vraag, 10-8). Hij vroeg naar een "hele site, open
     53 * tracks"-library voor Funkwhale. Als AS2-object helpt zo'n ding daar niet: een
     54 * Funkwhale-KANAAL wijst nergens naar een library, en hun library is een eigen
     55 * actor met inbox en sleutel -- de optie die op 7 augustus is afgewezen. Maar de
     56 * vorm waarin Funkwhale een kanaal WEL uitgeeft is RSS met iTunes en een
     57 * enclosure per item, en dat is precies wat Klonkt hier al doet. Naast een echte
     58 * kanaalfeed gelegd (audio.pepemoss.com/api/v1/channels/tnd/rss): dezelfde
     59 * namespaces, dezelfde enclosure.
     60 *
     61 * Het enige verschil was dat onze feed ook gewone posts draagt. Een muziekkanaal
     62 * met blogberichten ertussen is er geen, dus die feed staat er nu apart -- een
     63 * URL om te plakken, zonder dat er iets naar buiten geduwd wordt.
     64 */
     65function stuurFeed(req, res, { alleenTracks }) {
    4766  const site = res.locals.site;
    4867  if (!site) return res.status(404).send('No site');
     
    5069  const origin = siteOrigin(req);
    5170  const base = origin + (res.locals.siteUrlBase || '');
    52   const posts = postsForFeed(site.id);
     71  const posts = alleenTracks ? [] : postsForFeed(site.id);
    5372
    5473  // De tracks die deze site aan de federatie heeft opengezet, elk als eigen
     
    6584  // poortregel en die hoort op een plek te staan.
    6685  const tracks = siteOpenTracks(site.id);
    67   const lastBuild = posts[0]?.published_at || new Date().toISOString();
     86  const lastBuild = posts[0]?.published_at || tracks[0]?.created_at || new Date().toISOString();
    6887
    6988  // De itunes-velden waar een podcast-app een kanaal aan herkent. Funkwhale
     
    117136<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
    118137  <channel>
    119     <title>${escapeXml(site.title)}</title>
     138    <title>${escapeXml(alleenTracks ? `${site.title} \u2014 muziek` : site.title)}</title>
    120139    <link>${escapeXml(base + '/')}</link>
    121140    <description>${escapeXml(site.description || site.tagline || '')}</description>
    122141    <language>${escapeXml(site.language || 'nl')}</language>
    123142    <lastBuildDate>${new Date(lastBuild).toUTCString()}</lastBuildDate>
    124     <atom:link href="${escapeXml(base + '/feed.xml')}" rel="self" type="application/rss+xml" />
     143    <atom:link href="${escapeXml(base + (alleenTracks ? '/tracks.xml' : '/feed.xml'))}" rel="self" type="application/rss+xml" />
    125144${kanaalTags}
    126145${items}
    127146  </channel>
    128147</rss>`);
    129 });
     148}
     149
     150router.get('/feed.xml', (req, res) => stuurFeed(req, res, { alleenTracks: false }));
     151// De hele site als muziekkanaal: alleen wat op de federatie openstaat.
     152router.get('/tracks.xml', (req, res) => stuurFeed(req, res, { alleenTracks: true }));
    130153
    131154// ==================== Atom 1.0 ====================
Note: See TracChangeset for help on using the changeset viewer.