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.
+