This commit is contained in:
parent
633aede41c
commit
86ffc9c1a6
10
CHANGELOG.md
10
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
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
<meta name="format-detection" content="telephone=no">
|
||||
<meta name="color-scheme" content="light dark">
|
||||
<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="icon" href="/static/icon.svg" type="image/svg+xml">
|
||||
<link rel="apple-touch-icon" href="/static/icon.svg">
|
||||
@ -27,12 +27,12 @@
|
||||
|
||||
<!-- ── Core styles (local — no CDN dependency for first paint) ────────── -->
|
||||
<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/css/resource-diagnostics.css?v=1.48.0">
|
||||
<link rel="stylesheet" href="/static/css/background-jobs.css?v=1.48.0">
|
||||
<link rel="stylesheet" href="/static/css/voice-design.css?v=1.48.0">
|
||||
<link rel="stylesheet" href="/static/css/rehearser.css?v=1.48.0">
|
||||
<link rel="stylesheet" href="/static/css/audiobook.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.1">
|
||||
<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.1">
|
||||
<link rel="stylesheet" href="/static/css/rehearser.css?v=1.48.1">
|
||||
<link rel="stylesheet" href="/static/css/audiobook.css?v=1.48.1">
|
||||
|
||||
|
||||
<!-- ── Flag icons — non-blocking (loaded async, icons appear after JS) ── -->
|
||||
@ -403,7 +403,7 @@ window.toggleNavTree = function(treeId, chevronId) {
|
||||
</script>
|
||||
|
||||
<!-- 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>
|
||||
</html>
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user