document.addEventListener('DOMContentLoaded', () => { const synthesizeBtn = document.getElementById('synthesizeBtn'); const resultContainer = document.getElementById('resultContainer'); const errorContainer = document.getElementById('errorContainer'); const errorMessage = document.getElementById('errorMessage'); const audioPlayer = document.getElementById('audioPlayer'); const downloadLink = document.getElementById('downloadLink'); const translatedText = document.getElementById('translatedText'); // Update placeholder based on selected language document.querySelectorAll('input[name="inputLang"]').forEach(radio => { radio.addEventListener('change', () => { const lang = document.querySelector('input[name="inputLang"]:checked').value; document.getElementById('sanskritText').placeholder = lang === 'english' ? 'Example: The warrior stands on the battlefield of Kurukshetra...' : 'धर्मक्षेत्रे कुरुक्षेत्रे समवेता युयुत्सवः ।\nमामकाः पाण्डवाश्चैव किमकुर्वत संजय ॥'; }); }); synthesizeBtn.addEventListener('click', async () => { const text = document.getElementById('sanskritText').value.trim(); const meter = document.getElementById('meterSelect').value; const voiceModel = document.getElementById('voiceSelect').value; const inputLang = document.querySelector('input[name="inputLang"]:checked').value; if (!text) { showError('Please enter some text first.'); return; } // Reset UI errorContainer.classList.add('hidden'); resultContainer.classList.add('hidden'); synthesizeBtn.classList.add('loading'); // Update button label context document.querySelector('.btn-text').textContent = inputLang === 'english' ? 'Translating & Generating...' : 'Generating...'; let data = null; try { const formData = new FormData(); formData.append('text', text); formData.append('meter', meter); formData.append('voice_model', voiceModel); formData.append('input_lang', inputLang); const response = await fetch('/api/synthesize', { method: 'POST', body: formData, }); // Safely parse JSON — never let it crash const rawText = await response.text(); try { data = JSON.parse(rawText); } catch { throw new Error(`Server returned invalid response (status ${response.status}). Check the terminal for logs.`); } if (!response.ok) { throw new Error(data?.detail || `Server error (${response.status})`); } // ── Success ────────────────────────────────────────────────── if (data.sanskrit_text) { translatedText.innerHTML = `Sanskrit: ` + data.sanskrit_text.replace(/\n/g, '
'); } else { translatedText.innerHTML = ''; } audioPlayer.src = data.audio_url + '?t=' + Date.now(); // cache-bust downloadLink.href = data.audio_url; resultContainer.classList.remove('hidden'); // Try auto-play audioPlayer.play().catch(() => {}); } catch (err) { showError(err.message); } finally { synthesizeBtn.classList.remove('loading'); document.querySelector('.btn-text').textContent = 'Generate Chanting'; } }); function showError(msg) { errorMessage.textContent = '⚠️ ' + msg; errorContainer.classList.remove('hidden'); } });