From 52994df70b6a4dffb403d17d35446dd5250ac53f Mon Sep 17 00:00:00 2001 From: mARTin-B78 Date: Sat, 27 Jun 2026 12:12:22 +0200 Subject: [PATCH] feat: unified Library + character tags + shared cast (v1.10.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restructure the sidebar into Voices / Speak / Setup groups and fuse the Read Aloud and Script Rehearser features into one workspace: - New combined Library section (Books · Theater Plays · Characters/Cast) with cross-links (Rehearse a book, Read Aloud a play). - Character tags like voice tags: one record, many productions, reusable across books/scripts; seeded with origin book, editable in the editor. - Shared cast resolution: opening a production fills empty cast slots from the character roster (matched by book OR tag); voice choices written back on save. Productions joined by normalized title (prodKey). - Tags nav group for voices (distinct tags + counts, Cloned/Designed/Fav). - Fold standalone Characters into Library; Read Aloud now a single entry. Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 14 ++ VERSION | 2 +- scripts/minify.mjs | 2 +- static/index.html | 56 +++--- static/js/characters-library.js | 71 +++++++- static/js/library.js | 299 ++++++++++++++++++++++++++++++++ static/js/rehearser.js | 29 ++++ static/loader.js | 3 +- static/nav.js | 47 +++-- static/sections/s-library.html | 44 +++++ static/style.css | 26 +++ 11 files changed, 541 insertions(+), 52 deletions(-) create mode 100644 static/js/library.js create mode 100644 static/sections/s-library.html diff --git a/CHANGELOG.md b/CHANGELOG.md index c6ac32e..709c018 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,20 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi --- +## [1.10.0] — 2026-06-27 + +### Added +- **Combined Library** (new *Library* section under *Speak*) with three tabs — **Books**, **Theater Plays**, **Characters / Cast** — bringing audiobooks, rehearsals and the character roster into one place. Book and play cards cross-link: *Rehearse* a book, *Read Aloud* a play. +- **Character tags** (like voice tags): each character carries a comma-separated list of productions, seeded with its origin book and editable in the character editor. A character can now be **reused across several books/scripts** — one record, many tags. +- **Shared cast resolution**: opening a production in the Rehearser (and audiobook casting, which routes through it) auto-fills empty cast slots from the shared character roster, matched by book **or** tag. Cast voice choices are written back to existing characters on save, keeping the roster in sync. Productions are joined by normalized title (`prodKey`). +- **Tags** navigation group under *Voices*: distinct voice tags with live counts, plus the *Cloned / Designed / Favourites* predicates, each filtering the voice list. + +### Changed +- **Sidebar restructured** into clearer groups: *Voices* (Library · Tags · Voice Actions), *Speak* (Quick Play · Conversation · Read Aloud · Script Rehearsal · Library), *Setup* (Benchmark · Engines · Integrations · Settings). "Try It Out" is now **Quick Play**; "My Voices" is now **Library**. +- The standalone **Characters** section was folded into the combined Library; **Read Aloud** is now a single entry (its library lives in the combined Library); the Rehearser's Library/Cast steps moved into the combined Library, leaving Stage · Summary · Import/Export in the sidebar. + +--- + ## [1.9.8] — 2026-06-27 ### Changed diff --git a/VERSION b/VERSION index 66beabb..81c871d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.9.8 +1.10.0 diff --git a/scripts/minify.mjs b/scripts/minify.mjs index 148f155..4b51b3f 100644 --- a/scripts/minify.mjs +++ b/scripts/minify.mjs @@ -23,7 +23,7 @@ const MAIN = [ 'voice-picker', 'voice-inspector', 'seed-finder', 'voice-sources', 'fishaudio-browser', 'integrations', 'routing', 'voice-clone', 'voice-library', 'tts-preview', 'benchmark', 'stt', 'rehearser-parse', 'rehearser', 'reader', 'audiobook', 'character-sheets', - 'characters-library', + 'characters-library', 'library', ].map(n => join(jsDir, n + '.js')); const source = MAIN.map(f => `\n/* ==== ${f.split('/').pop()} ==== */\n` + readFileSync(f, 'utf8')).join('\n'); diff --git a/static/index.html b/static/index.html index 4335a7f..d9a4be1 100644 --- a/static/index.html +++ b/static/index.html @@ -26,7 +26,7 @@ - + @@ -119,49 +119,54 @@ + + + - - + + + + + + -
+