Changeset 2a10445 in Klonkt for src/views/partials


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@…>

Location:
src/views/partials
Files:
2 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>
  • src/views/partials/post-tile.ejs

    r15f1cb5 r2a10445  
    77const _isBoost = !!post.isBoost;
    88const _hasCover = !!post.cover_image_url || !!post.cover_video_url;
     9// A C2S post carries its media IN the content (a cover next to it showed the
     10// video twice on the post page). The tile derives its picture from the
     11// content instead, like the Cirkel card: first <video> (with its poster) or
     12// first <img>.
     13let _cVideo = null, _cPoster = null, _cImg = null;
     14if (!_hasCover && post.content) {
     15  const vm = String(post.content).match(/<video[^>]*\ssrc="([^"]+)"[^>]*>/i);
     16  if (vm) { _cVideo = vm[1]; const pm = vm[0].match(/poster="([^"]+)"/i); if (pm) _cPoster = pm[1]; }
     17  else { const im = String(post.content).match(/<img[^>]*\ssrc="([^"]+)"/i); if (im) _cImg = im[1]; }
     18}
     19const _showCover = _hasCover || !!_cVideo || !!_cImg;
    920const _typeLabel = (post.type && post.type !== 'post') ? post.type : '';
    1021const _src = post.source_name || '';   // bron-site (cirkel-feed: van welke site komt deze post)
     
    1425const _ext = !!_external;
    1526%>
    16 <a class="grid-tile<%= _hasCover ? '' : ' grid-tile-gradient' %><%= (_isPinned || _isBoost) ? ' is-pinned' : '' %><%= post.nsfw ? ' nsfw-media' : '' %>"
     27<a class="grid-tile<%= _showCover ? '' : ' grid-tile-gradient' %><%= (_isPinned || _isBoost) ? ' is-pinned' : '' %><%= post.nsfw ? ' nsfw-media' : '' %>"
    1728   href="<%= _href %>"
    1829   style="--tile-hue: <%= _tileHue %>;"
    1930   <% if (_ext) { %>target="_blank" rel="noopener"<% } else { %>hx-get="<%= _href %>?partial=1" hx-target="#pcms-main" hx-swap="innerHTML" hx-push-url="<%= _href %>" hx-indicator="#pcms-loading"<% } %>>
    2031
    21   <% if (post.cover_image_url) { %><img class="grid-tile-img" src="<%= thumb(post.cover_image_url, 480) %>" alt="" loading="lazy" decoding="async"<% if (post.cover_video_url) { %> data-ios-mp4="<%= post.cover_video_url %>"<% } %>><% } else if (post.cover_video_url) { %><video class="grid-tile-img" src="<%= post.cover_video_url %>" poster="<%= thumb(post.cover_video_url, 480) %>" autoplay loop muted playsinline></video><% } %>
     32  <% if (post.cover_image_url) { %><img class="grid-tile-img" src="<%= thumb(post.cover_image_url, 480) %>" alt="" loading="lazy" decoding="async"<% if (post.cover_video_url) { %> data-ios-mp4="<%= post.cover_video_url %>"<% } %>><% } else if (post.cover_video_url) { %><video class="grid-tile-img" src="<%= post.cover_video_url %>" poster="<%= thumb(post.cover_video_url, 480) %>" autoplay loop muted playsinline></video><% } else if (_cVideo) { %><video class="grid-tile-img" src="<%= _cVideo %>"<% if (_cPoster) { %> poster="<%= _cPoster %>"<% } %> autoplay loop muted playsinline preload="metadata"></video><% } else if (_cImg) { %><img class="grid-tile-img" src="<%= _cImg %>" alt="" loading="lazy" decoding="async"><% } %>
    2233
    2334  <% if (_typeLabel) { %>
Note: See TracChangeset for help on using the changeset viewer.