Changeset b56afa7 in Klonkt for src/routes


Ignore:
Timestamp:
06/20/2026 04:08:28 AM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
d43ea3f
Parents:
976d36d
Message:

feat(embed): show real YouTube title on the audio-only card

YT oEmbed has no CORS → new same-origin proxy GET /audio/yt-title (server
fetches oEmbed + caches it). The audio-only embed now shows the real video
title instead of "YouTube", and passes it to the site player. buster
embed-player.js?v=11.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/audio.js

    r976d36d rb56afa7  
    158158});
    159159
     160// Same-origin proxy voor de YouTube-titel (oEmbed). YouTube's oEmbed stuurt geen
     161// CORS-header, dus de browser kan 'm niet direct fetchen — wij halen 'm server-
     162// side op (geen CORS) en cachen 't. Gebruikt door de audio-only YT-embed om de
     163// echte videotitel te tonen i.p.v. "YouTube".
     164const ytTitleCache = new Map();
     165router.get('/yt-title', async (req, res) => {
     166  const url = String(req.query.url || '');
     167  if (!/^https:\/\/(www\.)?(youtube\.com|youtu\.be|youtube-nocookie\.com)\//i.test(url)) {
     168    return res.status(400).json({ error: 'bad url' });
     169  }
     170  if (ytTitleCache.has(url)) return res.json({ title: ytTitleCache.get(url) });
     171  try {
     172    const ac = new AbortController();
     173    const timer = setTimeout(() => ac.abort(), 6000);
     174    const r = await fetch('https://www.youtube.com/oembed?format=json&url=' + encodeURIComponent(url), { signal: ac.signal });
     175    clearTimeout(timer);
     176    if (!r.ok) { ytTitleCache.set(url, ''); return res.json({ title: '' }); }
     177    const d = await r.json();
     178    const title = (d && d.title) ? String(d.title).slice(0, 200) : '';
     179    ytTitleCache.set(url, title);
     180    res.json({ title });
     181  } catch (e) {
     182    res.status(502).json({ error: 'fetch failed' });
     183  }
     184});
     185
    160186export default router;
Note: See TracChangeset for help on using the changeset viewer.