diff --git a/public/js/main.js b/public/js/main.js index 7a69de7..c84be3e 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -93,6 +93,7 @@ document.addEventListener('DOMContentLoaded', () => { let controlsPointerReleaseTimeout = null; let managedSubtitleTracks = []; let selectedSubtitleTrackId = 'off'; + let pendingAutoPlayAfterDownload = false; if (videoPlayer) { videoPlayer.controls = false; @@ -215,6 +216,29 @@ document.addEventListener('DOMContentLoaded', () => { controlSubtitleToggle.textContent = selectedOption ? selectedOption.textContent : 'CC Off'; }; + const maybeStartPlaybackAfterDownload = () => { + if (!pendingAutoPlayAfterDownload || !hasDownloadCompleted) return; + if (!videoPlayer || videoPlayer.readyState < 2) return; + + pendingAutoPlayAfterDownload = false; + syncVideoDurationFromPlayer(); + transcodingOverlay.classList.add('hidden'); + videoPlayer.classList.remove('hidden'); + isStreamActive = true; + lastAbsolutePlaybackTime = seekOffset; + showSeekBar(); + showCustomControls(); + updateSeekBarPosition(seekOffset); + updatePlayControls(); + updateVolumeControls(); + updateFullscreenControls(); + schedulePlaybackChromeHide(); + videoPlayer.play().catch(() => {}); + loadSubtitleTracks(seekOffset).catch((error) => { + console.error('Subtitle load failed:', error); + }); + }; + const resetSubtitleTracks = () => { managedSubtitleTracks.forEach((track) => track.element.remove()); managedSubtitleTracks = []; @@ -468,6 +492,7 @@ document.addEventListener('DOMContentLoaded', () => { }, 600); } else if (status === 'transcoding') { hasDownloadCompleted = true; + maybeStartPlaybackAfterDownload(); if (!isStreamActive) { if (transcodingOverlay) transcodingOverlay.classList.remove('hidden'); if (videoPlayer) videoPlayer.classList.add('hidden'); @@ -487,6 +512,7 @@ document.addEventListener('DOMContentLoaded', () => { } } else if (status === 'finished') { hasDownloadCompleted = true; + maybeStartPlaybackAfterDownload(); if (!isStreamActive) { if (transcodingOverlay) transcodingOverlay.classList.remove('hidden'); showTranscodePhase(); @@ -520,6 +546,7 @@ document.addEventListener('DOMContentLoaded', () => { const resetPhases = () => { hasDownloadCompleted = false; + pendingAutoPlayAfterDownload = false; if (downloadPhase) downloadPhase.classList.remove('hidden'); if (downloadSizeText) downloadSizeText.textContent = '准备下载...'; if (downloadProgressText) downloadProgressText.textContent = '0%'; @@ -573,6 +600,8 @@ document.addEventListener('DOMContentLoaded', () => { }); videoPlayer.addEventListener('loadedmetadata', syncVideoDurationFromPlayer); videoPlayer.addEventListener('durationchange', syncVideoDurationFromPlayer); + videoPlayer.addEventListener('loadeddata', maybeStartPlaybackAfterDownload); + videoPlayer.addEventListener('canplay', maybeStartPlaybackAfterDownload); videoPlayer.addEventListener('play', () => { updatePlayControls(); @@ -1251,6 +1280,7 @@ document.addEventListener('DOMContentLoaded', () => { seekOffset = 0; videoDuration = 0; isStreamActive = false; + pendingAutoPlayAfterDownload = true; hideSeekBar(); hideCustomControls(); setPlaybackStatus('Paused', 'paused'); @@ -1261,27 +1291,7 @@ document.addEventListener('DOMContentLoaded', () => { const streamUrl = buildStreamUrl(); videoPlayer.src = streamUrl; videoPlayer.load(); - const onCanPlayAfterDownload = () => { - if (!hasDownloadCompleted) return; - videoPlayer.removeEventListener('canplay', onCanPlayAfterDownload); - syncVideoDurationFromPlayer(); - transcodingOverlay.classList.add('hidden'); - videoPlayer.classList.remove('hidden'); - isStreamActive = true; - lastAbsolutePlaybackTime = seekOffset; - showSeekBar(); - showCustomControls(); - updateSeekBarPosition(seekOffset); - updatePlayControls(); - updateVolumeControls(); - updateFullscreenControls(); - schedulePlaybackChromeHide(); - videoPlayer.play().catch(() => {}); - loadSubtitleTracks(seekOffset).catch((error) => { - console.error('Subtitle load failed:', error); - }); - }; - videoPlayer.addEventListener('canplay', onCanPlayAfterDownload); + maybeStartPlaybackAfterDownload(); } catch (err) { console.error(err); transcodingOverlay.innerHTML = `
Transcode Failed: ${err.message}
`; @@ -1304,6 +1314,7 @@ document.addEventListener('DOMContentLoaded', () => { handleProgress({ status: 'cancelled', percent: 0, details: 'Transcode stopped' }); isStreamActive = false; + pendingAutoPlayAfterDownload = false; videoPlayer.pause(); videoPlayer.removeAttribute('src'); videoPlayer.load();