fix(api,web): enrichissement métadonnées — hints locaux et scoring des correspondances

Recherche de fiches par nom peu fiable : sans ISBN, les providers
étaient interrogés avec des titres bruts peu discriminants.

- extraction de hints locaux (titre/auteur/année/isbn du fichier et du
  nom de fichier) persistés dans books.local_metadata_json
- nouveau use-case ScoreMetadataMatch : tri des résultats par score de
  correspondance avant sélection du meilleur candidat
- providers (google-books, open-library, bnf, local) durcis et nourris
  par les hints ; colonne + index local_metadata_json avec migrations
  idempotentes (création et rebuild legacy)
- web : nettoyage de la description de la fiche livre
  (cleanBookDescription, white-space pre-line)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Git Agent
2026-08-23 18:07:29 +02:00
parent 5de46a6f6d
commit 18d73a4db6
21 changed files with 829 additions and 56 deletions

View File

@ -58,6 +58,7 @@ export class DatabaseService implements OnModuleDestroy {
isbn TEXT,
isbn13 TEXT,
identifiers_json TEXT,
local_metadata_json TEXT,
language TEXT,
publisher TEXT,
published_date TEXT,
@ -175,6 +176,7 @@ export class DatabaseService implements OnModuleDestroy {
isbn TEXT,
isbn13 TEXT,
identifiers_json TEXT,
local_metadata_json TEXT,
language TEXT,
publisher TEXT,
published_date TEXT,
@ -187,11 +189,11 @@ export class DatabaseService implements OnModuleDestroy {
updated_at TEXT NOT NULL
);
INSERT INTO books (
id, library_id, title, author, description, isbn, isbn13, identifiers_json, language, publisher, published_date,
id, library_id, title, author, description, isbn, isbn13, identifiers_json, local_metadata_json, language, publisher, published_date,
format, file_path, cover_path, file_size, file_mtime, created_at, updated_at
)
SELECT
id, library_id, title, author, description, isbn, NULL, NULL, language, publisher, published_date,
id, library_id, title, author, description, isbn, NULL, NULL, NULL, language, publisher, published_date,
format, file_path, cover_path, file_size, file_mtime, created_at, updated_at
FROM books_legacy_format;
DROP TABLE books_legacy_format;
@ -233,7 +235,11 @@ export class DatabaseService implements OnModuleDestroy {
if (!names.has("identifiers_json")) {
this.sqlite.exec("ALTER TABLE books ADD COLUMN identifiers_json TEXT");
}
if (!names.has("local_metadata_json")) {
this.sqlite.exec("ALTER TABLE books ADD COLUMN local_metadata_json TEXT");
}
this.sqlite.exec("CREATE INDEX IF NOT EXISTS books_isbn13_idx ON books(isbn13)");
this.sqlite.exec("CREATE INDEX IF NOT EXISTS books_local_metadata_idx ON books(local_metadata_json)");
}
private ensureReaderPreferencesTable(): void {