feat(books): remember a default read-aloud narration language

Resolve book languages stated as names ("English") to a code, so the
dialog and the server's fallback stop calling English unsupported. The
dialog groups the ebook and audiobook in a Sources card, shows
Highlighting without the Advanced disclosure, and saves a per-user
default under /user-preferences/read-aloud for books it cannot match.
This commit is contained in:
neon
2026-10-22 00:42:06 +00:00
parent 0320210767
commit 8810d47658
16 changed files with 599 additions and 178 deletions
@@ -1,7 +1,7 @@
{
"totalRoutes": 677,
"totalRoutes": 679,
"byPermission": {
"(none)": 287,
"(none)": 289,
"Permission.ManageMetadataConfig": 41,
"Permission.EmailSend": 34,
"Permission.LibraryEditMetadata": 37,
@@ -814,5 +814,29 @@
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user-preferences/user-preferences.controller.ts",
"className": "UserPreferencesController",
"methodName": "getReadAloudPreferences",
"httpMethod": "GET",
"path": "/user-preferences/read-aloud",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
},
{
"file": "server/src/modules/user-preferences/user-preferences.controller.ts",
"className": "UserPreferencesController",
"methodName": "upsertReadAloudPreferences",
"httpMethod": "PUT",
"path": "/user-preferences/read-aloud",
"permissions": [],
"libraryAccess": [],
"isPublic": false,
"allowDefault": false,
"useGuards": []
}
]