Changeset 2a10445 in Klonkt for src/views/partials/post-card.ejs


Ignore:
Timestamp:
07/30/2026 08:23:47 AM (6 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
094f7d0
Parents:
15f1cb5
Message:

De tegel leest zijn beeld uit de content, de cover-kopie is weg

Robins melding: de video stond dubbel op de postpagina, een keer afspeelbaar
in de content en een keer als cover erboven. Terecht; de cover-promotie van
vanmiddag was de verkeerde helft van de oplossing.

Nu doet de tegel wat de Cirkel-kaart al deed: zijn beeld AFLEIDEN uit de
content. post-tile en post-card pakken de eerste video (met zijn poster) of
de eerste afbeelding uit post.content als er geen echte cover is, en de
grid-tegel speelt de video muted-loopend als zijn eigen thumbnail. Het
post-model blijft single-source: c2sCreatePost zet geen covers meer.

En zelfherstel voor wat er al staat: covers die hun eigen content-media
dupliceren (het korte cover-promotie-venster) worden bij boot leeggemaakt;
idempotent en raakt alleen die gevallen.

Changed files:
src/services/ActivityPubService.js

  • c2sCreatePost zet geen covers meer; media leeft alleen in de content

src/views/partials/post-tile.ejs

  • content-afgeleide fallback: video (met poster) of afbeelding

src/views/partials/post-card.ejs

  • dezelfde fallback in de lijstweergave

src/config/database.js

  • zelfherstel: cover-kopieen van content-media leeggemaakt

test/c2s-compose.test.js

  • covers blijven null; de video federeert precies een keer

remarks: 338 tests groen, server start.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/views/partials/post-card.ejs

    r15f1cb5 r2a10445  
    1616const _ext       = !!_external;
    1717const _src       = post.source_name || '';
    18 const _hasCover  = !!post.cover_image_url || !!post.cover_video_url;
     18const _realCover = !!post.cover_image_url || !!post.cover_video_url;
     19// Content-derived fallback (see post-tile.ejs): a C2S post's media lives in
     20// its content, and the card fronts it from there.
     21let _cVideo = null, _cPoster = null, _cImg = null;
     22if (!_realCover && post.content) {
     23  const vm = String(post.content).match(/<video[^>]*\ssrc="([^"]+)"[^>]*>/i);
     24  if (vm) { _cVideo = vm[1]; const pm = vm[0].match(/poster="([^"]+)"/i); if (pm) _cPoster = pm[1]; }
     25  else { const im = String(post.content).match(/<img[^>]*\ssrc="([^"]+)"/i); if (im) _cImg = im[1]; }
     26}
     27const _hasCover  = _realCover || !!_cVideo || !!_cImg;
    1928const _typeLabel = (post.type && post.type !== 'overig' && post.type !== 'post') ? post.type : '';
    2029const _isPinned  = !!post.pinned;
     
    5362           sizes="(min-width: 768px) 120px, 100vw"
    5463           alt="" loading="lazy" decoding="async"<% if (post.cover_video_url) { %> data-ios-mp4="<%= post.cover_video_url %>"<% } %>>
    55       <% } else if (post.cover_video_url) { %><video src="<%= post.cover_video_url %>" poster="<%= thumb(post.cover_video_url, 480) %>" autoplay loop muted playsinline></video><% } %>
     64      <% } else if (post.cover_video_url) { %><video src="<%= post.cover_video_url %>" poster="<%= thumb(post.cover_video_url, 480) %>" autoplay loop muted playsinline></video><% } else if (_cVideo) { %><video src="<%= _cVideo %>"<% if (_cPoster) { %> poster="<%= _cPoster %>"<% } %> autoplay loop muted playsinline preload="metadata"></video><% } else if (_cImg) { %><img src="<%= _cImg %>" alt="" loading="lazy" decoding="async"><% } %>
    5665      <% if (post.nsfw) { %><span class="nsfw-veil"><%- include('nsfw-veil', { cw: post.content_warning }) %></span><% } %>
    5766    </a>
Note: See TracChangeset for help on using the changeset viewer.