Changeset 1f640ff in Klonkt for src/routes


Ignore:
Timestamp:
07/30/2026 12:04:21 PM (6 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
f9b1c5c
Parents:
6dd26e5
Message:

Audio-tegel: golfvorm en titel elk hun eigen band, en balkjes ipv de rauwe golf

De titel stond dwars door de golfvorm heen (Robins schermafdruk): de
golfvorm hing absoluut gecentreerd en de flex-tegel centreerde de titel
er bovenop. Nu heeft elk zijn eigen band: golfvorm in de bovenhelft
(8-54 procent), titel op 60 procent, bronregel op 76. De maten staan
expliciet: een absoluut gepositioneerde img valt bij width/height auto
terug op zijn intrinsieke maat en de band klapte dicht.

En de golfvorm zelf is mooier (Robins tweede vraag): geen harige rauwe
golf meer maar balkjes in SoundCloud-stijl. Peak en average worden op 57
kolommen gesampled (zachte piek-top over heldere kern), nearest-neighbor
opgeblazen tot balkjes van 14px, en drawgrid wist er transparante
spleetjes van 5px tussen (c=black@0 met replace=1 schrijft echte
transparantie).

Changed files:
src/routes/activitypub.js

  • het showwavespic-recept vervangen door de gelaagde balkjes-graph

src/views/partials/post-tile.ejs

  • grid-tile-audio-klasse op de anchor als er een golfvorm is

src/assets/css/style.css

  • grid-tile-wave: expliciete band (top 8, hoogte 46, breedte 84)
  • grid-tile-audio: titel op 60 procent, bronregel op 76

remarks: geometrie numeriek geverifieerd in een browser-preview (golf
17.6-44.4 procent, titel 60-65.2, 58px ruimte, gradient intact) en het
balkjes-recept visueel beoordeeld op een tegel-gradient-compositie. De
bestaande audiopost houdt zijn oude dunne golfvorm-png; een verse upload
krijgt de balkjes. 345 tests groen.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    r6dd26e5 r1f640ff  
    357357    // audio-tegel op): ffmpeg draws the waveform into <name>.poster.png.
    358358    // White on transparent, so the tile's own gradient stays the backdrop
    359     // and every audio post keeps its own hue.
     359    // and every audio post keeps its own hue. The shape is bars, not the
     360    // raw hairy wave (Robins tweede vraag): peak and average sampled into
     361    // 57 columns (soft tip over bright core), blown up nearest-neighbor to
     362    // 14px bars, and drawgrid ERASES 5px gaps (c=black@0 + replace=1 writes
     363    // transparent pixels; h=2*ih keeps horizontal grid lines out of frame).
    360364    if (mime.startsWith('audio/')) {
    361365      Promise.all([import('child_process'), import('ffmpeg-static')]).then(([{ execFile }, ff]) => {
     
    363367        if (!bin) return;
    364368        const poster = req.file.path + '.poster.png';
    365         execFile(bin, ['-hide_banner', '-loglevel', 'error', '-y', '-i', req.file.path, '-filter_complex', 'showwavespic=s=800x256:colors=white', '-frames:v', '1', poster],
     369        const graph = '[0:a]aformat=channel_layouts=mono,asplit[a][b];'
     370          + '[a]showwavespic=s=57x256:colors=white@0.5:filter=peak:scale=sqrt:draw=full[pk];'
     371          + '[b]showwavespic=s=57x256:colors=white:filter=average:scale=sqrt:draw=full[av];'
     372          + '[pk][av]overlay=format=auto,scale=798:256:flags=neighbor,drawgrid=w=14:h=2*ih:t=5:c=black@0:replace=1';
     373        execFile(bin, ['-hide_banner', '-loglevel', 'error', '-y', '-i', req.file.path, '-filter_complex', graph, '-frames:v', '1', poster],
    366374          { timeout: 30000 }, (e) => { if (e && e.code !== 'ENOENT') console.warn('[media] waveform failed:', e.message); });
    367375      }).catch(() => { /* never blocks the upload */ });
Note: See TracChangeset for help on using the changeset viewer.