Show live % progress in playing badge, generation time in idle badge
This commit is contained in:
@@ -2439,6 +2439,7 @@ const chapterTmpl = `
|
|||||||
voiceSel.disabled = false;
|
voiceSel.disabled = false;
|
||||||
speedSlider.disabled = false;
|
speedSlider.disabled = false;
|
||||||
setBadge(playerStateBadge, 'playing');
|
setBadge(playerStateBadge, 'playing');
|
||||||
|
playerStateBadge.textContent = '0%';
|
||||||
playerTitle.textContent = 'Ch.\u00a0' + CHAPTER_N;
|
playerTitle.textContent = 'Ch.\u00a0' + CHAPTER_N;
|
||||||
setStatus('');
|
setStatus('');
|
||||||
showSeek();
|
showSeek();
|
||||||
@@ -2448,6 +2449,10 @@ const chapterTmpl = `
|
|||||||
if (stale()) return;
|
if (stale()) return;
|
||||||
setPlayIcon('▶');
|
setPlayIcon('▶');
|
||||||
setBadge(playerStateBadge, 'paused');
|
setBadge(playerStateBadge, 'paused');
|
||||||
|
// Keep showing current % while paused.
|
||||||
|
var pct = (audio.duration && isFinite(audio.duration))
|
||||||
|
? Math.round((audio.currentTime / audio.duration) * 100) : 0;
|
||||||
|
playerStateBadge.textContent = pct + '%';
|
||||||
setStatus('');
|
setStatus('');
|
||||||
showSeek();
|
showSeek();
|
||||||
if ('mediaSession' in navigator) navigator.mediaSession.playbackState = 'paused';
|
if ('mediaSession' in navigator) navigator.mediaSession.playbackState = 'paused';
|
||||||
@@ -2459,6 +2464,11 @@ const chapterTmpl = `
|
|||||||
voiceSel.disabled = false;
|
voiceSel.disabled = false;
|
||||||
speedSlider.disabled = false;
|
speedSlider.disabled = false;
|
||||||
setBadge(playerStateBadge, 'idle');
|
setBadge(playerStateBadge, 'idle');
|
||||||
|
// Show how long TTS generation took, if we have a timestamp.
|
||||||
|
if (genStartTime > 0) {
|
||||||
|
var secs = ((Date.now() - genStartTime) / 1000).toFixed(1);
|
||||||
|
playerStateBadge.textContent = secs + 's';
|
||||||
|
}
|
||||||
playerTitle.textContent = 'Ch.\u00a0' + CHAPTER_N;
|
playerTitle.textContent = 'Ch.\u00a0' + CHAPTER_N;
|
||||||
setStatus('');
|
setStatus('');
|
||||||
hideSeek();
|
hideSeek();
|
||||||
@@ -2485,11 +2495,13 @@ const chapterTmpl = `
|
|||||||
|
|
||||||
// ── server-side audio generation ─────────────────────────────────────────────
|
// ── server-side audio generation ─────────────────────────────────────────────
|
||||||
var currentAudioCtrl = null;
|
var currentAudioCtrl = null;
|
||||||
|
var genStartTime = 0; // Date.now() when generation began
|
||||||
|
|
||||||
function generateAudio(chapterN, cb) {
|
function generateAudio(chapterN, cb) {
|
||||||
if (currentAudioCtrl) { currentAudioCtrl.abort(); }
|
if (currentAudioCtrl) { currentAudioCtrl.abort(); }
|
||||||
var ctrl = new AbortController();
|
var ctrl = new AbortController();
|
||||||
currentAudioCtrl = ctrl;
|
currentAudioCtrl = ctrl;
|
||||||
|
genStartTime = Date.now();
|
||||||
|
|
||||||
fetch('/ui/audio/' + SLUG + '/' + chapterN, {
|
fetch('/ui/audio/' + SLUG + '/' + chapterN, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@@ -2523,6 +2535,10 @@ const chapterTmpl = `
|
|||||||
function onTimeUpdate() {
|
function onTimeUpdate() {
|
||||||
if (stale()) { audio.removeEventListener('timeupdate', onTimeUpdate); return; }
|
if (stale()) { audio.removeEventListener('timeupdate', onTimeUpdate); return; }
|
||||||
updateSeek();
|
updateSeek();
|
||||||
|
// Live % progress in the badge while playing.
|
||||||
|
if (audio.duration && isFinite(audio.duration) && !audio.paused) {
|
||||||
|
playerStateBadge.textContent = Math.round((audio.currentTime / audio.duration) * 100) + '%';
|
||||||
|
}
|
||||||
if (!NEXT_N || prefetchFired || !audio.duration || !isFinite(audio.duration)) {
|
if (!NEXT_N || prefetchFired || !audio.duration || !isFinite(audio.duration)) {
|
||||||
} else if (audio.currentTime / audio.duration >= 0.8) {
|
} else if (audio.currentTime / audio.duration >= 0.8) {
|
||||||
prefetchFired = true;
|
prefetchFired = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user