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
6553d5003d
fix: preserve custom OCR engine cards
2026-09-05 08:11:57 +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
18e586d06f
refactor: scope conversation state
2026-09-04 13:42:02 +02:00
417d7215d2
refactor: scope i18n state
2026-09-04 13:40:07 +02:00
ee4208ec51
refactor: scope cast compatibility modules
2026-09-04 13:38:40 +02:00
542f44fbb8
refactor: scope seed finder
2026-09-04 13:36:55 +02:00
10f618c179
refactor: scope character columns
2026-09-04 13:35:10 +02:00
d2a8dd43b4
perf: tighten character pagination
2026-09-04 13:31:18 +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
1b7d6b2346
refactor: scope generation module
2026-09-04 13:15:30 +02:00
ababdf6741
refactor: scope stt module
2026-09-04 13:13:10 +02:00
c53c47ce2d
refactor: scope ai backends
2026-09-04 13:10:51 +02:00
716e601fac
refactor: scope integrations module
2026-09-04 13:06:59 +02:00
3fffae9015
refactor: scope combined library
2026-09-04 13:04:46 +02:00
260c5c22a7
refactor: scope engine support
2026-09-04 13:02:29 +02:00
b747553bf6
refactor: scope routing module
2026-09-04 13:00:10 +02:00
28c72c76dd
refactor: scope voice sources
2026-09-04 12:57:53 +02:00
d219aec676
refactor: scope voice clone
2026-09-04 12:55:50 +02:00
998a65f2ba
refactor: scope tts preview
2026-09-04 12:53:44 +02:00
656d0473d4
refactor: scope settings module
2026-09-04 12:51:29 +02:00
8002ca1d75
refactor: scope character library
2026-09-04 12:49:22 +02:00
0e615d52de
refactor: scope studio module
2026-09-04 12:47:30 +02:00
ac55cd88a3
refactor: scope rehearser cast
2026-09-04 12:44:58 +02:00
df95ada578
refactor: scope rehearser voice design
2026-09-04 12:44:08 +02:00
0f3d410260
refactor: scope rehearser voice picker
2026-09-04 12:43:11 +02:00
dea1de5c57
refactor: scope rehearser stage
2026-09-04 12:42:22 +02:00
da3957347c
refactor: scope audiobook network
2026-09-04 12:41:35 +02:00
7ee5f65e00
refactor: scope rehearser library
2026-09-04 12:40:56 +02:00
0ee43421b7
refactor: scope reader module
2026-09-04 12:40:09 +02:00
66c5dd6e0c
refactor: scope audiobook core
2026-09-04 12:37:37 +02:00
c6db55e55b
refactor: scope rehearser core
2026-09-04 12:33:55 +02:00
6c62a0f75e
refactor: scope rehearser recording
2026-09-04 12:31:03 +02:00
3a7f0bf677
refactor: scope rehearser io
2026-09-04 12:30:13 +02:00
a202230654
refactor: scope rehearser playback
2026-09-04 12:29:19 +02:00
cc4fc4ae2e
refactor: scope audiobook state modules
2026-09-04 12:26:21 +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
e096b3e529
refactor: wire audiobook namespace APIs
2026-09-04 11:54:56 +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
7c14f41cb9
refactor: extract audiobook speaker normalization
2026-09-04 11:32:20 +02:00
0d1299b19c
refactor: extract audiobook cast cleanup
2026-09-04 11:30:12 +02:00
1951ce0646
refactor: extract audiobook dialogue merging
2026-09-04 11:27:49 +02:00
41349867a1
refactor: extract audiobook cast normalization
2026-09-04 11:25: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
b1374c50a0
fix: synchronize frontend release cache version
2026-09-04 10:36:44 +02:00
5c8683821e
fix: preserve lazy navigation intent
2026-09-04 10:34:50 +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
a11fe8177c
test: cover background retry controls
2026-09-04 10:00:10 +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
9b15dae205
fix: preserve live image job results
2026-09-04 09:52:40 +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