Changeset 73b41eb in Klonkt for src/assets


Ignore:
Timestamp:
06/20/2026 03:42:00 AM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
9e6b54f
Parents:
389aa99
Message:

feat(embed): YouTube audio-only option in posts

Per embed you now choose audio-only or video. [[embed:audio:URL]] (YouTube)
renders as an audio card with our controls (play/seek/volume + thumbnail as
cover); the YT player runs hidden off-screen and provides only the sound.
[[embed:URL]] stays video. The editor embed button asks for audio or video
when a YouTube URL is given. Server: audio:/video: prefix in the shortcode
→ data-embed-mode. busters embed-player.js?v=8, embed.css?v=5.

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

Location:
src/assets
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/assets/css/embed.css

    r389aa99 r73b41eb  
    119119  width: 320px;
    120120  height: 60px;
     121  opacity: 0;
     122  pointer-events: none;
     123}
     124/* Audio-only YouTube: de YT-speler draait verborgen (off-screen) maar moet een
     125 * echte grootte houden, anders pauzeert de browser 'm. Alleen het geluid telt. */
     126.pcms-embed-card--youtube.pcms-embed-audio-mode .pcms-embed-mount {
     127  position: absolute;
     128  left: -99999px;
     129  top: 0;
     130  width: 320px;
     131  height: 180px;
    121132  opacity: 0;
    122133  pointer-events: none;
  • src/assets/js/embed-player.js

    r389aa99 r73b41eb  
    183183
    184184    // --- UI ophangen (verschilt per provider-type) ---
    185     const isVideo = provider === 'youtube';
     185    // Audio-only YouTube (data-embed-mode="audio"): render als audio-kaart met
     186    // onze controls; de YT-speler draait verborgen (off-screen) en levert alleen
     187    // het geluid. Video blijft de default.
     188    const audioOnly = provider === 'youtube' && el.dataset.embedMode === 'audio';
     189    if (audioOnly) el.classList.add('pcms-embed-audio-mode');
     190    const isVideo = provider === 'youtube' && !audioOnly;
    186191    const custom = provider === 'youtube' || provider === 'soundcloud'; // eigen controls
    187192    const poster = provider === 'youtube'
     
    222227    let vol = 100;       // huidige volume 0-100 (wordt op de adapter toegepast)
    223228    let preMuteVol = 100;
     229    // Audio-only YouTube: zet de thumbnail als albumhoes op de audio-kaart.
     230    if (audioOnly && poster) {
     231      const art0 = el.querySelector('.pcms-embed-art');
     232      if (art0) { art0.style.backgroundImage = `url('${poster}')`; art0.classList.add('has-art'); }
     233    }
    224234
    225235    function setPlayingUI(on) {
     
    369379          events: {
    370380            onReady() {
    371               let d = 0; try { d = player.getDuration() || 0; } catch (e) {}
    372               hooks.onReady({ duration: d });
     381              let d = 0; const meta = {};
     382              try { d = player.getDuration() || 0; } catch (e) {}
     383              try { const vd = player.getVideoData(); if (vd && vd.title) meta.title = vd.title; } catch (e) {}
     384              meta.duration = d;
     385              hooks.onReady(meta);
    373386              resolve({
    374387                play() { try { player.playVideo(); } catch (e) {} },
Note: See TracChangeset for help on using the changeset viewer.