diff --git a/CHANGELOG.md b/CHANGELOG.md index dfe95dd..0efa87a 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.48.0] — 2026-09-22 + +### Added +- **Magazine: "Generate all audio" resumes instead of redoing everything.** It now only renders approved articles that don't already have an MP3 — safe to click again after an aborted or partial run (a container restart mid-batch, closing the tab, etc.) without re-synthesising what already finished. + +--- + ## [1.47.1] — 2026-09-22 ### Added @@ -4358,7 +4365,8 @@ Initial feature-complete release. --- -[Unreleased]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.47.1...HEAD +[Unreleased]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.48.0...HEAD +[1.48.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.47.1...v1.48.0 [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 diff --git a/VERSION b/VERSION index f805cd6..9db5ea1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.47.1 +1.48.0 diff --git a/static/index.html b/static/index.html index a767efc..8cdb5ee 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 f3a1582..e7b9473 100644 --- a/static/js/magazine.js +++ b/static/js/magazine.js @@ -820,6 +820,13 @@ function renderContentsBulkBar() { async function magGenerateAllAudio() { const voice = ($('mag-audio-voice')?.value || '').trim(); if (!voice) return say('Pick a narrator voice for the export first', 'err'); + // Skip whatever already has audio -- resuming after an aborted or + // partial run (confirmed live: a magazine this size can genuinely take + // a while, and killing the job partway through, deliberately or via a + // container restart, is a real scenario, not an edge case) should not + // mean re-synthesising articles that are already done. + const missing = state.articles.filter((a) => a.status === 'approved' && !a.has_audio).map((a) => a.id); + if (!missing.length) return say('Every approved article already has audio', ''); const btn = $('mag-audio-export-btn'); const status = $('mag-audio-export-status'); const progressWrap = $('mag-audio-export-progress-wrap'); @@ -831,7 +838,7 @@ async function magGenerateAllAudio() { try { const r = await api('/api/magazine/' + state.doc.id + '/audio/batch', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ voice }), + body: JSON.stringify({ voice, article_ids: missing }), }); jobId = r.job_id; } catch (e) { diff --git a/static/sections/s-magazine.html b/static/sections/s-magazine.html index f98b834..6c714a6 100644 --- a/static/sections/s-magazine.html +++ b/static/sections/s-magazine.html @@ -84,7 +84,7 @@