736aeaaeac
feat: add magazine projects with layout-aware article extraction
...
Magazines break the audiobook pipeline's assumptions: several unrelated
articles share a page, columns run in parallel, adverts and sidebars
interrupt body copy, and a feature routinely jumps twenty pages to its
tail. Narrating page-by-page walks out of an article mid-sentence and
into an advert, so the canonical object is the article, not the page.
core/magazine.py reconstructs articles from a flat PDF: PyMuPDF extracts
blocks with bboxes and font metrics, tesseract supplies a TSV fallback so
scanned pages join the same column grouping, blocks are classified and
ordered column-major, and articles are anchored by the parsed table of
contents with "continued on page N" tails linked back.
routes/magazine.py adds 13 endpoints. Ingestion is a restart-safe
background job. Nothing is narrated until a human approves the
boundaries; podcast generation refuses unapproved articles.
Podcast mode renders an approved article as a 2-3 host discussion using
the configured LLM and voices the user picks, alongside narration rather
than instead of it.
Verified end-to-end over HTTP on a synthetic 8-page issue: the feature
came back as pages [3, 8] with its jump tail absorbed and the advert page
excluded, and an image-only rendering recovered all 47 blocks via OCR.
44 new tests; full suite 90 passing.
The Studio UI is not built — this is reachable only via the API.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 12:46:54 +02:00
60ef436ce1
feat: add OCR engine profiles
2026-09-04 22:29:11 +02:00
2caa417401
fix: preserve audiobook dialogue boundaries
2026-09-04 15:36:26 +02:00
29f5243f6b
test: preserve dialogue-only recast merges
2026-09-04 15:31:45 +02:00
b6f4a9518b
test: lock visual identity prompts
2026-09-04 15:30:39 +02:00
8181c491c0
docs: complete frontend namespace migration
2026-09-04 13:43:36 +02:00
7938f9ca74
refactor: scope frontend utilities
2026-09-04 13:27:43 +02:00
d055596504
refactor: scope voice inspector
2026-09-04 13:25:13 +02:00
67ee55d3ac
refactor: scope character library
2026-09-04 13:23:54 +02:00
73f8f92826
refactor: scope character sheets
2026-09-04 13:21:31 +02:00
e5bd2a149f
refactor: scope voice library
2026-09-04 13:19:52 +02:00
8002ca1d75
refactor: scope character library
2026-09-04 12:49:22 +02:00
0ee43421b7
refactor: scope reader module
2026-09-04 12:40:09 +02:00
a202230654
refactor: scope rehearser playback
2026-09-04 12:29:19 +02:00
302dbe1279
refactor: scope pure frontend leaves
2026-09-04 12:20:33 +02:00
d32985256d
docs: close incremental p1 audit
2026-09-04 12:14:47 +02:00
cefd4bd494
refactor: extract rehearser training mode
2026-09-04 12:12:11 +02:00
0c7cc04643
refactor: extract rehearser recording
2026-09-04 12:10:00 +02:00
ba7b3115b9
refactor: extract audiobook preview export
2026-09-04 12:05:50 +02:00
76421dfe88
refactor: extract audiobook casting pipeline
2026-09-04 12:04:05 +02:00
eaf2f29d62
refactor: extract rehearser io
2026-09-04 12:01:38 +02:00
f97fd60e43
refactor: extract rehearser playback
2026-09-04 11:59:09 +02:00
6f2c0b7b3d
refactor: extract audiobook cast view
2026-09-04 11:53:04 +02:00
262e37fffd
refactor: extract rehearser voice matching
2026-09-04 11:47:51 +02:00
4c8022e8aa
refactor: extract audiobook stylesheet
2026-09-04 11:44:55 +02:00
065445a20a
refactor: extract rehearser stylesheet
2026-09-04 11:42:43 +02:00
eb008475ed
refactor: extract rehearser cast renderer
2026-09-04 11:39:45 +02:00
ae9df4f7f0
feat: distinguish provider configuration and health
2026-09-04 11:35:52 +02:00
0876527554
refactor: extract audiobook quote segmentation
2026-09-04 11:22:15 +02:00
2fde0a176d
refactor: extract rehearser voice design
2026-09-04 11:19:01 +02:00
d43959728d
refactor: split voice design styles
2026-09-04 11:16:05 +02:00
de099d30c5
refactor: split background job styles
2026-09-04 11:13:36 +02:00
8d9a172993
refactor: split resource diagnostics styles
2026-09-04 11:10:43 +02:00
c0ac5dd775
refactor: extract audiobook cast serialization
2026-09-04 11:08:49 +02:00
d3bc806f33
refactor: extract rehearser training comparison
2026-09-04 11:06:23 +02:00
d613591526
refactor: extract rehearser cast controls
2026-09-04 11:04:13 +02:00
ed3b2d42cd
refactor: publish feature APIs through TTVC
2026-09-04 11:00:22 +02:00
e2e20fa89f
feat: add request correlation diagnostics
2026-09-04 10:58:46 +02:00
66ebd1a8b8
refactor: extract audiobook parsing primitives
2026-09-04 10:56:31 +02:00
0bfb6d694b
refactor: extract rehearser voice picker
2026-09-04 10:54:21 +02:00
e98c5ffe33
refactor: extract rehearser stage controls
2026-09-04 10:52:05 +02:00
2712843322
refactor: extract rehearser library persistence
2026-09-04 10:46:02 +02:00
c815b7941a
feat: expand resource diagnostics
2026-09-04 10:42:08 +02:00
8f95978486
test: validate current image under 4g memory limit
2026-09-04 10:38:36 +02:00
8d7511cdbf
test: measure constrained character workloads
2026-09-04 10:34:27 +02:00
4b01a853fb
perf: bound browser library image cache
2026-09-04 10:28:07 +02:00
e515554446
refactor: centralize provider health probes
2026-09-04 10:25:55 +02:00
c43a11da68
perf: lazy-load section feature modules
2026-09-04 10:23:20 +02:00
06763a4602
docs: record P1 status for 1.24.15
2026-09-04 10:15:56 +02:00
0f1d93c9df
perf: bound rehearser audio cache
2026-09-04 10:11:44 +02:00
bf186387f9
perf: coalesce voice library fetches
2026-09-04 10:10:10 +02:00
55d0dd1012
refactor: add frontend namespace migration bridge
2026-09-04 10:07:46 +02:00
c4a5689a1d
fix: prevent narrator phantom speakers in book2
2026-09-04 10:04:20 +02:00
aa8a96c48f
feat: add safe retries for background jobs
2026-09-04 09:58:45 +02:00
6ca044ef64
feat: validate canonical image asset digests
2026-09-04 09:53:50 +02:00
90e74149d9
feat: add constrained-device resource diagnostics
2026-09-04 09:51:49 +02:00
e18bc6a8cc
test: validate throttled desktop navigation
2026-09-04 09:49:57 +02:00
690673625d
feat: persist background job result artifacts
2026-09-04 09:48:37 +02:00
b648bbdf0b
feat: add safe background job history panel
2026-09-04 09:44:31 +02:00
f67930aefb
feat: expose sanitized background job history
2026-09-04 09:39:13 +02:00
b0f475d850
test: cover constrained character dom
2026-09-04 09:37:56 +02:00
5219bc4588
feat: unify transient provider retries
2026-09-04 09:36:48 +02:00
2608c953ee
test: cover attribution and timeout safety
2026-09-04 09:34:46 +02:00
0fd39d4acb
test: cover profile completeness counting
2026-09-04 09:33:45 +02:00
97c0958ef0
test: validate current image under four gigabytes
2026-09-04 09:32:28 +02:00
748351b71f
test: cover casting constraints
2026-09-04 09:28:26 +02:00
c6c9c53489
test: cover stt and comfyui boundaries
2026-09-04 09:27:45 +02:00
a714ea0273
test: add frontend quality gate
2026-09-04 09:26:01 +02:00
e234a6e9a3
feat: persist background job metadata
2026-09-04 09:23:17 +02:00
8ed1f122a3
test: add book two attribution fixture
2026-09-04 09:18:41 +02:00
4300d22cd9
feat: add background casting jobs
2026-09-04 09:17:56 +02:00
cc8fcdbd69
refactor: share frontend module manifest
2026-09-04 09:15:41 +02:00
a53f65aa05
feat: add background voice design jobs
2026-09-04 09:12:27 +02:00
f14e1d2e92
docs: close provider credential boundary review
2026-09-04 09:08:31 +02:00
3964690444
feat: add optional background transcription jobs
2026-09-04 09:07:14 +02:00
d03c9841e9
test: cover constrained browser concurrency
2026-09-04 08:59:09 +02:00
3456b5a3b0
feat: support character appearance forms
2026-09-04 08:51:33 +02:00
0b51a76c21
fix: flag inconsistent current image pairs
2026-09-04 08:39:01 +02:00
cb653d15d0
perf: reduce library pages on low memory devices
2026-09-04 08:35:18 +02:00
4ffe6e9012
feat: add consistent image job cancellation
2026-09-04 08:34:35 +02:00
2cda7df636
test: stabilize browser smoke fixtures
2026-09-04 08:30:46 +02:00
3c6245a5f8
fix: repair split guillemet dialogue
2026-09-04 08:26:27 +02:00
95cadcc463
test: cover character library interactions
2026-09-04 08:22:47 +02:00
47d6a5d247
fix: release local preview object URLs
2026-09-04 08:11:32 +02:00
fc0361bc71
feat: deduplicate casting requests
2026-09-04 08:10:55 +02:00
2b99dc8ccc
feat: deduplicate voice design requests
2026-09-04 08:10:27 +02:00
116e234c20
perf: bound persisted line audio cache
2026-09-04 08:09:36 +02:00
d21a6f28e8
feat: record protected generation history
2026-09-04 08:07:42 +02:00
e52d462dac
perf: paginate large voice libraries
2026-09-04 08:05:09 +02:00
8235b36afd
security: validate upload filenames and archive paths
2026-09-04 08:04:26 +02:00
b5d2e773d8
perf: paginate large character productions
2026-09-04 08:01:29 +02:00
760a3640ba
perf: bound speech proxy synthesis
2026-09-04 08:00:41 +02:00
9517cca00c
feat: detect stale character image identity
2026-09-04 07:59:17 +02:00
94f09c110d
feat: version character visual identity
2026-09-04 07:58:16 +02:00
6c75acbf72
perf: bound stt concurrency
2026-09-04 07:57:04 +02:00
c1ad0cdc46
perf: bound preview tts concurrency
2026-09-04 07:56:30 +02:00
742b43d860
security: isolate docker socket behind proxy
2026-09-04 07:55:00 +02:00
4a0101f4a4
perf: bound fish audio response cache
2026-09-04 07:53:17 +02:00
885fa9b065
perf: bound concurrent image generation
2026-09-04 07:52:17 +02:00
ebf7b8baa1
feat: deduplicate image generation jobs
2026-09-04 07:51:31 +02:00