tts-voice-creator-clone-and.../core
mARTin-B78 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
..
__init__.py Security audit, modular refactor, and container-name field 2026-05-29 12:13:07 +02:00
audio.py Fix Fish-Speech emotion tags, wire book context into portraits, add emotion controls app-wide (v1.20.5) 2026-08-11 18:02:41 +02:00
config.py feat: unify transient provider retries 2026-09-04 09:36:48 +02:00
constants.py security: harden P0 boundaries and recovery 2026-09-04 07:33:41 +02:00
database.py feat: persist background job result artifacts 2026-09-04 09:48:37 +02:00
docker_client.py security: isolate docker socket behind proxy 2026-09-04 07:55:00 +02:00
magazine.py feat: add magazine projects with layout-aware article extraction 2026-09-05 12:46:54 +02:00
presets.py Back user state with SQLite voice index 2026-06-30 15:06:43 +02:00
provider_health.py refactor: centralize provider health probes 2026-09-04 10:25:55 +02:00
registry.py Security audit, modular refactor, and container-name field 2026-05-29 12:13:07 +02:00
retry.py feat: unify transient provider retries 2026-09-04 09:36:48 +02:00
routing.py Release v1.22.2 2026-09-03 16:12:02 +02:00
tts_helpers.py Fix bundle-breaking TDZ throw, use English emotion instructs, forward Fish gen params (v1.20.6) 2026-08-11 22:00:56 +02:00
validation.py feat: validate canonical image asset digests 2026-09-04 09:53:50 +02:00
voice_index.py Add unified Studio casting workflow and fix voice/casting pipeline bugs 2026-07-26 02:03:56 +02:00
voice.py security: harden P0 boundaries and recovery 2026-09-04 07:33:41 +02:00