Changeset b56afa7 in Klonkt for src/routes/audio.js
- Timestamp:
- 06/20/2026 04:08:28 AM (3 months ago)
- Branches:
- main
- Children:
- d43ea3f
- Parents:
- 976d36d
- File:
-
- 1 edited
-
src/routes/audio.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/audio.js
r976d36d rb56afa7 158 158 }); 159 159 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". 164 const ytTitleCache = new Map(); 165 router.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 160 186 export default router;
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)