feat(books): add read-aloud generation

Generate a synced read-aloud EPUB from a book's EPUB and audiobook through an
optional STAlign worker (Docker on CPU, or native with MLX on Apple Silicon),
with review, re-sync, replace in place, restart recovery and live progress on
the Files tab. Book details also stack the ebook and audiobook covers when
both exist. See docs/READ_ALOUD.md.
This commit is contained in:
neon
2026-10-21 23:44:37 +00:00
parent 99aa7dce70
commit 992224f2e8
154 changed files with 69074 additions and 271 deletions
+22
View File
@@ -958,6 +958,28 @@ export const E2E_SUITES = Object.freeze({
...SHARED_DB_AND_HELPER_PATHS,
],
},
"read-aloud-jobs": {
id: "read-aloud-jobs",
name: "Read-Aloud Jobs",
timeout: 60,
lane: "full",
description: "Read-along generation lifecycle against a fake worker: publish, review and re-sync, replace in place, ownership, retry, cancel, resume",
vitestTarget: "test/read-aloud-jobs.e2e-spec.ts",
junitOutput: `${TEST_RESULTS_DIR}/read-aloud-jobs-e2e-junit.xml`,
prepareDedicatedDatabase: true,
useDedicatedDatabase: true,
changedPaths: [
"server/src/modules/read-aloud/**",
"server/src/modules/upload/generated-book-file.service.ts",
"server/src/modules/upload/upload.service.ts",
"server/src/db/schema/read-aloud.ts",
"server/test/read-aloud-jobs.e2e-spec.ts",
"server/test/e2e/read-aloud/**",
"server/test/e2e/reader-state-isolation/**",
"packages/types/src/read-aloud.ts",
...SHARED_DB_AND_HELPER_PATHS,
],
},
"koreader-file-naming": {
id: "koreader-file-naming",
name: "KOReader File Naming",