diff --git a/__pycache__/downloader.cpython-312.pyc b/__pycache__/downloader.cpython-312.pyc index 617a4d8..53a5ac8 100644 Binary files a/__pycache__/downloader.cpython-312.pyc and b/__pycache__/downloader.cpython-312.pyc differ diff --git a/script.js b/script.js index db75a00..f1e9ad9 100644 --- a/script.js +++ b/script.js @@ -2180,35 +2180,61 @@ function initListenerMode() { // AudioContext will be created when user enables audio to avoid suspension - // Create or reuse audio element to handle the MediaSource + // ALWAYS create a fresh audio element to avoid MediaSource/MediaElementSource conflicts + // This is critical for page refreshes - you can only create MediaElementSource once per element let audio; + + // Clean up old audio element if it exists if (window.listenerAudio) { - // Reuse existing audio element from previous initialization - audio = window.listenerAudio; - console.log('โ™ป๏ธ Reusing existing audio element'); - - // Clean up old MediaSource if it exists - if (audio.src) { - URL.revokeObjectURL(audio.src); - audio.removeAttribute('src'); - audio.load(); // Reset the element + console.log('๐Ÿงน Cleaning up old audio element and AudioContext nodes'); + try { + window.listenerAudio.pause(); + if (window.listenerAudio.src) { + URL.revokeObjectURL(window.listenerAudio.src); + } + window.listenerAudio.removeAttribute('src'); + window.listenerAudio.remove(); // Remove from DOM + } catch (e) { + console.warn('Error cleaning up old audio:', e); } - } else { - // Create a new hidden media element. - // Note: MSE (MediaSource) support is often more reliable on