From d52449c1abf16ee48eaaa78e86dd8e155be18b53 Mon Sep 17 00:00:00 2001 From: KodeStar Date: Fri, 13 Nov 2026 19:22:29 +0000 Subject: [PATCH 1/8] Document adding free books from LibriVox The console's Library > LibriVox and the player's Find on LibriVox let an admin add a public-domain LibriVox recording to a books library through the Bridge's new librivox.fetch job, and the server records the placed book as that recording. User Guide: a new Add free books from LibriVox page (what is needed, the console and player steps, what lands on disk, cancel and resume, the failure reasons), plus Features, the Bridge pages, the console tour, browsing and the books page. Developer Docs: a new Bridge page for librivox.fetch (params, progress, result and failure codes, the identity rule, the archive.org-only fetch, placement, staging and resume, .audiosilo/librivox.json), the three admin routes in the reference, the librivox feature and in_library code, the job in the kinds lists, the book_matches fold, the console and player sections, the notifications, the cross-repo contract and a mapping table row. Part of LibriVox L6. --- .../architecture/cross-repo-contract.md | 48 +++ docs-developers/bridge/attachments.md | 4 + docs-developers/bridge/configuration.md | 15 +- docs-developers/bridge/development.md | 5 +- docs-developers/bridge/index.md | 7 + docs-developers/bridge/librivox.md | 279 ++++++++++++++++++ docs-developers/bridge/pairing-and-jobs.md | 23 +- docs-developers/contributing/documentation.md | 1 + .../frontend/library-and-browse.md | 80 +++++ docs-developers/frontend/routes.md | 1 + docs-developers/server/api/index.md | 13 +- docs-developers/server/api/reference.md | 142 ++++++++- .../server/backups-and-notifications.md | 11 +- docs-developers/server/data-model.md | 11 +- docs-developers/server/scanner.md | 7 + docs-developers/server/web-ui.md | 43 ++- docs-users/admin/books.md | 3 +- docs-users/admin/bridge.md | 3 +- docs-users/admin/console-tour.md | 1 + docs-users/admin/librivox.md | 126 ++++++++ docs-users/features.md | 1 + .../getting-started/running-a-bridge.md | 2 + docs-users/listening/browsing.md | 1 + sidebars-developers.ts | 1 + sidebars-users.ts | 1 + 25 files changed, 803 insertions(+), 26 deletions(-) create mode 100644 docs-developers/bridge/librivox.md create mode 100644 docs-users/admin/librivox.md diff --git a/docs-developers/architecture/cross-repo-contract.md b/docs-developers/architecture/cross-repo-contract.md index 23b937e0..ed9f785b 100644 --- a/docs-developers/architecture/cross-repo-contract.md +++ b/docs-developers/architecture/cross-repo-contract.md @@ -873,6 +873,12 @@ tries the book's identifiers first, then its `book_matches` `work_id` and `recording_id` when they find nothing. The envelope is the same, so the wire does not change. +A book [added from LibriVox](#librivox-fetches) gets its row from the server's +fold of the done `librivox.fetch`, with the work and recording the server resolved +at queue time (`how` `accepted`). Where a LibriVox recording is on the server is +read from these rows alone, by their exact, non-empty `recording_id`, never from +`/meta`'s first-recording answer for a work. + The player's book page asks `/meta` for every loaded book that is not an episode (`bookPageMetaEnabled`), so a book matched with neither identifier shows its community content there. Most other surfaces keep the identifier gate @@ -1373,6 +1379,7 @@ server's reader. See [The .audiosilo folder](../bridge/attachments.md). | `audible.poll` | Polls one Audible account. | | `audible.import` | Backs up one Audible title. | | `audible.sync` | Syncs listening positions with one Audible account. | +| `librivox.fetch` | Downloads one LibriVox recording into a books library. | Each kind's rules follow. @@ -1594,6 +1601,34 @@ feed also answers `400 invalid_request`. See [Position sync](../bridge/audible.md#position-sync-audiblesync-and-the-push-loop). +### LibriVox fetches + +`librivox.fetch` (feature `librivox`) is internal and writing, for a books library, +not quiet, deduped per library and project, and in no module. + +- Three admin routes queue and support it: `GET /admin/librivox/search`, + `GET /admin/librivox/work` and `POST /admin/librivox/fetch`. All are `404 + metadata_off` while community metadata is off. There is no `/server` flag: a + client gates on the `librivox` feature. +- The server builds its params, `{librivox_id, work_id, recording_id, library_id}`, + with the work and recording from metaserve's `lookup?librivox_id=` at queue + time. The Bridge reads them leniently and ignores unknown fields. +- The Bridge reads the manifest from its own metadata service and downloads only + from `https` archive.org hosts, checking every redirect. +- It reports progress steps `manifest|download|cover|place|rescan`. The result is + `{library_id, path, librivox_id, files, bytes}`, where `path` is the book path + that `POST /bridge/rescan` answered. +- A failure is `{code, message}`, with `not_writable`, `exists`, `disk_full`, + `not_found`, `archive_unavailable` or `metadata_off`. +- It uses no new Bridge route. +- The Bridge writes `.audiosilo/librivox.json` + (`{version, librivox_id, work_id, recording_id, archive_id}`) into the book's + folder. The server does not read it yet, and its scanner skips the name. +- The server folds a done result into the book's `book_matches` row + ([Matches by work id](#matches-by-work-id)). + +See [Add from LibriVox](../bridge/librivox.md). + ### The player's Bridge surface The player's first admin-only UI is gated on all of these: @@ -1609,6 +1644,10 @@ Its confirmation holds Generate back while the estimate's `open_job` is a for a book with no ASIN or ISBN. Its `types.ts` mirrors the job, the estimate, `BookMetaWork.generated` and `BookMetaWork.generated_description` by hand. +Find on LibriVox is gated the same way with `librivox` in place of `sidecars`, so +it shows only while the Bridge is online. Its `types.ts` and `client.ts` mirror the +three LibriVox routes by hand. + ### Bridge seam and old clients Everything is additive. @@ -1643,6 +1682,15 @@ Audible backups: it (`kind_unavailable`, and a poll's policy pass queues nothing). - Its account PUT's `policy` still creates an account as before. +LibriVox fetches: + +- An older server doesn't know `librivox.fetch`, so its `features` never list + `librivox`, and neither the console nor the player offers the feature. +- An older Bridge never advertises it, so the fetch route answers + `kind_unavailable`. +- A shipped player never sees Find on LibriVox. A book added this way is an + ordinary book with a recorded match. + Audible position sync: - An older Bridge never advertises `audible.sync`, so the server queues none and the diff --git a/docs-developers/bridge/attachments.md b/docs-developers/bridge/attachments.md index 1b6a7381..1c18dfb2 100644 --- a/docs-developers/bridge/attachments.md +++ b/docs-developers/bridge/attachments.md @@ -24,6 +24,10 @@ The prefix keeps the books of one folder apart, since a collection folder's book share one `.audiosilo/`. These are the book attachment names; podcast-specific files are described below. Audio is never stored in `.audiosilo/`. +A book [added from LibriVox](librivox.md#audiosilolibrivoxjson) also holds +`.audiosilo/librivox.json`, which names its LibriVox recording. It is no +attachment: the server skips the name and serves nothing from it. + ### Podcast CHAP attachments `podcast.fetch` writes `/.audiosilo/.chapters.json`, stripping only diff --git a/docs-developers/bridge/configuration.md b/docs-developers/bridge/configuration.md index e7713298..5872484e 100644 --- a/docs-developers/bridge/configuration.md +++ b/docs-developers/bridge/configuration.md @@ -18,7 +18,9 @@ the images (`AUDIOSILO_BRIDGE_DATA`), else `--data`, else `~/.audiosilo-bridge`. the defaults and the environment apply; - the SQLite database `bridge.db`; - the sealed `secrets/` and their key `secret.key`; -- the tools the Bridge downloads. +- the tools the Bridge downloads; +- `librivox/`, one state file per LibriVox fetch + ([Staging, resume and cleanup](librivox.md#staging-resume-and-cleanup)). Settings are read from `/config.yaml`, then overridden by `AUDIOSILO_BRIDGE_*` variables. An **empty** variable counts as unset. A variable that doesn't parse @@ -227,6 +229,17 @@ and tests. Release builds and images never carry the tag, so there they do nothi | `AUDIOSILO_BRIDGE_AUDIBLE_FAKE_URL` | the base URL of an Audible fake (`go run -tags audiblefake ./cmd/audiblefake`): every Audible and Amazon endpoint goes there instead | | `AUDIOSILO_BRIDGE_AUDIBLE_RECORD_DIR` | records every Audible exchange into a `0600` JSON-lines file in this folder, scrubbed of credentials as it is written. It is for recording fixtures from a real account | +## LibriVox + +`librivox.fetch` has no settings of its own. It reads LibriVox manifests from the +engine's `metadata.base_url` (`AUDIOSILO_BRIDGE_METADATA_BASE_URL`, default +`https://meta.audiosilo.app`). With it empty, the job fails `metadata_off`. It +downloads only from archive.org, over https, through a guarded client that +reaches public addresses only (the podcasts' `allow_networks` does not apply). +The book's files go straight into the library's folder, staged in a hidden folder +beside the book, so the library needs the room, not the data folder. See +[Add from LibriVox](librivox.md). + ## Secrets The Bridge's secrets are **never in `config.yaml`**. They are: diff --git a/docs-developers/bridge/development.md b/docs-developers/bridge/development.md index 3d9f7b77..f365daae 100644 --- a/docs-developers/bridge/development.md +++ b/docs-developers/bridge/development.md @@ -179,7 +179,10 @@ Conventions that carry the design: - the podcast jobs write a show's files in a podcast library ([Podcasts](podcasts.md)); - `audible.import` installs a backed-up title without replacing anything - ([The hardened transfer](audible.md#the-hardened-transfer-internaltransfer)). + ([The hardened transfer](audible.md#the-hardened-transfer-internaltransfer)); + - `librivox.fetch` writes a whole new book folder, staged in a dot folder beside + it and moved into place by one no-replace rename, never into an existing book + ([Add from LibriVox](librivox.md#staging-resume-and-cleanup)). A delete moves the files into `.audiosilo-trash/` first, as podcast retention does diff --git a/docs-developers/bridge/index.md b/docs-developers/bridge/index.md index a1c2c553..e713c251 100644 --- a/docs-developers/bridge/index.md +++ b/docs-developers/bridge/index.md @@ -75,6 +75,10 @@ the job kinds in the Bridge's heartbeat include it (see [`audible.sync`](audible.md#position-sync-audiblesync-and-the-push-loop) and a push loop over `GET /bridge/progress` sync listening places both ways, furthest only, for the accounts the console turns sync on for. +- **LibriVox.** [`librivox.fetch`](librivox.md) adds a LibriVox recording an admin + picked to a books library: the manifest from the community metadata service, + the sections from archive.org only, a no-replace move into place, a rescan. The + server then records the book as that recording. Some job families belong to a [managed module](../server/modules.md) of the server, which the console turns on and off. @@ -258,6 +262,9 @@ one-command worker install needs them. its matching, `audible.import` (backups: resume, the hardened transfer, secrets), position sync (`audible.sync`, the push loop), the server's accounts, titles and queueing, the `audible` module and the build-tagged fake. +- [Add from LibriVox](librivox.md) - `librivox.fetch` (its params, progress, + result and codes), the book's identity, the archive.org-only fetch, placement, + staging and resume, and `.audiosilo/librivox.json`. - [Configuration](configuration.md) - the Bridge's settings and environment, the images and the compose example. - [Development](development.md) - the gate, the layout and the Bridge's own page. diff --git a/docs-developers/bridge/librivox.md b/docs-developers/bridge/librivox.md new file mode 100644 index 00000000..dc132ff9 --- /dev/null +++ b/docs-developers/bridge/librivox.md @@ -0,0 +1,279 @@ +--- +title: Add from LibriVox +description: "How an admin adds a LibriVox recording to a books library: the three admin routes, the librivox.fetch job (params, progress, result, failure codes), the book's identity recorded by the server's fold, the archive.org-only fetch, placement and names, staging and resume, and .audiosilo/librivox.json." +--- + +An admin searches the community metadata database's LibriVox works, picks a +recording and a books library, and the Bridge downloads the recording into that +library. The server then records the placed book as that LibriVox recording, so +[`/meta`](../server/api/reference.md#get-apiv1librariesidmeta) answers it with no +console match. + +| Side | Role | Code | +|---|---|---| +| The server | the admin routes, the recording's identity at queue time, the job kind and its fold | `api/handlers_librivox.go`, `bridge/librivox.go`, `catalog/librivox.go`, `meta/librivox.go` | +| The Bridge | reads the manifest, downloads from archive.org, places the folder, rescans | `internal/librivoxjob`, `internal/metaops/librivox.go`, netguard's per-request `Allow` | +| The console | Library > LibriVox | `admin-ui/src/features/librivox/` | +| The player | Find on LibriVox, an admin page off a books library's menu | `src/components/librivox/` | + +The User Guide's [Add free books from LibriVox](/users/admin/librivox) is the +admin's view of it. + +## The gate + +There is no managed module, no toggle and no `/server` flag of its own. A client +offers the feature when all of these hold: + +- the caller is an admin; +- the `metadata` capability is on; +- the Bridge's features list `librivox`, the family of `librivox.fetch`. + +The server lists a feature only for kinds it knows +(see [`GET /server`](../server/api/reference.md#get-apiv1server-the-bridge-capability-and-block)), +so an older server never shows it, and an older Bridge never advertises the kind. + +The console reads the features from `GET /admin/bridge`, which keeps them while +the Bridge is offline, so it still queues a job that waits for the Bridge. The +player reads them from `GET /server`, whose `bridge` block is present only while +the Bridge is online, so the player offers nothing while it is offline. + +## The routes + +All three are admin only (`requireAdmin`) and answer `404 metadata_off` while +community metadata is off. The [reference](../server/api/reference.md#add-from-librivox) +has the shapes and every status. + +- `GET /admin/librivox/search?q=&lang=&limit=` asks metaserve's + `works/search?source=librivox`. The server checks `lang` and `limit` itself, so + a metaserve `400` never reads as an outage. +- `GET /admin/librivox/work?id=` answers the work and its LibriVox recordings only + (those with a `librivox_id`). Each recording carries `in_library`, where it + already is on this server, and `job`, the newest open fetch of the project in + any library. +- `POST /admin/librivox/fetch {library_id, librivox_id}` resolves the project's + work and recording and queues `librivox.fetch`. + +## The job: `librivox.fetch` + +| | | +|---|---| +| Kind | `librivox.fetch` (`bridge.KindLibrivoxFetch`; the Bridge's `librivoxjob.Kind`), feature `librivox` | +| Server spec | needs a library, no book path, **writes**, a books library only, internal (`POST /admin/bridge/jobs` refuses it with `400`), no module | +| Dedupe | per library and project (suffix `\|`): a repeat answers the open job | +| Notifications | not quiet: done is "Added from LibriVox", named by the result's path; failed and a lasting park are notified as for other kinds | +| Bridge lane | `download` (1 slot, shared with `audible.import` and an ordinary `podcast.fetch`), so one book downloads at a time | +| Bridge state | `/librivox/-.json` | + +### Params + +The server builds them and checks them strictly. The Bridge reads them leniently +and ignores unknown fields. + +```json +{ "librivox_id": 192, "work_id": "johnny-crows-garden", "recording_id": "…", "library_id": 3 } +``` + +`work_id` and `recording_id` are what the server resolved at queue time +([The book's identity](#the-books-identity)). Neither may be blank. + +### Progress + +`progress.step` is one of these, in order: + +| Step | What the Bridge does | +|---|---| +| `manifest` | reads the project's manifest and work from its metadata service | +| `download` | downloads the sections; `done` and `total` count sections | +| `cover` | downloads `cover.jpg`, best effort | +| `place` | writes `.audiosilo/librivox.json` and moves the folder into place | +| `rescan` | asks the server to index the book (`POST /bridge/rescan`, three tries) | + +A library that is not mapped and writable **parks** the job (`needs_attention`, +park code `not_writable`), and it carries on once a mapping check reports the +library writable again. + +### Result + +```json +{ "library_id": 3, "path": "L. Leslie Brooke/Johnny Crow's Garden", "librivox_id": 192, "files": 9, "bytes": 53477376 } +``` + +`path` is the book path the Bridge's rescan answered. `files` and `bytes` count +everything the folder holds from the job: the sections and the cover. + +### Failure codes + +A failed job's result is `{code, message}`, and its error is the message. The +message never holds a URL. + +| Code | Means | +|---|---| +| `not_writable` | the library is not a checked, writable books mapping, or its mapping moved to another mount while the job ran | +| `exists` | the title's folder and its fallback are both taken, or the author folder is a listed book or holds audio | +| `disk_full` | the library has less than 1.1 times the rest of a file free | +| `not_found` | the Bridge's metadata service has no such project, or it lists no files | +| `archive_unavailable` | a section is not on archive.org, or archive.org kept failing | +| `metadata_off` | the Bridge has no metadata service set (`metadata.base_url`) | + +The console words each code (`FETCH_CODES` and `fetchReason` in +`librivox-model.ts`), and so does the player (`librivox.fetch.code.*`). An +unknown failure keeps the Bridge's own message in the console's job list. + +## The book's identity + +The server, not the Bridge, decides which recording a fetched book is: + +1. `POST /admin/librivox/fetch` asks metaserve's `lookup?librivox_id=` for the + project alone (`meta.Service.LibrivoxRecordingOf`). An answer with no + recording is `404 not_found`. The server never falls back to a work's first + recording. +2. The work and recording travel in the job's params. +3. When the job ends `done`, `catalog.FoldLibrivoxFetch` (from the jobs' + `OnEnded` hook) writes the book's `book_matches` row with them: `how` + `accepted`, `set_by` the admin who asked, no run and no offered identifiers. + It wakes the `OnBookChange` listeners, since the rescan woke them before the + match was there. + +The fold writes only when the result names the job's own library and project and +a book indexed there, in a books library. Otherwise it records nothing and logs +`ErrFetchNotIndexed`. It **replaces** a row already at that path: the Bridge +placed the book in a folder that was vacant, so such a row is a deleted book's +leftover. It never touches another path's row. + +"Where is this recording" is read from those stored rows alone +(`catalog.WorkRecordingBooks`): indexed books whose `book_matches` row names that +exact, non-empty `recording_id` of the work. A work-level match, or `/meta`'s +answer for a work's first recording, never counts. The work route's `in_library` +and the fetch route's `409 in_library` (any library) both read it. + +Two things drop the identity, because the server does not read +`.audiosilo/librivox.json`: + +- a fold lost between the job's commit and the fold, such as a crash; +- [Clear community matches](../server/api/reference.md#delete-apiv1admincommunity-matches). + +Adding the recording again repairs either. The Bridge finds the folder it placed +(it holds the project's `librivox.json`), only rescans it, and the fold records +the match. + +## Fetching from archive.org only + +The Bridge reads the manifest from **its own** metadata service +(`metadata.base_url`, `meta.audiosilo.app` by default), not the server's copy: + +- `GET /api/v1/librivox/audiobooks?id=&extended=1&coverart=1`, the + LibriVox-shaped feed, for the sections, their titles and URLs, the cover and the + archive.org identifier; +- `GET /api/v1/works/{work_id}` for the title, the authors and how many LibriVox + recordings the work has. A `404` there is no failure: the project's own title + names the folder. + +A metadata service that is down never ends the job. Each read is tried 4 times +(5, 10 and 20 seconds apart), then the run fails with no code and keeps its +staging folder and state for the next attempt. Only a definite `404` for the +project ends it as `not_found`. + +Every section and cover URL must be `https` on `archive.org` or a subdomain of it +(`AllowedURL`). The Bridge checks each one before anything is fetched or +written, and again on every redirect, through netguard's per-request `Allow`. It +never fetches from librivox.org. The client is the Bridge's own netguard client +(public addresses only, not the podcasts' `allow_networks`). A URL with padding +around it is refused as it stands, so the check and the request see one spelling. + +Only audio is kept: + +- a `Content-Type` other than none, `audio/*`, `application/octet-stream` or + `application/ogg` is never written; +- a whole file whose first bytes (past any zero padding in its first 4 KB) are no + ID3 tag, MPEG frame sync, `OggS`, `fLaC` or MP4 `ftyp` is removed; +- an empty body never counts as a finished section. + +Each is tried again like a dropped connection. Three attempts in a row that add +nothing to a section fail the job `archive_unavailable`, and so does a `4xx` +other than `408`, `416` and `429`. + +## Placement and names + +The folder is `//`, from `placement.Suggest` as a standalone book: + +- **Author**: the first credit. Over three authors, `Various`. An author folder + already in the library (`importjob.AuthorFolders`) is reused as it is spelled. + With no author the book goes at the library root. +- **Title**: the work's title, or the project's own title when the work has more + than one LibriVox recording, so "(version 2)" and "Vol. 001" keep two projects + apart. That is why it is not `importjob.Planner.Plan`, whose `match.CleanTitle` + drops them. A title with nothing left is `LibriVox <id>`. +- **Taken**: when the title's folder exists, the Bridge tries + `<Title> (LibriVox <id>)` once, then fails `exists`. + +Names lose control characters and runs of spaces, go through `placement.Sanitize` +(which also drops leading dots) and are cut to 180 bytes on a rune boundary. + +Sections are `NN - <section title>.<ext>`: + +- `NN` is the section's 1-based position, at least two digits and as wide as the + count. It is never LibriVox's `section_number`. +- A title that opens with its own number and a separator (`1 - `, `1. `, `1: `, + `1) `) loses it, so "1 - Chapter 01" is `01 - Chapter 01`. A title such as + "1984" stays. +- An untitled section, or one that was only its number, is `Section N`. +- `<ext>` is the URL's audio extension, else `.mp3`. + +Each section is one file and one chapter: the job writes no `chapters.json`, and +the scanner titles the chapters from the tags or the file names. + +## Staging, resume and cleanup + +The Bridge stages the book in `<parent>/.audiosilo-librivox-<id>/`, beside where +it goes. It is a dot folder, so the scanner skips it. Every write goes through +the mount's `os.Root`: + +1. Each section downloads to `<name>.part`. Its strong `ETag` and size are saved + in the state before the body. +2. A resumed section asks with `Range` and `If-Range`, and only a proven `206` + continues it. Anything unproven starts the file again. +3. A section is renamed to its name only at its stated size. +4. The cover (`cover.jpg`, only a sniffed JPEG from archive.org) and + `.audiosilo/librivox.json` follow. +5. The staging folder is swept to the manifest's files, then moved into place by + one `fsutil.RenameNoReplace`. A folder that raced in takes the fallback once. + Nothing is ever replaced. +6. The Bridge rescans the book. + +The mapping is checked again before each section, before the cover and marker, +and before the rename. + +The state file records the parent, the destination, the partials' validators and, +once placed, the count and bytes. So: + +- a stop, or a lost claim, keeps the staging folder and the state, and the next + attempt follows them instead of planning again; +- once placed, the state is the placement marker: a failed rescan keeps the book, + and the retry goes on from the rescan; +- a placement the state never recorded (a kill between the rename and the state's + write) is adopted when the folder or its fallback holds this project's + `librivox.json`, and is never fetched again; +- a cancel, a failure, or the runner abandoning the job removes the staging + folder, an author folder it made that is empty, and the state. + +A lost claim that the server never hands out again leaves its staging folder, +hidden and unindexed. + +## `.audiosilo/librivox.json` + +The Bridge writes it into the book's folder: + +```json +{ "version": 1, "librivox_id": 192, "work_id": "johnny-crows-garden", "recording_id": "…", "archive_id": "…" } +``` + +The server does not read it. Its scanner skips the name, so the book has no +attachments from it and no scan error. It is not one of the +[attachments](attachments.md) the server serves. + +## The console and the player + +- The console's Library > LibriVox is described in + [the web UI](../server/web-ui.md#library--librivox). +- The player's Find on LibriVox is in + [Library and browse](../frontend/library-and-browse.md#find-on-librivox-admin). diff --git a/docs-developers/bridge/pairing-and-jobs.md b/docs-developers/bridge/pairing-and-jobs.md index ede02553..75478908 100644 --- a/docs-developers/bridge/pairing-and-jobs.md +++ b/docs-developers/bridge/pairing-and-jobs.md @@ -123,7 +123,7 @@ pairing and after a mapping check finishes: | Field | What it carries | |---|---| | `version` | the Bridge's version | -| `kinds` | the job kinds it runs (`bridge.verify`, `sidecars.generate`, `sidecars.describe`, `chapters.detect`, `sidecars.contribute`, `meta.correct`, `readalong.align`, `audible.poll`, `audible.import` and `audible.sync`; an older Bridge lists fewer) | +| `kinds` | the job kinds it runs (`bridge.verify`, `sidecars.generate`, `sidecars.describe`, `chapters.detect`, `sidecars.contribute`, `meta.correct`, `readalong.align`, `audible.poll`, `audible.import`, `audible.sync` and `librivox.fetch`; an older Bridge lists fewer) | | `libraries` | its last [mapping check](mappings.md) of each library | | `workers` | its [ASR workers](workers.md) that have connected at least once: `name`, `version`, `platform` (the GOOS/GOARCH and the speech recognition in one line, e.g. `darwin/arm64, mlx-whisper (metal)`) and `last_seen` | | `ui_url` | its own page as the local network reaches it (its `public_url` setting), which the console links to | @@ -534,7 +534,7 @@ Bridge doesn't have. The server's table also says whether a kind **writes** into the library. Such a kind (`sidecars.generate`, `sidecars.describe`, `chapters.detect`, `readalong.align`, `podcast.subscribe`, -`podcast.poll`, `podcast.fetch`, `podcast.retain`) is queued only for a library the last heartbeat reports +`podcast.poll`, `podcast.fetch`, `podcast.retain`, `audible.import`, `librivox.fetch`) is queued only for a library the last heartbeat reports **mapped and writable**, else `409 library_not_writable`, after the dedupe (an open job is still returned). `bridge.verify`, `sidecars.contribute` and `meta.correct` write nothing. Book-writing jobs refuse a podcast library with @@ -677,6 +677,25 @@ and `audible_error`. The push back to Audible is no job: a loop reads `GET /bridge/progress` every minute. See [Position sync](audible.md#position-sync-audiblesync-and-the-push-loop). +### LibriVox jobs + +`librivox.fetch` adds one LibriVox recording to a books library. It belongs to no +module: + +- internal (`POST /admin/bridge/jobs` refuses it with `400`), queued by + `POST /admin/librivox/fetch`; +- a **writing** kind for a books library: it needs a writable mapping, else + `library_not_writable`, and a podcast library is `not_book_library`; +- no book path: the book does not exist until the job places it; +- params `{librivox_id, work_id, recording_id, library_id}`, built by the server; +- deduped per library and project; +- **not** quiet: done and failed are notified, named by the result's path. + +It runs in the `download` lane, so it takes turns with `audible.import` and the +ordinary `podcast.fetch` slot, and its partial download survives a restart. When +it ends done, the server records the book as the recording. See +[Add from LibriVox](librivox.md). + ### Notifications The server tells admins about notable jobs itself (the Bridge has no route for diff --git a/docs-developers/contributing/documentation.md b/docs-developers/contributing/documentation.md index 68d4c6d9..d689718a 100644 --- a/docs-developers/contributing/documentation.md +++ b/docs-developers/contributing/documentation.md @@ -107,6 +107,7 @@ mappings: | The player's podcasts: `src/components/podcasts/`, `src/playback/episode-fetch.ts`, Home's New episodes (`new-episodes-*`, `use-new-episodes.ts`), the `shows` Library mode, `src/lib/library-kind.ts`, the podcast client gate (`auth.PodcastPlayerMinVersion`, `app.json` `expo.version`, `client-id.ts`), the gated whole-list replace (`catalog.GatedScopes`); finding shows (`find-shows-*`, `directory-search.tsx`, `discovery-*`, `follow-by-url.tsx`, `follow-requests.tsx`, `opml-*`, `use-opml-import.ts`, `shows-actions.tsx`, `check-episodes-button.tsx`, `artwork-retry.ts`, `src/lib/podcast-requests.ts`, `findShowsHref`, the `podcast_discovery` / `podcast_opml` client methods and hooks), the server's CORS lists (`corsAllowHeaders`, `corsExposeHeaders`) | [frontend/podcasts.md](../frontend/podcasts.md) (and its [Finding shows](../frontend/podcasts.md#finding-shows)) + [bridge/podcasts.md](../bridge/podcasts.md#player-phase-2d-1) (the wire and the controller's rules; [discovery and OPML](../bridge/podcasts.md#player-discovery-and-opml-phase-2d-2) for 2d-2) + [api/index.md CORS](../server/api/index.md#cors) and [cross-repo-contract.md §12](../architecture/cross-repo-contract.md#12-cors-for-web-development) + [auth-and-security.md](../server/auth-and-security.md#podcast-visibility) + the [reference](../server/api/reference.md#podcasts) (the gate, the replace rules) + [api/index.md](../server/api/index.md#client-identification-x-audiosilo-client) + the lines in [playback.md](../frontend/playback.md), [state-and-data.md](../frontend/state-and-data.md), [offline.md](../frontend/offline.md), [chromecast.md](../frontend/chromecast.md), [end-of-book.md](../frontend/end-of-book.md) and [kids-mode.md](../frontend/kids-mode.md) + `/users/listening/podcasts` (and the podcast lines in `browsing`, `up-next`, `end-of-book`, `offline-downloads`, `chromecast`, `kids-mode`, `mobile-apps`, `/users/troubleshooting`, `/users/admin/podcasts`, `/users/admin/server#modules`, `/users/faq`) + the `web-player/library-shows.png`, `podcast-show.png`, `home-new-episodes.png`, `episode-fetching.png`, `phone-podcast-show.png`, `find-shows-search.png`, `find-shows-address.png`, `find-shows-import.png` and `phone-find-shows.png` screenshots (the podcast seed in `run.sh` and its `directory` fixture; Find shows' stand-in routes in `capture-web.mjs`) | | Managed modules: the server's `internal/modules` (its `Runner`, the `builtin` registry), `api/modules.go`, a `modules.<id>` setting, the console's Settings > Modules (`features/settings/modules-topic.tsx`), the player's `src/modules/` registry and slots | [server/modules.md](../server/modules.md) (+ the adding-a-module steps) + [configuration.md](../server/configuration.md#managed-modules-modules) (the key, the variable, the runtime table) + the [reference](../server/api/reference.md#get-apiv1adminmodules) (`GET /admin/modules`, the settings envelope's `modules`, the module's flag on `GET /server`, the module's Bridge jobs) + [api/index.md](../server/api/index.md#capability-flags---gate-your-features) (the flag, `module_off`, `kid_account`, `demo_account`) + [bridge/pairing-and-jobs.md](../bridge/pairing-and-jobs.md#jobs-of-a-managed-module) (the jobs a module owns, held while it is off) + [web-ui.md](../server/web-ui.md) + [frontend/state-and-data.md](../frontend/state-and-data.md#player-modules-srcmodules) + the [cross-repo contract](../architecture/cross-repo-contract.md#8-capability-flags-get-apiv1server) + `/users/admin/server#modules` (the console's Learn more link opens it: keep the heading) + `/users/admin/bridge#when-the-contributions-module-is-off` + the `admin/settings-modules.png` screenshot | | Audible accounts, backups and position sync (Bridge Phases 4a, 4b and 4c): the server's `catalog/audible.go`, `catalog/audible_import.go`, `catalog/audible_sync.go` (and FurthestOnly in `catalog/listening_sync.go`), `internal/audible` (the scheduler, `imports.go`), `bridge/audible.go` (`audible.poll`, `audible.import`, `audible.sync`), `api/handlers_audible.go`, `api/handlers_audible_sync.go`, `0063`, `0064`, `0065` (planned destinations, contests), `0066` (sync, `no_sync`, `progress.change_seq`), the `audible` module and flag, the console's `features/audible/` (the Audible accounts card, Settings > Audible); the Bridge's `internal/audible` (the client, the build-tagged fake and `AUDIOSILO_BRIDGE_AUDIBLE_*`), `audibleacct`, `audiblejob` (`import.go`), `audiblesync` (the job and the push loop), `link/audiblesync.go`, `0011` (`audible_push`, `refusal_kind`), `importjob`, `placement`, `transfer`, `fsutil`'s install, `link/audible.go`, `0009`, `0010` (the device profile), `redact.go`, `audiblejob/plan.go`, the Accounts tab's `AudibleCard`, the `audible` setup item | [bridge/audible.md](../bridge/audible.md) + [bridge/configuration.md](../bridge/configuration.md#audible) (and its Secrets) + [bridge/development.md](../bridge/development.md) (the tagged gate) + [pairing-and-jobs.md](../bridge/pairing-and-jobs.md#audible-jobs) (and its setup checklist) + the [reference](../server/api/reference.md#audible-accounts) (and 4c's [position sync](../server/api/reference.md#audible-position-sync) routes, the reserved `audible:` device id on `/me/listening/sync` and the progress `PUT`, and the module flag on `GET /server`, `features`, `GET /admin/modules`) + [api/index.md](../server/api/index.md#capability-flags---gate-your-features) (the flag, the codes) + [server/modules.md](../server/modules.md) + [configuration.md](../server/configuration.md#managed-modules-modules) + [data-model.md](../server/data-model.md#the-bridge) (`0063`, `0064`, `0065`, `0066`; `progress.change_seq`) + [web-ui.md](../server/web-ui.md) + the [cross-repo contract](../architecture/cross-repo-contract.md#16-the-bridge) (after the workspace `CROSS-REPO.md` §8, §23 and §25) + `/users/admin/audible` (its sync section), `/users/listening/playback` (Places from Audible), `/users/getting-started/bridge-accounts#audible`, `/users/admin/bridge` (the card, the setup step), `/users/admin/server#modules` + the `admin/audible-accounts-card.png`, `admin/audible-titles.png`, `admin/audible-backup-settings.png`, `admin/audible-backup-all.png`, `admin/audible-destination.png`, `bridge/accounts-audible.png` and `bridge/audible-sign-in.png` screenshots (`capture-bridge.mjs` against a Bridge built with `-tags audiblefake` and the fake: `SHOTS_ONLY=bridge/,admin/audible screenshots/run.sh`). Copy about backing up says "a personal backup of books you bought" and "check your local law", never that it is legal everywhere | +| Add from LibriVox: the server's `api/handlers_librivox.go`, `bridge/librivox.go` (`librivox.fetch`), `catalog/librivox.go` (`FoldLibrivoxFetch`, `WorkRecordingBooks`), `meta/librivox.go`, the console's `features/librivox/` (and the job list's `fetchReason`, the Community card's LibriVox line, the bell); the Bridge's `internal/librivoxjob`, `metaops/librivox.go`, netguard's per-request `Allow`; the player's `src/components/librivox/` | [bridge/librivox.md](../bridge/librivox.md) + the [reference](../server/api/reference.md#add-from-librivox) (and `community_match`, the internal kinds of `POST /admin/bridge/jobs`, the `librivox` feature) + [api/index.md](../server/api/index.md#capability-flags---gate-your-features) (the feature, `in_library` and the other codes) + [bridge/pairing-and-jobs.md](../bridge/pairing-and-jobs.md#librivox-jobs) + [bridge/attachments.md](../bridge/attachments.md) and [server/scanner.md](../server/scanner.md#the-bridges-attachments) (`librivox.json`) + [data-model.md](../server/data-model.md#book_matches) (the fold) + [web-ui.md](../server/web-ui.md#library--librivox) + [frontend/library-and-browse.md](../frontend/library-and-browse.md#find-on-librivox-admin) and [routes.md](../frontend/routes.md) + [backups-and-notifications.md](../server/backups-and-notifications.md#bridge-messages) + the [cross-repo contract](../architecture/cross-repo-contract.md#librivox-fetches) (after the workspace `CROSS-REPO.md` §23 and §17) + `/users/admin/librivox` and the `admin/librivox.png` and `web-player/find-librivox.png` screenshots | | Chapterless books: the Bridge's `internal/chapterdetect`, `chapter_detecting`, the windows manifest, `chapters.detect`; the server's `metadata/chapterlist.go`, `catalog/generatedchapters.go`, the console's Detect chapters (`health/detect-chapters-dialog.tsx`) and the Chapters card's source control; the player's generated caption | [bridge/chapters.md](../bridge/chapters.md) + [bridge/attachments.md](../bridge/attachments.md#chaptersjson) + [bridge/pairing-and-jobs.md](../bridge/pairing-and-jobs.md#kinds-are-allow-listed-twice) (the kinds table) + [server/community-chapters.md](../server/community-chapters.md#generated-chapters) + the [reference](../server/api/reference.md#post-apiv1adminbridgejobs) (`chapters_source`, `chapter_choice`, `generated_chapters_fit`, the `409` codes) + [api/index.md](../server/api/index.md#capability-flags---gate-your-features) (the `chapters` feature, the codes) + [data-model.md](../server/data-model.md) + [backups-and-notifications.md](../server/backups-and-notifications.md#events) (`chapters_source` on the event) + [web-ui.md](../server/web-ui.md) (Health, the Chapters card) + [frontend/book-page.md](../frontend/book-page.md#the-chapters-tab) (the caption) + `/users/admin/generating-characters-and-recaps#books-without-chapters`, `/users/admin/health`, `/users/admin/books#chapters-found-in-the-narration`, `/users/listening/book-page#chapters` + the `admin/health-detect-chapters.png`, `admin/detect-chapters-dialog.png` and `admin/book-chapters-generated.png` screenshots | | Read-along: the Bridge's `internal/readalong`, `internal/epubcfi`, `readalong_aligning`, goal `readalong`, `readalongjob.go` (the reuse table, the 50% refusal); the server's `metadata/readalong.go`, `library/readalong.go`, `catalog/readalong.go`, `handlers_readalong.go`, the `readalong.align` kind, `Book.readalong`, the `readalong` capability; the console's Read-along card (`features/book/readalong-*`) | [bridge/readalong.md](../bridge/readalong.md) + [bridge/attachments.md](../bridge/attachments.md#readalongjson) + [bridge/pairing-and-jobs.md](../bridge/pairing-and-jobs.md#kinds-are-allow-listed-twice) (the kinds table) + the [reference](../server/api/reference.md#get-apiv1librariesidreadalong) (`/readalong`, `Book.readalong` on `/item`, the estimate's `kind=readalong.align`, the job, the Bridge book route's `duration` and `ebook`) + [api/index.md](../server/api/index.md#capability-flags---gate-your-features) (the capability, the feature, `no_readalong`, `readalong_stale`, `readalong_open`, `no_ebook`) + [scanner.md](../server/scanner.md#a-books-ebook) (ebook hashing) + [data-model.md](../server/data-model.md) (`0058`) + [backups-and-notifications.md](../server/backups-and-notifications.md#events) + [web-ui.md](../server/web-ui.md) (the card) + the [cross-repo contract](../architecture/cross-repo-contract.md#18-the-ebook-reader) (after the workspace `CROSS-REPO.md` §23 and §24) + `/users/admin/making-read-along`, `/users/admin/bridge` (the job), `/users/admin/notifications` + the `admin/book-readalong.png` and `admin/readalong-dialog.png` screenshots (`SHOTS_ONLY=admin/book-readalong,admin/readalong-dialog`) | | Read-along in the player (Bridge Phase 3c-2): `reader/src/readalong.js`, the read-along messages in `protocol.ts` and `reader.js`, `src/reader/` (`readalong-map.ts`, `readalong-gating.ts`, `use-book-readalong.ts`, `narration.ts`, `use-reader-readalong.ts`, `reader-session.ts`, `page-edge.tsx`, Follow narration in `reader-screen.tsx`), the companion's Text tab (`companion/text-panel.tsx`, `use-text-tab.ts`), Make read-along (`src/components/bridge/make-readalong.tsx`, `use-make-readalong.ts`, `readalong-model.ts`), the map in downloads (`src/downloads/readalong-file.ts`, `readalongGeneratedAt`), `useReadalong` / `useReadalongEstimate` | [frontend/reader.md](../frontend/reader.md#read-along-following-the-narration) + [player-ui.md](../frontend/player-ui.md#the-text-tab-read-along) + [offline.md](../frontend/offline.md#the-read-along-map-in-downloads) + [state-and-data.md](../frontend/state-and-data.md#read-along-usereadalong-and-usebookreadalong) + `/users/listening/reading-the-ebook#follow-the-narration`, `/users/listening/companion#text`, `/users/listening/full-player`, `/users/listening/offline-downloads`, `/users/admin/making-read-along#from-the-player` + the `web-player/player-text.png`, `reader-readalong.png`, `phone-player-text-chip.png` and `phone-player-text.png` screenshots (`SHOTS_ONLY=web-player/player-text,web-player/reader-readalong,web-player/phone-player-text`; the seed is `run.sh` 2e, `seed-readalong.mjs` and `fixtures/call-of-the-wild.readalong.json`, and the run stops early when Gutenberg's EPUB no longer matches the map) | diff --git a/docs-developers/frontend/library-and-browse.md b/docs-developers/frontend/library-and-browse.md index 85af1ed1..1994ef70 100644 --- a/docs-developers/frontend/library-and-browse.md +++ b/docs-developers/frontend/library-and-browse.md @@ -114,6 +114,86 @@ A capability that is still unknown hides its item. Remove download asks first through the shared `RemoveDownloadConfirm` (see [Offline](offline.md#lifecycle)). +### Find on LibriVox (admin) + +`src/components/librivox/` is the player's side of +[Add from LibriVox](../bridge/librivox.md): an admin searches the community +metadata's LibriVox works and adds a recording to a books library, which the +server's Bridge downloads. The console's Library > LibriVox is the same page, so +the two keep the same rules. + +**The gate.** `librivoxAccess(user, server)` (`librivox-model.ts`) needs an admin +(`isBridgeAdmin`), the `bridge` flag with `librivox` in `bridge.features`, and +`metadata`. `mayAddLibrivox` is its `allowed`. There is no `/server` flag of its +own, and `/server` names the Bridge's features only while it is online, so unlike +the console the player offers nothing while the Bridge is offline. The page shows +a sentence (`notAdmin`, `unavailable`, `metadataOff`) and sends nothing without +`allowed`. The search and everything under it mount only then, and the hooks are +called nowhere else. + +**The way in.** `LibrivoxMenu` is a **...** menu in the Books mode's controls +(`books-controls.tsx`'s trailing slot: the sub-nav row on a tablet or desktop, +the count line on a phone) with one item, **Find on LibriVox**. It renders +nothing for anyone else. It opens `/find-librivox?connection=&library=` +(`findLibrivoxHref`, `openFindLibrivox`), the Library tab's own page like Add +shows. It is a browse page (`BROWSE_PATHS`), so opening it keeps the Library's +scroll memory. + +**The wire** (`client.ts`, hand-mirrored from `handlers_librivox.go`): + +| Method | Route | +|---|---| +| `librivoxSearch(q, {lang, limit})` | `GET /admin/librivox/search` | +| `librivoxWork(id)` | `GET /admin/librivox/work` | +| `librivoxFetch(lib, id)` | `POST /admin/librivox/fetch`, `202 {job}` | +| `bridgeJob(id)` | `GET /admin/bridge/jobs/{id}` | + +`addRefusalKey` and `readErrorKey` word the refusals: `in_library` (the work read +again shows where; the body's `library_id` and `path` are not read), +`not_book_library`, `kind_unavailable`, `library_not_writable` and +`metadata_off`. + +**The hooks** (`hooks.ts`): + +- `useLibrivoxSearch` and `useLibrivoxWork` are `metadata` reads with + `retry: false`. +- `useAddLibrivox` is a `metadata` write. It seeds the job's own read and asks the + connection's works again whatever the answer. +- `useLibrivoxJob` is a `bridge` read, and Cancel is `useCancelBridgeJob`. + `storeJob` puts a job about no book at its own read (`qk.bridgeJob`). + +A `librivox.fetch` has no book path, so a row follows it by its id, not through +`useBridgeJobs` or `useBridgeJobSurface`, which are keyed on a book. It is polled +while open and the page is focused (`librivoxJobPollInterval`: 5 s, 60 s while +parked) and never after a `404`. A first read that failed with no answer or a +server error is asked again every 60 s; a refusal (`400`, `401`, `403`) is not. + +**The page.** One scroller holds the search (asked on submit only), the works +found, and the opened work's recordings under it. + +- Add goes to the library the page was opened from, or the one picked when the + server has several books libraries. Podcast libraries are never offered. +- A row follows the last job it queued or saw open on the work + (`useFollowedFetch`). It keeps the job after the work stops naming it, so a + failure still says why. The work's job is taken only when the work comes to name + another one, so an answer that still names the old job never takes the row back + from the one it just queued. +- `fetchView` words the job: its step (`manifest`, `download`, `cover`, `place`, + `rescan`) or its code (`librivox.fetch.code.*`). The Bridge's English is never + shown. +- A job's end asks the works again. A `done` one asks once more after + `DONE_RECHECK_MS` (the server records the book just after the job ends) and reads + the library's lists and the connection's recently added again + (`invalidateLibraryLists`). +- A read with nothing to show and no network is `OfflineState` + (`useUnreadQuery`). A search or a work read again that failed keeps what it + shows. +- The recording's `cover_url` is never loaded: it is a third-party host, with no + server proxy. + +Strings are under `librivox.*` in all six locales, and fixtures are in +`src/testing/librivox-fixtures.ts`. + ## Browse building blocks The covers and shelves every browse screen is made of (STYLEGUIDE section 8) diff --git a/docs-developers/frontend/routes.md b/docs-developers/frontend/routes.md index 02cd9652..e61042ad 100644 --- a/docs-developers/frontend/routes.md +++ b/docs-developers/frontend/routes.md @@ -30,6 +30,7 @@ The layouts and the files that are not pages are in | `/search` | `(app)/(search)/search.tsx` → `src/components/search/search-screen.tsx` | Search across the person listening's connections. See [Search](#search). | | `/library?mode=…` | `(app)/(library)/library/index.tsx` → `src/components/library/library-screen.tsx` | The Library tab root, with the browse modes `books` (the mode when `mode` is absent), `authors`, `series`, `narrators`, `collections` and `folders` (see [The Library modes](library-and-browse.md#the-library-modes)). Books mode also reads `sort` (`recent\|title\|author\|length`), `status` (`new\|progress\|finished`), `dl=1` and `len` (`short\|mid\|long`), which Home's links set. | | `/find-shows?connection=…&library=…§ion=…` | `(app)/(library)/find-shows.tsx` → `src/components/podcasts/find-shows-screen.tsx` | Add shows to a podcast library with a search, a feed address or an OPML import (see [Podcasts](podcasts.md#finding-shows)). It is the Library tab's own page, so a cold link (a reload, a pasted URL) lands in the Library and Back returns there. | +| `/find-librivox?connection=…&library=…` | `(app)/(library)/find-librivox.tsx` → `src/components/librivox/find-librivox-screen.tsx` | Find on LibriVox, an admin's page that adds a LibriVox recording to a books library through the Bridge (see [Find on LibriVox](library-and-browse.md#find-on-librivox-admin)). Like Add shows, it is the Library tab's own page. | | `/series?connection=…&library=…&name=…&work=…` | `(app)/(home,library,search,offline,me)/series.tsx` → `src/components/library/series-screen.tsx` | The series bookcase. `name` is a **local** series: the exact `Book.series` value, the `series=` filter of `GET /books`. `work` is a community work id whose rails to show, which is how the listener reaches a series they own nothing of. The route needs at least one of them. With both, `name` lists the owned books and `work` supplies the reading orders and ghosts. | | `/author?connection=…&library=…&name=…`, `/narrator?…` | `author.tsx` / `narrator.tsx` (same group) → `src/components/library/person-screen.tsx` | A person page: the books whose `Book.author` or `Book.narrator` is **exactly** `name` (a joint credit is one name, as the server lists it), series shelves, other books, and Read by / Books by chips. A narrator filter needs `browse_people`. An older server shows a "can't list books by narrator yet" state. | | `/collection?connection=…&id=…` | `collection.tsx` (same group) → `src/components/library/collection-screen.tsx` | A collection. It belongs to a server, not a library, so its items can span libraries. The owner has Edit, Share, Delete, and Move up, Move down and Remove in the list view. A viewer (`owned: false`) has Leave. A `404` reads as deleted or no longer shared. | diff --git a/docs-developers/server/api/index.md b/docs-developers/server/api/index.md index 231f8f36..0b0fd03b 100644 --- a/docs-developers/server/api/index.md +++ b/docs-developers/server/api/index.md @@ -327,12 +327,12 @@ Failures a person can fix also carry a machine-readable **`code`** next to | `book_not_found` | `404` | the Bridge's `PUT /bridge/libraries/{id}/enrichment` for no book of a books library at the path; an admin catalog call on a path that is not an indexed book (book page, edit, bulk edit, match, cover upload, community cover); an admin progress edit on a path with no progress and no indexed book; `POST /admin/bridge/jobs` and `GET /admin/bridge/estimate` on a path that is not an indexed book | | `invalid_override` | `400` | a metadata edit the server refuses; the body also carries a `field` key naming the offending field (`PATCH /admin/libraries/{id}/book`, `POST /admin/books/bulk`) | | `module_off` | `404` | any route a [managed module](../modules.md) mounts, while that module is off (Settings > Modules), for a caller the route's auth check admits (it runs first). The route exists either way, so turning the module on needs no restart. The `podcasts` module mounts `POST`/`DELETE /podcasts/follow`, `POST /podcasts/check`, the `/podcasts/discovery/*` routes and `POST /podcasts/opml/import`. Also `POST /admin/bridge/jobs` for a job the module owns (`sidecars.contribute`, `meta.correct`, `sidecars.generate` with `contribute: "issue"`, the `contributions` module), checked before anything else about the job | -| `metadata_off` | `404` | a community match search, a `POST /admin/books/works` work-id batch, a community cover (`POST /admin/meta/covers`, `PUT /admin/libraries/{id}/cover/community`), or the metadata mirror (`GET /admin/meta/mirror`, `POST /admin/meta/mirror/check`) while community metadata is turned off; also [`GET /me/upcoming`](reference.md#get-apiv1meupcoming), [`GET`](reference.md#get-apiv1meupcomingcalendar)/[`POST /me/upcoming/calendar`](reference.md#post-apiv1meupcomingcalendar), [`/me/upcoming/releases.ics`](reference.md#get-apiv1meupcomingreleasesics) and [`/me/upcoming/cover`](reference.md#get-apiv1meupcomingcover) (checked after `kid_account` and, on the mint, the `demo_account` and API-key refusals; before `upcoming_off`). Never `DELETE /me/upcoming/calendar` | +| `metadata_off` | `404` | the [Add from LibriVox](reference.md#add-from-librivox) routes, a community match search, a `POST /admin/books/works` work-id batch, a community cover (`POST /admin/meta/covers`, `PUT /admin/libraries/{id}/cover/community`), or the metadata mirror (`GET /admin/meta/mirror`, `POST /admin/meta/mirror/check`) while community metadata is turned off; also [`GET /me/upcoming`](reference.md#get-apiv1meupcoming), [`GET`](reference.md#get-apiv1meupcomingcalendar)/[`POST /me/upcoming/calendar`](reference.md#post-apiv1meupcomingcalendar), [`/me/upcoming/releases.ics`](reference.md#get-apiv1meupcomingreleasesics) and [`/me/upcoming/cover`](reference.md#get-apiv1meupcomingcover) (checked after `kid_account` and, on the mint, the `demo_account` and API-key refusals; before `upcoming_off`). Never `DELETE /me/upcoming/calendar` | | `upcoming_off` | `404` | the same upcoming routes as `metadata_off` while community metadata is on but the upcoming releases job is switched off (`upcoming.enabled`, the console's Settings > Metadata) | | `too_large` | `400` / `413` | a bulk edit or an issue ignore over 1000 books, a cover batch over 60, a community cover batch over 12, or a work-id batch over 100 (`400`); a custom cover upload over 5 MiB, or a community cover over 16 MiB or 40 megapixels (`413`); a [listening sync](reference.md#post-apiv1melisteningsync) body over 1 MiB (`413`) | | `unsupported_image` | `415` | a custom cover (uploaded or community) that is not a JPEG, PNG or WebP image | | `cover_unavailable` | `502` | `PUT /admin/libraries/{id}/cover/community`, `GET /libraries/{id}/meta/cover` or [`GET /me/upcoming/cover`](reference.md#get-apiv1meupcomingcover) when the server couldn't fetch the image (the latter two also for a minute after a failed fetch, without asking again) | -| `not_found` | `404` | an [unknown API route](#error-envelope-and-status-conventions) (below), `DELETE /admin/libraries/{id}` for a library that doesn't exist, and [`GET /me/upcoming/cover`](reference.md#get-apiv1meupcomingcover) for a work the caller's upcoming list doesn't hand out a cover for (not listed for them, or listed without one) | +| `not_found` | `404` | an [unknown API route](#error-envelope-and-status-conventions) (below), `DELETE /admin/libraries/{id}` for a library that doesn't exist, and [`GET /me/upcoming/cover`](reference.md#get-apiv1meupcomingcover) for a work the caller's upcoming list doesn't hand out a cover for (not listed for them, or listed without one); also `GET /admin/librivox/work` for an unknown work and `POST /admin/librivox/fetch` for a LibriVox project the community metadata doesn't know | | `invalid_schedule` | `400` | a library `scan_schedule` that isn't `""`, `every:<N>h` (1, 3, 6, 12, 24) or `daily:HH:MM` (`POST`/`PATCH /admin/libraries`) | | `invalid_pattern` | `400` | a library `ignore_patterns` list the server refuses: more than 100 patterns, one over 200 bytes, one that matches nothing, or a malformed wildcard; the message names the line (`POST`/`PATCH /admin/libraries`, `POST /admin/setup/preview`) | | `invalid_metadata_source` | `400` | a library `metadata_source` other than `"tags"` or `"path"` (`POST`/`PATCH /admin/libraries`) | @@ -371,13 +371,14 @@ Failures a person can fix also carry a machine-readable **`code`** next to | `self_managed` | `409` | `PATCH /admin/users/{id}` assigning a person to themselves | | `has_members` | `409` | `PATCH /admin/users/{id}` assigning a person who has household members of their own | | `invalid_keep_members` | `400` | `DELETE /admin/users/{id}?keep_members=` with an entry that isn't one of that person's members | -| `kind_unavailable` | `409` | `POST /admin/bridge/jobs` (or `GET /admin/bridge/estimate`) for a kind the paired Bridge doesn't run, or before any Bridge has reported | -| `library_not_writable` | `409` | podcast follow/check, or `POST /admin/bridge/jobs` for a kind that writes (`sidecars.generate`, `sidecars.describe`, `chapters.detect`, `readalong.align`) in a library the Bridge's last heartbeat doesn't report mapped and writable | +| `kind_unavailable` | `409` | `POST /admin/bridge/jobs` (or `GET /admin/bridge/estimate`) for a kind the paired Bridge doesn't run, or before any Bridge has reported; `POST /admin/librivox/fetch` with no Bridge paired, or one that doesn't run `librivox.fetch` | +| `library_not_writable` | `409` | podcast follow/check, `POST /admin/librivox/fetch`, or `POST /admin/bridge/jobs` for a kind that writes (`sidecars.generate`, `sidecars.describe`, `chapters.detect`, `readalong.align`) in a library the Bridge's last heartbeat doesn't report mapped and writable | | `cannot_contribute` | `409` | `POST /admin/bridge/jobs` for `sidecars.generate` with `contribute: "issue"`, `sidecars.contribute` or `meta.correct` while the Bridge's last heartbeat doesn't say it can contribute (its `setup.can_contribute`, else `estimates.sidecars.can_contribute`) | | `generate_open` | `409` | `POST /admin/bridge/jobs` for `sidecars.describe`, `chapters.detect`, `sidecars.contribute` or `readalong.align` while a `sidecars.generate` job is open for the book (it writes the description, finds a chapterless book's chapters, and replaces the characters and recaps a share would file, itself; a read-along waits because both transcribe the same audio) | | `contribute_open` | `409` | `POST /admin/bridge/jobs` for `sidecars.generate` while a `sidecars.contribute` job is queued or working for the book (a parked one, or a queued one held while the `contributions` module is off, is cancelled instead) | | `not_edited` | `400` | `POST /admin/bridge/jobs` for `meta.correct` with a change whose field isn't an edit made on this server, or whose corrected value isn't the book's value now; `field` names it | | `detect_open` | `409` | `POST /admin/bridge/jobs` for `sidecars.generate` while a `chapters.detect` job is queued or working for the book (the generate job after it reuses its transcription), or for `sidecars.describe` or `readalong.align` while one is open | +| `in_library` | `409` | `POST /admin/librivox/fetch` for a LibriVox recording already on this server, in any library; the body also carries the first book's `library_id` and `path` | | `readalong_open` | `409` | `POST /admin/bridge/jobs` for `sidecars.generate` while a `readalong.align` job is queued or working for the book (a parked one is cancelled instead), or for `chapters.detect` while one is open: all three transcribe the same audio on the Bridge | | `no_ebook` | `409` | `POST /admin/bridge/jobs` for `readalong.align` for a book the index holds no ebook for | | `no_readalong` | `404` | [`GET /libraries/{id}/readalong`](reference.md#get-apiv1librariesidreadalong) for a book with no read-along map (none, one that fails the server's checks, no ebook, a part's path, a podcast library) | @@ -832,6 +833,7 @@ families the Bridge runs that the server knows: - `chapters`, for finding a chapterless book's chapters; - `meta`, for filing corrections; - `readalong`, for making read-along maps; +- `librivox`, for adding LibriVox recordings to a books library; - `contribute`, while the Bridge can file contributions to the community database. That means it has a GitHub token that GitHub accepts, from its Accounts sign-in, its environment or `gh`. The server reads this from the @@ -853,6 +855,9 @@ Check the flag **and** the feature you need: `features`. - The book page's Read-along card offers **Make read-along** only with `readalong`. +- The console's Library > LibriVox and the player's **Find on LibriVox** add a + book only with `librivox` and `metadata`, for an admin. The player also needs + `bridge`, so it offers nothing while the Bridge is offline. ### Managed modules diff --git a/docs-developers/server/api/reference.md b/docs-developers/server/api/reference.md index fa7e16bc..22bac352 100644 --- a/docs-developers/server/api/reference.md +++ b/docs-developers/server/api/reference.md @@ -6908,10 +6908,11 @@ book path). Omitted when the book has none. There is no backfill, so a book matched before 2.6.0 has none until it is matched again. Its fields: - `work_id` and `recording_id` (omitted for none): what an accept or a match - run's apply took; + run's apply took, or the recording a book was + [added from LibriVox](#add-from-librivox) as; - `how`: `"auto"` for a run's confident item applied unasked, `"accepted"` for - the match dialog or a review item the admin included. A refresh that heals a - merged work keeps it; + the match dialog, a review item the admin included, or a book added from + LibriVox. A refresh that heals a merged work keeps it; - `matched_at`; - `web_url`: the work's page on the community site, omitted when no service is configured. @@ -10087,6 +10088,7 @@ that read the block, ask with their token. `readalong.align` gives `readalong`. - The podcast kinds give `podcast`, and `audible.poll` and `audible.import` give `audible`. + - `librivox.fetch` gives `librivox`. - `contribute` is added while the Bridge can file contributions (the last heartbeat's `setup.can_contribute`, else its `estimates.sidecars.can_contribute`). The `contributions` @@ -10355,11 +10357,12 @@ reads; a private feed URL appears only in the Bridge's claim answer. See ### `POST /api/v1/admin/bridge/jobs` *Admin.* Queues a job. `podcast.subscribe`, `podcast.poll`, `podcast.fetch`, -`podcast.retain`, `audible.poll` and `audible.import` are server-internal and -refused here with `400` (no code): use listener follow/check, the admin storage -routes, [Check now](#post-apiv1adminaudibleaccountsaccountpoll), -[Back up](#post-apiv1adminaudibletitlesaccountasinbackup) or the scheduler -instead. +`podcast.retain`, `audible.poll`, `audible.import`, `audible.sync` and +`librivox.fetch` are server-internal and refused here with `400` (no code): use +listener follow/check, the admin storage routes, +[Check now](#post-apiv1adminaudibleaccountsaccountpoll), +[Back up](#post-apiv1adminaudibletitlesaccountasinbackup), +[Add from LibriVox](#post-apiv1adminlibrivoxfetch) or the scheduler instead. Book-writing kinds on a podcast library return `409 not_book_library`; podcast kinds are only ever queued for a podcast library (follow and check answer `409 not_podcast_library` for a books library before queuing). @@ -11693,6 +11696,129 @@ go, its open poll and sync are cancelled, and so are its open backups. It signs Amazon: that is the Bridge's. `204`, known or not; audited as `bridge.audible.remove` (with `account`) when there was one. A bridge token is `401`. +## Add from LibriVox + +The code is in `api/handlers_librivox.go`, `meta/librivox.go`, +`bridge/librivox.go` and `catalog/librivox.go`. The design is in +[Add from LibriVox](../../bridge/librivox.md). An admin searches the community +metadata database's LibriVox works, opens one, and adds a recording to a books +library through the Bridge's `librivox.fetch`. The server never asks +librivox.org. + +All three routes are *Admin*: an admin's session or personal API key. A +listener's session or API key is `403`; no token, and a bridge, cast or feed +token, is `401`. They answer **`404 metadata_off`** while community metadata is +off, before anything in the request is checked, and `502` (`metadata service unavailable`, no code) when +the metadata service can't answer. There is no managed module and no `/server` +flag: a client offers them when the Bridge's `features` list `librivox` (see +[`GET /server`](#get-apiv1server-the-bridge-capability-and-block)). + +### `GET /api/v1/admin/librivox/search` + +The works with a LibriVox recording that match `q`, best first, from metaserve's +`works/search?source=librivox`. + +| Param | Meaning | +|---|---| +| `q` | required; the title or author to look for, at most 300 characters | +| `lang` | optional; one language tag (`en`, `pt-br`), sent lowercased | +| `limit` | optional; 1 to 50, default 20 | + +```json +{ + "results": [ + { + "work_id": "johnny-crows-garden", + "title": "Johnny Crow's Garden", + "authors": [{ "id": "l-leslie-brooke", "name": "L. Leslie Brooke" }], + "language": "en", + "release_date": "1903" + } + ] +} +``` + +`release_date` is always a string, `""` when unknown. + +| Status | Meaning | +|---|---| +| `200` | the results (`[]` for none) | +| `400` | `q` missing or too long; `lang` not a language tag; `limit` outside 1 to 50 | +| `404` | `metadata_off` | +| `502` | the metadata service can't answer | + +### `GET /api/v1/admin/librivox/work` + +One work and its **LibriVox recordings only** (those with a project id), by +`?id=<work_id>`. + +```json +{ + "work": { "id": "johnny-crows-garden", "title": "Johnny Crow's Garden", "authors": [{ "id": "…", "name": "…" }], "language": "en" }, + "recordings": [ + { + "recording_id": "…", + "librivox_id": 192, + "narrators": [{ "id": "…", "name": "…" }], + "runtime_min": 12, + "chapter_count": 3, + "cover_url": "https://archive.org/…jpg", + "url": "https://librivox.org/…", + "in_library": [{ "library_id": 3, "path": "L. Leslie Brooke/Johnny Crow's Garden" }], + "job": { "id": 41, "state": "running" } + } + ] +} +``` + +- `in_library` lists the indexed books whose recorded community match names this + exact recording (`[]` for none). A work-level match never counts. See + [The book's identity](../../bridge/librivox.md#the-books-identity). +- `job` is the newest open `librivox.fetch` of the project, in any library, or + `null`. A lease that ran out is settled first, so a fetch that failed on its last + attempt is not listed. + +| Status | Meaning | +|---|---| +| `200` | the work and its recordings | +| `400` | `id` missing or not a work id | +| `404` | `not_found` - no such work; `metadata_off` | +| `502` | the metadata service can't answer | + +### `POST /api/v1/admin/librivox/fetch` + +Adds a LibriVox project to a books library: + +```json +{ "library_id": 3, "librivox_id": 192 } +``` + +The server resolves the project's work and recording with metaserve's +`lookup?librivox_id=`, and queues `librivox.fetch` with them in its params. A +lookup that names no recording is `not_found`: the server never takes a work's +first recording instead. + +| Status | Meaning | +|---|---| +| `202` | `{ "job": Job }`: the queued [job](#the-job-object), or the open one for the same library and project | +| `400` | a malformed body, or `library_id` or `librivox_id` missing | +| `404` | `library not found` (no code); `not_found` - no such project in the community metadata; `metadata_off` | +| `409` | `in_library` - the recording is already on this server, in any library, with the first book's `library_id` and `path` in the body; `not_book_library` - a podcast library; `kind_unavailable` - no Bridge is paired, or the paired one doesn't run `librivox.fetch`; `library_not_writable` - the Bridge's last heartbeat doesn't report the library mapped and writable | +| `502` | the metadata service can't answer | + +An offline Bridge still gets the job queued, and it waits. A queued job is audited +as `bridge.job` (with `job`, `kind`, `library` and `librivox_id`). + +### The `librivox.fetch` job + +Internal (refused by `POST /admin/bridge/jobs` with `400`), a writing kind for a +books library, no module, deduped per library and project, and notified when it +ends done or failed (named by the book's path). Its params, progress steps, result +and failure codes are in [The job](../../bridge/librivox.md#the-job-librivoxfetch). +A done job's result becomes the book's recorded community match (`how` +`accepted`, `set_by` the admin who asked) when it names a book indexed in the +job's own library. + ## Well-known Native deep-link association files. Both are *Public*, config-driven diff --git a/docs-developers/server/backups-and-notifications.md b/docs-developers/server/backups-and-notifications.md index 99abb0aa..71a65c70 100644 --- a/docs-developers/server/backups-and-notifications.md +++ b/docs-developers/server/backups-and-notifications.md @@ -394,12 +394,13 @@ its title, else its path, else its library. | `sidecars.contribute` that filed nothing because the community already had it (`contributed` empty, `covered` not) | `Already in the community: <title>` | | | `meta.correct` | `Corrections sent: <title>` | "The book's corrections went to the community for review. The book page links them." | | `readalong.align` | `Read-along made: <title> (N% lined up)`. The coverage is rounded down to a whole percent, so 0.996 reads 99%. | "It is saved with the book. Open the book in a compatible AudioSilo player to follow the text with the narration." | +| `librivox.fetch` | `Added from LibriVox: <title>`, the book its result names | "It is in the library now, matched to its LibriVox recording." | | `bridge.verify` | `Bridge check finished: <library>`, or the book's title when the job named one | "The Bridge finished the job." | | any other kind | `<kind> finished: <title>` | "The Bridge finished the job." | -In the bell, only `sidecars.generate`, `sidecars.describe`, `chapters.detect` -and `readalong.align` have titles of their own (`FINISHED_OWN` in -`lib/server-events.ts`). A read-along reads `Read-along made for <name>`, with +In the bell, only `sidecars.generate`, `sidecars.describe`, `chapters.detect`, +`readalong.align` and `librivox.fetch` (`Added from LibriVox: <name>`) have titles +of their own (`FINISHED_OWN` in `lib/server-events.ts`). A read-along reads `Read-along made for <name>`, with `N% of the text lined up. Open the book in a compatible AudioSilo player to follow the text with the narration.` under it. Every other kind, including `sidecars.contribute` and `meta.correct`, reads `Bridge job finished: <name>` @@ -408,8 +409,8 @@ with the kind's name under it. `bridge_job_failed` reads `A Bridge job needs attention: <title>` (in the warning colour) or `<kind> failed: <title>`. The kind's words come from `notify.bridgeKindWords`: `Characters and recaps`, `Description`, `Chapters`, -`Sharing with the community`, `Corrections`, `Read-along`, `Bridge check`, else -`Bridge job`. Its text is the park code in words: +`Sharing with the community`, `Corrections`, `Read-along`, `Adding from LibriVox`, +`Bridge check`, else `Bridge job`. Its text is the park code in words: - `book_not_writable`; - `budget_exceeded`: raise the cap on the Bridge, or wait for the monthly one diff --git a/docs-developers/server/data-model.md b/docs-developers/server/data-model.md index a29b1c9b..163049b8 100644 --- a/docs-developers/server/data-model.md +++ b/docs-developers/server/data-model.md @@ -1816,8 +1816,15 @@ or an apply took, with or without an ASIN or ISBN. Columns: `run_id` and `set_by` have no foreign keys, because runs are pruned and the row outlives either. -Only a community edit writes it, in the edit's transaction -(`catalog.BookEdit.Match`, a `catalog.MatchAnchor`). A bulk edit refuses one. +Two things write it: + +- a community edit, in the edit's transaction (`catalog.BookEdit.Match`, a + `catalog.MatchAnchor`). A bulk edit refuses one; +- the fold of a done `librivox.fetch` (`catalog.FoldLibrivoxFetch`), for the book + the Bridge placed: `how` `accepted`, `set_by` the admin who asked, no run and no + offered identifiers. It replaces a row already at that path and touches no + other (see [Add from LibriVox](../bridge/librivox.md#the-books-identity)). + An empty work id unlinks the book. That clears the one book's community values, cover and row, as [clearing the community matches](api/reference.md#delete-apiv1admincommunity-matches) diff --git a/docs-developers/server/scanner.md b/docs-developers/server/scanner.md index 6a26a88a..e09fe0a9 100644 --- a/docs-developers/server/scanner.md +++ b/docs-developers/server/scanner.md @@ -1464,6 +1464,13 @@ A book's hidden **`.audiosilo/`** folder holds what the A single-file book's files carry its file stem first (`Book.characters.json`), in a `.audiosilo/` beside it. +Any other name there is skipped (`knownAttachment`). A book the Bridge +[added from LibriVox](../bridge/librivox.md#audiosilolibrivoxjson) holds +`librivox.json`, which the server does not read: the book is indexed with no +attachments from it and no scan error. The Bridge's staging folder for such a +book (`.audiosilo-librivox-<id>/`, beside it) is a dot folder, so the scan never +sees it. + They are not a metadata layer. Nothing in the effective row reads them except `chapters.json`, which is a chapter source of its own, and `/meta` serves the rest. Recording a book's attachments (`SetAttachments`, `RefreshAttachments`) diff --git a/docs-developers/server/web-ui.md b/docs-developers/server/web-ui.md index 2a25d481..1544592d 100644 --- a/docs-developers/server/web-ui.md +++ b/docs-developers/server/web-ui.md @@ -684,7 +684,10 @@ The aside's Community card (`book-aside.tsx`) shows the book's - the work id, linking `web_url`, and the `recording_id` when set; - how and when it was matched (`howKey`): "No ASIN or ISBN: matched to its store listing ..." without an identifier, and "Matched by a bulk match ..." - or "Matched ..." with one; + or "Matched ..." with one. A match whose `/meta` recording carries + `librivox` (and is the match's `recording_id`, when it names one) reads + "Matched to its LibriVox recording ...". Until the book's `/meta` answers, the + line stays the neutral "Matched ..."; - **Unlink**, behind a `ConfirmDialog` (no undo). It sends `PATCH …/book {match: {work_id: ""}}` and refreshes the issues. @@ -809,6 +812,37 @@ transcript was reused". - `KIND_READALONG` counts in the page's job poll. The page fetches the book again when the job ends, so its new map shows. +#### Library > LibriVox + +Library > LibriVox (`features/librivox/`) adds a LibriVox recording to a books +library through the Bridge's `librivox.fetch`. The design is in +[Add from LibriVox](../bridge/librivox.md). + +- **Metadata off**: with the `metadata` capability off the page says so and links + Settings > Metadata, and asks nothing. +- **Search**: a search box over + [`GET /admin/librivox/search`](api/reference.md#get-apiv1adminlibrivoxsearch), + asked as the admin types. A result opens the work beside it. +- **The work**: [`GET /admin/librivox/work`](api/reference.md#get-apiv1adminlibrivoxwork) + lists the recordings, each with its readers, length, section count, project id + and a **LibriVox page** link. A recording in `in_library` shows **In library** + with a link to each book. +- **The Bridge note** (`bridgeNote` in `librivox-model.ts`, from + `GET /admin/bridge`): `addBlock` stops Add while the status loads or fails, with + no Bridge paired, or when its `features` lack `librivox`, each with a sentence + and a link to Settings > Bridge. An offline Bridge is no block: the note says a + book added waits for it. +- **Add**: a library picker when there are several books libraries (podcast + libraries are never offered), then `POST /admin/librivox/fetch`. A refusal shows + as a toast (`errors.librivoxInLibrary` for `409 in_library`). +- **Following the job**: a row follows its job by id + (`GET /admin/bridge/jobs/{id}`) every few seconds while it is open + (`jobPollMs`), and stops for a job that is gone (`404`, `jobGone`). The work + itself is not polled. When the job ends it asks the work again and, for a done + job, once more after `DONE_RECHECK_MS` (2 s), since the fold commits just after + the job reads done. A parked or failed job keeps its reason on the row + (`fetchReason`). + #### Library > Libraries **Library cards** come from `GET /admin/libraries`, with `book_count`, @@ -1411,6 +1445,11 @@ A failed Audible job's code reads as a sentence (`audibleJobReason`): A sync cancelled by turning sync off shows the server's reason, "sync with Audible was turned off for the account" (`SERVER_CANCEL_REASONS`). +**LibriVox jobs.** A `librivox.fetch` reads "Adding from LibriVox", with its +project ("Project 192", `librivoxProject`). Its failure or park code reads as +`librivox.code.<code>` (`fetchReason`: a park's code, else the result's `code`, +else an error starting `<code>:`), and an unknown one keeps the Bridge's text. + ##### The Setup card The **Setup** card reads "Get set up" while a required step is still to do. It @@ -1701,6 +1740,8 @@ People > Devices or Invites, Server > About, or Server > Settings > Backups. - **See all** opens Server > Events. - Each row is `ServerEventItem` (`components/server-event-item.tsx`), shared with that page. +- A done `librivox.fetch` reads `Added from LibriVox: <name>`, and a parked one + words its code as the LibriVox page does (`fetchParkKey`). #### Server > Events diff --git a/docs-users/admin/books.md b/docs-users/admin/books.md index 5c4888e6..f29405ed 100644 --- a/docs-users/admin/books.md +++ b/docs-users/admin/books.md @@ -84,7 +84,8 @@ The community database holds some books as a store listing with no ASIN or ISBN. A match to one of them still counts. The book shows as **Matched**, and [Match automatically](health.md#store-listings-with-no-asin-or-isbn) skips it. Its **Community metadata** card says "No ASIN or ISBN: matched to its store -listing". +listing". A book [added from LibriVox](librivox.md) says it is matched to its +LibriVox recording instead. A few things need an ASIN or ISBN, so they leave such a book out: the [community chapter check](#community-chapters) and the missing books on the diff --git a/docs-users/admin/bridge.md b/docs-users/admin/bridge.md index 376db9ad..4f0240a5 100644 --- a/docs-users/admin/bridge.md +++ b/docs-users/admin/bridge.md @@ -114,7 +114,8 @@ properly. The **Jobs** card lists what the Bridge was asked to do, newest first: characters and recaps, descriptions, chapters, read-alongs, community shares, corrections, -podcast downloads and Audible backups. **Show jobs** filters it by state. +podcast downloads, Audible backups and books added from LibriVox. **Show jobs** +filters it by state. Each job shows its book, its progress, who asked and when. Jobs the server queues itself say **Scheduled by the server**. When a job is done, it says what it made. diff --git a/docs-users/admin/console-tour.md b/docs-users/admin/console-tour.md index 905f14b7..d2b0165e 100644 --- a/docs-users/admin/console-tour.md +++ b/docs-users/admin/console-tour.md @@ -64,6 +64,7 @@ What each section is for: | **Library > Authors**, **Series**, **Narrators** | Merging two spellings of a name, and the books missing from a series. See [Authors and narrators](books.md#authors-and-narrators). | | **Library > Folders** | How AudioSilo reads each folder. See [The Folders page](libraries.md#the-folders-page). | | **Library > Libraries** | Add, edit, rescan, export and delete libraries. See [Add and manage libraries](libraries.md). | +| **Library > LibriVox** | Search LibriVox and have your Bridge add a free book to a library. See [Add free books from LibriVox](librivox.md). | | **People > People** and **Invites** | Accounts and invite links. See [Invite people](users-and-invites.md). | | **People > Shares** | Named sets of folders you give to people. See [Sharing](sharing.md). | | **People > Devices** | Every signed-in phone, browser and API key. See [The Devices page](users-and-invites.md#the-devices-page). | diff --git a/docs-users/admin/librivox.md b/docs-users/admin/librivox.md new file mode 100644 index 00000000..3363e8d0 --- /dev/null +++ b/docs-users/admin/librivox.md @@ -0,0 +1,126 @@ +--- +title: Add free books from LibriVox +description: "Find a free public-domain audiobook from LibriVox in the admin console or the player, and have your Bridge download it into a library, already matched to its recording." +--- + +An admin can search LibriVox's free public-domain audiobooks and add one to a +books library. Your [Bridge](bridge.md) downloads the recording, puts it in the +library and has the server index it. The book arrives matched to its LibriVox +recording, so its community details show with no matching by hand. + +You need: + +- an admin account; +- community metadata turned on, in **Server > Settings > Metadata**; +- a paired Bridge, updated together with your server; +- the library shown as **Ready** in [Server > Settings > Bridge](bridge.md#libraries). + +The search reads the community metadata database, so your server never asks +LibriVox itself. The Bridge downloads the audio from archive.org, where LibriVox +keeps its recordings. + +:::note[A new books library] +The Bridge checks a books library against a book the server has indexed. A +library with no books yet can't be **Ready**, so add one book to it first (see +[Libraries](bridge.md#libraries)). +::: + +## Add a book in the console + +To add a book, open **Library > LibriVox** in the admin console. + +1. Type a title or an author in **Search LibriVox**. +2. Select a result. Its **Recordings** list shows who reads each one, its + length, how many sections it has and its LibriVox project number. +3. Pick the **Library**, when you have more than one books library. +4. Press **Add**, or **Add to** *your library* when there is only one. + +The recording's row shows the Bridge's progress. When it is done, the row says +**In library** with a link to the book. + +**LibriVox page** on a row opens the recording on librivox.org. + +When the Bridge is offline, the page says so. A book you add then waits, and the +Bridge starts it when it is back. + +## Add a book in the player + +To add a book from the app or the web player, open the **Library** tab on a +books library. + +1. Press the **...** button beside the sort and layout controls. +2. Choose **Find on LibriVox**. +3. Type a title or an author, press **Search** and select a result. +4. Press **Add to** *the library* on the recording you want. + +The book goes to the library you opened the page from. With more than one books +library, you can pick another under **Add to**. + +The row shows the progress, with **Cancel** while it runs. Once the book is in, +the row says **In your library**, and **Open** opens its page. + +The **...** button shows only for an admin, with community metadata on and the +Bridge online. + +## What lands in your library + +The Bridge makes one folder for the book, by author and title: + +``` +Charles Dickens/ + A Christmas Carol/ + 01 - Marley's Ghost.mp3 + 02 - The First of the Three Spirits.mp3 + ... + cover.jpg + .audiosilo/librivox.json +``` + +- Each section is one file and one chapter, numbered in reading order. +- When the author already has a folder in the library, the book goes in it. +- A book with more than three authors goes under **Various**. +- A book with several LibriVox recordings is named by the recording's own title, + such as "(version 2)", so two recordings never share a folder. +- If a folder of that name already exists, the Bridge uses + *Title* (LibriVox *number*) instead. It never writes into an existing book. +- `.audiosilo/librivox.json` records which LibriVox recording the folder holds. + +While it downloads, the Bridge keeps the files in a hidden folder beside the +book, which the server ignores. The book appears all at once when every section +is in. + +The Bridge adds one book at a time. Audible backups and podcast episode +downloads take turns with it. + +## Cancel or restart + +**Cancel** on the player's row stops the download. In the console, use +**Cancel** in the [Jobs](bridge.md#jobs) list on **Server > Settings > Bridge**. +A cancelled book leaves nothing behind in the library. + +If the Bridge stops part way, it picks up where it left off. Sections it already +downloaded are not downloaded again, and a section cut off part way usually +carries on from where it stopped. + +## When adding fails + +The row says why. Press **Add** again to try once more. + +| Reason | What to do | +|---|---| +| **The Bridge can't write to this library.** | Check the library is **Ready** in [Server > Settings > Bridge](bridge.md#libraries). A book that **Needs attention** for this carries on by itself once the library is ready. | +| **A book is already at that place in the library.** | Something is already in the folders the book would go in. Move or rename that folder. | +| **The library's disk is full.** | Free some space in the library. | +| **LibriVox no longer lists this project.** | The recording left the community database. Search again. | +| **archive.org couldn't be reached.** | Try again later. | +| **Community metadata was turned off.** | Turn it on in **Server > Settings > Metadata**. If it is on, the Bridge has no metadata service set: check its `AUDIOSILO_BRIDGE_METADATA_BASE_URL`. | +| **That recording is already in a library.** | Nothing to do. The recording's row links to it. | + +## Good to know + +- The server tells you when a book is added or fails, in the bell and your + [notifications](notifications.md). +- [Clear community matches](server.md#community-metadata) removes the match of + books added from LibriVox too. To get it back, press **Add** on the recording + again. The Bridge finds the book it already placed and downloads nothing, and + the server matches it again. diff --git a/docs-users/features.md b/docs-users/features.md index 3d4be4a1..dc2a0cd8 100644 --- a/docs-users/features.md +++ b/docs-users/features.md @@ -63,6 +63,7 @@ Everything else works with the server alone. - [Community metadata](community/meta-site.md): a free database of books, series and release dates. - [Characters, recaps and chapters](admin/generating-characters-and-recaps.md) for books the community hasn't covered. **(Bridge)** - [Back up your Audible books](admin/audible.md) and keep your places in step with Audible. **(Bridge)** +- [Add free books from LibriVox](admin/librivox.md): search LibriVox and download a public-domain audiobook into a library, already matched. **(Bridge)** - [Contribute from your server](community/contributing-from-your-server.md): share corrections and recaps with the community. **(Bridge)** - [Import from Audiobookshelf](admin/import.md): bring over listening history, progress and bookmarks. diff --git a/docs-users/getting-started/running-a-bridge.md b/docs-users/getting-started/running-a-bridge.md index 73d0f571..71b98eb6 100644 --- a/docs-users/getting-started/running-a-bridge.md +++ b/docs-users/getting-started/running-a-bridge.md @@ -19,6 +19,8 @@ You don't need a Bridge to listen to your books. Add one for: narration in the book's ebook; - [Audible backups](../admin/audible.md) of the books you bought, and listening places kept in step with Audible; +- [free books from LibriVox](../admin/librivox.md), downloaded into a library + and matched to their recording; - [sharing with the community](../community/contributing-from-your-server.md). <a id="which-bridge-version"></a> diff --git a/docs-users/listening/browsing.md b/docs-users/listening/browsing.md index 6b32dd05..9caea119 100644 --- a/docs-users/listening/browsing.md +++ b/docs-users/listening/browsing.md @@ -82,6 +82,7 @@ Every book in the library, as a cover grid or a list: - **Genre** and **Tag**, when the library's books have them. Tapping a genre or tag on a [book's page](book-page.md#about-this-book) opens this view filtered to it. - **Sort** by **Recently added**, **Title**, **Author** or **Length**. Sorted by title, an **A to Z** rail jumps to a letter. - **Grid or list**. On a tablet or computer, the list adds columns for narrator, length and progress. +- **...** beside them, for an admin: **Find on LibriVox** adds a free book to the library (see [Add free books from LibriVox](../admin/librivox.md)). ![The Genre filter open over the Library's books](/img/screenshots/web-player/library-genre.png) diff --git a/sidebars-developers.ts b/sidebars-developers.ts index 0a901eb8..30a596af 100644 --- a/sidebars-developers.ts +++ b/sidebars-developers.ts @@ -87,6 +87,7 @@ const sidebars: SidebarsConfig = { 'bridge/contributions', 'bridge/podcasts', 'bridge/audible', + 'bridge/librivox', 'bridge/workers', 'bridge/configuration', 'bridge/development', diff --git a/sidebars-users.ts b/sidebars-users.ts index 18fed29c..eecfa79d 100644 --- a/sidebars-users.ts +++ b/sidebars-users.ts @@ -104,6 +104,7 @@ const sidebars: SidebarsConfig = { 'admin/generating-characters-and-recaps', 'admin/making-read-along', 'admin/audible', + 'admin/librivox', 'getting-started/running-a-worker', ], }, From cbec3f80a5fb7d729fb459126170d04a8e08d6d3 Mon Sep 17 00:00:00 2001 From: KodeStar <kode@audiosilo.app> Date: Fri, 13 Nov 2026 19:39:18 +0000 Subject: [PATCH 2/8] Screenshots: the console's Library > LibriVox and the player's Find on LibriVox capture-admin.mjs sends the stand-in Bridge's heartbeat again with librivox.fetch, so its features list librivox, then searches the live community metadata for The Wind in the Willows on Library > LibriVox and, signed in to the web player as the admin (browsing, so nothing plays), from the Books mode's ... menu. Nothing is added, so no seeded book gains a match. The Add free books from LibriVox page embeds both. Part of LibriVox L6. --- docs-users/admin/librivox.md | 4 + screenshots/README.md | 11 +++ screenshots/capture-admin.mjs | 87 +++++++++++++++++- screenshots/manifest.mjs | 2 + static/img/screenshots/admin/librivox.png | Bin 0 -> 104987 bytes .../screenshots/web-player/find-librivox.png | Bin 0 -> 71968 bytes 6 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 static/img/screenshots/admin/librivox.png create mode 100644 static/img/screenshots/web-player/find-librivox.png diff --git a/docs-users/admin/librivox.md b/docs-users/admin/librivox.md index 3363e8d0..eaf259fb 100644 --- a/docs-users/admin/librivox.md +++ b/docs-users/admin/librivox.md @@ -29,6 +29,8 @@ library with no books yet can't be **Ready**, so add one book to it first (see To add a book, open **Library > LibriVox** in the admin console. +![Library > LibriVox: a search and the recordings of the book found](/img/screenshots/admin/librivox.png) + 1. Type a title or an author in **Search LibriVox**. 2. Select a result. Its **Recordings** list shows who reads each one, its length, how many sections it has and its LibriVox project number. @@ -53,6 +55,8 @@ books library. 3. Type a title or an author, press **Search** and select a result. 4. Press **Add to** *the library* on the recording you want. +![Find on LibriVox in the web player](/img/screenshots/web-player/find-librivox.png) + The book goes to the library you opened the page from. With more than one books library, you can pick another under **Add to**. diff --git a/screenshots/README.md b/screenshots/README.md index 5a7c3666..971e93b3 100644 --- a/screenshots/README.md +++ b/screenshots/README.md @@ -266,6 +266,17 @@ folder under the Inbox (`.cache/inbox`, rebuilt every run), asks for the attachm rescan and reports the job done. The book's Chapters card is then shot clipped, with the found chapters in use. Nothing is written into the seeded library. +The LibriVox shots (`admin/librivox.png`, `web-player/find-librivox.png`) come +after the read-along step, from the same stand-in, its heartbeat sent again with +`librivox.fetch` among its kinds so the Bridge's features list `librivox`. Both +search the live community metadata (the demo server's default lookup, so they need +the network) for The Wind in the Willows and open its recordings: first the +console's Library > LibriVox, then the web player in a context of its own, signed +in as the admin (Browse the library, so nothing plays) and opened from the Books mode's **...** menu (Find on LibriVox), +which shows only while the Bridge is online. Both are taken by `capture-admin.mjs`, +since that is where the stand-in is paired. Nothing is added, so no job is queued +and no seeded book gains a match; the player's session is signed out again. + The generated description shots (`admin/book-description.png`, `web-player/book-about-generated.png`, Bridge Phase 1c) need a book with a `description.json`. Before the servers start, on every run, `run.sh` writes the diff --git a/screenshots/capture-admin.mjs b/screenshots/capture-admin.mjs index d06610f8..cba0e6b7 100644 --- a/screenshots/capture-admin.mjs +++ b/screenshots/capture-admin.mjs @@ -1126,13 +1126,14 @@ const STORY_SHOTS = ['admin/book-story.png', 'admin/book-story-recaps.png']; const DETECT_SHOTS = ['admin/health-detect-chapters.png', 'admin/detect-chapters-dialog.png', 'admin/book-chapters-generated.png']; const READALONG_SHOTS = ['admin/readalong-dialog.png', 'admin/book-readalong.png']; +const LIBRIVOX_SHOTS = ['admin/librivox.png', 'web-player/find-librivox.png']; // The stand-in's heartbeat. The server keeps a heartbeat it just saved as the // current one, so the next GET /server sees it at once. const standInHeartbeat = (status) => api(bridgeToken, 'PUT', '/bridge/status', status, BRIDGE_CLIENT); await step('settings: bridge', async () => { if (!wanted('admin/settings-bridge.png', 'admin/bridge-pair.png', 'admin/bridge-setup.png', 'admin/settings-bridge-paired.png', ...GENERATE_SHOTS, ...STORY_SHOTS, ...DETECT_SHOTS, - ...READALONG_SHOTS)) return; + ...READALONG_SHOTS, ...LIBRIVOX_SHOTS)) return; const info = await api(null, 'GET', '/server'); if (!info?.capabilities || !('bridge' in info.capabilities)) throw new Error('this server build has no Bridge'); try { @@ -1536,6 +1537,90 @@ await step('bridge: make a read-along', async () => { } }); +// ── Add from LibriVox ──────────────────────────────────────────────────────── +// With the stand-in Bridge offering librivox.fetch (so the Bridge's features list +// librivox), Library > LibriVox searches the live community metadata (the demo +// server's default lookup, so it needs the network) for a work with many LibriVox +// recordings and opens it beside the results. Then the web player, signed in as +// the admin in a context of its own, opens the same search from the Books mode's +// ... menu (Find on LibriVox), which shows only while the Bridge is online, for an +// admin, with metadata on. Nothing is added: no job is queued, so no book gains a +// match. The player's session is signed out again. +const LIBRIVOX_QUERY = 'The Wind in the Willows'; +await step('bridge: add from LibriVox', async () => { + if (!wanted(...LIBRIVOX_SHOTS)) return; + if (!bridgeToken || !bridgeStatus) throw new Error('no stand-in Bridge was paired'); + const status = {...bridgeStatus, kinds: [...bridgeStatus.kinds, 'librivox.fetch']}; + await standInHeartbeat(status); + const info = await api(token, 'GET', '/server'); + if (!info?.bridge?.features?.includes('librivox')) throw new Error('this server build has no librivox.fetch'); + + if (wanted('admin/librivox.png')) { + await open(page, '/library/librivox'); + await page.getByLabel('Title or author').fill(LIBRIVOX_QUERY); + const hit = page.getByRole('list', {name: 'Search results'}) + .getByRole('button', {name: new RegExp(`^${LIBRIVOX_QUERY}`)}).first(); + await hit.waitFor({timeout: 30000}); + await hit.click(); + const recordings = page.getByRole('list', {name: 'Recordings'}); + await recordings.getByText(/^Read by /).first().waitFor({timeout: 30000}); + await recordings.getByRole('button', {name: /^Add/}).first().waitFor({timeout: 15000}); + await sleep(1500); + await shoot(page, 'admin/librivox.png'); + } + + if (wanted('web-player/find-librivox.png')) { + const wctx = await browser.newContext(DESKTOP_CONTEXT); + await wctx.addInitScript(() => { + try { + localStorage.setItem('audiosilo.upNext', JSON.stringify({drawerOpen: false})); + } catch { + /* storage blocked: the drawer opens, the shot is just narrower */ + } + }); + let session = null; + try { + const wpage = await wctx.newPage(); + const visible = (id) => wpage.getByTestId(id).filter({visible: true}).first(); + await wpage.goto(`${ORIGIN}/web/connect`, {waitUntil: 'networkidle', timeout: 45000}); + await visible('connect-start').waitFor({timeout: 15000}); + const field = wpage.getByRole('textbox', {name: 'Server address'}).filter({visible: true}).first(); + if (await field.count()) { + await field.fill(ORIGIN); + await wpage.getByRole('button', {name: 'Continue', exact: true}).filter({visible: true}).first().click(); + } + await visible('probe-notice').waitFor({timeout: 15000}); + await wpage.getByRole('button', {name: /^Sign in to /}).filter({visible: true}).first().click(); + await visible('sign-in-step').waitFor({timeout: 8000}); + await wpage.getByRole('radio', {name: 'Username and password'}).filter({visible: true}).first().click(); + await wpage.getByLabel('Username', {exact: true}).filter({visible: true}).first().fill('admin'); + await wpage.getByLabel('Password', {exact: true}).filter({visible: true}).first().fill(PASSWORD); + await wpage.getByRole('button', {name: 'Sign in', exact: true}).filter({visible: true}).first().click(); + await visible('ready-screen').waitFor({timeout: 15000}); + session = await wpage.evaluate(() => { + const key = Object.keys(localStorage).find((k) => k.startsWith('audiosilo.token.')); + return key ? localStorage.getItem(key) : null; + }); + // Browse the library, not Start listening: nothing plays, so no session is recorded. + await wpage.getByRole('button', {name: 'Browse the library'}).filter({visible: true}).first().click(); + await visible('top-bar-(library)').waitFor({timeout: 15000}); + await standInHeartbeat(status); + await visible('books-menu').click({timeout: 20000}); + await visible('books-find-librivox').click({timeout: 8000}); + await visible('librivox-search-input').fill(LIBRIVOX_QUERY); + await visible('librivox-search-submit').click(); + await visible('librivox-hit').click({timeout: 30000}); + await visible('librivox-recording').waitFor({timeout: 30000}); + await visible('librivox-add').waitFor({timeout: 15000}); + await sleep(1500); + await shoot(wpage, 'web-player/find-librivox.png'); + } finally { + if (session) await api(session, 'POST', '/auth/logout').catch(() => {}); + await wctx.close(); + } + } +}); + await step('webhook deliveries', async () => { // What the local receiver got: every signature must check out. if (!hookBodies.length) throw new Error('the webhook received nothing'); diff --git a/screenshots/manifest.mjs b/screenshots/manifest.mjs index b78275cc..80441894 100644 --- a/screenshots/manifest.mjs +++ b/screenshots/manifest.mjs @@ -160,6 +160,8 @@ export const SHOTS = [ {file: 'admin/book-chapters-generated.png', capture: 'admin', title: 'Admin - Chapters found in the narration', hint: "A Long Lecture's Chapters card (clipped) once the stand-in Bridge finished its chapters.detect job: the chapters.json it wrote (as a Bridge does) in use, Found in the narration on this server. and Use the file's chapters over the timeline and the list"}, {file: 'admin/readalong-dialog.png', capture: 'admin', title: 'Admin - Make a read-along dialog', hint: "the Make a read-along confirmation over A Christmas Carol's page, while the stand-in Bridge offers readalong.align: what it does, the Ebook, Transcription (up to, from the stand-in's figures), Agent cost None: no agent is used, and the note on a poor match; then submitted, and the stand-in runs the job"}, {file: 'admin/book-readalong.png', capture: 'admin', title: 'Admin - Read-along card', hint: "A Christmas Carol's Read-along card (clipped) once the stand-in Bridge finished its readalong.align job: the readalong.json it wrote (its head: the EPUB's sha256, the book's files and lengths, 99.6% text coverage, made two days ago) Ready, the job's 99% of the text lined up and the transcript was reused, and Make again"}, + {file: 'admin/librivox.png', capture: 'admin', title: 'Admin - Library > LibriVox', hint: "Library > LibriVox while the stand-in Bridge offers librivox.fetch (online, so no Bridge note): Search LibriVox with The Wind in the Willows typed, the one result (Kenneth Grahame) selected, and its Recordings beside it, each with its readers, length, sections, project number, LibriVox page and the library picker with Add (live community metadata; nothing is added)"}, + {file: 'web-player/find-librivox.png', capture: 'admin', title: 'Web player - Find on LibriVox', hint: "the web player signed in as the admin (Browse the library, so nothing plays), opened from the Books mode's ... menu (Find on LibriVox) while the stand-in Bridge offers librivox.fetch: the intro, the Add to picker, The Wind in the Willows searched, its result opened with the first recordings, each with Read by, the sections, Project N, LibriVox page and Add to <library> (live community metadata; captured by capture-admin.mjs, which pairs the stand-in; nothing is added)"}, {file: 'admin/book-description.png', capture: 'admin', title: 'Admin - Generated description', hint: "The Call of the Wild's Community metadata card (clipped) with its Description part: the description run.sh seeds into its .audiosilo folder, Generated on this server two days ago, the text clamped behind Show more; shot before the stand-in Bridge is paired, so there is no Characters and recaps part"}, {file: 'admin/book-community-match.png', capture: 'admin', title: 'Admin - Recorded community match', hint: "The Hound of the Baskervilles' Community metadata card (clipped), matched for the shot through the match endpoint's first candidate with an ASIN (live meta.audiosilo.app): ASIN, Community work, Recording, Matched just now, Compare fields and Unlink; unlinked again afterwards, and shot before the stand-in Bridge is paired"}, {file: 'admin/bell.png', capture: 'admin', title: 'Admin - Notifications bell', hint: 'the top bar bell open over the overview: new books and sign-ins'}, diff --git a/static/img/screenshots/admin/librivox.png b/static/img/screenshots/admin/librivox.png new file mode 100644 index 0000000000000000000000000000000000000000..907f8b765e768f965a72fc2e7b61e3c6150f287b GIT binary patch literal 104987 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Ⓢ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≻bn_dpw9WLTfu;39}3LdVkL(nNlBo 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 b>A6bxN`r>MEdgM$JoivdN44PIv)BI%Xor%Y literal 0 HcmV?d00001 diff --git a/static/img/screenshots/web-player/find-librivox.png b/static/img/screenshots/web-player/find-librivox.png new file mode 100644 index 0000000000000000000000000000000000000000..b653ffe5612980115136688d44127e307f34aa35 GIT binary patch literal 71968 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 literal 0 HcmV?d00001 From e29a1c4452bf2778c5e14c83ce7ebdd91d436fc0 Mon Sep 17 00:00:00 2001 From: KodeStar <kode@audiosilo.app> Date: Fri, 13 Nov 2026 19:42:02 +0000 Subject: [PATCH 3/8] LibriVox docs: what a failed fetch's notice names, and what the Bridge contacts A failed or parked librivox.fetch has no result path, so its notice names the library, not the book. The FAQ's list of what the server sends now has Add from LibriVox (the search to meta.audiosilo.app, the download from archive.org), the player's hooks table lists the LibriVox client methods, and the Bridge page says LibriVox works without the agent. Part of LibriVox L6. --- docs-developers/bridge/attachments.md | 2 +- docs-developers/bridge/librivox.md | 6 +++--- docs-developers/bridge/pairing-and-jobs.md | 5 +++-- docs-developers/frontend/state-and-data.md | 2 ++ docs-developers/server/api/reference.md | 2 +- docs-users/admin/librivox.md | 2 +- docs-users/faq.md | 1 + docs-users/getting-started/running-a-bridge.md | 2 +- 8 files changed, 13 insertions(+), 9 deletions(-) diff --git a/docs-developers/bridge/attachments.md b/docs-developers/bridge/attachments.md index 1c18dfb2..86efe93b 100644 --- a/docs-developers/bridge/attachments.md +++ b/docs-developers/bridge/attachments.md @@ -26,7 +26,7 @@ files are described below. Audio is never stored in `.audiosilo/`. A book [added from LibriVox](librivox.md#audiosilolibrivoxjson) also holds `.audiosilo/librivox.json`, which names its LibriVox recording. It is no -attachment: the server skips the name and serves nothing from it. +attachment. The server skips the name and serves nothing from it. ### Podcast CHAP attachments diff --git a/docs-developers/bridge/librivox.md b/docs-developers/bridge/librivox.md index dc132ff9..d07b5b99 100644 --- a/docs-developers/bridge/librivox.md +++ b/docs-developers/bridge/librivox.md @@ -60,7 +60,7 @@ has the shapes and every status. | Kind | `librivox.fetch` (`bridge.KindLibrivoxFetch`; the Bridge's `librivoxjob.Kind`), feature `librivox` | | Server spec | needs a library, no book path, **writes**, a books library only, internal (`POST /admin/bridge/jobs` refuses it with `400`), no module | | Dedupe | per library and project (suffix `\|<librivox_id>`): a repeat answers the open job | -| Notifications | not quiet: done is "Added from LibriVox", named by the result's path; failed and a lasting park are notified as for other kinds | +| Notifications | not quiet. Done is "Added from LibriVox", named by the result's path. Failed, and a lasting park, are notified as for other kinds, named by the library | | Bridge lane | `download` (1 slot, shared with `audible.import` and an ordinary `podcast.fetch`), so one book downloads at a time | | Bridge state | `<data>/librivox/<library_id>-<librivox_id>.json` | @@ -165,8 +165,8 @@ The Bridge reads the manifest from **its own** metadata service LibriVox-shaped feed, for the sections, their titles and URLs, the cover and the archive.org identifier; - `GET /api/v1/works/{work_id}` for the title, the authors and how many LibriVox - recordings the work has. A `404` there is no failure: the project's own title - names the folder. + recordings the work has. A `404` there is no failure, and the project's own + title names the folder then. A metadata service that is down never ends the job. Each read is tried 4 times (5, 10 and 20 seconds apart), then the run fails with no code and keeps its diff --git a/docs-developers/bridge/pairing-and-jobs.md b/docs-developers/bridge/pairing-and-jobs.md index 75478908..30ab1ef3 100644 --- a/docs-developers/bridge/pairing-and-jobs.md +++ b/docs-developers/bridge/pairing-and-jobs.md @@ -686,10 +686,11 @@ module: `POST /admin/librivox/fetch`; - a **writing** kind for a books library: it needs a writable mapping, else `library_not_writable`, and a podcast library is `not_book_library`; -- no book path: the book does not exist until the job places it; +- no book path, since the book does not exist until the job places it; - params `{librivox_id, work_id, recording_id, library_id}`, built by the server; - deduped per library and project; -- **not** quiet: done and failed are notified, named by the result's path. +- **not** quiet: done is notified, named by the result's path; a failed or parked + one names only its library, since only a done job's result names the book. It runs in the `download` lane, so it takes turns with `audible.import` and the ordinary `podcast.fetch` slot, and its partial download survives a restart. When diff --git a/docs-developers/frontend/state-and-data.md b/docs-developers/frontend/state-and-data.md index 4a751aa0..2f4ad1cc 100644 --- a/docs-developers/frontend/state-and-data.md +++ b/docs-developers/frontend/state-and-data.md @@ -556,6 +556,8 @@ older server (React Query rejects it instead), and the query stays pending. | `communityCoverUrl(lib, path, coverUrl, { size })` | `useCommunityCover(cid, lib, path)` (a resolver, not a query) | `meta_covers` | `GET /libraries/{id}/meta/cover?path=&url=&size=` (see [Community covers](#community-covers-clientcommunitycoverurl)) | | `readalong(lib, path)` | `useReadalong(lib, path, { enabled, generatedAt }, connectionId?)`, behind `useBookReadalong` | `readalong` | `GET /libraries/{id}/readalong` (the map, checked span by span into a `CheckedReadalongMap`; see [Read-along](#read-along-usereadalong-and-usebookreadalong)) | | `readalongEstimate(lib, path)` | `useReadalongEstimate(lib, path, connectionId?)` | `bridge` | `GET /admin/bridge/estimate?kind=readalong.align` (`ReadalongEstimate`, admin only) | +| `librivoxSearch(q, { lang, limit })` / `librivoxWork(id)` | `useLibrivoxSearch` / `useLibrivoxWork` | `metadata` (the page checks the whole gate; see [Find on LibriVox](library-and-browse.md#find-on-librivox-admin)) | `GET /admin/librivox/search`, `/admin/librivox/work` (admin only) | +| `librivoxFetch(lib, id)` / `bridgeJob(id)` | `useAddLibrivox` / `useLibrivoxJob` | `metadata` / `bridge` | `POST /admin/librivox/fetch`, `GET /admin/bridge/jobs/{id}` (admin only) | - **People lists are normalised.** The server answers `{ authors, unknown }` and `{ narrators, unknown }`. The client returns both as one shape, diff --git a/docs-developers/server/api/reference.md b/docs-developers/server/api/reference.md index 22bac352..090c281f 100644 --- a/docs-developers/server/api/reference.md +++ b/docs-developers/server/api/reference.md @@ -11813,7 +11813,7 @@ as `bridge.job` (with `job`, `kind`, `library` and `librivox_id`). Internal (refused by `POST /admin/bridge/jobs` with `400`), a writing kind for a books library, no module, deduped per library and project, and notified when it -ends done or failed (named by the book's path). Its params, progress steps, result +ends done (named by the book's path) or failed (named by its library). Its params, progress steps, result and failure codes are in [The job](../../bridge/librivox.md#the-job-librivoxfetch). A done job's result becomes the book's recorded community match (`how` `accepted`, `set_by` the admin who asked) when it names a book indexed in the diff --git a/docs-users/admin/librivox.md b/docs-users/admin/librivox.md index eaf259fb..8f84ed6b 100644 --- a/docs-users/admin/librivox.md +++ b/docs-users/admin/librivox.md @@ -68,7 +68,7 @@ Bridge online. ## What lands in your library -The Bridge makes one folder for the book, by author and title: +The Bridge makes one folder for the book, by author and title. For example: ``` Charles Dickens/ diff --git a/docs-users/faq.md b/docs-users/faq.md index 8fb0ba37..2dec8665 100644 --- a/docs-users/faq.md +++ b/docs-users/faq.md @@ -67,6 +67,7 @@ Only what a lookup needs: - **Community metadata** sends meta.audiosilo.app a book's ASIN or ISBN, or the community entry an admin matched it to. Matching a book also sends details like its title and author (see [Server settings](./admin/server.md#community-metadata)). The server never sends listener details or full file paths. A match can send up to three names from the book's path (its author, series and book folders) as search terms. - **Help complete the community database** (off by default) sends, once a day, the ASINs the database doesn't know. See [Helping complete the community database](./admin/server.md#helping-complete-the-community-database). +- **Add from LibriVox**, when an admin uses it, sends the search text to meta.audiosilo.app, and the Bridge downloads the book from archive.org. See [Add free books from LibriVox](./admin/librivox.md). - **Podcast search** sends the search text to Apple Podcasts or Podcast Index. See [Searching podcast directories](./admin/podcasts.md#searching-podcast-directories). - **The update check** asks GitHub once a day for the newest version. See [What the update check sends](./admin/server.md#what-the-update-check-sends). diff --git a/docs-users/getting-started/running-a-bridge.md b/docs-users/getting-started/running-a-bridge.md index 71b98eb6..06731e14 100644 --- a/docs-users/getting-started/running-a-bridge.md +++ b/docs-users/getting-started/running-a-bridge.md @@ -217,7 +217,7 @@ To make it faster, or to give a `:latest-slim` Bridge a way to transcribe: ## 7. The agent's credential (optional) {/* #7-the-agents-credential */} Skip this step if you don't want characters, recaps or descriptions. Chapters, -read-alongs, podcasts and Audible work without the agent. +read-alongs, podcasts, Audible and LibriVox work without the agent. The agent needs a credential for an AI account. It runs **Claude Code** unless you switch it to Codex (below). The easiest place to set the credential is the From f7d1356311fc79b0d7ae1c73617fd825b1574afe Mon Sep 17 00:00:00 2001 From: KodeStar <kode@audiosilo.app> Date: Fri, 13 Nov 2026 19:47:40 +0000 Subject: [PATCH 4/8] Share the player sign-in helpers between the capture scripts The Find on LibriVox shot in capture-admin.mjs signed the web player in with an inline copy of capture-web.mjs's connect, sign-in and token helpers, so a change to the connect flow would have been fixed in one script and left broken in the other. drawerClosed, playerSession, probeServer and signInWithPassword now live in lib.mjs and both scripts import them. The LibriVox step's settle waits drop to the 800 ms the other Bridge steps use, and its second heartbeat says why it is there. Part of LibriVox L6. --- screenshots/capture-admin.mjs | 41 ++++++++++------------------- screenshots/capture-web.mjs | 49 +++-------------------------------- screenshots/lib.mjs | 45 ++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 72 deletions(-) diff --git a/screenshots/capture-admin.mjs b/screenshots/capture-admin.mjs index cba0e6b7..3e24780b 100644 --- a/screenshots/capture-admin.mjs +++ b/screenshots/capture-admin.mjs @@ -45,16 +45,21 @@ import { addHousehold, apiClient, around, + drawerClosed, fitViewportToPage, isoAgo, pathQuery, + playerSession, + probeServer, showDockerPaths, silence, sleep, shoot, + signInWithPassword, stamp, step, submitSignIn, + tid, waitForScans, wanted, DESKTOP_CONTEXT, @@ -1565,45 +1570,27 @@ await step('bridge: add from LibriVox', async () => { const recordings = page.getByRole('list', {name: 'Recordings'}); await recordings.getByText(/^Read by /).first().waitFor({timeout: 30000}); await recordings.getByRole('button', {name: /^Add/}).first().waitFor({timeout: 15000}); - await sleep(1500); + await sleep(800); await shoot(page, 'admin/librivox.png'); } if (wanted('web-player/find-librivox.png')) { const wctx = await browser.newContext(DESKTOP_CONTEXT); - await wctx.addInitScript(() => { - try { - localStorage.setItem('audiosilo.upNext', JSON.stringify({drawerOpen: false})); - } catch { - /* storage blocked: the drawer opens, the shot is just narrower */ - } - }); + await wctx.addInitScript(drawerClosed); let session = null; try { const wpage = await wctx.newPage(); - const visible = (id) => wpage.getByTestId(id).filter({visible: true}).first(); + const visible = (id) => tid(wpage, id); await wpage.goto(`${ORIGIN}/web/connect`, {waitUntil: 'networkidle', timeout: 45000}); - await visible('connect-start').waitFor({timeout: 15000}); - const field = wpage.getByRole('textbox', {name: 'Server address'}).filter({visible: true}).first(); - if (await field.count()) { - await field.fill(ORIGIN); - await wpage.getByRole('button', {name: 'Continue', exact: true}).filter({visible: true}).first().click(); - } - await visible('probe-notice').waitFor({timeout: 15000}); - await wpage.getByRole('button', {name: /^Sign in to /}).filter({visible: true}).first().click(); - await visible('sign-in-step').waitFor({timeout: 8000}); - await wpage.getByRole('radio', {name: 'Username and password'}).filter({visible: true}).first().click(); - await wpage.getByLabel('Username', {exact: true}).filter({visible: true}).first().fill('admin'); - await wpage.getByLabel('Password', {exact: true}).filter({visible: true}).first().fill(PASSWORD); - await wpage.getByRole('button', {name: 'Sign in', exact: true}).filter({visible: true}).first().click(); + await probeServer(wpage, ORIGIN); + await signInWithPassword(wpage, 'admin', PASSWORD); await visible('ready-screen').waitFor({timeout: 15000}); - session = await wpage.evaluate(() => { - const key = Object.keys(localStorage).find((k) => k.startsWith('audiosilo.token.')); - return key ? localStorage.getItem(key) : null; - }); + session = (await playerSession(wpage)).token; // Browse the library, not Start listening: nothing plays, so no session is recorded. await wpage.getByRole('button', {name: 'Browse the library'}).filter({visible: true}).first().click(); await visible('top-bar-(library)').waitFor({timeout: 15000}); + // Again, so a slow console shot cannot leave the Bridge offline: the player's + // /server names the Bridge's features only while it is online. await standInHeartbeat(status); await visible('books-menu').click({timeout: 20000}); await visible('books-find-librivox').click({timeout: 8000}); @@ -1612,7 +1599,7 @@ await step('bridge: add from LibriVox', async () => { await visible('librivox-hit').click({timeout: 30000}); await visible('librivox-recording').waitFor({timeout: 30000}); await visible('librivox-add').waitFor({timeout: 15000}); - await sleep(1500); + await sleep(800); await shoot(wpage, 'web-player/find-librivox.png'); } finally { if (session) await api(session, 'POST', '/auth/logout').catch(() => {}); diff --git a/screenshots/capture-web.mjs b/screenshots/capture-web.mjs index 95375eda..d5384e65 100644 --- a/screenshots/capture-web.mjs +++ b/screenshots/capture-web.mjs @@ -40,13 +40,17 @@ import { addHousehold, apiClient, around, + drawerClosed, firstVisible, fitViewportTo, fitted, imagesLoaded, isoAgo, pathQuery, + playerSession, + probeServer, shoot, + signInWithPassword, sleep, slug, stamp, @@ -90,16 +94,6 @@ const COLLECTION = { books: ['Christmas Carol', 'Hound of the Baskervilles', 'Adventures of Sherlock Holmes', 'Looking-Glass'], }; -// The desktop Up next drawer starts closed in every capture context, so the shots -// that aren't about it keep the page's full width; the Up next shot opens it. -const drawerClosed = () => { - try { - localStorage.setItem('audiosilo.upNext', JSON.stringify({drawerOpen: false})); - } catch { - /* storage blocked: the drawer opens, the shots are just narrower */ - } -}; - // A capture context: DESKTOP_CONTEXT (1440x900, retina, dark, motion reduced) with // `options` on top (a viewport, stored auth, a time zone...), the Up next drawer // closed. `on` is the browser to open it in (the Cast shot has its own). @@ -169,18 +163,6 @@ const PRIMARY_PLAY = /^(start listening|resume( chapter \d+)?|listen again|liste // a bare web export, so it isn't read from there). const FELL_ASLEEP_NOTE = 'Fell asleep'; -// The signed-in player's connection id and token (the web player keeps the token in -// localStorage under audiosilo.token.<connection id>), for provisioning through the API. -async function playerSession(page) { - const session = await page.evaluate(() => { - const prefix = 'audiosilo.token.'; - const key = Object.keys(localStorage).find((k) => k.startsWith(prefix)); - return key ? {cid: key.slice(prefix.length), token: localStorage.getItem(key)} : null; - }); - if (!session?.token) throw new Error('no player token in localStorage'); - return session; -} - // The demo user's token. async function demoToken(page) { return (await playerSession(page)).token; @@ -1755,29 +1737,6 @@ if (wanted(...Object.values(PODCAST_SHOTS), ...Object.values(FIND_SHOTS))) { } } -// The connect start screen, done once the probe card shows what it found. A served -// player that asks its own server on open has no address field; one that has the field -// gets the server's address typed and Continue pressed. -async function probeServer(page, origin) { - await tid(page, 'connect-start').waitFor({timeout: 15000}); - const field = firstVisible(page.getByRole('textbox', {name: 'Server address'})); - if (await field.count()) { - await field.fill(origin); - await firstVisible(page.getByRole('button', {name: 'Continue', exact: true})).click({timeout: 8000}); - } - await tid(page, 'probe-notice').waitFor({timeout: 15000}); -} - -// From the probe card: Sign in, by username and password. -async function signInWithPassword(page, username, password) { - await firstVisible(page.getByRole('button', {name: /^Sign in to /})).click({timeout: 8000}); - await tid(page, 'sign-in-step').waitFor({timeout: 8000}); - await firstVisible(page.getByRole('radio', {name: 'Username and password'})).click({timeout: 8000}); - await firstVisible(page.getByLabel('Username', {exact: true})).fill(username); - await firstVisible(page.getByLabel('Password', {exact: true})).fill(password); - await firstVisible(page.getByRole('button', {name: 'Sign in', exact: true})).click({timeout: 8000}); -} - // ── Household: profiles, members, kids mode, listening in the house, Cast ─── // These shots need people, not the demo: a demo account can't share what it listens to // or add household members, and profiles, PINs and kids mode live in this browser's diff --git a/screenshots/lib.mjs b/screenshots/lib.mjs index 85a4f82f..4ccee0b2 100644 --- a/screenshots/lib.mjs +++ b/screenshots/lib.mjs @@ -38,6 +38,51 @@ export const pathQuery = (relPath) => `?path=${encodeURIComponent(relPath)}`; export const firstVisible = (locator) => locator.filter({visible: true}).first(); export const tid = (page, id) => firstVisible(page.getByTestId(id)); +// The desktop Up next drawer starts closed in every capture context, so the shots +// that aren't about it keep the page's full width; the Up next shot opens it. +export const drawerClosed = () => { + try { + localStorage.setItem('audiosilo.upNext', JSON.stringify({drawerOpen: false})); + } catch { + /* storage blocked: the drawer opens, the shots are just narrower */ + } +}; + +// The signed-in player's connection id and token (the web player keeps the token in +// localStorage under audiosilo.token.<connection id>), for provisioning through the API. +export async function playerSession(page) { + const session = await page.evaluate(() => { + const prefix = 'audiosilo.token.'; + const key = Object.keys(localStorage).find((k) => k.startsWith(prefix)); + return key ? {cid: key.slice(prefix.length), token: localStorage.getItem(key)} : null; + }); + if (!session?.token) throw new Error('no player token in localStorage'); + return session; +} + +// The connect start screen, done once the probe card shows what it found. A served +// player that asks its own server on open has no address field; one that has the field +// gets the server's address typed and Continue pressed. +export async function probeServer(page, origin) { + await tid(page, 'connect-start').waitFor({timeout: 15000}); + const field = firstVisible(page.getByRole('textbox', {name: 'Server address'})); + if (await field.count()) { + await field.fill(origin); + await firstVisible(page.getByRole('button', {name: 'Continue', exact: true})).click({timeout: 8000}); + } + await tid(page, 'probe-notice').waitFor({timeout: 15000}); +} + +// From the probe card: Sign in, by username and password. +export async function signInWithPassword(page, username, password) { + await firstVisible(page.getByRole('button', {name: /^Sign in to /})).click({timeout: 8000}); + await tid(page, 'sign-in-step').waitFor({timeout: 8000}); + await firstVisible(page.getByRole('radio', {name: 'Username and password'})).click({timeout: 8000}); + await firstVisible(page.getByLabel('Username', {exact: true})).fill(username); + await firstVisible(page.getByLabel('Password', {exact: true})).fill(password); + await firstVisible(page.getByRole('button', {name: 'Sign in', exact: true})).click({timeout: 8000}); +} + // The standard desktop capture context (retina, dark, motion-reduced) shared by // the capture scripts. capture-web spreads it into its capture contexts // (`newCaptureContext`), overriding the viewport where a shot needs it; its warm-up and From 03dd0a7d283de5e67b4fa810fa44e441e2e878a7 Mon Sep 17 00:00:00 2001 From: KodeStar <kode@audiosilo.app> Date: Fri, 13 Nov 2026 19:47:40 +0000 Subject: [PATCH 5/8] Tighten the LibriVox pages and keep each fact in one place - The player's Find on LibriVox is its own section, not a Library mode, and links to the Bridge page's gate instead of restating it. - The bell's wording for a parked librivox.fetch moves to the notifications page beside the other per-kind bell titles. - The scanner names the staging folder in its hidden-folder rule rather than in the attachments section. - The API reference says a parked fetch is notified too, as the notifier does. - The User Guide puts the "Bridge online" condition on the step that needs it and shortens the resume paragraph. Part of LibriVox L6. --- docs-developers/bridge/librivox.md | 16 ++++----------- .../frontend/library-and-browse.md | 20 +++++++++---------- docs-developers/server/api/reference.md | 2 +- .../server/backups-and-notifications.md | 3 ++- docs-developers/server/scanner.md | 7 +++---- docs-developers/server/web-ui.md | 2 -- docs-users/admin/librivox.md | 11 ++++------ 7 files changed, 23 insertions(+), 38 deletions(-) diff --git a/docs-developers/bridge/librivox.md b/docs-developers/bridge/librivox.md index d07b5b99..b029901a 100644 --- a/docs-developers/bridge/librivox.md +++ b/docs-developers/bridge/librivox.md @@ -13,8 +13,8 @@ console match. |---|---|---| | The server | the admin routes, the recording's identity at queue time, the job kind and its fold | `api/handlers_librivox.go`, `bridge/librivox.go`, `catalog/librivox.go`, `meta/librivox.go` | | The Bridge | reads the manifest, downloads from archive.org, places the folder, rescans | `internal/librivoxjob`, `internal/metaops/librivox.go`, netguard's per-request `Allow` | -| The console | Library > LibriVox | `admin-ui/src/features/librivox/` | -| The player | Find on LibriVox, an admin page off a books library's menu | `src/components/librivox/` | +| The console | [Library > LibriVox](../server/web-ui.md#library--librivox) | `admin-ui/src/features/librivox/` | +| The player | [Find on LibriVox](../frontend/library-and-browse.md#find-on-librivox-admin), an admin page off a books library's menu | `src/components/librivox/` | The User Guide's [Add free books from LibriVox](/users/admin/librivox) is the admin's view of it. @@ -267,13 +267,5 @@ The Bridge writes it into the book's folder: { "version": 1, "librivox_id": 192, "work_id": "johnny-crows-garden", "recording_id": "…", "archive_id": "…" } ``` -The server does not read it. Its scanner skips the name, so the book has no -attachments from it and no scan error. It is not one of the -[attachments](attachments.md) the server serves. - -## The console and the player - -- The console's Library > LibriVox is described in - [the web UI](../server/web-ui.md#library--librivox). -- The player's Find on LibriVox is in - [Library and browse](../frontend/library-and-browse.md#find-on-librivox-admin). +The server does not read it yet: its scanner skips the name (no scan error), and +it is not one of the [attachments](attachments.md) the server serves. diff --git a/docs-developers/frontend/library-and-browse.md b/docs-developers/frontend/library-and-browse.md index 1994ef70..11bc1110 100644 --- a/docs-developers/frontend/library-and-browse.md +++ b/docs-developers/frontend/library-and-browse.md @@ -114,7 +114,7 @@ A capability that is still unknown hides its item. Remove download asks first through the shared `RemoveDownloadConfirm` (see [Offline](offline.md#lifecycle)). -### Find on LibriVox (admin) +## Find on LibriVox (admin) `src/components/librivox/` is the player's side of [Add from LibriVox](../bridge/librivox.md): an admin searches the community @@ -124,12 +124,11 @@ the two keep the same rules. **The gate.** `librivoxAccess(user, server)` (`librivox-model.ts`) needs an admin (`isBridgeAdmin`), the `bridge` flag with `librivox` in `bridge.features`, and -`metadata`. `mayAddLibrivox` is its `allowed`. There is no `/server` flag of its -own, and `/server` names the Bridge's features only while it is online, so unlike -the console the player offers nothing while the Bridge is offline. The page shows -a sentence (`notAdmin`, `unavailable`, `metadataOff`) and sends nothing without -`allowed`. The search and everything under it mount only then, and the hooks are -called nowhere else. +`metadata`. `mayAddLibrivox` is its `allowed`. Unlike the console, the player +offers nothing while the Bridge is offline (see +[The gate](../bridge/librivox.md#the-gate)). Without `allowed` the page shows only +a sentence (`notAdmin`, `unavailable`, `metadataOff`): the search and its hooks +never mount. **The way in.** `LibrivoxMenu` is a **...** menu in the Books mode's controls (`books-controls.tsx`'s trailing slot: the sub-nav row on a tablet or desktop, @@ -174,10 +173,9 @@ found, and the opened work's recordings under it. - Add goes to the library the page was opened from, or the one picked when the server has several books libraries. Podcast libraries are never offered. - A row follows the last job it queued or saw open on the work - (`useFollowedFetch`). It keeps the job after the work stops naming it, so a - failure still says why. The work's job is taken only when the work comes to name - another one, so an answer that still names the old job never takes the row back - from the one it just queued. + (`useFollowedFetch`) and switches only when the work names a different job, so a + failure still says why and an older answer never takes the row back from the + job it just queued. - `fetchView` words the job: its step (`manifest`, `download`, `cover`, `place`, `rescan`) or its code (`librivox.fetch.code.*`). The Bridge's English is never shown. diff --git a/docs-developers/server/api/reference.md b/docs-developers/server/api/reference.md index 090c281f..bd0b6c05 100644 --- a/docs-developers/server/api/reference.md +++ b/docs-developers/server/api/reference.md @@ -11813,7 +11813,7 @@ as `bridge.job` (with `job`, `kind`, `library` and `librivox_id`). Internal (refused by `POST /admin/bridge/jobs` with `400`), a writing kind for a books library, no module, deduped per library and project, and notified when it -ends done (named by the book's path) or failed (named by its library). Its params, progress steps, result +ends done (named by the book's path), failed or parked (named by its library). Its params, progress steps, result and failure codes are in [The job](../../bridge/librivox.md#the-job-librivoxfetch). A done job's result becomes the book's recorded community match (`how` `accepted`, `set_by` the admin who asked) when it names a book indexed in the diff --git a/docs-developers/server/backups-and-notifications.md b/docs-developers/server/backups-and-notifications.md index 71a65c70..5bd839bd 100644 --- a/docs-developers/server/backups-and-notifications.md +++ b/docs-developers/server/backups-and-notifications.md @@ -404,7 +404,8 @@ of their own (`FINISHED_OWN` in `lib/server-events.ts`). A read-along reads `Rea `N% of the text lined up. Open the book in a compatible AudioSilo player to follow the text with the narration.` under it. Every other kind, including `sidecars.contribute` and `meta.correct`, reads `Bridge job finished: <name>` -with the kind's name under it. +with the kind's name under it. A parked `librivox.fetch` words its code in the +bell as Library > LibriVox does (`fetchParkKey`). `bridge_job_failed` reads `A Bridge job needs attention: <title>` (in the warning colour) or `<kind> failed: <title>`. The kind's words come from diff --git a/docs-developers/server/scanner.md b/docs-developers/server/scanner.md index e09fe0a9..3520d498 100644 --- a/docs-developers/server/scanner.md +++ b/docs-developers/server/scanner.md @@ -1467,9 +1467,7 @@ in a `.audiosilo/` beside it. Any other name there is skipped (`knownAttachment`). A book the Bridge [added from LibriVox](../bridge/librivox.md#audiosilolibrivoxjson) holds `librivox.json`, which the server does not read: the book is indexed with no -attachments from it and no scan error. The Bridge's staging folder for such a -book (`.audiosilo-librivox-<id>/`, beside it) is a dot folder, so the scan never -sees it. +attachments from it and no scan error. They are not a metadata layer. Nothing in the effective row reads them except `chapters.json`, which is a chapter source of its own, and `/meta` serves the @@ -1479,7 +1477,8 @@ re-resolves the book when its `chapters.json` changed. The exact rule is in The scan finds them the way it finds an ABS `metadata.json`: -- **Discovery** never walks into a hidden folder. A folder named exactly +- **Discovery** never walks into a hidden folder, such as the Bridge's LibriVox + staging folder (`.audiosilo-librivox-<id>/`). A folder named exactly `.audiosilo` (a real folder, not ignored) is the exception: it is **listed once** without going in (`audioDirs`' `sidecarFiles`, beside the ABS signatures). Its known regular files are recorded by the folder holding it. diff --git a/docs-developers/server/web-ui.md b/docs-developers/server/web-ui.md index 1544592d..4677260e 100644 --- a/docs-developers/server/web-ui.md +++ b/docs-developers/server/web-ui.md @@ -1740,8 +1740,6 @@ People > Devices or Invites, Server > About, or Server > Settings > Backups. - **See all** opens Server > Events. - Each row is `ServerEventItem` (`components/server-event-item.tsx`), shared with that page. -- A done `librivox.fetch` reads `Added from LibriVox: <name>`, and a parked one - words its code as the LibriVox page does (`fetchParkKey`). #### Server > Events diff --git a/docs-users/admin/librivox.md b/docs-users/admin/librivox.md index 8f84ed6b..283af3c9 100644 --- a/docs-users/admin/librivox.md +++ b/docs-users/admin/librivox.md @@ -50,7 +50,8 @@ Bridge starts it when it is back. To add a book from the app or the web player, open the **Library** tab on a books library. -1. Press the **...** button beside the sort and layout controls. +1. Press the **...** button beside the sort and layout controls. It shows only + while the Bridge is online. 2. Choose **Find on LibriVox**. 3. Type a title or an author, press **Search** and select a result. 4. Press **Add to** *the library* on the recording you want. @@ -63,9 +64,6 @@ library, you can pick another under **Add to**. The row shows the progress, with **Cancel** while it runs. Once the book is in, the row says **In your library**, and **Open** opens its page. -The **...** button shows only for an admin, with community metadata on and the -Bridge online. - ## What lands in your library The Bridge makes one folder for the book, by author and title. For example: @@ -102,9 +100,8 @@ downloads take turns with it. **Cancel** in the [Jobs](bridge.md#jobs) list on **Server > Settings > Bridge**. A cancelled book leaves nothing behind in the library. -If the Bridge stops part way, it picks up where it left off. Sections it already -downloaded are not downloaded again, and a section cut off part way usually -carries on from where it stopped. +If the Bridge stops part way, it picks up where it left off: sections it already +downloaded are kept, and a section cut off part way usually resumes. ## When adding fails From 545f2e93230b81c2858d1c90da7c5417f86d080a Mon Sep 17 00:00:00 2001 From: KodeStar <kode@audiosilo.app> Date: Fri, 13 Nov 2026 19:54:56 +0000 Subject: [PATCH 6/8] Say the Bridge reads LibriVox sections from the metadata service The User Guide and the privacy FAQ said only that the search goes to meta.audiosilo.app and the audio comes from archive.org. The Bridge also reads the project's section list and work from its own metadata service before it downloads, so both pages now say so. Adding a recording again finds the placed book only while it is still in the folder the Bridge plans for it; the page no longer promises that in every case. Part of LibriVox L6. --- docs-users/admin/librivox.md | 9 +++++---- docs-users/faq.md | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs-users/admin/librivox.md b/docs-users/admin/librivox.md index 283af3c9..00f1c8e0 100644 --- a/docs-users/admin/librivox.md +++ b/docs-users/admin/librivox.md @@ -16,8 +16,9 @@ You need: - the library shown as **Ready** in [Server > Settings > Bridge](bridge.md#libraries). The search reads the community metadata database, so your server never asks -LibriVox itself. The Bridge downloads the audio from archive.org, where LibriVox -keeps its recordings. +LibriVox itself. The Bridge reads the recording's list of sections from the +community metadata database too, and downloads the audio from archive.org, where +LibriVox keeps its recordings. :::note[A new books library] The Bridge checks a books library against a book the server has indexed. A @@ -123,5 +124,5 @@ The row says why. Press **Add** again to try once more. [notifications](notifications.md). - [Clear community matches](server.md#community-metadata) removes the match of books added from LibriVox too. To get it back, press **Add** on the recording - again. The Bridge finds the book it already placed and downloads nothing, and - the server matches it again. + again. When the book is still in the folder the Bridge put it in, the Bridge + finds it there and downloads nothing, and the server matches it again. diff --git a/docs-users/faq.md b/docs-users/faq.md index 2dec8665..55d1fe41 100644 --- a/docs-users/faq.md +++ b/docs-users/faq.md @@ -67,7 +67,7 @@ Only what a lookup needs: - **Community metadata** sends meta.audiosilo.app a book's ASIN or ISBN, or the community entry an admin matched it to. Matching a book also sends details like its title and author (see [Server settings](./admin/server.md#community-metadata)). The server never sends listener details or full file paths. A match can send up to three names from the book's path (its author, series and book folders) as search terms. - **Help complete the community database** (off by default) sends, once a day, the ASINs the database doesn't know. See [Helping complete the community database](./admin/server.md#helping-complete-the-community-database). -- **Add from LibriVox**, when an admin uses it, sends the search text to meta.audiosilo.app, and the Bridge downloads the book from archive.org. See [Add free books from LibriVox](./admin/librivox.md). +- **Add from LibriVox**, when an admin uses it, sends the search text to meta.audiosilo.app. The Bridge then reads the recording's list of sections from meta.audiosilo.app (or the metadata service it is set to use) and downloads the book from archive.org. See [Add free books from LibriVox](./admin/librivox.md). - **Podcast search** sends the search text to Apple Podcasts or Podcast Index. See [Searching podcast directories](./admin/podcasts.md#searching-podcast-directories). - **The update check** asks GitHub once a day for the newest version. See [What the update check sends](./admin/server.md#what-the-update-check-sends). From 8dc256b604c5e2cf394a020bd3ba460793327ed7 Mon Sep 17 00:00:00 2001 From: KodeStar <kode@audiosilo.app> Date: Fri, 13 Nov 2026 19:54:56 +0000 Subject: [PATCH 7/8] Match the LibriVox developer docs to the job's actual rules - A new job whose library is checked but not writable fails not_writable; only a resumed or downloading one parks. - not_found also covers a recording that meta now ties to another project. - Section URLs are checked up front; an off-archive cover is skipped, not failed. binary/octet-stream is an accepted Content-Type. - Adding again repairs the identity only when the planned folder (or its fallback) is the one placed. - A done fetch's notification names the book its result names, which is its title once indexed, not its path. - The console's Bridge note links Settings > Bridge only when no Bridge is paired, and the player's refusal keys include not_found and invalid. Part of LibriVox L6. --- docs-developers/bridge/librivox.md | 33 ++++++++++--------- docs-developers/bridge/pairing-and-jobs.md | 5 +-- .../frontend/library-and-browse.md | 4 +-- docs-developers/server/api/reference.md | 4 +-- docs-developers/server/web-ui.md | 6 ++-- 5 files changed, 28 insertions(+), 24 deletions(-) diff --git a/docs-developers/bridge/librivox.md b/docs-developers/bridge/librivox.md index b029901a..88b8177c 100644 --- a/docs-developers/bridge/librivox.md +++ b/docs-developers/bridge/librivox.md @@ -60,7 +60,7 @@ has the shapes and every status. | Kind | `librivox.fetch` (`bridge.KindLibrivoxFetch`; the Bridge's `librivoxjob.Kind`), feature `librivox` | | Server spec | needs a library, no book path, **writes**, a books library only, internal (`POST /admin/bridge/jobs` refuses it with `400`), no module | | Dedupe | per library and project (suffix `\|<librivox_id>`): a repeat answers the open job | -| Notifications | not quiet. Done is "Added from LibriVox", named by the result's path. Failed, and a lasting park, are notified as for other kinds, named by the library | +| Notifications | not quiet. Done is "Added from LibriVox", named by the book its result names. Failed, and a lasting park, are notified as for other kinds, named by the library | | Bridge lane | `download` (1 slot, shared with `audible.import` and an ordinary `podcast.fetch`), so one book downloads at a time | | Bridge state | `<data>/librivox/<library_id>-<librivox_id>.json` | @@ -88,9 +88,11 @@ and ignores unknown fields. | `place` | writes `.audiosilo/librivox.json` and moves the folder into place | | `rescan` | asks the server to index the book (`POST /bridge/rescan`, three tries) | -A library that is not mapped and writable **parks** the job (`needs_attention`, -park code `not_writable`), and it carries on once a mapping check reports the -library writable again. +The job waits while its library has no mapping check yet. A new job whose library +is checked but not mapped and writable fails `not_writable`. A resumed job, or one +already downloading, **parks** instead (`needs_attention`, park code +`not_writable`), and it carries on once a mapping check reports the library +writable again. ### Result @@ -111,7 +113,7 @@ message never holds a URL. | `not_writable` | the library is not a checked, writable books mapping, or its mapping moved to another mount while the job ran | | `exists` | the title's folder and its fallback are both taken, or the author folder is a listed book or holds audio | | `disk_full` | the library has less than 1.1 times the rest of a file free | -| `not_found` | the Bridge's metadata service has no such project, or it lists no files | +| `not_found` | the Bridge's metadata service has no such project, it lists no files, or the work's recording now names another project | | `archive_unavailable` | a section is not on archive.org, or archive.org kept failing | | `metadata_off` | the Bridge has no metadata service set (`metadata.base_url`) | @@ -152,9 +154,9 @@ Two things drop the identity, because the server does not read - a fold lost between the job's commit and the fold, such as a crash; - [Clear community matches](../server/api/reference.md#delete-apiv1admincommunity-matches). -Adding the recording again repairs either. The Bridge finds the folder it placed -(it holds the project's `librivox.json`), only rescans it, and the fold records -the match. +Adding the recording again repairs either. When the folder the Bridge plans now, +or its fallback, is the one it placed (it holds the project's `librivox.json`), +the Bridge only rescans it, and the fold records the match. ## Fetching from archive.org only @@ -170,20 +172,21 @@ The Bridge reads the manifest from **its own** metadata service A metadata service that is down never ends the job. Each read is tried 4 times (5, 10 and 20 seconds apart), then the run fails with no code and keeps its -staging folder and state for the next attempt. Only a definite `404` for the -project ends it as `not_found`. +staging folder and state for the next attempt. A definite `404` for the project +ends it as `not_found`. Every section and cover URL must be `https` on `archive.org` or a subdomain of it -(`AllowedURL`). The Bridge checks each one before anything is fetched or -written, and again on every redirect, through netguard's per-request `Allow`. It -never fetches from librivox.org. The client is the Bridge's own netguard client +(`AllowedURL`). The Bridge checks every section's URL before anything is fetched +or written (one elsewhere fails the job `archive_unavailable`), the cover's before +the cover is fetched (one elsewhere is skipped), and each again on every redirect, +through netguard's per-request `Allow`. It never fetches from librivox.org. The client is the Bridge's own netguard client (public addresses only, not the podcasts' `allow_networks`). A URL with padding around it is refused as it stands, so the check and the request see one spelling. Only audio is kept: -- a `Content-Type` other than none, `audio/*`, `application/octet-stream` or - `application/ogg` is never written; +- a `Content-Type` other than none, `audio/*`, `application/octet-stream`, + `binary/octet-stream` or `application/ogg` is never written; - a whole file whose first bytes (past any zero padding in its first 4 KB) are no ID3 tag, MPEG frame sync, `OggS`, `fLaC` or MP4 `ftyp` is removed; - an empty body never counts as a finished section. diff --git a/docs-developers/bridge/pairing-and-jobs.md b/docs-developers/bridge/pairing-and-jobs.md index 30ab1ef3..d9e28cbb 100644 --- a/docs-developers/bridge/pairing-and-jobs.md +++ b/docs-developers/bridge/pairing-and-jobs.md @@ -689,8 +689,9 @@ module: - no book path, since the book does not exist until the job places it; - params `{librivox_id, work_id, recording_id, library_id}`, built by the server; - deduped per library and project; -- **not** quiet: done is notified, named by the result's path; a failed or parked - one names only its library, since only a done job's result names the book. +- **not** quiet: done is notified, named by the book its result names; a failed + or parked one names only its library, since only a done job's result names the + book. It runs in the `download` lane, so it takes turns with `audible.import` and the ordinary `podcast.fetch` slot, and its partial download survives a restart. When diff --git a/docs-developers/frontend/library-and-browse.md b/docs-developers/frontend/library-and-browse.md index 11bc1110..6bbc0e25 100644 --- a/docs-developers/frontend/library-and-browse.md +++ b/docs-developers/frontend/library-and-browse.md @@ -149,8 +149,8 @@ scroll memory. `addRefusalKey` and `readErrorKey` word the refusals: `in_library` (the work read again shows where; the body's `library_id` and `path` are not read), -`not_book_library`, `kind_unavailable`, `library_not_writable` and -`metadata_off`. +`not_book_library`, `kind_unavailable`, `library_not_writable`, `metadata_off`, +`not_found` and, for a read, `invalid`. **The hooks** (`hooks.ts`): diff --git a/docs-developers/server/api/reference.md b/docs-developers/server/api/reference.md index bd0b6c05..33431ca6 100644 --- a/docs-developers/server/api/reference.md +++ b/docs-developers/server/api/reference.md @@ -11813,8 +11813,8 @@ as `bridge.job` (with `job`, `kind`, `library` and `librivox_id`). Internal (refused by `POST /admin/bridge/jobs` with `400`), a writing kind for a books library, no module, deduped per library and project, and notified when it -ends done (named by the book's path), failed or parked (named by its library). Its params, progress steps, result -and failure codes are in [The job](../../bridge/librivox.md#the-job-librivoxfetch). +ends done (named by the book its result names), failed or parked (named by its +library). Its params, progress steps, result and failure codes are in [The job](../../bridge/librivox.md#the-job-librivoxfetch). A done job's result becomes the book's recorded community match (`how` `accepted`, `set_by` the admin who asked) when it names a book indexed in the job's own library. diff --git a/docs-developers/server/web-ui.md b/docs-developers/server/web-ui.md index 4677260e..94fd5293 100644 --- a/docs-developers/server/web-ui.md +++ b/docs-developers/server/web-ui.md @@ -829,9 +829,9 @@ library through the Bridge's `librivox.fetch`. The design is in with a link to each book. - **The Bridge note** (`bridgeNote` in `librivox-model.ts`, from `GET /admin/bridge`): `addBlock` stops Add while the status loads or fails, with - no Bridge paired, or when its `features` lack `librivox`, each with a sentence - and a link to Settings > Bridge. An offline Bridge is no block: the note says a - book added waits for it. + no Bridge paired, or when its `features` lack `librivox`, each with a sentence. + With no Bridge paired, the sentence links Settings > Bridge. An offline Bridge + is no block: the note says a book added waits for it. - **Add**: a library picker when there are several books libraries (podcast libraries are never offered), then `POST /admin/librivox/fetch`. A refusal shows as a toast (`errors.librivoxInLibrary` for `409 in_library`). From 3e00d056c42e1e65118a9c8e50e97f869bb77026 Mon Sep 17 00:00:00 2001 From: KodeStar <kode@audiosilo.app> Date: Fri, 13 Nov 2026 20:01:50 +0000 Subject: [PATCH 8/8] LibriVox user guide: the console's own labels and which downloads share the Bridge's slot The settings page is Community metadata; Recordings and Library are screen-reader labels, not visible text; only the podcast episodes the server fetches on its own take turns with a LibriVox download (an episode a listener waits for runs in the interactive lane); the retry button reads Add to <library>. --- docs-users/admin/librivox.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs-users/admin/librivox.md b/docs-users/admin/librivox.md index 00f1c8e0..37e33846 100644 --- a/docs-users/admin/librivox.md +++ b/docs-users/admin/librivox.md @@ -11,7 +11,7 @@ recording, so its community details show with no matching by hand. You need: - an admin account; -- community metadata turned on, in **Server > Settings > Metadata**; +- community metadata turned on, in **Server > Settings > Community metadata**; - a paired Bridge, updated together with your server; - the library shown as **Ready** in [Server > Settings > Bridge](bridge.md#libraries). @@ -33,9 +33,9 @@ To add a book, open **Library > LibriVox** in the admin console. ![Library > LibriVox: a search and the recordings of the book found](/img/screenshots/admin/librivox.png) 1. Type a title or an author in **Search LibriVox**. -2. Select a result. Its **Recordings** list shows who reads each one, its +2. Select a result. Its list of recordings shows who reads each one, its length, how many sections it has and its LibriVox project number. -3. Pick the **Library**, when you have more than one books library. +3. Pick the library, when you have more than one books library. 4. Press **Add**, or **Add to** *your library* when there is only one. The recording's row shows the Bridge's progress. When it is done, the row says @@ -92,8 +92,9 @@ While it downloads, the Bridge keeps the files in a hidden folder beside the book, which the server ignores. The book appears all at once when every section is in. -The Bridge adds one book at a time. Audible backups and podcast episode -downloads take turns with it. +The Bridge adds one book at a time. Audible backups and the podcast episodes +the server fetches on its own take turns with it; an episode a listener is +waiting for does not wait. ## Cancel or restart @@ -106,7 +107,7 @@ downloaded are kept, and a section cut off part way usually resumes. ## When adding fails -The row says why. Press **Add** again to try once more. +The row says why. Press the add button (**Add to** *your library*) again to try once more. | Reason | What to do | |---|---| @@ -115,7 +116,7 @@ The row says why. Press **Add** again to try once more. | **The library's disk is full.** | Free some space in the library. | | **LibriVox no longer lists this project.** | The recording left the community database. Search again. | | **archive.org couldn't be reached.** | Try again later. | -| **Community metadata was turned off.** | Turn it on in **Server > Settings > Metadata**. If it is on, the Bridge has no metadata service set: check its `AUDIOSILO_BRIDGE_METADATA_BASE_URL`. | +| **Community metadata was turned off.** | Turn it on in **Server > Settings > Community metadata**. If it is on, the Bridge has no metadata service set: check its `AUDIOSILO_BRIDGE_METADATA_BASE_URL`. | | **That recording is already in a library.** | Nothing to do. The recording's row links to it. | ## Good to know