• v2.6.60
    All checks were successful
    Release / Test backend (push) Successful in 49s
    Release / Check ui (push) Successful in 1m48s
    Release / Docker (push) Successful in 5m58s
    Release / Gitea Release (push) Successful in 34s
    Stable

    gitea-actions released this 2026-04-10 09:24:43 +05:00 | -482 commits to main since this release

    Split chapter text into ~1000-char sentence-boundary chunks before sending
    to kokoro-fastapi. Each chunk is generated individually and the raw MP3 bytes
    are concatenated. This prevents the EOF / timeout failures that occur when
    the server receives a very large single request (e.g. a full PDF 'Full Text'
    chapter). chunkText() breaks at sentence endings (. ! ? newlines) to preserve
    natural speech flow.

    Downloads
  • v2.6.59
    All checks were successful
    Release / Check ui (push) Successful in 2m10s
    Release / Test backend (push) Successful in 53s
    Release / Docker (push) Successful in 6m7s
    Release / Gitea Release (push) Successful in 23s
    Stable

    gitea-actions released this 2026-04-09 23:59:29 +05:00 | -481 commits to main since this release

    • parsePDF: return all text as single 'Full Text' chapter (admin splits manually)
    • parseEPUB: fix chapter numbering to use sequential counter not spine index
    • Remove dead code: chaptersFromBookmarks, cleanChapterText, extractChaptersFromText, chapterHeadingRE; drop pdfcpu alias and regexp imports
    • Backend: POST /api/admin/books/:slug/split-chapters endpoint — splits text on '---' dividers, optional '## Title' headers, writes chapters via WriteChapter
    • UI: admin panel now shows for all admin users regardless of source_url; chapter split tool shown when book has single 'Full Text' chapter, pre-fills from MinIO content
    Downloads
  • v2.6.57
    All checks were successful
    Release / Test backend (push) Successful in 4m55s
    Release / Check ui (push) Successful in 1m52s
    Release / Docker (push) Successful in 7m13s
    Release / Gitea Release (push) Successful in 46s
    Stable

    gitea-actions released this 2026-04-09 22:37:04 +05:00 | -479 commits to main since this release

    Use PDF outline (bookmarks) for chapter titles and page ranges, then
    extract text from per-page content streams via pdfcpu ExtractContent.
    This avoids the indefinite hang caused by dslipak/pdf trying to resolve
    custom font ToUnicode CMaps on publisher PDFs.

    • parsePDF: decrypt → ExtractContent → Bookmarks → chaptersFromBookmarks
    • chaptersFromBookmarks: flatten bookmark tree, skip front/back matter
      (Cover, Insert, Title Page, Copyright, Appendix), assign page ranges
    • extractTextFromContentStream: handle TJ arrays (concat literal strings,
      skip hex glyph arrays and kerning numbers) + single Tj strings
    • Falls back to paragraph-splitting when no bookmarks present
    • Build verified; test PDF produces 9 chapters with proper titles
    Downloads
  • v2.6.56
    All checks were successful
    Release / Test backend (push) Successful in 51s
    Release / Check ui (push) Successful in 2m2s
    Release / Docker (push) Successful in 7m32s
    Release / Gitea Release (push) Successful in 1m0s
    Stable

    gitea-actions released this 2026-04-09 21:19:50 +05:00 | -478 commits to main since this release

    • parsePDF function restored in import.go (body was orphaned outside function)
    • ParseImportFile() called at upload time with 3-min timeout; chapters stored as JSON in MinIO
    • runner.go: prefer ChaptersKey path (read pre-parsed JSON) over BookImport.Import()
    • ImportChapterStore interface added; store wired in runner/main.go
    • HeartbeatTask and ReapStaleTasks now include import_tasks collection
    • parseImportTask now returns ChaptersKey in domain.ImportTask
    • asynq_runner.go handleImportTask passes ChaptersKey
    • pb-init-v3.sh: chapters_key field added to import_tasks schema
    Downloads
  • v2.6.55
    All checks were successful
    Release / Test backend (push) Successful in 2m10s
    Release / Check ui (push) Successful in 1m55s
    Release / Docker (push) Successful in 7m17s
    Release / Gitea Release (push) Successful in 48s
    Stable

    gitea-actions released this 2026-04-09 20:08:18 +05:00 | -477 commits to main since this release

    • parsePDF now attempts to strip encryption via pdfcpu (empty user password)
      before handing bytes to dslipak/pdf — fixes '256-bit encryption key' error
      on publisher PDFs that use owner-only encryption (copy/print restrictions)
    • Add pdfcpu v0.11.1 as direct dependency (was already indirect)
    • docker-compose.yml minio-init: add 'imports' and 'translations' buckets
      so a fresh deploy creates all required buckets
    Downloads
  • v2.6.54
    All checks were successful
    Release / Test backend (push) Successful in 44s
    Release / Check ui (push) Successful in 1m56s
    Release / Docker (push) Successful in 6m10s
    Release / Gitea Release (push) Successful in 37s
    Stable

    gitea-actions released this 2026-04-09 19:05:16 +05:00 | -476 commits to main since this release

    • Add ImportFileStore interface to bookstore package
    • Add ImportFileStore field to backend.Dependencies
    • Wire ImportFileStore: store in cmd/backend/main.go
    • handlers_import.go: use s.deps.ImportFileStore.PutImportFile instead of
      broken s.deps.Producer.(*storage.Store) type assertion (fails when Asynq active)
    • pb-init-v3.sh: add import_tasks and notifications collection definitions
    Downloads
  • v2.6.53
    All checks were successful
    Release / Test backend (push) Successful in 37s
    Release / Check ui (push) Successful in 1m54s
    Release / Docker (push) Successful in 5m45s
    Release / Gitea Release (push) Successful in 35s
    Stable

    gitea-actions released this 2026-04-09 17:06:39 +05:00 | -474 commits to main since this release

    Downloads
  • v2.6.51
    All checks were successful
    Release / Test backend (push) Successful in 38s
    Release / Check ui (push) Successful in 1m49s
    Release / Docker (push) Successful in 6m4s
    Release / Gitea Release (push) Successful in 40s
    Stable

    gitea-actions released this 2026-04-09 15:55:14 +05:00 | -472 commits to main since this release

    • docker-compose.yml: BODY_SIZE_LIMIT=52428800 (50MB) on UI service
      — adapter-node was rejecting PDFs >512KB with 'Content-length exceeds limit'
    • storage/import.go: add AnalyzeFile() public function using real PDF/EPUB parsers
    • handlers_import.go: analyzeImportFile() now calls storage.AnalyzeFile() instead
      of the file-size stub, so chapter count is accurate in the preview
    Downloads
  • v2.6.50
    All checks were successful
    Release / Test backend (push) Successful in 3m15s
    Release / Check ui (push) Successful in 1m49s
    Release / Docker (push) Successful in 5m53s
    Release / Gitea Release (push) Successful in 40s
    Stable

    gitea-actions released this 2026-04-09 15:14:09 +05:00 | -471 commits to main since this release

    • svelte.config.js: paths.relative=false so CSS uses absolute /_app/ paths (fixes blank home page after redirect)
    • ai-jobs: fix openReview() mutating stale alias r instead of $state review — was causing 'Loading results...' to never resolve for chapter-names/image-gen/description
    • notifications bell: redesign with All/Unread tabs, per-item dismiss (×), mark-all-read, clear-all, 'View all' footer link
    • /admin/notifications: new dedicated full-page notifications view
    • api/notifications proxy: add PATCH (mark-all-read) and DELETE (clear-all, dismiss) handlers
    • runner: add CreateNotification calls on success/failure in runScrapeTask, runAudioTask, runTranslationTask
    • storage/import.go: real PDF (dslipak/pdf) and EPUB (archive/zip + x/net/html) parsing replacing stubs
    • translation admin page: stream jobs Promise instead of blocking navigation
    • store.go: DeleteNotification, ClearAllNotifications, MarkAllNotificationsRead methods
    • handlers_notifications.go + server.go: PATCH /api/notifications, DELETE /api/notifications, DELETE /api/notifications/{id}
    Downloads
  • v2.6.49
    All checks were successful
    Release / Test backend (push) Successful in 50s
    Release / Check ui (push) Successful in 2m4s
    Release / Docker (push) Successful in 5m42s
    Release / Gitea Release (push) Successful in 36s
    Stable

    gitea-actions released this 2026-04-09 13:02:32 +05:00 | -470 commits to main since this release

    • image-gen, text-gen: books list streamed (listBooks is expensive on cold cache)
    • ai-jobs: jobs list streamed; add 30s cache to listAIJobs (was uncached listAll)
    • changelog: Gitea releases streamed on cold cache; cached path stays synchronous
    • admin/+layout.svelte: remove duplicate audio/translation/image-gen nav links
    Downloads