// --- Narrativa + audio: construimos la URL con idioma/ciudad/pais/qr/session/ua --- async function cargarNarrativaVino() { const respuestaEl = document.getElementById("respuesta"); const bloqueAudio = document.getElementById("bloque-audio-narrativa"); const playerEl = document.getElementById("player"); if (!vinoId) { respuestaEl.innerText = "No se especificó ningún vino."; bloqueAudio.style.display = "none"; return; } try { // Espera rápida a que tengamos ciudad/pais/idioma (máx 1000 ms) try { await Promise.race([ window._datosUsuarioPromise, new Promise(r => setTimeout(r, 1000)) ]); } catch (_) { /* no pasa nada */ } // Ahora ya leemos con fallback const idioma = (window._datosUsuario?.idioma || (navigator.language || 'es')).slice(0,2); const ciudad = window._datosUsuario?.ciudad || ''; const pais = window._datosUsuario?.pais || ''; const qr_id = new URLSearchParams(window.location.search).get('qr') || ''; let sessionId = localStorage.getItem('user_id'); if (!sessionId) { sessionId = `user_${Math.random().toString(36).slice(2,10)}`; localStorage.setItem('user_id', sessionId); } const ua = navigator.userAgent || ''; const reqUrl = "https://n8n-production-cb18.up.railway.app/webhook/Consultar-vino-7dbyxa8kql19qw" + `?vino_id=${encodeURIComponent(vinoId)}` + `&secret=${encodeURIComponent('midulcesommelier')}` + `&idioma=${encodeURIComponent(idioma)}` + `&ciudad=${encodeURIComponent(ciudad)}` + `&pais=${encodeURIComponent(pais)}` + `&qr_id=${encodeURIComponent(qr_id)}` + `&session_id=${encodeURIComponent(sessionId)}` + `&ua=${encodeURIComponent(ua)}` + `&_ts=${Date.now()}`; const res = await fetch(reqUrl, { cache: "no-store" }); const raw = await res.text(); if (!res.ok) throw new Error(`HTTP ${res.status} :: ${raw.slice(0,120)}`); let data = {}; try { data = raw ? JSON.parse(raw) : {}; } catch { data = {}; } // Fallback si viene dentro de "fields" if (!data.audio_url && data.fields) { data.audio_url = data.fields["Audio URL"] || ""; data.narrativa = data.narrativa || data.fields["narrativa"] || ""; data.vino_id = data.vino_id || data.fields["ID Vino"] || ""; } // 1) Texto respuestaEl.innerText = data.narrativa || "No se pudo generar la narrativa del vino."; // 2) Audio (normaliza URL y no exige .mp3) let audioUrl = (data.audio_url || "").trim(); if (audioUrl.startsWith("http://")) audioUrl = audioUrl.replace(/^http:\/\//i, "https://"); if (audioUrl) { if (playerEl._plyr) { try { playerEl._plyr.destroy(); } catch(_) {} playerEl._plyr = null; } playerEl.innerHTML = ""; const src = document.createElement("source"); src.src = audioUrl; src.type = "audio/mpeg"; playerEl.appendChild(src); playerEl.load(); const inst = new Plyr(playerEl, { speed: { selected: 1, options: [0.75, 1, 1.25, 1.5, 2] } }); playerEl._plyr = inst; bloqueAudio.style.display = "block"; } else { bloqueAudio.style.display = "none"; } } catch (err) { console.error("❌ Narrativa/Audio:", err); respuestaEl.innerText = "No se pudo cargar la información del vino."; bloqueAudio.style.display = "none"; } }
Cargando comentarios...