Update css/player-base.js

This commit is contained in:
ashley 2025-10-06 12:00:09 +02:00
parent 3a5304644a
commit a7126dbe73

View File

@ -2,7 +2,7 @@
var _yt_player = videojs; var _yt_player = videojs;
var versionclient = "youtube.player.web_20250917_22_RC00" var versionclient = "youtube.player.web_20250917_22_RC00"
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
// video.js 8 init - source can be seen in https://poketube.fun/static/vjs.min.js or the vjs.min.js file // video.js 8 init - source can be seen in https://poketube.fun/static/vjs.min.js or the vjs.min.js file
const video = videojs('video', { const video = videojs('video', {
@ -55,6 +55,11 @@ var versionclient = "youtube.player.web_20250917_22_RC00"
let prevAudioMuted = false; let prevAudioMuted = false;
let pendingUnmute = false; let pendingUnmute = false;
// FIX: seek heuristics (fast-pause vs keep-playing)
const SMALL_SEEK_SEC = 0.75; // under this, try not to pause if buffer is ready
const LARGE_SEEK_SEC = 1.75; // over this, pause immediately during seeking
let lastVTime = 0; // updated from timeupdate to estimate seek size
// turn OFF native loop so 'ended' fires and we control both tracks together // turn OFF native loop so 'ended' fires and we control both tracks together
try { videoEl.loop = false; videoEl.removeAttribute?.('loop'); } catch {} try { videoEl.loop = false; videoEl.removeAttribute?.('loop'); } catch {}
try { audio.loop = false; audio.removeAttribute?.('loop'); } catch {} try { audio.loop = false; audio.removeAttribute?.('loop'); } catch {}
@ -215,14 +220,16 @@ var versionclient = "youtube.player.web_20250917_22_RC00"
} }
} }
function pauseTogether() { function pauseTogether(opts = {}) {
if (syncing || seekingActive) return; const { force = false } = opts; // FIX: allow bypass during seeking for fast-pause
if (syncing || (seekingActive && !force)) return;
syncing = true; syncing = true;
try { try {
desiredPlaying = false; // remember intent desiredPlaying = false; // remember intent
try { video.pause(); } catch {} try { video.pause(); } catch {}
try { audio.pause(); } catch {} try { audio.pause(); } catch {}
clearSyncLoop(); clearSyncLoop();
vIsPlaying = false; aIsPlaying = false;
} finally { } finally {
syncing = false; syncing = false;
} }
@ -360,6 +367,14 @@ var versionclient = "youtube.player.web_20250917_22_RC00"
video.on('playing', markVPlaying); video.on('playing', markVPlaying);
audio.addEventListener('playing', markAPlaying); audio.addEventListener('playing', markAPlaying);
// FIX: keep a rolling time so we can tell small vs big seeks
video.on('timeupdate', () => {
if (!seekingActive && !restarting) {
const vt = Number(video.currentTime());
if (isFinite(vt)) lastVTime = vt;
}
});
const errorBox = document.getElementById('loopedIndicator'); const errorBox = document.getElementById('loopedIndicator');
video.on('error', () => { video.on('error', () => {
const mediaError = video.error(); const mediaError = video.error();
@ -382,15 +397,29 @@ var versionclient = "youtube.player.web_20250917_22_RC00"
if (restarting) return; if (restarting) return;
seekingActive = true; seekingActive = true;
seekToken++; seekToken++;
wasPlayingBeforeSeek = desiredPlaying || !video.paused(); // remember intent
// stop sync + keep clocks close; pause audio to avoid drift audio glitches // compute seek size vs last known time
try { audio.pause(); } catch {}
clearSyncLoop();
const vt = Number(video.currentTime()); const vt = Number(video.currentTime());
if (Math.abs(vt - Number(audio.currentTime)) > 0.1) safeSetCT(audio, vt); const from = isFinite(lastVTime) ? lastVTime : vt;
vIsPlaying = false; aIsPlaying = false; const delta = Math.abs(vt - from);
// decide whether to fast-pause:
const targetPlayable = bothPlayableAt(vt);
const shouldPauseFast = (delta >= LARGE_SEEK_SEC) || !targetPlayable;
wasPlayingBeforeSeek = desiredPlaying || !video.paused(); // remember intent
if (shouldPauseFast) {
// immediate coordinated pause, even during seeking
pauseTogether({ force: true });
vIsPlaying = false; aIsPlaying = false;
} else {
// small, buffered scrub: keep playing; just keep clocks tight
if (Math.abs(vt - Number(audio.currentTime)) > 0.05) safeSetCT(audio, vt);
}
}); });
// wait helper
const waitUntilPlayable = (t, timeoutMs = 1000) => new Promise(resolve => { const waitUntilPlayable = (t, timeoutMs = 1000) => new Promise(resolve => {
const start = performance.now(); const start = performance.now();
const tick = () => { const tick = () => {
@ -416,9 +445,13 @@ var versionclient = "youtube.player.web_20250917_22_RC00"
if (myToken !== seekToken) return; if (myToken !== seekToken) return;
seekingActive = false; seekingActive = false;
// apply remembered intent // apply remembered intent
if (wasPlayingBeforeSeek || desiredPlaying) playTogether({ allowMutedRetry: true }); if (wasPlayingBeforeSeek || desiredPlaying) {
else pauseTogether(); playTogether({ allowMutedRetry: true });
} else {
pauseTogether();
}
})().catch(()=>{ seekingActive = false; }); })().catch(()=>{ seekingActive = false; });
}); });
@ -476,8 +509,6 @@ var versionclient = "youtube.player.web_20250917_22_RC00"
} }
}); });
// https://codeberg.org/ashley/poke/src/branch/main/src/libpoketube/libpoketube-youtubei-objects.json // https://codeberg.org/ashley/poke/src/branch/main/src/libpoketube/libpoketube-youtubei-objects.json