Changeset 6dd26e5 in Klonkt for src/services


Ignore:
Timestamp:
07/30/2026 11:48:53 AM (6 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
1f640ff
Parents:
67f7150
Message:

De audio-tegel opgevrolijkt: golfvorm als thumbnail en een echte titel

Een audiopost uit Shaer was op Klonkt een kale gradient met (untitled)
(Robins schermafdruk, 30-7). Twee dingen tegelijk gefixt.

De thumbnail: de upload-leg tekent bij audio nu een golfvorm met de
gebundelde ffmpeg (showwavespic, wit op transparant) naar
<naam>.poster.png, precies zoals video zijn stilstaand beeld krijgt. Die
golfvorm rijdt mee als data-poster op de audio-tag (voor de tegels), in
c2s_attachments en als AS2-icon op het gefedereerde Audio-attachment. De
tegel toont hem OVER de eigen hue-gradient, dus elke audiopost houdt
zijn kleur en krijgt zijn vorm.

De titel: C2S-posts hebben geen titel, dus elke Shaer-post toonde
(untitled). Tegels en kaarten leiden de titel nu af: eerst de eigen
woorden van de post (afgekapt op 64), anders een vriendelijk typelabel
(muzieknoot audio, pijl video), en pas als er echt niets is (untitled).
Een tegel die zijn beeld al toont forceert geen label meer.

Changed files:
src/routes/activitypub.js

  • uploadMedia: audio/* -> showwavespic-golfvorm naar .poster.png (best-effort, zelfde patroon als de videoposter)

src/services/ActivityPubService.js

  • c2sCreatePost: posterExt per type (video .jpg, audio .png); de audio-tag krijgt data-poster

src/views/partials/post-tile.ejs

  • audio-detectie + golfvorm over de gradient; titelcascade (titel -> tekst -> typelabel)

src/views/partials/post-card.ejs

  • zelfde spiegel: golfvorm als cover met eigen accent-gradient, zelfde titelcascade

src/assets/css/style.css

  • .grid-tile-wave: contain, padding, transparant op de gradient

test/c2s-compose.test.js

  • audio-golfvormketen: data-poster op de tag, poster in de store, icon op het gefedereerde attachment

remarks: bestaande audioposts kregen hun upload voor deze code en hebben
dus nog geen golfvorm-bestand; die tonen nu wel het muzieknoot-label. Een
verse audiopost laat het hele effect zien. ffmpeg-commando en beide
templates hier lokaal gesmoke-test (RGBA-png, render ok), 345 tests
groen.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    r67f7150 r6dd26e5  
    24412441    .map((a) => {
    24422442      const entry = { url: a.url, mediaType: String(a.mediaType), name: String(a.name || '').slice(0, 120) };
    2443       // A video's poster frame, when the upload leg made one (shaer-zowq):
    2444       // rides along so the tag, the federated attachment and the apps all
    2445       // show a still instead of a black box.
    2446       if (entry.mediaType.startsWith('video/')) {
     2443      // The poster the upload leg made, when it did: a video's still frame
     2444      // (shaer-zowq, .poster.jpg) or an audio's waveform (Robins vraag 30-7,
     2445      // .poster.png). Rides along so the tag, the federated attachment and
     2446      // the apps all have something to show instead of a bare box.
     2447      const posterExt = entry.mediaType.startsWith('video/') ? '.poster.jpg'
     2448        : entry.mediaType.startsWith('audio/') ? '.poster.png' : null;
     2449      if (posterExt) {
    24472450        try {
    24482451          const mediaRoot = path.resolve(process.env.MEDIA_PATH || './storage/media');
    24492452          const rel = entry.url.replace(/^\/media\//, '');
    2450           if (fs.existsSync(path.join(mediaRoot, rel + '.poster.jpg'))) entry.poster = entry.url + '.poster.jpg';
     2453          if (fs.existsSync(path.join(mediaRoot, rel + posterExt))) entry.poster = entry.url + posterExt;
    24512454        } catch { /* no poster is fine */ }
    24522455      }
     
    24612464  const mediaHtml = media.map((a) => {
    24622465    if (a.mediaType.startsWith('image/')) return `<p><img src="${a.url}" alt="${esc(a.name)}"></p>`;
    2463     if (a.mediaType.startsWith('audio/')) return `<p><audio controls preload="metadata" src="${a.url}"></audio></p>`;
     2466    // data-poster: <audio> has no poster attribute, but the tile derivation
     2467    // reads this one to show the waveform (post-tile/post-card).
     2468    if (a.mediaType.startsWith('audio/')) return `<p><audio controls preload="metadata"${a.poster ? ` data-poster="${a.poster}"` : ''} src="${a.url}"></audio></p>`;
    24642469    const poster = a.poster ? ` poster="${a.poster}"` : '';
    24652470    return `<p><video controls playsinline preload="metadata"${poster} src="${a.url}"></video></p>`;
Note: See TracChangeset for help on using the changeset viewer.