Release v1.48.1
Some checks are pending
Test and SonarQube / quality (push) Waiting to run

This commit is contained in:
mARTin-B78 2026-09-22 23:01:31 +02:00
parent 633aede41c
commit 86ffc9c1a6
4 changed files with 35 additions and 10 deletions

View File

@ -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 ## [1.48.0] — 2026-09-22
### Added ### 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.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.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.47.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.46.0...v1.47.0

View File

@ -1 +1 @@
1.48.0 1.48.1

View File

@ -10,7 +10,7 @@
<meta name="format-detection" content="telephone=no"> <meta name="format-detection" content="telephone=no">
<meta name="color-scheme" content="light dark"> <meta name="color-scheme" content="light dark">
<meta name="theme-color" content="#2563EB"> <meta name="theme-color" content="#2563EB">
<meta name="app-version" content="1.48.0"> <meta name="app-version" content="1.48.1">
<link rel="manifest" href="/manifest.webmanifest"> <link rel="manifest" href="/manifest.webmanifest">
<link rel="icon" href="/static/icon.svg" type="image/svg+xml"> <link rel="icon" href="/static/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/static/icon.svg"> <link rel="apple-touch-icon" href="/static/icon.svg">
@ -27,12 +27,12 @@
<!-- ── Core styles (local — no CDN dependency for first paint) ────────── --> <!-- ── Core styles (local — no CDN dependency for first paint) ────────── -->
<link rel="stylesheet" href="/static/vendor/mdi/materialdesignicons.min.css"> <link rel="stylesheet" href="/static/vendor/mdi/materialdesignicons.min.css">
<link rel="stylesheet" href="/static/style.css?v=1.48.0"> <link rel="stylesheet" href="/static/style.css?v=1.48.1">
<link rel="stylesheet" href="/static/css/resource-diagnostics.css?v=1.48.0"> <link rel="stylesheet" href="/static/css/resource-diagnostics.css?v=1.48.1">
<link rel="stylesheet" href="/static/css/background-jobs.css?v=1.48.0"> <link rel="stylesheet" href="/static/css/background-jobs.css?v=1.48.1">
<link rel="stylesheet" href="/static/css/voice-design.css?v=1.48.0"> <link rel="stylesheet" href="/static/css/voice-design.css?v=1.48.1">
<link rel="stylesheet" href="/static/css/rehearser.css?v=1.48.0"> <link rel="stylesheet" href="/static/css/rehearser.css?v=1.48.1">
<link rel="stylesheet" href="/static/css/audiobook.css?v=1.48.0"> <link rel="stylesheet" href="/static/css/audiobook.css?v=1.48.1">
<!-- ── Flag icons — non-blocking (loaded async, icons appear after JS) ── --> <!-- ── Flag icons — non-blocking (loaded async, icons appear after JS) ── -->
@ -403,7 +403,7 @@ window.toggleNavTree = function(treeId, chevronId) {
</script> </script>
<!-- loader.js: fetches sections → loads JS modules → removes skeleton --> <!-- loader.js: fetches sections → loads JS modules → removes skeleton -->
<script src="/static/loader.js?v=1.48.0"></script> <script src="/static/loader.js?v=1.48.1"></script>
</body> </body>
</html> </html>

View File

@ -2694,6 +2694,23 @@ function renderCurrentImage(i) {
async function magRead(articleId, opts) { async function magRead(articleId, opts) {
const a = state.articles.find((x) => x.id === articleId); const a = state.articles.find((x) => x.id === articleId);
if (!a) return; 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.article = a;
state.audioCache = new Map(); state.audioCache = new Map();
state.prepGen += 1; state.prepGen += 1;