Skip to content

Find on LibriVox: admins add a LibriVox recording to a books library - #292

Merged
KodeStar merged 13 commits into
mainfrom
feat/librivox-l6
Nov 13, 2026
Merged

KodeStar merged 13 commits into
mainfrom
feat/librivox-l6

Conversation

@KodeStar

Copy link
Copy Markdown
Owner

LibriVox L6-2 (v2.7.0 row 14, LIBRIVOX-PLAN.md "L6"), the player side of Add from LibriVox.

What:

  • A books library's Books mode gets a "..." menu with "Find on LibriVox" (admins only). It opens /find-librivox?connection=&library=, a Library-tab page beside Find shows.
  • Search LibriVox works (community metadata, never librivox.org), open a work, see its LibriVox recordings (reader, length, sections, project link). "Add to " queues the server's librivox.fetch Bridge job. The row follows the job by id (steps, sections, park and failure reasons), offers Cancel, then "In your library" with Open. Library lists are re-read when a book lands.
  • Gate librivoxAccess: admin + the bridge flag + bridge.features has librivox + metadata. Older servers and non-admins never see the menu, and a pasted URL sends no request. Offline state follows the app's offline rule.
  • Wire mirrored by hand: the three /admin/librivox routes, GET /admin/bridge/jobs/{id}, error codes metadata_off, in_library, not_book_library. Additive; no change for older servers.
  • Six locales; CONVENTIONS and STYLEGUIDE entries.

Tests: gating, client shapes and error codes, hooks against a fake client (polling, Add, Cancel), the page's states (RNTL), the menu, the route tree.

Reviews: /simplify + /code-review high (Fable 5.2) on the whole branch, fixes applied.

Verified live (web export under the server's /web CSP, server + paired Bridge from the paired branches, live meta, Chrome at 1440 and 390 px): menu opens the page; Johnny Crow's Garden added and followed to "In your library", Open lands on the book, the book shows in Books mode; Cancel mid-download on a 23-section project leaves no staging folder and offers Add again; a listener, metadata off and a stopped Bridge all hide the menu and send no admin request; no console errors or CSP violations on the page.

Needs a device run: the native "..." dropdown, the library Select popover (only shown with two or more books libraries, so not seen live), the LibriVox link on iOS and Android.

Pairs with KodeStar/audiosilo-server#378 (routes, job, fold, console) and KodeStar/audiosilo-bridge#68 (librivox.fetch).

The server's L6-1 routes (GET /admin/librivox/search and /work, POST
/admin/librivox/fetch) and GET /admin/bridge/jobs/{id} get hand-mirrored
types, client methods and hooks, so the player can search LibriVox works
and add a recording through the Bridge's librivox.fetch. A fetch has no
book path, so it is followed by its job id and polled while open
(librivoxJobPollInterval). The refusal codes metadata_off, in_library and
not_book_library join the known codes.

Part of LibriVox L6 (L6-2).
An admin opens it from a books library's menu (beside sort and layout),
searches the community metadata's LibriVox works, opens one to see its
recordings and adds one to a books library; the server's Bridge downloads
it, and each recording row follows its fetch (step, sections, why it
stopped, Cancel) until the book is in the library, then offers Open.

The page and the menu need an admin, the Bridge online with the librivox
feature and community metadata on (librivoxAccess); anyone else, an older
server or Bridge, gets a sentence and no request. Strings in all six
locales.

Part of LibriVox L6 (L6-2).
The gate, the wire, the hooks, how a fetch is followed by its id and the
page's layout, so the player stays in step with the console's Library >
LibriVox.

Part of LibriVox L6 (L6-2).
The page's suites mock the hooks, so nothing held what they send: the
reads ask nothing without the page's gate or the server's flag, an Add
seeds the job's read and asks the works again on success and refusal,
the job read polls while open and stops after a 404 or in the
background, a refused cancel reads the job again, and the library lists
reached are that library's only.

Part of LibriVox L6 (L6-2).
…does

The player's generate and read-along strings name it "the Bridge" in
every locale; the new page said "your Bridge". Also tests the second
ask for the work a moment after a fetch is done.

Part of LibriVox L6 (L6-2).
The Books mode wrapped BooksControls in a second row identical to the one
it already draws, only to put the admin menu beside sort and layout. The
controls now take children and stay the one row.

Part of LibriVox L6 (L6-2).
The page carried second copies of what the Bridge status already has:
a cancel hook for the same route, the rule for sane progress counts, the
waiting, stopping, count and cancel-failed strings (Portuguese had drifted
between the two), and a weaker check of the LibriVox page link than the
About card's librivoxUrl, which also lower-cases a scheme iOS refuses.

storeJob now puts a job about no book at its own read, through
storeAnswer, so a poll in flight cannot land over a Cancel's answer, and
useCancelBridgeJob serves both. invalidateLibraryLists builds its keys
from qk instead of spelling them again.

The hooks' allowed parameter was true at every call: the page's gate is
its mount, and the conventions now say so. Add's loading reads the
mutation, the rule for offering Add again moves to the tested model
(offersAdd), the status look and the closed page read from lookups, and
the unused search limit and progress type go.

Part of LibriVox L6 (L6-2).
BROWSE_PATHS listed Find shows but not its sibling, so opening Find on
LibriVox from a library's menu read as leaving the browse section and
cleared the scroll memory: going back up to a folder started at the top.

Part of LibriVox L6 (L6-2).
The job read is never retried and polls only from an answer, so a first
GET /admin/bridge/jobs/{id} that timed out or answered 500 left its row
on Waiting for the Bridge with no status, Cancel or Add until the work
was reopened. Such a read is now asked again every 60 s; a 404 (the job
is gone) and a refusal (400, 401, 403) still are not.

Part of LibriVox L6 (L6-2).
A finished fetch read the library's books, people and series again but
not its folder listings nor the connection's recently added, so Home's
rail and a mounted Folders mode missed the new book until the app was
resumed. The seriesList key also gets its memberships comment back.

Part of LibriVox L6 (L6-2).
A row took the work's open job on every render. While the work asked
again had not answered (or that ask failed), it still named the job
before, so after an Add the row snapped back from the new job to the
failed one: Couldn't add it, with Add again, while the new fetch ran.
The work's job is now taken only when the work comes to name another.

Part of LibriVox L6 (L6-2).
A search read again that failed (the foreground refresh reads every
list again, with no retry) emptied the results, which unmounted the open
work and dropped the fetch each of its rows follows. It now keeps what
it shows, as the work panel already did.

With no network a held read stays pending, so the page's skeleton and
the search and work spinners never ended. They follow the offline rule
now: OfflineState before the skeleton or spinner, and no Retry that
cannot work. The link button also loses a padding class its variant
already sets.

Part of LibriVox L6 (L6-2).
The entry now states the rules the page follows: a failed first job
read is asked again, the page is a browse page, a read with no network
is OfflineState, a failed re-read keeps what it shows, the work's job is
taken only when the work names another, and a finished fetch reads the
folders and recently added too.

Part of LibriVox L6 (L6-2).
@KodeStar
KodeStar merged commit 8dd502b into main Nov 13, 2026
1 check passed
@KodeStar
KodeStar deleted the feat/librivox-l6 branch November 13, 2026 20:33
KodeStar added a commit to KodeStar/audiosilo-docs that referenced this pull request Nov 13, 2026
…ots (#303)

Docs for LibriVox L6 (v2.7.0 row 14): Add from LibriVox in the console
and the player, run by the Bridge.

- New User Guide page `admin/librivox` ("Add free books from LibriVox"):
what is needed (admin, community metadata on, a paired Bridge with the
library mapped writable), console and player steps, what lands on disk,
the book arriving matched, cancel and resume, failure reasons, Clear
community matches.
- New Developer Docs page `bridge/librivox`: the gate, the three
`/admin/librivox` routes, the `librivox.fetch` job (params, progress,
result, failure codes), the identity rule (a `book_matches` row from the
fold, never a first-recording fallback), archive.org-only fetching,
placement, staging and resume, `.audiosilo/librivox.json`.
- Updated: features, running a Bridge, Bridge jobs, console tour, books,
browsing, FAQ, API reference and index, Bridge pairing/jobs,
configuration, attachments, scanner, data model, web UI, notifications,
player library/routes/state, the cross-repo contract, the documentation
mapping table. Also adds `audible.sync` and `audible.import` where two
kind lists had missed them.
- Screenshots: `admin/librivox.png` and `web-player/find-librivox.png`,
captured from the real UI with live community metadata.

Pairs with KodeStar/audiosilo-server#378, KodeStar/audiosilo-bridge#68,
KodeStar/audiosilo-frontend#292.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant