Changeset 73b41eb in Klonkt for src/services


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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/AudioEmbedService.js

    r389aa99 r73b41eb  
    6767      case 'youtube':
    6868        return this.embedPlaceholder('youtube', config.id, 'video',
    69           config.url || `https://youtu.be/${config.id}`);
     69          config.url || `https://youtu.be/${config.id}`, config.mode);
    7070      case 'soundcloud':
    7171        return this.embedPlaceholder('soundcloud', config.url, 'track', config.url);
     
    9191   * ALLE waarden via escape() — post.content_html wordt ongeescaped uitgevoerd.
    9292   */
    93   static embedPlaceholder(provider, ref, type, url) {
     93  static embedPlaceholder(provider, ref, type, url, mode) {
    9494    const attrs = [
    9595      `data-embed-provider="${this.escape(provider)}"`,
    9696      `data-embed-ref="${this.escape(ref)}"`,
    9797      type ? `data-embed-type="${this.escape(type)}"` : '',
     98      mode ? `data-embed-mode="${this.escape(mode)}"` : '',
    9899      `data-embed-url="${this.escape(url)}"`,
    99100    ].filter(Boolean).join(' ');
     
    227228  static embedMediaShortcodes(html) {
    228229    if (!html) return html;
    229     return html.replace(/\[\[embed:([^\]]+)\]\]/gi, (match, rawUrl) => {
    230       const url = rawUrl.trim().replace(/&amp;/g, '&');
     230    return html.replace(/\[\[embed:([^\]]+)\]\]/gi, (match, rawSpec) => {
     231      // Optionele modus-prefix: [[embed:audio:URL]] = alleen-audio speler,
     232      // [[embed:video:URL]] / [[embed:URL]] = normaal (video waar van toepassing).
     233      let spec = rawSpec.trim();
     234      let mode = null;
     235      const mm = spec.match(/^(audio|video):(.+)$/i);
     236      if (mm) { mode = mm[1].toLowerCase(); spec = mm[2].trim(); }
     237      const url = spec.replace(/&amp;/g, '&');
    231238      const detected = this.detectProvider(url);
    232239      if (!detected) {
    233240        return `<div class="post-embed-missing"><em>Embed: niet-ondersteunde of ongeldige URL.</em></div>`;
    234241      }
    235       return this.generateIframe(detected.provider, detected) || match;
     242      return this.generateIframe(detected.provider, { ...detected, mode }) || match;
    236243    });
    237244  }
Note: See TracChangeset for help on using the changeset viewer.