修复问题4

This commit is contained in:
CN-JS-HuiBai
2026-04-03 23:31:12 +08:00
parent bfef6f651d
commit d398d922df

View File

@@ -93,6 +93,7 @@ document.addEventListener('DOMContentLoaded', () => {
let controlsPointerReleaseTimeout = null; let controlsPointerReleaseTimeout = null;
let managedSubtitleTracks = []; let managedSubtitleTracks = [];
let selectedSubtitleTrackId = 'off'; let selectedSubtitleTrackId = 'off';
let pendingAutoPlayAfterDownload = false;
if (videoPlayer) { if (videoPlayer) {
videoPlayer.controls = false; videoPlayer.controls = false;
@@ -215,6 +216,29 @@ document.addEventListener('DOMContentLoaded', () => {
controlSubtitleToggle.textContent = selectedOption ? selectedOption.textContent : 'CC Off'; 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 = () => { const resetSubtitleTracks = () => {
managedSubtitleTracks.forEach((track) => track.element.remove()); managedSubtitleTracks.forEach((track) => track.element.remove());
managedSubtitleTracks = []; managedSubtitleTracks = [];
@@ -468,6 +492,7 @@ document.addEventListener('DOMContentLoaded', () => {
}, 600); }, 600);
} else if (status === 'transcoding') { } else if (status === 'transcoding') {
hasDownloadCompleted = true; hasDownloadCompleted = true;
maybeStartPlaybackAfterDownload();
if (!isStreamActive) { if (!isStreamActive) {
if (transcodingOverlay) transcodingOverlay.classList.remove('hidden'); if (transcodingOverlay) transcodingOverlay.classList.remove('hidden');
if (videoPlayer) videoPlayer.classList.add('hidden'); if (videoPlayer) videoPlayer.classList.add('hidden');
@@ -487,6 +512,7 @@ document.addEventListener('DOMContentLoaded', () => {
} }
} else if (status === 'finished') { } else if (status === 'finished') {
hasDownloadCompleted = true; hasDownloadCompleted = true;
maybeStartPlaybackAfterDownload();
if (!isStreamActive) { if (!isStreamActive) {
if (transcodingOverlay) transcodingOverlay.classList.remove('hidden'); if (transcodingOverlay) transcodingOverlay.classList.remove('hidden');
showTranscodePhase(); showTranscodePhase();
@@ -520,6 +546,7 @@ document.addEventListener('DOMContentLoaded', () => {
const resetPhases = () => { const resetPhases = () => {
hasDownloadCompleted = false; hasDownloadCompleted = false;
pendingAutoPlayAfterDownload = false;
if (downloadPhase) downloadPhase.classList.remove('hidden'); if (downloadPhase) downloadPhase.classList.remove('hidden');
if (downloadSizeText) downloadSizeText.textContent = '准备下载...'; if (downloadSizeText) downloadSizeText.textContent = '准备下载...';
if (downloadProgressText) downloadProgressText.textContent = '0%'; if (downloadProgressText) downloadProgressText.textContent = '0%';
@@ -573,6 +600,8 @@ document.addEventListener('DOMContentLoaded', () => {
}); });
videoPlayer.addEventListener('loadedmetadata', syncVideoDurationFromPlayer); videoPlayer.addEventListener('loadedmetadata', syncVideoDurationFromPlayer);
videoPlayer.addEventListener('durationchange', syncVideoDurationFromPlayer); videoPlayer.addEventListener('durationchange', syncVideoDurationFromPlayer);
videoPlayer.addEventListener('loadeddata', maybeStartPlaybackAfterDownload);
videoPlayer.addEventListener('canplay', maybeStartPlaybackAfterDownload);
videoPlayer.addEventListener('play', () => { videoPlayer.addEventListener('play', () => {
updatePlayControls(); updatePlayControls();
@@ -1251,6 +1280,7 @@ document.addEventListener('DOMContentLoaded', () => {
seekOffset = 0; seekOffset = 0;
videoDuration = 0; videoDuration = 0;
isStreamActive = false; isStreamActive = false;
pendingAutoPlayAfterDownload = true;
hideSeekBar(); hideSeekBar();
hideCustomControls(); hideCustomControls();
setPlaybackStatus('Paused', 'paused'); setPlaybackStatus('Paused', 'paused');
@@ -1261,27 +1291,7 @@ document.addEventListener('DOMContentLoaded', () => {
const streamUrl = buildStreamUrl(); const streamUrl = buildStreamUrl();
videoPlayer.src = streamUrl; videoPlayer.src = streamUrl;
videoPlayer.load(); videoPlayer.load();
const onCanPlayAfterDownload = () => { maybeStartPlaybackAfterDownload();
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);
} catch (err) { } catch (err) {
console.error(err); console.error(err);
transcodingOverlay.innerHTML = `<p style="color: #ef4444;">Transcode Failed: ${err.message}</p>`; transcodingOverlay.innerHTML = `<p style="color: #ef4444;">Transcode Failed: ${err.message}</p>`;
@@ -1304,6 +1314,7 @@ document.addEventListener('DOMContentLoaded', () => {
handleProgress({ status: 'cancelled', percent: 0, details: 'Transcode stopped' }); handleProgress({ status: 'cancelled', percent: 0, details: 'Transcode stopped' });
isStreamActive = false; isStreamActive = false;
pendingAutoPlayAfterDownload = false;
videoPlayer.pause(); videoPlayer.pause();
videoPlayer.removeAttribute('src'); videoPlayer.removeAttribute('src');
videoPlayer.load(); videoPlayer.load();