diff --git a/CLAUDE.md b/CLAUDE.md index 795a97f..ec8ed15 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -151,6 +151,37 @@ d'obtenir `zbar.wasm` et sa licence. **Leçon confirmée, dans les deux sens** : le coût d'une bibliothèque n'est pas le poids de son assembly. Toujours comparer deux publish. +### L'add-on EAN-2 — désactivé par défaut, et c'est le piège (2026-08-19) + +Le code-barres d'un périodique porte, à côté du code principal, un petit code à deux chiffres : +l'**EAN-2**, qui est normativement le **numéro de parution**. C'est le candidat naturel pour +pré-remplir le numéro d'une revue. + +⚠️ **Il ne suffit pas de cesser de le filtrer : zbar ne le produit pas.** Mesuré le 2026-08-19, +sur un EAN-13 `9772466671438` et un EAN-2 `43` rendus côte à côte dans un canvas : + +| Scanner | Symboles lus | +|---|---| +| par défaut | `ZBAR_EAN13=9772466671438` | +| après `setConfig(ZBAR_EAN2, ZBAR_CFG_ENABLE, 1)` | `ZBAR_EAN2=43` **et** `ZBAR_EAN13=9772466671438` | + +La ligne de configuration est donc indispensable, et ce fichier affirmait le contraire avant +mesure — « `decoder()` les écarte » laissait croire qu'ils arrivaient. + +**L'EAN-5 reste désactivé** : il porte un **prix**. Le confondre avec un numéro créerait des +numéros « 00595 » que personne ne comprendrait. Le filtre du `decoder()` le mentionne quand même, +par prudence. + +⚠️ **Ce qui reste non vérifié, et qui est dit à l'utilisateur** : que les magazines réels portent +bien leur numéro de parution dans cet add-on. La chaîne de décodage est prouvée, l'usage +éditorial ne l'est pas — cela demande un exemplaire devant la caméra. Le numéro lu est donc +**proposé** dans un champ modifiable, sous un message qui invite à le comparer à la couverture +(« Vérifiez-le sur la couverture »), et jamais enregistré tout seul. + +⚠️ Un add-on lu ne doit pas **déteindre** sur la saisie suivante : `_parutionLue` est remis à zéro +à chaque saisie manuelle et à chaque ouverture du scanner. Sans cela, le numéro d'un magazine +serait proposé pour le suivant. + ### Ce qui reste vrai de l'ancienne section - Le scan caméra exige **HTTPS** (garanti par YunoHost ; `localhost` est considéré comme sûr). @@ -165,9 +196,8 @@ assembly. Toujours comparer deux publish. - Il remonte le **format** du symbole (`ZBAR_EAN13`, `ZBAR_ISBN13`, `ZBAR_EAN5`…), là où nous déduisons le type du préfixe. -- Il décode les **add-ons EAN-2 (numéro de parution) et EAN-5 (prix)** imprimés à côté du code - principal. ⚠️ `decoder()` les **écarte** : ce ne sont pas le code du livre. L'EAN-2 deviendra - utile le jour où les périodiques seront catalogués. +- Il sait décoder les **add-ons EAN-2 (numéro de parution) et EAN-5 (prix)** imprimés à côté du + code principal. ⚠️ **Mais ils sont DÉSACTIVÉS par défaut** — voir « L'add-on EAN-2 » ci-dessous. ## Saisie d'un code-barres — décisions actées le 2026-08-18 (2ᵉ série) diff --git a/IDEES.md b/IDEES.md index 665d5c7..3bfc788 100644 --- a/IDEES.md +++ b/IDEES.md @@ -60,23 +60,17 @@ rendu en canvas, pas sur une image de caméra. # Retours d'usage du 2026-08-19 (3ᵉ série) -## Ce qui reste des magazines : le numéro scanné +## Ce qui reste des magazines : confirmer l'EAN-2 sur un vrai kiosque -Les revues sont implémentées (voir `CLAUDE.md`) : fiche par revue, numéros à l'intérieur, et le -code-barres `977` mène désormais à la fiche de la revue. +Le numéro scanné est implémenté (voir `CLAUDE.md`) : zbar lit l'add-on EAN-2 — après l'avoir +**activé**, il est désactivé par défaut — et l'écran de la revue le propose dans un champ à +vérifier. -⚠️ **Le numéro, lui, se saisit à la main.** Les deux chiffres de parution du code-barres ne sont -pas fiables ; l'**add-on EAN-2** imprimé à côté du code principal est le bon candidat, et zbar -sait le décoder — mais `decoder()` l'écarte aujourd'hui, et rien n'a pu être vérifié faute d'un -magazine réel devant la caméra. À reprendre avec un exemplaire en main : lire l'EAN-2, le -comparer au numéro imprimé sur la couverture, et ne le pré-remplir que si les deux concordent -sur plusieurs numéros. - -Autres pistes non traitées, sans urgence : - -- **Champs propres à la BD** (série, tome, scénariste/dessinateur). Le regroupement en série est - couvert par les sagas ; il reste la distinction des **rôles**, le modèle mettant tous les - auteurs dans `LivreAuteur` sans les distinguer. +⚠️ **Ce qui n'est toujours pas vérifié** : que les magazines réels portent bien leur numéro de +parution dans cet add-on, et non autre chose. La chaîne de décodage est prouvée sur un code +généré ; l'usage éditorial demande un exemplaire devant la caméra. À faire sur trois ou quatre +numéros d'un même titre : si l'EAN-2 suit la parution, le message d'avertissement pourra +s'alléger ; s'il ne la suit pas, c'est le pré-remplissage qu'il faudra retirer. ## Auteurs et bibliographie diff --git a/MaBibli.Client/Composants/CodeScanne.cs b/MaBibli.Client/Composants/CodeScanne.cs new file mode 100644 index 0000000..fc67df4 --- /dev/null +++ b/MaBibli.Client/Composants/CodeScanne.cs @@ -0,0 +1,23 @@ +namespace MaBibli.Client.Composants; + +/// +/// Ce qu'un coup de scanner a produit : le code du livre ou de la revue, et son add-on éventuel. +/// +/// EAN-13 normalisé, seul code qui identifie l'ouvrage. +/// +/// Contenu de l'add-on EAN-2, imprimé à côté du code principal sur les périodiques. +/// +/// +/// ⚠️ L'EAN-2 est une indication, jamais une donnée acquise. Il porte le numéro de +/// parution d'une revue — c'est sa raison d'être normative — mais rien n'a pu être vérifié sur +/// des magazines réels : la vérification demande un exemplaire devant la caméra. Il est donc +/// proposé à l'utilisateur dans un champ qu'il corrige, jamais enregistré tel quel. +/// +/// L'add-on EAN-5 n'est pas remonté : il porte un prix, et le confondre avec un +/// numéro créerait des numéros « 00595 » que personne ne comprendrait. +/// +/// +public readonly record struct CodeScanne(string Code, string? Parution); + +/// Forme brute renvoyée par scanner-camera.js, avant validation de l'ISBN. +internal sealed record LectureCodeBarres(string? Code, string? Parution); diff --git a/MaBibli.Client/Composants/ScannerCodeBarres.razor b/MaBibli.Client/Composants/ScannerCodeBarres.razor index 6c98284..913ddc0 100644 --- a/MaBibli.Client/Composants/ScannerCodeBarres.razor +++ b/MaBibli.Client/Composants/ScannerCodeBarres.razor @@ -61,7 +61,7 @@ @code { /// Appelé avec l'ISBN-13 dès qu'un code-barres exploitable est décodé. - [Parameter] public EventCallback OnCodeDetecte { get; set; } + [Parameter] public EventCallback OnCodeDetecte { get; set; } /// Appelé quand l'utilisateur renonce au scan. [Parameter] public EventCallback OnAnnuler { get; set; } @@ -168,7 +168,8 @@ } var depart = Stopwatch.GetTimestamp(); - var code = await _module.InvokeAsync("decoder", LargeurMax); + var lecture = await _module.InvokeAsync("decoder", LargeurMax); + var code = lecture?.Code; _totalMs += Stopwatch.GetElapsedTime(depart).TotalMilliseconds; _framesDecodees++; @@ -192,7 +193,7 @@ } await ArreterCameraAsync(); - await OnCodeDetecte.InvokeAsync(isbn); + await OnCodeDetecte.InvokeAsync(new CodeScanne(isbn, lecture?.Parution)); return; } } diff --git a/MaBibli.Client/Pages/AjoutIsbn.razor b/MaBibli.Client/Pages/AjoutIsbn.razor index 15a1459..886dfc0 100644 --- a/MaBibli.Client/Pages/AjoutIsbn.razor +++ b/MaBibli.Client/Pages/AjoutIsbn.razor @@ -198,6 +198,9 @@ private string? _messagePeriodique; private PeriodiqueDetecte? _periodique; + + /// Add-on EAN-2 du dernier scan, quand il y en avait un. Voir . + private string? _parutionLue; private bool _chargement; private bool _enregistrement; private string? _erreur; @@ -248,6 +251,7 @@ _erreur = null; _messagePeriodique = null; _periodique = null; + _parutionLue = null; _avertissements = []; _etape = Etape.Scan; } @@ -255,9 +259,15 @@ // Le scan enchaîne directement sur le flux de lookup existant : l'utilisateur // ne retape jamais ce qui vient d'être scanné, et n'a aucun bouton à confirmer. // Le code lu reste dans le champ : si le décodage était mauvais, il se corrige et se relance. - private async Task SurCodeDetecteAsync(string isbn) + private async Task SurCodeDetecteAsync(CodeScanne lecture) { - _isbn = isbn; + _isbn = lecture.Code; + + // Gardé de côté pour la seule chose qui sache quoi en faire : la fiche d'une revue. + // Sur un livre, l'add-on EAN-5 (le prix) n'est même pas remonté, et l'EAN-2 n'a pas + // de sens. + _parutionLue = lecture.Parution; + await ChercherAsync(); } @@ -265,6 +275,9 @@ { if (e.Key == "Enter" && !string.IsNullOrWhiteSpace(_isbn)) { + // Saisi à la main ou à la douchette : aucun add-on, et surtout pas celui d'un + // scan précédent, qui se retrouverait proposé pour un autre magazine. + _parutionLue = null; await ChercherAsync(); } } @@ -393,7 +406,13 @@ return; } - Navigation.NavigateTo($"revues/{resultat.Valeur!.Id}"); + // Le numéro lu sur l'add-on EAN-2 suit la navigation : la fiche le proposera dans un + // champ modifiable. On ne l'enregistre pas soi-même — voir CodeScanne. + var numero = string.IsNullOrWhiteSpace(_parutionLue) + ? string.Empty + : $"?numero={Uri.EscapeDataString(_parutionLue)}"; + + Navigation.NavigateTo($"revues/{resultat.Valeur!.Id}{numero}"); } /// Ramène l'écran à la saisie, champ ISBN de nouveau actif pour la douchette. diff --git a/MaBibli.Client/Pages/Revue.razor b/MaBibli.Client/Pages/Revue.razor index 3eeeb1b..467c53a 100644 --- a/MaBibli.Client/Pages/Revue.razor +++ b/MaBibli.Client/Pages/Revue.razor @@ -87,6 +87,15 @@ else parution du code-barres ne sont PAS un numéro fiable (CLAUDE.md), et l'add-on EAN-2 qui le porterait vraiment n'a pas pu être vérifié sur un magazine réel. *@ + @if (_numeroPropose && !string.IsNullOrWhiteSpace(NumeroScanne)) + { +

+ Le code-barres portait « @NumeroScanne » à côté du code principal, ce qui est + normalement le numéro de parution. Vérifiez-le sur la couverture + avant d'enregistrer. +

+ } +