Changeset 4d81de5 in Klonkt
- Timestamp:
- 08/08/2026 05:30:29 AM (5 weeks ago)
- Branches:
- main
- Children:
- cf5073b
- Parents:
- 34e63f0
- git-author:
- Robin <roboburr@…> (08/08/2026 05:28:46 AM)
- git-committer:
- Robin <roboburr@…> (08/08/2026 05:30:29 AM)
- Files:
-
- 1 added
- 3 edited
-
src/routes/feed.js (modified) (3 diffs)
-
src/services/ActivityPubService.js (modified) (2 diffs)
-
test/channel-actor.test.js (modified) (1 diff)
-
test/feed-itunes.test.js (added)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/feed.js
r34e63f0 r4d81de5 66 66 const tracks = siteOpenTracks(site.id); 67 67 const lastBuild = posts[0]?.published_at || new Date().toISOString(); 68 69 // De itunes-velden waar een podcast-app een kanaal aan herkent. Funkwhale 70 // bouwde onze kanaalpagina langs de RSS-kant op en liet de categorie leeg, 71 // want die leest hij hier -- niet uit `category` op de AP-actor. 72 // 73 // De categorie volgt DEZELFDE regel als daar: alleen 'Music' als er ook 74 // werkelijk publieke muziek is. Een blog zonder open track is naar buiten 75 // toe geen muziekkanaal, en gated muziek telt niet mee -- afwezig is 76 // afwezig, ook in een categorie. 77 const abs = (u) => !u ? null : (/^https?:/i.test(u) ? u : `${base}${u.startsWith('/') ? '' : '/'}${u}`); 78 const kanaalKunst = abs(site.profile_photo || site.og_image_default || null); 79 const kanaalTags = [ 80 ` <itunes:author>${escapeXml(site.author || site.title || '')}</itunes:author>`, 81 site.description || site.tagline 82 ? ` <itunes:summary>${escapeXml(site.description || site.tagline)}</itunes:summary>` : null, 83 kanaalKunst ? ` <itunes:image href="${escapeXml(kanaalKunst)}" />` : null, 84 tracks.length ? ' <itunes:category text="Music" />' : null, 85 ].filter(Boolean).join('\n'); 68 86 69 87 const wanneer = (d) => { const t = Date.parse(d); return Number.isNaN(t) ? 0 : t; }; … … 88 106 <description>${escapeXml(t.artist || '')}</description> 89 107 <enclosure url="${escapeXml(`${base}/audio/stream/${encodeURIComponent(fn)}`)}" length="${Number(t.size) || 0}" type="${escapeXml(t.mime_type || 'audio/mpeg')}" />${t.duration ? ` 90 <itunes:duration>${Math.round(t.duration)}</itunes:duration>` : ''} 108 <itunes:duration>${Math.round(t.duration)}</itunes:duration>` : ''}${t.artist ? ` 109 <itunes:author>${escapeXml(t.artist)}</itunes:author>` : ''}${abs(t.cover_url) ? ` 110 <itunes:image href="${escapeXml(abs(t.cover_url))}" />` : ''} 91 111 </item>` }; 92 112 }), … … 103 123 <lastBuildDate>${new Date(lastBuild).toUTCString()}</lastBuildDate> 104 124 <atom:link href="${escapeXml(base + '/feed.xml')}" rel="self" type="application/rss+xml" /> 125 ${kanaalTags} 105 126 ${items} 106 127 </channel> -
src/services/ActivityPubService.js
r34e63f0 r4d81de5 233 233 * de kast, niet enable_audio_player -- die staat standaard aan en zegt niets. 234 234 */ 235 function channelCategory(site) { 236 try { 237 return db.prepare('SELECT 1 FROM audio_tracks WHERE site_id = ? LIMIT 1').get(site.id) ? 'music' : null; 235 export function channelCategory(site) { 236 try { 237 // ALLEEN opengezette tracks tellen. Eerst keek dit naar elke track, ook een 238 // gated -- en dan roept een site met uitsluitend afgeschermde muziek toch 239 // "hier is muziek" naar de hele fediverse. Dat botst met de regel die we 240 // overal aanhouden: een gesloten track is AFWEZIG, niet stilletjes 241 // aanwezig. Naar buiten toe is een kanaal zonder publieke muziek geen 242 // muziekkanaal. 243 return db.prepare('SELECT 1 FROM audio_tracks WHERE site_id = ? AND fedi_open = 1 LIMIT 1').get(site.id) ? 'music' : null; 238 244 } catch { return null; } 239 245 } … … 6039 6045 AP_CONTEXT, getOrCreateKeys, apWants, sendAP, actorId, noteId, stripLeadingMentions, 6040 6046 buildActor, buildNote, buildCreate, buildOutbox, buildFollowers, buildFollowing, buildFeatured, 6041 channelUrls, timelineFields, guessMediaType,6047 channelUrls, channelCategory, timelineFields, guessMediaType, 6042 6048 siteOpenTracks, openTrack, buildTrackAudio, buildTrackCollection, buildTrackCreate, 6043 6049 buildPlaylistCollection, playlistOpenTracks, listPlaylistsAP, playlistLinkTags, -
test/channel-actor.test.js
r34e63f0 r4d81de5 36 36 }); 37 37 38 test('met muziek is de category "music"', () => { 38 test('een GATED track maakt er nog geen muziekkanaal van', () => { 39 // Aangescherpt: eerst telde elke track mee, ook een afgeschermde -- dan riep 40 // een site met uitsluitend gated muziek toch "hier is muziek" naar buiten. 41 // Afwezig is afwezig, ook in een categorie. 42 db.prepare('INSERT INTO media (id, site_id, filename, storage_path, mime_type, size) VALUES (?,?,?,?,?,1)') 43 .run('m0', 's1', 'dicht.mp3', 'audio/dicht.mp3', 'audio/mpeg'); 44 db.prepare('INSERT INTO audio_tracks (id, site_id, title, media_id, fedi_open) VALUES (?,?,?,?,0)') 45 .run('t0', 's1', 'Achter de poort', 'm0'); 46 assert.equal(AP.buildActor(BASE, site()).category, undefined); 47 }); 48 49 test('met OPENGEZETTE muziek is de category "music"', () => { 39 50 db.prepare('INSERT INTO media (id, site_id, filename, storage_path, mime_type, size) VALUES (?,?,?,?,?,1)') 40 51 .run('m1', 's1', 'a.mp3', 'audio/a.mp3', 'audio/mpeg'); 41 db.prepare('INSERT INTO audio_tracks (id, site_id, title, media_id ) VALUES (?,?,?,?)')52 db.prepare('INSERT INTO audio_tracks (id, site_id, title, media_id, fedi_open) VALUES (?,?,?,?,1)') 42 53 .run('t1', 's1', 'Een nummer', 'm1'); 43 54 assert.equal(AP.buildActor(BASE, site()).category, 'music');
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)