Changeset 8cf8b5f in Klonkt


Ignore:
Timestamp:
07/01/2026 09:31:54 PM (2 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
c06816e
Parents:
badbba8
Message:

feat(fediverse): cover art on federated Audio attachments (AS2 icon)

A fedi_open track's Audio attachment now carries artwork as an AS2 icon (the
track cover, else the post cover), so receivers whose audio player supports
artwork (Mastodon's shows a thumbnail) render it instead of a blank tile. Purely
additive — a receiver that ignores icon is unaffected.

  • src/services/ActivityPubService.js — addRow selects t.cover_url and attaches icon {type:Image, mediaType, url} with post-cover fallback (track + playlist SELECTs).
  • test/audio-attachment-art.test.js — track cover, post-cover fallback, no-cover no-icon.
  • CHANGELOG(.nl/.de).md — "Cover art on openly shared audio" under Unreleased.

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

Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • CHANGELOG.de.md

    rbadbba8 r8cf8b5f  
    77
    88### Hinzugefügt
     9- **Cover-Art bei offen geteiltem Audio.** Ein offen im Fediverse geteilter Track trägt jetzt sein
     10  Cover (oder das Beitragscover) mit, sodass Audio-Player, die Artwork unterstützen, es statt einer
     11  leeren Kachel anzeigen.
    912- **Einen Beitrag im Fediverse melden.** Von einem Fediverse-Beitrag aus kannst du ihn jetzt den
    1013  Moderatoren seines Heimatservers melden, mit optionaler Begründung — und meldet jemand deine Seite,
  • CHANGELOG.md

    rbadbba8 r8cf8b5f  
    77
    88### Added
     9- **Cover art on openly shared audio.** A track shared openly on the fediverse now carries its
     10  cover art (or the post cover), so audio players that support artwork show it instead of a blank tile.
    911- **Report a post to the fediverse.** From a fediverse post you can now report it to the moderators
    1012  of its own home server, with an optional reason — and if someone reports your site, the report
  • CHANGELOG.nl.md

    rbadbba8 r8cf8b5f  
    77
    88### Toegevoegd
     9- **Cover-art op openbaar gedeelde audio.** Een track die je openbaar op de fediverse deelt draagt
     10  nu z'n cover-art mee (of de post-cover), zodat audiospelers die artwork ondersteunen die tonen in
     11  plaats van een leeg vlak.
    912- **Rapporteer een post op de fediverse.** Vanaf een fediverse-post kun je die nu melden bij de
    1013  moderators van de eigen server van die post, met een optionele reden — en meldt iemand jouw site,
  • src/services/ActivityPubService.js

    rbadbba8 r8cf8b5f  
    299299      const fn = r.filename || (r.storage_path || '').split('/').pop();
    300300      if (!fn || seenA.has(fn)) return; seenA.add(fn);
    301       openAudio.push({ type: 'Audio', mediaType: r.mime_type || 'audio/mpeg', url: `${base}/audio/stream/${encodeURIComponent(fn)}`, name: r.title || 'Audio' });
     301      const a = { type: 'Audio', mediaType: r.mime_type || 'audio/mpeg', url: `${base}/audio/stream/${encodeURIComponent(fn)}`, name: r.title || 'Audio' };
     302      // Cover art on the Audio attachment (AS2 `icon`): track cover, else the post cover.
     303      // Mastodon renders it as the artwork thumbnail on its native audio player.
     304      const art = abs(r.cover_url || post.cover_image_url || null);
     305      if (art) a.icon = { type: 'Image', mediaType: mediaType(art), url: art };
     306      openAudio.push(a);
    302307    };
    303     const SEL = 'SELECT t.title, m.filename, m.storage_path, m.mime_type FROM audio_tracks t JOIN media m ON m.id = t.media_id WHERE t.fedi_open = 1 AND ';
     308    const SEL = 'SELECT t.title, t.cover_url, m.filename, m.storage_path, m.mime_type FROM audio_tracks t JOIN media m ON m.id = t.media_id WHERE t.fedi_open = 1 AND ';
    304309    try {
    305310      for (const mm of (post.content || '').matchAll(/\[\[track:([A-Za-z0-9_-]+)\]\]/g)) { const r = db.prepare(SEL + 't.id = ?').get(mm[1]); if (r) addRow(r); }
    306311      for (const mm of (post.content || '').matchAll(/\[\[album:([^\]]+)\]\]/g)) for (const r of db.prepare(SEL + 't.site_id = ? AND t.album = ? ORDER BY t.rowid').all(site.id, mm[1].trim())) addRow(r);
    307       for (const mm of (post.content || '').matchAll(/\[\[playlist:([A-Za-z0-9_-]+)\]\]/g)) for (const r of db.prepare('SELECT t.title, m.filename, m.storage_path, m.mime_type FROM playlist_tracks pt JOIN audio_tracks t ON t.id = pt.track_id JOIN media m ON m.id = t.media_id WHERE t.fedi_open = 1 AND pt.playlist_id = ? ORDER BY pt.position').all(mm[1])) addRow(r);
     312      for (const mm of (post.content || '').matchAll(/\[\[playlist:([A-Za-z0-9_-]+)\]\]/g)) for (const r of db.prepare('SELECT t.title, t.cover_url, m.filename, m.storage_path, m.mime_type FROM playlist_tracks pt JOIN audio_tracks t ON t.id = pt.track_id JOIN media m ON m.id = t.media_id WHERE t.fedi_open = 1 AND pt.playlist_id = ? ORDER BY pt.position').all(mm[1])) addRow(r);
    308313    } catch { /* non-fatal */ }
    309314  }
Note: See TracChangeset for help on using the changeset viewer.