feat(metadata): add external HTTP metadata providers

Register book-metadata-provider services by address, with no code change per
provider; Settings lists ready-made ones to install. Ranking prefers a record of
the book's own medium. LubimyCzytac moves out to its own provider and Aladin,
whose API closes, is retired; their ids stay. Adds migrations 0129 and 0130.
See docs/METADATA_PROVIDERS.md.

Ref #1405
This commit is contained in:
neon
2026-10-22 21:05:06 +00:00
parent 9e49f496f1
commit b50b8da56c
186 changed files with 59209 additions and 2550 deletions
+25 -1
View File
@@ -255,6 +255,29 @@ export const E2E_SUITES = Object.freeze({
...SHARED_DB_AND_HELPER_PATHS,
],
},
"metadata-http-providers": {
id: "metadata-http-providers",
name: "External Metadata Providers",
timeout: 90,
lane: "full",
description: "External HTTP metadata providers: registration, search, refresh, ids, ratings and purge",
vitestTarget: "test/metadata-http-providers.e2e-spec.ts",
junitOutput: `${TEST_RESULTS_DIR}/metadata-http-providers-e2e-junit.xml`,
prepareDedicatedDatabase: true,
useDedicatedDatabase: true,
changedPaths: [
"server/src/modules/metadata-http-provider/**",
"server/src/modules/metadata-fetch/**",
"server/src/modules/metadata-preferences/**",
"server/src/modules/book/**",
"server/src/modules/book-dock/**",
"server/src/modules/book-metadata-fetch/**",
"server/test/metadata-http-providers.e2e-spec.ts",
".github/workflows/e2e-runner.yml",
...SHARED_TYPES_PATHS,
...SHARED_DB_AND_HELPER_PATHS,
],
},
"metadata-lock": {
id: "metadata-lock",
name: "Metadata Lock",
@@ -1060,7 +1083,8 @@ export const E2E_SUITES = Object.freeze({
name: "Read-Aloud Jobs",
timeout: 60,
lane: "full",
description: "Read-along generation lifecycle against a fake worker: publish, review and re-sync, replace in place, ownership, retry, cancel, resume",
description:
"Read-along generation lifecycle against a fake worker: publish, review and re-sync, replace in place, ownership, retry, cancel, resume",
vitestTarget: "test/read-aloud-jobs.e2e-spec.ts",
junitOutput: `${TEST_RESULTS_DIR}/read-aloud-jobs-e2e-junit.xml`,
prepareDedicatedDatabase: true,