Files
mabibli/IDEES.md
T
mathieuandClaude Opus 5 278d6579f7 Basculer le décodage des codes-barres de ZXing.Net vers zbar
L'ISBN 9782846391009 n'était pas décodé par l'application, alors qu'il
l'était par une application d'essai utilisant zbar, sur le même livre et
le même appareil.

⚠️ Le raisonnement qui avait écarté cette piste était faux : CLAUDE.md
concluait que « le décodeur n'y est pour rien » à partir de mesures de
VITESSE (4-6 ms/frame). La vitesse ne dit rien du taux de réussite.

Le décodage quitte donc le C# pour zbar compilé en WebAssembly, dont les
assets viennent du paquet ZBar.Blazor.

Ce que la bascule apporte, au-delà du code lu :
- plus aucun pixel ne traverse le pont JS→C# (un byte[] par frame avant),
  seule la valeur décodée le fait ;
- l'image ENTIÈRE est analysée, à 960 px, là où l'ancienne version
  recadrait sur la bande centrale à 640 px pour alléger ce transfert —
  c'était la seconde cause possible des codes non lus, elle disparaît ;
- zbar.wasm est chargé À LA DEMANDE, à la première ouverture du scanner.

⚠️ Le composant ZBarCamera du paquet n'est PAS utilisé : il ouvre la
caméra lui-même et avale les erreurs. On y perdrait les messages qui
distinguent permission refusée, absence de caméra, caméra occupée et
contexte non sécurisé, ainsi que facingMode environment (caméra arrière)
et l'indication de résolution. Seuls zbar.js et zbar.wasm sont empruntés.

Poids, comparaison de deux publish Release complets (somme brotli) :
  _framework  3 281 558 → 2 978 700 o   (−296 Kio au démarrage)
  total       3 281 558 → 3 125 541 o   (−152 Kio)
L'écart vient de la traîne que ZXing imposait au trimmer :
System.Text.RegularExpressions retombe de 98 374 à 7 137 o, et
System.Runtime.Numerics disparaît.

⚠️ Coût assumé : six tests de décodage disparaissent avec IsbnScanner,
le décodeur n'étant plus en C#. Le décodage a été vérifié dans le
navigateur sur un EAN-13 rendu en canvas — 9782846391009 ressort bien en
ZBAR_EAN13 — mais cela reste une vérification, pas un garde-fou.
À confirmer avec le livre en main.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 00:51:56 +02:00

219 lines
12 KiB
Markdown

# IDEES.md — améliorations envisagées
Ce fichier recueille les idées et corrections identifiées en cours de route, **pas encore implémentées**. Il n'a pas valeur de décision : rien ici n'est acté tant que ce n'est pas repris dans `CLAUDE.md` ou traité dans une phase.
Le travail visuel de fond (couleurs, typographie, mise en page) est repoussé volontairement : il sera fait quand les fonctionnalités seront en place.
---
## Qualité des données
### Recherche insensible aux accents
« Emile » ne trouve pas « Émile ». Gênant sur un fonds francophone.
**Semble réglé par la refonte du schéma** (colonnes normalisées, voir `CLAUDE.md`) : vérifié le 2026-08-18 sur l'API, `recherche=Emile` remonte bien les livres d'« Émile Zola ». Laissé ici faute d'avoir été traité comme un point à part entière — à confirmer sur un fonds réel avant de le retirer.
---
## Recherche : la ligature « œ » n'est pas réduite à « oe »
Repéré le 2026-08-18 en implémentant la liste d'envies. `NormalisationTexte.Normaliser`
décompose en **NFD**, qui sépare les accents mais laisse les ligatures intactes — seul NFKD les
défait. Conséquence : `L'Œuvre` et `L'oeuvre` ne se rencontrent jamais.
Ce n'est pas propre à la liste d'envies : la même fonction alimente la **recherche du catalogue**
et la **clé unique des auteurs**. Zola a écrit *L'Œuvre*, que la BnF orthographie avec la
ligature ; un utilisateur qui tape « oeuvre » ne le trouvera pas, et ne verra pas non plus le
livre grisé dans la bibliographie.
Correction envisagée : passer en NFKD, ou traiter explicitement `œ`/`Œ` et `æ`/`Æ`. **Non fait
volontairement** — changer cette fonction déplace deux invariants en base (les colonnes
normalisées et l'index unique `CleRegroupement`). `ServiceRenormalisation` sait recalculer les
colonnes au démarrage, mais la fusion d'auteurs que la nouvelle règle provoquerait mérite d'être
regardée avant. Documenté par un test (`CleOeuvreTests.Ne_reduit_pas_la_ligature_oe`) pour que
la limite reste visible.
---
## Bibliographie : ce qui reste à creuser
La bibliographie par auteur est implémentée (voir `CLAUDE.md`). Deux pistes non traitées :
- **Plafond de 200 notices.** Suffisant pour un auteur contemporain (Werber : 203, Nothomb : 277),
très insuffisant pour un classique (Zola : 2692). L'écran le dit, mais on pourrait charger les
pages suivantes à la demande plutôt que d'annoncer un extrait.
- **OpenLibrary en second rideau.** La BnF ne connaît pas les auteurs étrangers non traduits ;
l'écran affiche alors une liste vide et l'explique. OpenLibrary expose les œuvres d'un auteur
(`/authors/{id}/works.json`) et pourrait prendre le relais — à ne faire que si le cas se
présente réellement en usage.
---
# Retours d'usage du 2026-08-18 (2ᵉ série)
Demandes et anomalies remontées après quelques jours d'usage réel. **Rien n'est acté** :
ce qui suit est la matière brute, classée par sujet, avec ce que le diagnostic a déjà établi.
## Scan et saisie d'ISBN
### Le scan caméra rate souvent sur ordinateur
**Deux remèdes appliqués**, tous deux dans `CLAUDE.md` : la **douchette USB** (champ focalisé,
validation sur `Entrée`) et surtout la **bascule de ZXing.Net vers zbar** — c'était bien le
décodeur, contrairement à ce qu'on avait conclu de mesures de vitesse.
Reste à confirmer en usage réel. Si cela ne suffisait toujours pas : choisir la caméra quand il
y en a plusieurs, exposer un curseur de zoom/torche là où l'API le permet, et laisser **déposer
une photo** du code-barres à décoder.
### ISBN `9782846391009` : résolu — c'était le décodeur
Le livre existe bien à la BnF : l'échec était **au décodage de l'image**. Confirmé le
2026-08-19 — zbar lit ce code-barres, ZXing.Net ne le lisait pas, sur le même appareil et le
même livre. La bascule est faite (voir `CLAUDE.md`).
⚠️ **À confirmer avec le livre en main** : la vérification faite jusqu'ici porte sur un EAN-13
rendu en canvas, pas sur une image de caméra.
---
# Retours d'usage du 2026-08-19 (3ᵉ série)
## Bug — un livre déjà catalogué peut être réencodé
Vérifié dans le code : `ServiceCatalogue.CreerAsync` ne fait **aucun** contrôle de doublon, et
`HasIndex(l => l.Isbn)` n'est **pas** unique. Scanner deux fois le même livre crée deux fiches.
⚠️ **À trancher avant de coder : refuser, ou avertir ?** Refuser tout net serait un piège, car
posséder deux exemplaires est légitime — on garde le sien et on prête l'autre. Et l'ISBN est
facultatif, donc il ne peut pas être le seul critère.
Trois critères candidats, de plus en plus large :
| Critère | Attrape | Rate / gêne |
|---|---|---|
| **ISBN identique** | le rescan du même livre, cas visé | rien si l'ISBN manque ; refuse un second exemplaire |
| **Clé d'œuvre + auteur** (`CleOeuvre`, comme la liste d'envies) | la saisie manuelle sans ISBN | confond le poche et le grand format, qui sont deux éditions possédées |
| **les deux, en avertissement** | tout ce qui précède | demande une confirmation de plus |
Piste privilégiée : **avertir et laisser confirmer** (« Vous avez déjà *Germinal* — ajouter
quand même ? »), plutôt que l'index unique qui interdirait le second exemplaire. La liste
d'envies, elle, refuse — mais elle décrit une envie, pas un objet, et deux exemplaires d'une
envie n'ont pas de sens.
## À l'ajout d'un livre, signaler l'envie correspondante
**Décidé le 2026-08-19 : on ne supprime rien, on signale.** La liste d'envies marque l'entrée
« déjà au catalogue ».
Pourquoi pas la suppression, qui était la demande initiale :
- le catalogue est **commun**, la liste d'envies **personnelle**. Supprimer l'envie d'un autre
modifierait sa liste en silence et lui ferait perdre sa note (« demandé à Noël ») ; l'API ne
sait pas — délibérément — écrire dans la liste d'autrui, et l'ouvrir serait une brèche dans un
invariant tenu partout ailleurs ;
- le rapprochement se fait par `CleOeuvre` + auteur, donc **faillible** (titre retraduit, tome,
intégrale — voir `CLAUDE.md`). Une suppression fondée sur un rapprochement faux est
irréversible ; un signalement se corrige d'un coup d'œil.
Reste à implémenter : le marquage dans `SouhaitDto`, calculé comme l'est déjà `Possede` dans la
bibliographie, et son rendu sur l'écran des envies.
## Bandes dessinées et magazines
Deux demandes distinctes, de coût très différent.
### Les BD : surtout une question de type de document
Une BD est déjà catalogable telle quelle — elle a un ISBN, la BnF la connaît (vérifié au lot 6 :
la BD de Dobbs tirée de *La bête humaine* remonte bien). Ce qui manque est de pouvoir **la
distinguer** : `Format` dit physique ou numérique, pas roman ou BD.
Piste : un `TypeDocument` (roman / BD / magazine…) à côté de `Format`, avec migration, filtre au
catalogue et étiquette. ⚠️ Suivre la règle déjà actée pour le format : **n'afficher que ce qui
n'est pas le cas par défaut**, sinon chaque ligne du catalogue porte une étiquette qui n'apprend
rien.
Champs propres à la BD (série, tome, scénariste/dessinateur) : à ne faire que si le besoin se
confirme. Le modèle actuel met tous les auteurs dans `LivreAuteur` sans distinguer les rôles.
### Les magazines : une fiche par revue, les numéros à l'intérieur
⚠️ Rouvre la décision du lot 1, qui écartait le catalogage des périodiques faute de modèle.
Le modèle est maintenant choisi.
**Décidé le 2026-08-19 : une fiche par REVUE**, et dans sa page, la sélection d'un numéro
précis. C'est exactement ce qui évite le défaut redouté — douze numéros d'un même magazine ne
font plus douze fiches identiques, puisqu'ils partagent la fiche de leur revue.
Ce que cela demande :
- un **ISSN** sur la fiche de revue, distinct de l'ISBN. ⚠️ Ranger un code `977` dans
`Livre.Isbn` casserait tout lookup ultérieur sur cette fiche ;
- une table de **numéros** rattachés à la revue, portant au minimum un numéro et une date de
parution ;
- reprendre le flux `977` : il nomme aujourd'hui la revue et bascule sur la saisie manuelle, il
devra créer ou compléter la fiche puis proposer d'ajouter le numéro scanné. ⚠️ Les deux
chiffres de parution du code-barres **ne sont pas un numéro fiable** ; l'add-on **EAN-2**, que
zbar sait maintenant décoder, est le bon candidat — à vérifier sur des magazines réels ;
- décider ce qu'un **prêt** signifie pour une revue : on prête un numéro, pas un abonnement.
## Sagas et cycles : plusieurs livres, un ordre de lecture
Demandé le 2026-08-19. Cas donné : [Drizzt Do'Urden](https://fr.wikipedia.org/wiki/Drizzt_Do%27Urden)
**plusieurs regroupements de plusieurs livres, à lire dans un ordre précis**. Vaut pour les
romans comme pour les BD.
C'est la première demande du projet qui porte sur une **relation entre livres** plutôt que sur
un livre. Ce que le cas Drizzt impose, et qu'un simple champ « série » ne couvrirait pas :
- **Deux niveaux.** *La Légende de Drizzt* regroupe plusieurs trilogies (*L'Elfe noir*,
*La Séquence de l'Icewind Dale*…) : un cycle contient des séries, qui contiennent des tomes.
Un champ texte plat perdrait ce regroupement.
- **L'ordre de lecture n'est pas l'ordre de publication.** *L'Elfe noir* est une préquelle écrite
après. C'est précisément l'information qu'on vient chercher : elle doit être **stockée**, pas
déduite de l'année.
- **Un livre peut appartenir à plusieurs regroupements** (une intégrale, une série, un cycle).
- **Ce qu'on possède est partiel.** L'intérêt de l'écran est de montrer les trous — « il vous
manque le tome 3 » — comme la bibliographie montre déjà ce qui manque d'un auteur.
Questions à trancher avant tout modèle :
- **D'où viennent les séries ?** La BnF ne les expose pas de façon exploitable en Dublin Core.
Saisie à la main, déduction depuis le titre (« Tome 3 »), ou source tierce ?
- **Portée** : commune au foyer, comme le catalogue, ou personnelle ? L'ordre de lecture est une
propriété de l'œuvre et non du lecteur — donc commune, a priori.
- **Les tomes non possédés** existent-ils en base, ou sont-ils seulement affichés ? S'ils
existent, ils ressemblent beaucoup à des envies, et il faudra dire comment les deux cohabitent.
⚠️ Ne pas confondre avec le regroupement d'œuvres de la bibliographie (`CleOeuvre`), qui réunit
les **rééditions d'un même titre**. Ici, ce sont des titres **différents** qui se suivent.
## Auteurs et bibliographie
### Homonymes : « Between two worlds », un autre Robert Harper
Constaté le 2026-08-19 en vérifiant la bibliographie de Robert A. Harper : parmi les 7 œuvres
retenues figure *Between two worlds : a new introduction to geography* (1973, Houghton Mifflin),
qui est d'un **géographe homonyme**, pas du psychothérapeute.
Le post-filtre d'auteur ne peut rien : `RapprochementAuteurs` compare des **noms**, et ces
deux-là portent le même. Départager demanderait les dates de vie (`dc:creator` les porte souvent :
« Harper, Robert A. (1915-2004) »), ce que le parser jette aujourd'hui au nettoyage ISBD.
⚠️ Ne pas en faire une urgence : une œuvre en trop se voit et s'ignore, contrairement à une œuvre
manquante. Piste si le cas se répète : conserver les dates extraites de `dc:creator` et écarter
une notice dont les dates contredisent celles majoritairement observées pour l'auteur.
### OpenLibrary en second rideau — la justification est retombée
Le cas « Robert A. Harper » semblait l'imposer : il s'est révélé être un **délai dépassé**, pas un
trou de couverture (voir `CLAUDE.md`). La BnF connaît bien cet auteur.
La piste reste valable pour les auteurs étrangers **non traduits**, avec ses deux difficultés
inchangées : résoudre un nom vers un identifiant OpenLibrary (`/search/authors.json`), étape sans
équivalent BnF et sensible aux homonymes ; et des œuvres remontées **en langue originale**, donc
non rapprochables du catalogue par `CleOeuvre` — l'écran afficherait une liste où presque rien ne
serait marqué « possédé ». À ne faire que si le cas se présente réellement.