fix(shorts): autoplay muet, langues FR/EN, proxy prod et Dailymotion embeds
CI / build-and-test (push) Successful in 14m9s

- autoplay: les Shorts demarrent muets (comme Watch) pour garantir l'autoplay des iframes; le son se debloque a la premiere interaction (unlockSound) et reste controlable
- proxy prod: ajoute les alias /proxy/twitch-api, /proxy/twitch-auth, /proxy/dm, /proxy/odysee (evite le fallback SPA -> parse JSON 'status 200 ok:false'); forwardJson accepte les deux prefixes. Corrige aussi la validation des clips Twitch morts
- Dailymotion: allow_embed demande dans les flux shorts/trending -> les videos non-embeddables ('Forbidden') sont exclues
- langues: mapping language (Dailymotion/PeerTube/Odysee) + shortsLangOk applique a tous les fournisseurs; en+fr toujours acceptes
- PeerTube shorts: durationMin/Max cote serveur (plus de videos longues au hasard)
- Twitch: validation helix/clips de nouveau fonctionnelle + autoplay muet
This commit is contained in:
2026-09-29 14:22:45 -04:00
parent 983c6cb5ab
commit d4895bae92
5 changed files with 67 additions and 23 deletions
+11 -1
View File
@@ -3071,7 +3071,11 @@ app.post('/api/ai/summarize', aiLimiter, async (req, res) => {
// Generic JSON forwarder helper
async function forwardJson(req, res, base) {
try {
const pathPart = req.originalUrl.replace(/^\/api\/(dm|odysee|twitch-api|twitch-auth)/, '');
// Accepte les deux préfixes : `/api/<key>` (prod canonique) ET
// `/proxy/<key>` (repli du front, défini dans proxy.conf.json pour le dev).
// Sans le second, les replis `/proxy/...` tombaient sur le fallback SPA
// (index.html) → erreur de parse JSON "status 200 / ok:false".
const pathPart = req.originalUrl.replace(/^\/(?:proxy\/)?(?:api\/)?(dm|odysee|twitch-api|twitch-auth)/, '');
const targetUrl = `${base}${pathPart}`;
const method = (req.method || 'GET').toUpperCase();
// Ne transfère que les headers utiles : tout le reste (cookies, content-length
@@ -3105,6 +3109,12 @@ app.all('/api/dm/*', (req, res) => forwardJson(req, res, 'https://api.dailymotio
app.all('/api/odysee/*', (req, res) => forwardJson(req, res, 'https://api.na-backend.odysee.com'));
app.all('/api/twitch-api/*', (req, res) => forwardJson(req, res, 'https://api.twitch.tv'));
app.all('/api/twitch-auth/*', (req, res) => forwardJson(req, res, 'https://id.twitch.tv'));
// Alias `/proxy/...` : le front utilise ces chemins en repli (cf. proxy.conf.json
// pour le dev). En prod ils doivent répondre du JSON, pas le shell SPA.
app.all('/proxy/dm/*', (req, res) => forwardJson(req, res, 'https://api.dailymotion.com'));
app.all('/proxy/odysee/*', (req, res) => forwardJson(req, res, 'https://api.na-backend.odysee.com'));
app.all('/proxy/twitch-api/*', (req, res) => forwardJson(req, res, 'https://api.twitch.tv'));
app.all('/proxy/twitch-auth/*', (req, res) => forwardJson(req, res, 'https://id.twitch.tv'));
// -------------------- Unified search endpoint (GET) --------------------
app.get('/api/search', async (req, res) => {