Section « Installation YunoHost » : la chaîne réelle, les pièges de
publication (dépôt privé qui répond 404, manifeste lu depuis Gitea), les
deux pièges systemd avec leur mesure, l'écart entre le propriétaire
d'install_dir déclaré et celui appliqué, et ce qui a été vérifié en
exécution — installation, WAL, sauvegarde, mise à jour, désinstallation.
L'étape 9 des prochaines étapes est faite.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Constate en essai : quand c'est le serveur qui tombe, navigator.onLine n'a
jamais change, donc aucun evenement « online » ne viendra jamais. Les lectures
court-circuitaient sur EnLigne et ne retentaient plus rien : l'application
restait sur le cache jusqu'au rechargement de la page.
EtatReseau distingue donc deux notions : EnLigne (ce que l'interface affiche et
ce qui active les boutons) et TenterLeReseau (faut-il tenter un appel, vrai des
que le navigateur a une connexion, meme apres un echec). Verifie : serveur
arrete puis redemarre sans aucun evenement « online », la navigation suivante
retire le bandeau, reactive les actions et fait apparaitre un livre ajoute
cote serveur pendant la coupure.
CLAUDE.md : architecture retenue, ce qui a ete observe reseau coupe, pourquoi
le filtre existe en deux exemplaires, ce que le hors-ligne ne couvre pas, la
chaine de mise a jour du service worker, et la cause etablie de son echec
d'enregistrement dans le navigateur d'automatisation.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Retire d'IDEES.md la section « Pour plus tard — livres souhaités », désormais
implémentée, et acte dans CLAUDE.md les trois décisions structurantes : table
dédiée pour la liste d'envies, SRU BnF par bib.author pour la bibliographie,
export en .txt et .csv.
Consigne dans CLAUDE.md ce que la source renvoie réellement (Werber 203 notices
-> 51 œuvres, Zola 2692 annoncées -> 87 œuvres sur 200 lues) et ce que le
rapprochement par titre rate, l'interface énonçant la même limite à l'écran.
Deux points relevés en passant et laissés à IDEES.md : la ligature « œ » que
NormalisationTexte ne réduit pas à « oe » (L'Œuvre de Zola y échappe, et le
défaut touche aussi la recherche du catalogue), et le plafond de 200 notices.
Corrige au passage une ponctuation bancale du bandeau de bibliographie, et
restreint le BOM UTF-8 au seul CSV.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
CLAUDE.md gagne une section « Interface — décisions actées » : les deux modes
de la fiche et le mode porté par l'URL, les deux exceptions assumées qui
restent hors édition (statut, prêts), la liste en lecture seule, le format
réservé aux ebooks et son corollaire sur le formulaire, l'agrandissement de
couverture. Y figure aussi le piège Blazor du routeur qui ne redessine pas
quand aucun paramètre ne change.
IDEES.md perd sa section « Interface — retours d'usage », désormais
entièrement traitée. La recherche sans accents y reste, mais annotée : elle
paraît réglée par la refonte du schéma — « Emile » remonte bien « Émile Zola »
sur l'API — sans avoir été traitée comme un point à part entière.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
L'entite Pret existait depuis le squelette sans jamais etre exploitee. Cette
phase la met en service de bout en bout.
API
- GET /api/prets/en-cours ce qui n'est pas a la maison, du plus ancien
au plus recent : on cherche le livre oublie,
pas celui prete hier
- POST /api/livres/{id}/prets preter
- GET /api/livres/{id}/prets historique complet, du plus recent au plus
ancien
- POST /api/prets/{id}/retour clore le pret sans le supprimer
Un livre deja sorti ne peut pas etre prete une seconde fois. Le service le
verifie et nomme celui qui l'a deja, mais entre sa verification et l'insertion
il reste une fenetre : un index unique PARTIEL (LivreId WHERE DateRetour IS
NULL) la ferme, tout en laissant l'historique accumuler autant de prets clos
que necessaire sur le meme livre.
Les ebooks sont refuses cote API, pas seulement grises dans l'interface : une
fiche n'a pas d'exemplaire a confier.
Les prets sont COMMUNS au foyer, symetrique inverse du statut de lecture. Le
service ne recoit meme pas d'identite, pour qu'on ne puisse pas s'en servir
par inadvertance.
Interface, pensee mobile d'abord
- ecran « Prets en cours » avec bouton « Rendu » a meme la liste
- bloc pret sur la fiche d'un livre : etat courant, action, puis historique
- etiquette « Prete a X » dans le catalogue
- la barre d'actions passe sur deux lignes plutot que de comprimer ses
libelles maintenant qu'elle compte quatre entrees
Toutes les dates sont en UTC ; le client convertit la date locale du
<input type="date"> avant l'envoi, faute de quoi le pret se decalerait d'un
jour pour la moitie du globe.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le publish de MaBibli.Api recopiait index.html tel quel, placeholders
compris, et l application publiee restait blanche.
Cause : dans le SDK .NET 10, la cible de publication
GenerateHtmlAssetPlaceholdersPublishStaticWebAssets lit la liste des
fichiers HTML dans @(_HtmlStaticWebAssets), item alimente uniquement par
la cible de *build*. Quand c est l API qui demande au client ses assets de
publication, la cible de build n a pas tourne : la liste est vide, aucun
asset HTML calcule n entre dans le manifeste, et c est le fichier source
qui est recopie par ComputeResolvedFilesToPublishList.
Correction : supprimer le besoin de reecriture plutot que la reparer.
WasmFingerprintAssets=false et pas de OverrideHtmlAssetPlaceholders (c est
lui qui, a true, forcait l empreinte de blazor.webassembly.js) ; index.html
reference des noms stables, sans import map ni preload placeholder. Le
contournement « ?m=1 » de l import du module scanner devient inutile.
Verifie : publish self-contained lance, scripts references en 200,
application chargee dans un navigateur (catalogue affiche, module JS du
scanner charge, aucun 404).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le bloc « Modele de donnees » decrivait encore Auteur et Statut comme des
colonnes de Livre. Il reflete desormais les cinq tables, leurs index et
leurs contraintes d'unicite.
Ajoute aussi ce qui ne se devine pas a la lecture du schema : pourquoi
des colonnes normalisees existent (SQLite ne sait pas ignorer les
accents), pourquoi Auteur en porte deux, et ce que la migration fait des
donnees existantes.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Verifie en executant le binaire publie : la racine repond 200 mais les
scripts de demarrage renvoient 404, donc l'application publiee affiche une
page blanche. Les placeholders d'empreinte restent litteraux alors que
seuls les fichiers empreintes existent sur disque.
Preexistant depuis la phase 1 : ma verification d'alors se limitait au code
HTTP de la racine, ce qui ne prouve pas que l'application demarre.
Consigne les trois pistes deja essayees sans succes pour eviter qu'on les
retente, et signale que le developpement n'est pas affecte.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Les deux defauts ont ete constates en executant reellement l'application, pas par
relecture :
1. L'import du module JS partait en 404 en developpement. L'import map generee par
Blazor reecrit « ./js/scanner-camera.js » vers un nom empreinte que l'API hote ne
sert pas (UseStaticFiles ignore les points d'entree empreintes). Une chaine de
requete sur le specifieur empeche la reecriture ; en publication rien n'est
reecrit pour ce fichier, le comportement est donc identique dans les deux modes.
2. Les messages d'erreur camera etaient tous generiques. Une DOMException perd son
« name » en traversant le pont JS vers C# : un refus de permission arrivait sous
la forme « Permission denied undefined ». Le JS attrape donc l'erreur et renvoie
un code de statut stable, que le C# traduit en message utile.
CLAUDE.md est mis a jour avec les mesures reelles obtenues en WASM, qui manquaient :
la performance de decodage (l'estimation de 5-10 ms/frame est confirmee, l'AOT reste
inutile) et le surcout de payload, nettement superieur aux 192 Ko documentes une fois
comptees les assemblies BCL que ZXing empeche le trimmer de retirer.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le statut de lecture sort de `Livre` vers une table par utilisateur : le
livre reste commun au foyer, sa lecture devient personnelle. La decision
« collection commune » n'est pas remise en cause.
L'auteur passe d'un champ texte libre a une table dediee avec forme
normalisee, prerequis du regroupement par auteur et de la recherche
insensible aux accents. Le regroupement automatique est limite aux
variantes sures ; les rapprochements ambigus doivent etre proposes, pas
appliques silencieusement — une fusion erronee se defait mal.
IDEES.md : la liste d'envies sera personnelle elle aussi, et exportable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Retours d'usage a traiter plus tard : agrandissement de la couverture au
clic, statut de lecture en lecture seule dans la liste et remonte au
niveau du type, affichage du format limite aux ebooks (physique par
defaut), fiche en lecture seule avec bouton d'edition, regroupement des
livres par auteur.
Documente aussi un cas de donnee sale mesure sur l'ISBN 9782749942636 :
la notice BnF colle le nom de l'auteur en fin de titre sans separateur
ISBD, donc la regle de nettoyage existante ne peut pas s'appliquer. Ce
n'est ni un doublon ni un defaut du parsing.
Garde en fin de fichier l'idee des livres souhaites (bibliographie par
auteur avec ouvrages possedes grises), hors perimetre v1, avec ses
implications sur le modele de donnees.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Couvertures OpenLibrary : 502 intermittents mesures sur un meme ISBN.
Ne pas valider l'URL par un HEAD ; c'est a l'interface de gerer l'image
cassee.
- OpenLibrary : certaines editions n'ont aucun champ `authors`, le double
appel documente ne suffit donc pas. Le repli via `/works/` est desormais
implemente et documente.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Architecture serveur : x86_64, publish `linux-x64`.
- Production des binaires : compilation locale + release manuelle, via un
script ecrit pour etre reutilisable en CI plus tard. Compiler sur le
serveur est explicitement exclu.
- Cache hors-ligne : IndexedDB, retenu pour permettre recherche et tri
hors-ligne sur toute la bibliotheque.
- Notices BnF multiples : demander systematiquement, l'exactitude de
l'edition primant sur la vitesse de saisie.
- AOT WASM : desactive par defaut, a reevaluer apres mesure sur telephone.
Ajoute une section sur l'architecture de deploiement : les 3 projets .NET
ne produisent qu'un seul service (le client WASM est servi par l'API), et
le packaging vit dans un depot `mabibli_ynh` separe du code.
Le cadrage est desormais clos.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
API testee : HTTP 200, ~240 ms, sans cle. Le schema `dublincore` evite
completement l'UNIMARC — mapping bien plus simple que prevu, contrairement
a ce que supposait la note precedente.
Piege bloquant identifie : la BnF indexe l'ISBN tel qu'imprime, donc les
livres d'avant 2007 ne sont trouvables que par leur ISBN-10, alors que le
scanner lit toujours un EAN-13. Mesure sur echantillon verifie via
OpenLibrary : 2 titres sur 3 introuvables en ISBN-13 mais trouves en
ISBN-10. Interroger systematiquement les deux formes.
Autres pieges confirmes et documentes :
- aucune couverture cote BnF -> passer par OpenLibrary, avec
`?default=false` sans lequel un placeholder masque les absences
- plusieurs notices possibles pour un meme ISBN (3 pour Germinal)
- ponctuation ISBD a nettoyer sur titre / auteur / editeur, regles validees
- livres etrangers absents, ce qui confirme la necessite de la cascade
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Hors-ligne : consultation seule via cache des reponses GET. SQLite WASM
cote client ecarte. L'UI devra desactiver explicitement les ecritures
hors-ligne plutot que de les laisser echouer.
- Portee des donnees : collection commune au foyer. `UtilisateurId`
(proprietaire) devient `AjoutePar` (tracabilite) — ne jamais filtrer les
lectures dessus.
- Sources ISBN : BnF (SRU) en principale, OpenLibrary en secours. Motif :
OpenLibrary est lacunaire sur le fonds francais. API BnF pas encore
testee, a valider avant implementation.
- SSO : en-tetes SSOwat `YNH_USER` / `YNH_USER_EMAIL` / `YNH_USER_FULLNAME`.
OIDC ecarte, non documente par YunoHost (verifie ce jour). Corrige au
passage le nom d'en-tete, qui n'est pas `Remote-User`.
- Ebooks : fiches uniquement, pas de stockage de fichiers. Les prets ne
concernent donc que les livres physiques.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le dépôt ne versionnait qu'une archive `mabibli-init.tar.gz`, ce qui
empêchait git de suivre le contenu des fichiers. Les trois fichiers sont
désormais à plat et l'archive est supprimée.
Scan ISBN : remplacement de `html5-qrcode` par ZXing.Net (C#, Apache 2.0).
Validé concrètement en .NET 10 — round-trip EAN-13 OK, publish Blazor WASM
OK, 0,53 ms/frame dans le pire cas (échec sur frame 640x480 bruitée),
+192 Ko brotli sur le payload. Motif principal : le décodage reste
réutilisable hors navigateur si le projet évolue en scanner de
bibliothèque.
Clarification du besoin hors-ligne : consultation de la bibliothèque
existante uniquement. Signale au passage que SQLite vit côté serveur et
qu'un cache client sera nécessaire — point d'architecture non résolu.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>