Controls can no longer fall off screen (320x568 up to tablets and landscape), share no longer overlaps the title.
Picture view with zoom/pan, Spotify-style whole-text lyrics with follow/back-to-current, minimize to current line,
persisted view choice, 44px segmented control.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Previous/current/next sentence in a fixed-height box with a fade, tap to jump. The
highlight is a binary search over sentence starts on audio.currentTime every animation
frame, with forced resync on seeking, seeked, ratechange, play, pause and visibility; the
marked word uses the sentence's own span. Playwright covers seeks, 1.5x/2x, rapid seeks.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The TTS pads every sentence with 0.4-0.9 s of silence; boundaries are exact but the
highlight lit up that long before the words. Record per-sentence speech onsets at render
time, measure them from the decoded MP3 for older audio, and expose them as 'speech' in
/timings.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Share buttons (toolbar, playlist, driving mode) build #s-magazine?doc=..&article=..&mode=drive; opening it routes to the article and starts driving mode with a Tap-to-play prompt if autoplay is blocked. Ids are validated strictly; access is unchanged.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Adds GET .../articles/{id}/timings (exact per-sentence times via plan_sentences); the player uses them, falls back to the length estimate, and gives captions no time slot.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Fixed 1:1 sizes scaled with clamp(), no flex-shrink/stretch; overlay no longer clips when content is taller than the viewport.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The story moment was a ~5,400-character prompt whose period rules sat at
the end, out of reach of the 4-step model; it opened with "ears clearly
visible" and asked for studio photography by a photographer with a real
actor, and drew a modern man with headphones and a camera in a garden,
captioned with pseudo-text. The prop tile was a stock catalog photo. The
negative prompts were inert because those samplers run at cfg 1.0.
Story moment and signature-item prompts are now short, world-first and
positive-only: The Dark Eye, 900-1300 AD and the book profile's setting
(never the title), the same identity, appearance and costume as the
turnaround, the book moment, a period background and a hand-made,
unmarked world; the item is the character's own, in the craftsmanship
and colours of their costume, on a table in a medieval room. Text and
modern objects are added to the scene and prop negatives.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The sheet composer drew light lines between the three poses and between
the top and bottom rows, cutting through capes and swords.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Also reuses the existing magFmtClock for the contents list (the duplicate
tripped the frontend collision gate).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A page either side marks as a full-page ad is skipped by that side's quality
run, so comparing its near-empty boxes against the same page freshly OCR'd
on the other side (ad-marking is a one-time manual step) was a review-state
difference, not a pipeline one, skewing whole-issue numbers. Verified: text
similarity 0.837->0.870, box precision 0.62->0.66 on the real re-import.
Also records the clean from-scratch re-ingest results: the ingest-time
duplicate-check ordering fix is proven in isolation (0 additional duplicates
found afterward, vs 13 before the fix), and the auto-chained Auto-fix ran
end to end.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
A fresh import used to stop once laid out, leaving missed text, unverified
OCR and provable misspellings for a separate manual click. _ingest_sync now
runs _quality_run_sync itself, under the same job, so the ingest progress
bar carries through it and the reviewer opens an already-worked magazine.
An Auto-fix failure is reported as an ingest failure without losing the
ingest's own result.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The duplicate detector only ran once, before geometry fixes could merge or
grow a box into one that now duplicates another's text -- narrating it
twice. Now re-run after the geometry loop at ingest and after
recover_missing_text in the whole-issue quality run. Confirmed live: 13
such duplicates in a fresh import, 6 in the already-reviewed magazine.
TODO: F decided unnecessary per user; G updated with both universal fixes
from this pass.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- fuse_paragraph_blocks joins a paragraph split by a column or page break into one
narration block (reader, podcast source and MP3), keeping source regions for highlighting
- language decided once per article; per-article acronym glossary (LLM classifies unknown
acronyms from context), letter-spelled acronym lists, extended DE/EN database
- core/spelling: dictionary findings (compounds, inflections, line-break hyphens, other-language
words), marked in review and listed per page/article; guarded LLM agent fixes; quality run
now includes the spelling pass
- keep suspended compound hyphens (Programmier- und) when merging regions / building layouts
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fold the previously-untagged 1.53.5 work-in-progress plus the magazine
quality-check/driving-mode-player/ad-recognition/phone-toolbar fixes into
a single finalized release.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- The sticky review toolbar wraps to many rows on a phone and covered most of the page image,
so drawing a region or drag-selecting boxes started on a toolbar button; it now scrolls away
below 860px
- Delete-button layout test accepts the phone layout (text on its own line)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Export the region-type picker handlers and magRunPageQuality to the page (they threw
"not defined", so the picker never opened and Find missed text / Verify OCR did nothing)
- Add a unit test that fails when an inline mag* handler is not exported
- Quality audit: pixel-level clipping check on all four box edges, duplicate-article
detection, detected full-page advertisements skipped and shown green (no manual button)
- Driving mode text is karaoke-style (whole article, current sentence and word highlighted)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Quality run: per-page missed-text recovery, guarded OCR re-read and a pixel audit
(uncovered ink, overlapping boxes, clipped box edges); report saved as quality_report.json
- Thumbnail grid: quality-stage colours, flag badge, live per-page indicator for every
batch step (OCR, detection, figure fixing, quality run, audio)
- Pages can be approved as advertisements (not narrated, skipped by quality run)
- Driving mode: +/-15 s, seek bar, playback speed, text and image toggles
- Plus the previously uncommitted 1.53.5 magazine/OCR work in the same tree
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bundles this session's magazine review work: a single "Draw region" tool
replacing six preset-kind buttons; "Table" as a real, non-narrated region
type; uniform auto-OCR for every text-like drawn/re-read region with a
Tesseract fallback when the vision OCR backend is unreachable; a thumbnail
grid view and inline title editing for the article list; batch
approve/reject; standalone MP3 export with embedded title/author/album,
lyrics and cover art (adds mutagen); "Remove all boxes" for starting a
tangled page from scratch; Approve advancing straight to the next article;
a merged, sticky review toolbar; and a fix for stale image previews after
resizing a region's box.
Also fixes several character-portrait rendering biases confirmed live
across this session's DSA audiobook cast (routes/conversation.py): modern
or bald/receding hair regardless of established coverage, armored women
rendering masculinized, duplicated/malformed weapons, a ranged weapon
rendering as a firearm due to a German compound-word regex miss, an
established dwarf rendered with human proportions, and occasional extra
hands or lost non-human species in scene panels.
See CHANGELOG.md [1.43.0] for the full list.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The preview carries each page's regions (percent of the page, type, reading
order) for the reading pass and the labelling pass, drawn over the page image
with a legend. A server restart that killed the import left it "running" for
ever; the status route now reports it as failed. v1.42.0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>