diff --git a/CHANGELOG.md b/CHANGELOG.md index b2dd361..dfe95dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,13 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi --- +## [1.47.1] — 2026-09-22 + +### Added +- **Magazine: a progress bar for "Generate all audio."** The export status was a single line of text that jumped between "Article N/Total…" and a mid-render "sentence X/Y" — now a `` bar plus a plain "N / Total" count track the same numbers visually, parsed from the job's own progress text. + +--- + ## [1.47.0] — 2026-09-22 ### Added @@ -4351,7 +4358,8 @@ Initial feature-complete release. --- -[Unreleased]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.47.0...HEAD +[Unreleased]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.47.1...HEAD +[1.47.1]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.47.0...v1.47.1 [1.47.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.46.0...v1.47.0 [1.46.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.45.0...v1.46.0 [1.45.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.44.0...v1.45.0 diff --git a/VERSION b/VERSION index 21998d3..f805cd6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.47.0 +1.47.1 diff --git a/static/index.html b/static/index.html index 342b4ae..a767efc 100644 --- a/static/index.html +++ b/static/index.html @@ -10,7 +10,7 @@ - + @@ -27,12 +27,12 @@ - - - - - - + + + + + + @@ -403,7 +403,7 @@ window.toggleNavTree = function(treeId, chevronId) { - + diff --git a/static/js/magazine.js b/static/js/magazine.js index b23eaca..f3a1582 100644 --- a/static/js/magazine.js +++ b/static/js/magazine.js @@ -822,7 +822,11 @@ async function magGenerateAllAudio() { if (!voice) return say('Pick a narrator voice for the export first', 'err'); const btn = $('mag-audio-export-btn'); const status = $('mag-audio-export-status'); + const progressWrap = $('mag-audio-export-progress-wrap'); + const progressBar = $('mag-audio-export-progress'); + const progressCount = $('mag-audio-export-count'); if (btn) btn.disabled = true; + if (progressWrap) progressWrap.hidden = false; let jobId; try { const r = await api('/api/magazine/' + state.doc.id + '/audio/batch', { @@ -832,6 +836,7 @@ async function magGenerateAllAudio() { jobId = r.job_id; } catch (e) { if (btn) btn.disabled = false; + if (progressWrap) progressWrap.hidden = true; return say('Could not start audio export: ' + e.message, 'err'); } for (;;) { @@ -839,6 +844,15 @@ async function magGenerateAllAudio() { try { job = await api('/api/jobs/' + jobId); } catch (e) { if (btn) btn.disabled = false; return say('Could not check audio export: ' + e.message, 'err'); } if (status) status.textContent = job.detail || 'Working…'; + // The job's own detail text always leads with "N/Total" -- either + // "Article N/Total…" between articles, or "(N/Total) Title: sentence + // X/Y" while one is actively rendering -- so one simple match covers + // both without the backend needing a separate numeric progress field. + const m = /(\d+)\/(\d+)/.exec(job.detail || ''); + if (m && progressBar && progressCount) { + progressBar.max = m[2]; progressBar.value = m[1]; + progressCount.textContent = m[1] + ' / ' + m[2]; + } if (job.done) { say(job.error ? 'Audio export failed: ' + job.error : (job.detail || 'Audio export done'), job.error ? 'err' : 'ok'); break; @@ -847,6 +861,7 @@ async function magGenerateAllAudio() { } if (btn) btn.disabled = false; if (status) status.textContent = ''; + if (progressWrap) progressWrap.hidden = true; await magRefreshArticles(); renderContents(); if (!$('mag-playlist')?.hidden) renderPlaylistTracks(); diff --git a/static/sections/s-magazine.html b/static/sections/s-magazine.html index 20f84ce..f98b834 100644 --- a/static/sections/s-magazine.html +++ b/static/sections/s-magazine.html @@ -90,6 +90,10 @@ +