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>
Régression worker PDF : le worker pdf.js est désormais instancié une
seule fois via un port dédié (?worker&url) et reconfiguré à chaque
montage, au lieu d'un workerSrc recalculé qui cassait le rendu.
- ReaderShell : chrome commun aux lecteurs (toolbar, zones de tap,
statut) et contrat ReaderControls pour EPUB/PDF/CBZ
- préférences de lecture par livre (mode horizontal/vertical, fit) :
table reader_preferences + migrations idempotentes, module API,
DTO partagés, client web avec fallback localStorage hors-ligne
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Un fichier dont l'ingestion échoue est enregistré en entrée incomplète
(métadonnées minimales) plutôt que d'interrompre le scan; le digest du
job liste les échecs avec exemples tronqués.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Réponses 206 partielles avec Content-Range/Accept-Ranges pour la
lecture PDF, types MIME explicites par format, en-tête
Content-Disposition UTF-8 et nosniff.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Recherche ISBN directe sur Open Library avec repli titre/auteur,
normalisation des réponses, timeouts et User-Agent explicites sur les
trois providers distants, abandon de l'extraction de jaquette CBR en
échec silencieux (fallback métadonnées seules), tests des providers et
garde du test de migration si better-sqlite3 est indisponible.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Validation des chemins externalisée (library-path) avec codes d'erreur
explicites, support d'alias LIBRARY_PATH_ALIASES pour traduire un chemin
hôte vers le montage conteneur, rejet des doublons de chemin entre
bibliothèques, documentation README/.env.example et docker-compose
paramétrable via READABOOK_LIBRARY_HOST_PATH.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Les colonnes metadata_source_config et automation_settings sont
désormais ajoutées par ALTER TABLE conditionnels sur les bases déjà
initialisées, l'index books_isbn13_idx est créé via le chemin de
migration, et un test couvre la base de données existante.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Chaîne de résolution metadata (local, Open Library, Google Books, BNF)
avec activation/priorité/clé API par provider, colonnes isbn13 et
identifiers sur les livres, et intégration au scanner pour compléter
métadonnées et jaquettes manquantes. Module automation: réglages
persistés, planifications scan/enrichissement et déclenchement manuel,
exposés via des endpoints admin.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- web: gestion d'erreur et d'état vide sur SearchPage/AdminPage
- web: client API — traitement des réponses sans contenu/erreurs réseau
- api: jobs.service — éviter le statut de scan perpétuellement en cours
- tests: client.test.ts
Refs: #12 (QA non-GREEN faute d'exécution, pas d'échec réel)