MaBibli 1.0.0

Gestion de bibliothèque personnelle auto-hébergée : catalogue, prêts,
scan de code-barres, consultation hors-ligne.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Mathieu Limonier
2026-08-22 22:36:16 +02:00
co-authored by Claude Opus 5
commit 6a6d745af4
207 changed files with 35543 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
namespace MaBibli.Shared.Dtos;
/// <summary>Source d'où proviennent les métadonnées d'un candidat.</summary>
public enum SourceMetadonnees
{
/// <summary>Catalogue général de la BnF, via son API SRU (Dublin Core).</summary>
Bnf = 0,
/// <summary>OpenLibrary (Internet Archive), second rideau de la cascade.</summary>
OpenLibrary = 1,
}
/// <summary>
/// Une notice candidate pour un ISBN donné.
/// </summary>
/// <remarks>
/// Un même ISBN peut correspondre à <b>plusieurs</b> notices (rééditions successives partageant
/// l'ISBN). Décision actée dans CLAUDE.md : on ne choisit pas à la place de l'utilisateur,
/// on lui présente tous les candidats. C'est l'interface (phase 3) qui fera choisir.
/// </remarks>
public record CandidatLivre
{
/// <summary>Titre nettoyé de la ponctuation ISBD.</summary>
public required string Titre { get; init; }
/// <summary>
/// Auteurs au format « Prénom Nom », dans l'ordre donné par la source. Peut être vide.
/// </summary>
/// <remarks>
/// Une liste, et non une chaîne : <i>Introduction to Algorithms</i> en renvoie quatre
/// (Cormen, Leiserson, Rivest, Stein), et les recoller pour les redécouper ensuite ferait
/// perdre la frontière entre « Zola, Émile » et deux auteurs.
/// </remarks>
public IReadOnlyList<string> Auteurs { get; init; } = [];
/// <summary>
/// Les auteurs sur une ligne, séparés comme les attend un champ de saisie
/// (<see cref="EnregistrementLivre.SeparateurAuteurs"/>).
/// </summary>
public string? Auteur =>
Auteurs.Count == 0
? null
: string.Join($"{EnregistrementLivre.SeparateurAuteurs} ", Auteurs);
public string? Editeur { get; init; }
/// <summary>Année de publication telle que fournie par la source (texte : « 1979 », « March 2007 »…).</summary>
public string? Annee { get; init; }
/// <summary>Code langue tel que fourni par la source (« fre », « eng »…).</summary>
public string? Langue { get; init; }
/// <summary>
/// Nombre de pages lu dans la description matérielle de la notice, quand elle en donne un.
/// </summary>
/// <remarks>
/// ⚠️ <b>Une proposition, jamais une certitude</b> : la BnF n'expose pas un nombre de pages
/// mais une phrase (<c>dc:format</c> : « 1 vol. (349 p.) », « 30 cm », « 2 disques
/// compacts »). Tout ce que le nettoyage ne comprend pas reste <c>null</c> — mieux vaut un
/// champ vide qu'un chiffre inventé.
/// </remarks>
public int? NombrePages { get; init; }
/// <summary>URL de la couverture chez OpenLibrary, toujours renseignée (voir remarques du service).</summary>
public string? CoverUrl { get; init; }
public required SourceMetadonnees Source { get; init; }
/// <summary>Forme d'ISBN qui a effectivement produit cette notice (13 ou 10 converti).</summary>
public string? IsbnInterroge { get; init; }
/// <summary>Identifiant chez la source : ark BnF (<c>ark:/12148/cb…</c>) ou clé OpenLibrary (<c>/books/OL…M</c>).</summary>
public string? IdentifiantSource { get; init; }
/// <summary>URL de consultation de la notice chez la source.</summary>
public string? UrlNotice { get; init; }
}