Studio -> Magazines: library, contents tree grouped by section with
confidence/pages/listening-time/audio status, the Stage D review
screen (tick/untick layout blocks, correct title/author, approve or
reject), a reflowed article view with click-to-seek sentence
highlighting, a linked original-page view showing the source bounding
box, and a podcast panel (2-3 host pickers, script generation,
turn-by-turn playback).
Wired into the existing lazy-module system (module-manifest.json,
loader.js, nav.js) rather than a separate app. Reuses /api/tts-preview
for both narration and podcast turns -- no new audio pipeline.
Fixes found building this:
- The pane toggle used role="tab" without the full ARIA tabs pattern
(aria-selected, roving tabindex, arrow-key nav) -- fails WCAG 2.2 AA
and hid the buttons from role-based tooling. Replaced with a button
group + aria-pressed, matching the plain-click interaction it
actually has.
- Print layout cues ("(continued on page 8)") were being sent to TTS
verbatim -- narration would have spoken the parenthetical aloud.
Stripped from the narration copy only; layout.json keeps the
original for the review screen.
- has_podcast now comes from the articles listing so opening an
article without a generated script skips a doomed GET instead of a
routine 404 on every open.
Verified against the real API contract with Playwright (library,
review pre-selection, approval, sentence highlighting + PDF-page
linking, podcast approval gate, zero console errors across the flow)
and manually end-to-end against a real ingested fixture, screenshots
included. Full suite: 94 Python tests, 33/34 desktop Playwright tests
(one unrelated pre-existing flaky DOM-count assertion).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
123 lines
2.7 KiB
JSON
123 lines
2.7 KiB
JSON
{
|
|
"core": [
|
|
"voice-picker",
|
|
"benchmark-voice-picker",
|
|
"voice-inspector",
|
|
"seed-finder",
|
|
"voice-sources",
|
|
"fishaudio-browser",
|
|
"voice-cache",
|
|
"jobs",
|
|
"image-cache",
|
|
"integrations",
|
|
"routing",
|
|
"voice-clone",
|
|
"voice-library",
|
|
"tts-preview",
|
|
"generation",
|
|
"benchmark",
|
|
"stt",
|
|
"namespace"
|
|
],
|
|
"lazy": {
|
|
"s-rehearser": [
|
|
"rehearser-parse",
|
|
"rehearser-cast",
|
|
"rehearser-train",
|
|
"rehearser-training-ui",
|
|
"rehearser-voice-design",
|
|
"rehearser-io",
|
|
"rehearser-playback",
|
|
"rehearser-recording",
|
|
"rehearser",
|
|
"rehearser-library",
|
|
"rehearser-stage",
|
|
"rehearser-voice-picker"
|
|
],
|
|
"s-reader": [
|
|
"rehearser-parse",
|
|
"rehearser-cast",
|
|
"rehearser-train",
|
|
"rehearser-training-ui",
|
|
"rehearser-voice-design",
|
|
"rehearser-io",
|
|
"rehearser-playback",
|
|
"rehearser-recording",
|
|
"rehearser",
|
|
"rehearser-library",
|
|
"rehearser-stage",
|
|
"rehearser-voice-picker",
|
|
"characters-library",
|
|
"reader",
|
|
"audiobook/network",
|
|
"audiobook-parse",
|
|
"audiobook-segmentation",
|
|
"audiobook-cast",
|
|
"audiobook-pipeline",
|
|
"audiobook-preview-export",
|
|
"audiobook",
|
|
"character-sheets"
|
|
],
|
|
"s-library": [
|
|
"rehearser-parse",
|
|
"rehearser-cast",
|
|
"rehearser-train",
|
|
"rehearser-training-ui",
|
|
"rehearser-voice-design",
|
|
"rehearser-io",
|
|
"rehearser-playback",
|
|
"rehearser-recording",
|
|
"rehearser",
|
|
"rehearser-library",
|
|
"rehearser-stage",
|
|
"rehearser-voice-picker",
|
|
"characters-library",
|
|
"reader",
|
|
"audiobook/network",
|
|
"audiobook-parse",
|
|
"audiobook-segmentation",
|
|
"audiobook-cast",
|
|
"audiobook-pipeline",
|
|
"audiobook-preview-export",
|
|
"audiobook",
|
|
"character-sheets",
|
|
"library",
|
|
"character-columns",
|
|
"library-characters",
|
|
"sillytavern"
|
|
],
|
|
"s-caststudio": [
|
|
"rehearser-parse",
|
|
"rehearser-cast",
|
|
"rehearser-train",
|
|
"rehearser-training-ui",
|
|
"rehearser-voice-design",
|
|
"rehearser-io",
|
|
"rehearser-playback",
|
|
"rehearser-recording",
|
|
"rehearser",
|
|
"rehearser-library",
|
|
"rehearser-stage",
|
|
"rehearser-voice-picker",
|
|
"characters-library",
|
|
"reader",
|
|
"audiobook/network",
|
|
"audiobook-parse",
|
|
"audiobook-segmentation",
|
|
"audiobook-cast",
|
|
"audiobook-pipeline",
|
|
"audiobook-preview-export",
|
|
"audiobook",
|
|
"character-sheets",
|
|
"library",
|
|
"character-columns",
|
|
"library-characters",
|
|
"sillytavern",
|
|
"studio"
|
|
],
|
|
"s-magazine": [
|
|
"magazine"
|
|
]
|
|
}
|
|
}
|