Use UA detection for audio format instead of canPlayType

Firefox on Linux reports canPlayType('audio/mpeg') as supported
but then fails to decode mp3. Use user-agent detection instead:
Firefox always gets opus (ogg), Chromium browsers get mp3.
This commit is contained in:
russell@unturf.com 2026-01-27 08:23:06 -05:00
parent 74a1ea581c
commit 1a2a85c797

View file

@ -20,19 +20,19 @@ export function setTTSMode(mode) {
}
// Detect best audio format for this browser
// Chrome: mp3 works everywhere, MediaSource supports audio/mpeg
// Firefox: mp3 may lack decoders on Linux; opus (ogg) always works
// For MediaSource streaming: only Chrome supports audio/mpeg, nobody supports audio/ogg in MSE
// Chrome/Edge: mp3 works, MediaSource supports audio/mpeg for streaming
// Firefox: mp3 decoder often missing on Linux (canPlayType lies), use opus (ogg)
// For MediaSource streaming: only Chromium browsers support audio/mpeg in MSE
function detectAudioFormat() {
const audio = document.createElement('audio');
// Check if the browser can play mp3 at all
const canMp3 = audio.canPlayType('audio/mpeg') === 'probably' || audio.canPlayType('audio/mpeg') === 'maybe';
if (canMp3) {
return { format: 'mp3', mime: 'audio/mpeg', mseMime: 'audio/mpeg' };
const isFirefox = navigator.userAgent.includes('Firefox');
if (isFirefox) {
// Firefox on Linux often claims mp3 support but lacks decoders
// Opus in Ogg container always works natively in Firefox
console.log("Firefox detected, using opus format for TTS");
return { format: 'opus', mime: 'audio/ogg', mseMime: null };
}
// Fallback to opus (ogg container) - Firefox always supports this
console.log("Browser lacks mp3 support, using opus format");
return { format: 'opus', mime: 'audio/ogg', mseMime: null }; // MSE doesn't support ogg
// Chromium-based browsers: mp3 works, MSE supports audio/mpeg
return { format: 'mp3', mime: 'audio/mpeg', mseMime: 'audio/mpeg' };
}
const AUDIO_FORMAT = detectAudioFormat();