diff --git a/CHANGELOG.md b/CHANGELOG.md index 0efa87a..c305f70 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.1] — 2026-09-22 + +### Fixed +- **Magazine: "Listen"/"Continue" on an article with a generated MP3 still went through the live reader.** It hit "Pick a narrator voice first" instead of just playing the file that already existed. Both buttons now check for a generated MP3 first and play it instantly through the playlist player — no voice pick, no synthesis wait; "Continue" resumes from the saved position when one exists. Only an article with no generated audio falls back to the live sentence-by-sentence reader. + +--- + ## [1.48.0] — 2026-09-22 ### Added @@ -4365,7 +4372,8 @@ Initial feature-complete release. --- -[Unreleased]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.48.0...HEAD +[Unreleased]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.48.1...HEAD +[1.48.1]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.48.0...v1.48.1 [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 diff --git a/VERSION b/VERSION index 9db5ea1..5525f03 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.48.0 +1.48.1 diff --git a/static/index.html b/static/index.html index 8cdb5ee..58c2f4c 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 e7b9473..e1bd543 100644 --- a/static/js/magazine.js +++ b/static/js/magazine.js @@ -2694,6 +2694,23 @@ function renderCurrentImage(i) { async function magRead(articleId, opts) { const a = state.articles.find((x) => x.id === articleId); if (!a) return; + // A generated MP3 already exists: play that directly through the + // playlist player instead of picking a narrator and synthesising sentence + // by sentence again -- confirmed live, "Listen" on an article that had + // already been exported still went through the live reader from scratch. + if (a.has_audio) { + magTogglePlaylist(true); + magPlaylistPlay(articleId); + const saved = !(opts && opts.fromStart) && (state.doc.progress || {})[articleId]; + if (saved && saved.seconds) { + const audio = $('mag-playlist-audio'); + if (audio) { + const resume = () => { audio.currentTime = saved.seconds; audio.removeEventListener('loadedmetadata', resume); }; + audio.addEventListener('loadedmetadata', resume); + } + } + return; + } state.article = a; state.audioCache = new Map(); state.prepGen += 1;