39414-vm/patch_audio.js
2026-04-01 10:05:01 +00:00

88 lines
4.1 KiB
JavaScript

const fs = require('fs');
const path = require('path');
const jsPath = path.join(__dirname, 'assets/js/main.js');
let jsCode = fs.readFileSync(jsPath, 'utf8');
// Replace the icon logic
jsCode = jsCode.replace(
/audioBtn\.innerHTML = '<i class="bi bi-volume-up"><\/i>';/g,
`audioBtn.innerHTML = '<i class="bi bi-megaphone-fill text-success"></i>';`
).replace(
/audioBtn\.innerHTML = '<i class="bi bi-volume-mute"><\/i>';/g,
`audioBtn.innerHTML = '<i class="bi bi-megaphone"></i>';`
);
// Add logic to test sound when audio is enabled
const repl1 = `if (nextState) {
initAudio();
if ('speechSynthesis' in window) {
const primeUtterance = new SpeechSynthesisUtterance('');
window.speechSynthesis.speak(primeUtterance);
}
}`;
const repl2 = `if (nextState) {
initAudio();
if ('speechSynthesis' in window) {
const primeUtterance = new SpeechSynthesisUtterance('');
window.speechSynthesis.speak(primeUtterance);
}
// Force latest announcement to replay
const cards = Array.from(document.querySelectorAll('.announcement-card'));
const latest = cards[0];
if (latest) {
const storageKey =
`hospitalQueue:lastAnnouncement:${locale}
`;
window.localStorage.removeItem(storageKey);
setTimeout(checkAnnouncements, 200);
}
}`;
jsCode = jsCode.replace(repl1, repl2);
// Make sure speech synthesis gets voices early, and handle fallback properly
const oldVoiceLogic = `if (langVoices.length > 0) {
// Try to find a high-quality (Google/Microsoft Natural) voice
const bestVoice = langVoices.find(v =>
v.name.includes('Google') ||
v.name.includes('Natural') ||
v.name.includes('Premium') ||
v.name.includes('Online')
) || langVoices.find(v => v.name.includes('Microsoft')) || langVoices[0];
utterance.voice = bestVoice;
}`;
const newVoiceLogic = `if (langVoices.length > 0) {
// Try to find a high-quality (Google/Microsoft Natural) voice
const bestVoice = langVoices.find(v =>
v.name.includes('Google') ||
v.name.includes('Natural') ||
v.name.includes('Premium') ||
v.name.includes('Online')
) || langVoices.find(v => v.name.includes('Microsoft')) || langVoices[0];
utterance.voice = bestVoice;
} else if (voices.length > 0) {
// Fallback to any available voice to ensure sound plays
utterance.voice = voices[0];
}`;
jsCode = jsCode.replace(oldVoiceLogic, newVoiceLogic);
// Call getVoices early
if (!jsCode.includes('window.speechSynthesis.getVoices();')) {
jsCode = jsCode.replace(
`document.addEventListener('DOMContentLoaded', () => {`,
`document.addEventListener('DOMContentLoaded', () => {
if ('speechSynthesis' in window) {
window.speechSynthesis.onvoiceschanged = () => { window.speechSynthesis.getVoices(); };
window.speechSynthesis.getVoices();
}`
);
}
fs.writeFileSync(jsPath, jsCode);
console.log('patched');