Skip to main content

26004 - ISBN des livres pour indexation Calibre

26004 — ISBN des livres pour indexation Calibre

Objectif : identifier les livres de \\NASMAISON\foxy — 16 616 fichiers, 10 360 EPUB et 6 240 PDF accumulés depuis trente ans — pour reconstruire une bibliothèque exploitable par Kavita.

Règle absolue : lecture seule. Aucun script n'écrit dans \\NASMAISON\foxy, ni dans les fichiers, ni dans Calibre. C'est Julien qui renseigne les métadonnées. Les scripts préparent la décision, ils ne la prennent pas et ne l'appliquent pas.

Scripts : Jux-scripts/Livres-ISBN/ — stdlib Python seule, README.md complet dans le dossier.


Les dossiers

Chemin Rôle
D:\Procedures Calibre\Dossier à renseigner\ Julien y dépose les EPUB et PDF à investiguer
D:\Procedures Calibre\ISBN\ reçoit etat.csv, propositions.csv, livres.sqlite

C'est le moule des procédures Photos-Caesium et Musique-FLAC : un dossier de dépôt, un dossier de résultat.

La procédure

cd D:\Syncthing\Jux_univers\Jux-scripts\Livres-ISBN

py -3.12 inventaire_livres.py      # etape 1 : lit les fichiers
py -3.12 resoudre_livres.py        # etape 2 : interroge les catalogues

Étape 3 : Julien relit propositions.csv, corrige, et saisit dans Calibre.

Pour viser un dossier du NAS plutôt que le dossier de dépôt :

py -3.12 inventaire_livres.py --dossier "//NASMAISON/foxy/Histoire"

Ce qui a changé par rapport à la première rédaction

La procédure d'origine tenait en trois temps : lire le nom des fichiers, faire deviner l'identité par l'IA à partir de recherches Internet (Amazon notamment), puis saisir à la main. Trois points ont été corrigés, chacun sur mesure et non sur intuition.

1. Les métadonnées sont DANS les fichiers — c'est la découverte

L'étape 1 lisait le nom de fichier. Or un EPUB porte son OPF, un PDF son DocInfo et son XMP, un MOBI ses enregistrements EXTH. C'est gratuit, hors ligne, instantané, et sans commune mesure avec ce que dit un nom de fichier.

Vérifié sur le dossier d'examen 0_A Inventorier, 6 fichiers :

Nom de fichier Ce que le fichier contient
9866gwlaz0l55yw8lsfh.epub Dé-civilisation : les nouvelles logiques de l'empire, Roland Gori, LLL 2025, ISBN 9791020922816
L.animal.en.nous.2011.Michel.Odoul.epub L'animal en nous, Michel Odoul, Albin Michel, ISBN 9782226422156
Rovere Maxime - L'école de la vie.epub L'école de la vie, Maxime Rovere, Flammarion 2020

6 sur 6 portaient leur titre et leur auteur exacts — y compris celui dont le nom est un identifiant de téléchargement qui ne dit rien.

Sur 150 fichiers pris dans foxy : 150 titres exploitables, 147 lus dans le fichier même, et 56 ISBN (37 %) déjà présents — 56 livres identifiés sans une seule requête réseau.

L'ISBN d'un EPUB se cache à quatre endroits. Un parseur qui ne regarde que <dc:identifier> en rate la moitié :

<dc:identifier opf:scheme="ISBN">9782226422156</dc:identifier>
<dc:identifier>urn:isbn:9791020923059</dc:identifier>
<meta property="dcterms:identifier">9791020922816</meta>
<meta property="pageBreakSource">urn:isbn:9791020923059</meta>

2. Amazon est une impasse — BnF et OpenLibrary marchent

La source Amazon de Calibre passe par un scraping Google et ne renvoie plus rien ; Google Books répond 429 depuis cette IP, même sur une requête isolée (vérifié le 2026-08-31, voir page 300 du chantier Calibre-Metadonnees).

Les sources retenues sont BnF (SRU) puis OpenLibrary, gratuites et sans clé. Sur la passe du 2026-08-31, 104 des 121 ISBN retrouvés venaient de la BnF. Une clé posée dans GOOGLE_BOOKS_KEY réactive Google Books ; sans elle, la source se saute d'elle-même plutôt que de coûter une seconde par livre.

3. Un ISBN se retrouve, il ne se déduit pas

« Extrapolation », « l'IA qui déduit » : c'est le point à ne pas garder. Un ISBN est une clé de contrôle. Une IA qui le déduit l'invente, et un ISBN inventé est indétectable à l'œil tout en pointant un autre livre.

Le rôle du traitement automatique est de nettoyer le titre pour interroger un catalogue, puis de vérifier la clé de ce que le catalogue renvoie. Tout numéro passe par un contrôle de clé et une normalisation en ISBN-13 avant d'entrer dans un CSV.

Corollaire pour les PDF : un numéro n'est retenu que s'il est précédé du mot ISBN ou EAN. Sans cette exigence, un numéro quelconque passe la clé de contrôle une fois sur dix — sur 6 240 PDF, cela ferait des centaines de faux.

4. « Un seul auteur, sinon Calibre ne trouve rien »

C'était un symptôme de la source morte, pas une règle. La requête est bien normalisée à un auteur, mais les autres restent dans le CSV. Et le filtre auteur est désormais insensible à l'ordre : Harari Yuval Noah et Yuval Noah Harari sont reconnus comme le même auteur, ce qui sortait auparavant Sapiens, Homo Deus et Nexus de la pile des pré-cochés pour rien.


Le fichier d'état

etat.csv sépare ce que dit le fichier, ce que dit le nom et la synthèse — les trois restent lisibles côte à côte, ce qui permet de voir pourquoi une valeur a été retenue.

confiance Sens
haute titre et auteur lus dans le fichier
moyenne titre du fichier, auteur seulement déduit du nom
faible tout vient du nom de fichier
nulle rien d'exploitable

a_resoudre vaut oui (à interroger), vide (ISBN déjà là) ou non (pas même un titre : aucune requête n'y changera rien).

Le pré-cochage engage la main de Julien

La colonne decision n'est pré-remplie o qu'au-dessus de 0,90, et jamais :

  • sur un résultat de repli — obtenu sans filtre auteur, donc l'auteur de départ y est suspect : c'est précisément ce qu'il faut aller regarder ;
  • sur un résultat d'inclusion — la BnF catalogue souvent sous le sous-titre seul. L'odyssée des mythologies - La création du monde (EPUB) contre La création du monde : les mythes grecs… (BnF) tombait à 0,55 alors que l'auteur était exact. Le candidat remonte en tête de la pile à relire, mais son score est plafonné à 0,88, sous le seuil.

Points techniques à ne pas re-découvrir

  • Le catalogue arbitre les noms ambigus. Cioran - Exercices Négatifs veut le premier membre comme auteur ; Constantin - Bertrand Lançon veut le second. Aucune heuristique ne tranche les deux à la fois. L'inventaire pose l'hypothèse la plus fréquente et marque (ambigu) ; l'étape 2 rejoue la requête dans l'autre sens et garde le meilleur score. Vérifié : Constantin : un auguste chrétien, Bertrand Lançon, A. Colin 2012, 9782200255947, retrouvé en BnF (sens inverse).
  • Un mot de titre suffit à départager. Aucun auteur ne s'appelle Dictionnaire. Une courte liste (dictionnaire, histoire, essai, œuvres, exercices…) classe un fragment du côté du titre — sans elle, Dictionnaire Aristote - Pierre Pellegrin était lu à l'envers.
  • Le DocInfo d'un PDF est souvent du bruit d'atelier : Photocopillage picto.eps, Microsoft Word - doc1, un nom de gabarit InDesign. Filtré — mais uniquement pour les PDF : appliqué aux EPUB, ce filtre jetait des titres courts parfaitement valides (ARISTOTELOUS).
  • Des noms de fichier ont perdu leur première lettre accentuée : thique à Eudeme pour Éthique à Eudème, uvres complètes pour Œuvres complètes. Les métadonnées embarquées les rattrapent.
  • \\NASMAISON\foxy en barres inverses échoue depuis Python lancé par Claude Code ; //NASMAISON/foxy fonctionne.
  • Bibliotheque Calibre est exclu par défaut de l'inventaire : déjà traité depuis Noël, et il porte à lui seul 603 PDF. --tout lève l'exclusion.
  • Les doublons sont signalés, pas traités — note doublon possible avec #N. Lequel garder est un arbitrage humain : c'est la leçon du dédoublonnage photo du 2026-08-28, où un doublon inter-albums s'est révélé être une intention et non une erreur.

Cadence mesurée (2026-09-04)

Étape Débit Sur les 16 616 fichiers
Inventaire ≈ 0,8 s/fichier (coût = lecture SMB) ~3 h 30
Résolution ≈ 2,2 s/livre interrogé ~6 h

Les deux étapes reprennent où elles s'étaient arrêtées (--reprendre), donc le travail se fait par lots, dossier par dossier. Rendement de la résolution sur 32 livres d'histoire : 28 fiches trouvées, 22 pré-cochées (69 %).


Ce qu'il ne faut pas chercher à indexer

Le constat du 2026-08-31 tient : sur 302 livres sans ISBN dans la bibliothèque Calibre, 181 n'en avaient pas à trouver — 122 PDF (brochures, PDF Reducer Demo version, Mon chien / Collectif OSAV), 47 compilations de recettes, 9 guides. Une brochure n'a pas d'ISBN, aucune source ne le lui inventera.

Ces fichiers sortent en a_resoudre=non et ne consomment aucune requête. S'ils polluent la vue « livres », l'angle est de les étiqueter comme documents, pas de s'acharner à les indexer.

Note pour la suite — Kavita

Kavita lit les métadonnées dans l'EPUB (son OPF), pas dans la base Calibre. Une bibliothèque Calibre impeccable ne suffira donc pas : il faudra, côté Calibre, incruster les métadonnées dans les fichiers (Modifier les métadonnées → Polir les livres → Mettre à jour les métadonnées). À vérifier sur l'instance avant de s'engager.

Et pour Kavita, l'ISBN est un moyen, pas une fin : ce qui s'affiche, c'est le titre, l'auteur, la série, le résumé et la couverture. L'ISBN n'est que la clé qui permet d'aller les chercher d'un coup et sans erreur.

Point de vigilance

\\NASMAISON\foxy n'est dans aucune sauvegarde connue : ni dans sync_kdrive_complete.sh (qui ne traite que le NAS sasnexte), ni dans la sauvegarde VPS. C'est vrai de la bibliothèque Calibre comme des 16 616 fichiers. À trancher séparément.


REX — premier lot réel : Cuisine Géo (2026-09-04)

619 fichiers, 9,6 Go déposés depuis \NASMAISON\foxy\Cuisine\Cuisine Géo (8 sous-dossiers par origine géographique). 79 % de PDF — le mélange le plus difficile du fonds, et l'inverse des échantillons de mise au point.

Résultat

Fichiers
Inventoriés 619 487 PDF, 130 EPUB, 1 DOC, 1 AZW3
ISBN lu directement dans le fichier 61 aucune requête
Écartés avant requête 143 142 IMG 3940 + 1 sans titre
Interrogés en catalogue 415
ISBN retrouvés 172 BnF 146, OpenLibrary 26
dont pré-cochés 41 preuve solide, saisissables sans relecture
dont à relire 131 l'essentiel du travail de Julien
Sans réponse 243

Bilan : 233 livres sur 619 (38 %) portent un ISBN — 61 gratuits, 172 retrouvés. Durée : 2 min 40 d'inventaire, 15 min de résolution.

Le taux d'ISBN embarqué tombe à 10 % ici (contre 37 % sur un échantillon majoritairement EPUB) : un PDF n'a pas de champ ISBN, il faut aller le lire sur la page de copyright. Et une part des 243 sans réponse n'a tout simplement pas d'ISBN à trouver — magazines, compilations de recettes, fascicules scannés.

Sept défauts corrigés grâce à ce lot

Aucun n'était visible sur les échantillons de mise au point. Ils sont tous corrigés dans les scripts.

  1. Chemin de plus de 260 caractères — la limite historique de Windows. os.walk voit le fichier, getsize/open échouent dessus sur un WinError 3 « chemin introuvable » alors qu'il est bien là. Corrigé par les chemins étendus \?\.

  2. Un seul fichier illisible tuait tout l'inventaire. Inacceptable sur 16 616 fichiers : l'incident est désormais consigné dans la ligne (ILLISIBLE : …) et le parcours continue.

  3. Crash d'encodage à l'affichage. Une cédille combinante (U+0327) dans un nom fait lever UnicodeEncodeError sur une console cp1252 — le calcul était bon, c'est le print qui tombait, à 410 fichiers sur 619. sys.stdout.reconfigure(errors="replace").

  4. ⚠⚠ Signatures d'outil préférées au nom de fichier. Le plus grave. 342 des 487 PDF portaient une signature dans leur DocInfo : PDF Reducer Demo version 203 fois, ~1 (reste de nom 8.3) 139 fois. Saveurs Americaines Christine Fleurent.pdf se voyait donc attribuer le titre ~1 — une métadonnée pourrie préférée à un nom de fichier excellent. Deux garde-fous : une liste noire, et surtout une règle générale — un titre d'ouvrage ne se répète pas à l'identique dans cinq fichiers différents, qui rattrapera les signatures inconnues.

  5. Auteurs = noms de fichier tassés (SaveursAmericainesChristineFleurent, GenesedelacuisineQuebecoise). Uniques par fichier, donc invisibles de la règle de répétition : reconnus à leur forme (ressemblance au nom de fichier, ou 14 lettres collées sans espace).

  6. Titres corrompus ou tronqués à la source — vérifié sur les octets, le décodeur n'est pas en cause :

    • /Title (orkaises inratables) pour Recettes New-yorkaises inratables.pdf — le producteur a coupé les 14 premiers caractères ;
    • /Title <feff005100750000006200650063> — UTF-16BE où le é de Québec a été écrit comme un octet NUL, d'où Qu\x00bec.

    Deux règles générales : rejet de toute valeur contenant un octet de contrôle, et rejet d'un titre embarqué inclus en plein mot dans celui du nom de fichier. La seconde ne se déclenche pas sur le cas légitime Auteur - Titre où le titre embarqué vaut justement Titre.

  7. New-Yorkaises coupé en deux. Je découpais sur un tiret sans espaces — un mot composé n'est pas un séparateur. D'où l'auteur « Recettes New » pour le titre « Yorkaises inratables ».

Deux règles nouvelles, qui valent pour tout le fonds

Les noms d'appareil ne sont plus interrogés. IMG 3940, DSC01234, Page 12 : 142 des 557 livres à résoudre, soit un quart des requêtes vouées à l'échec. Ils sortent en a_resoudre=non. Le filtre exige un préfixe d'appareil : Cuisine 1900 et Menus 2015 restent des livres.

⚠ Sans auteur pour corroborer, un titre exactement identique ne prouve rien. Beaucoup de ces fichiers n'ont pas d'auteur exploitable ; le score se réduit alors à la seule ressemblance des titres. Wraps et Whoopies ressortaient à 1,0 — mais il existe plusieurs livres portant ces titres. Le pré-cochage exige désormais, en l'absence d'auteur, un titre d'au moins 25 caractères. Effet mesuré sur ce lot : 95 pré-cochés → 41. C'est une perte apparente et un gain réel — la pile pré-cochée est celle que Julien saisit sans relire, elle doit être digne de confiance.

Le signal qui a mis la puce à l'oreille : zéro « à relire » sur les 206 premiers résultats, tout étant soit pré-coché soit vide. Une distribution aussi tranchée n'est pas naturelle.

--reclasser a été ajouté pour cela : il recalcule la seule colonne decision d'un propositions.csv existant, sans relancer une requête. Changer une règle de pré-cochage ne coûte plus 15 minutes d'interrogation.


Correction du 2026-09-05 — les CSV suivent l'ordre du répertoire

Signalé par Julien après la première relecture réelle : « c'est une immense perte de temps de rechercher les livres alors qu'ils sont tous mélangés ». Défaut de conception, corrigé.

propositions.csv était trié par score décroissant. Sur 619 livres et 80 rayons, cela éparpillait les livres d'un même dossier sur toute la longueur du fichier. Or on ne vérifie pas un ISBN isolément, on le vérifie en voyant ses voisins d'étagère : dans un rayon « Origine Asie/Chine », l'œil corrige seul ce qu'un score ne voit pas. Le score classe bien la confiance, il ne classe pas le travail.

Les deux CSV sont désormais rangés dossier par dossier, dans l'ordre de l'explorateur, avec une ligne d'intitulé et un compte avant chaque rayon :

=== Origine Amerique Caraibes/Amérique du Nord/Canada === (8)
    Une colonne dossier porte le chemin relatif, placée en 2ᵉ position pour rester lisible sans faire défiler Les sous-dossiers sont parcourus triés, pour retrouver l'ordre affiché par l'explorateur --tri score rend l'ancien ordre si besoin --reclasser remet un CSV existant dans cet ordre sans relancer une seule requête : il reprend le dossier de chaque livre dans etat.csv par son id. Le lot Cuisine a été réordonné ainsi, sans réinterroger les 415 livres

    ⚠ Les lignes d'intitulé portent un id VIDE. C'est le seul marqueur qui permette aux relectures (--reprendre, --reclasser, l'étape 2) de les distinguer d'un livre et de les sauter. Ne jamais leur donner d'identifiant — sinon elles seraient interrogées comme des ouvrages.

    ⚠ Piège rencontré en appliquant le correctif : create table if not exists ne migre pas une base existante. L'ajout de la colonne dossier a fait échouer l'insertion sur livres.sqlite (table livres has no column named dossier). La table est désormais recréée à chaque inventaire — son contenu était de toute façon reconstruit intégralement.

    Résultat sur le lot Cuisine : 619 livres répartis en 80 rayons.