namespace MaBibli.Shared.Dtos; /// Source d'où proviennent les métadonnées d'un candidat. public enum SourceMetadonnees { /// Catalogue général de la BnF, via son API SRU (Dublin Core). Bnf = 0, /// OpenLibrary (Internet Archive), second rideau de la cascade. OpenLibrary = 1, } /// /// Une notice candidate pour un ISBN donné. /// /// /// Un même ISBN peut correspondre à plusieurs 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. /// public record CandidatLivre { /// Titre nettoyé de la ponctuation ISBD. public required string Titre { get; init; } /// /// Auteurs au format « Prénom Nom », dans l'ordre donné par la source. Peut être vide. /// /// /// Une liste, et non une chaîne : Introduction to Algorithms 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. /// public IReadOnlyList Auteurs { get; init; } = []; /// /// Les auteurs sur une ligne, séparés comme les attend un champ de saisie /// (). /// public string? Auteur => Auteurs.Count == 0 ? null : string.Join($"{EnregistrementLivre.SeparateurAuteurs} ", Auteurs); public string? Editeur { get; init; } /// Année de publication telle que fournie par la source (texte : « 1979 », « March 2007 »…). public string? Annee { get; init; } /// Code langue tel que fourni par la source (« fre », « eng »…). public string? Langue { get; init; } /// /// Nombre de pages lu dans la description matérielle de la notice, quand elle en donne un. /// /// /// ⚠️ Une proposition, jamais une certitude : la BnF n'expose pas un nombre de pages /// mais une phrase (dc:format : « 1 vol. (349 p.) », « 30 cm », « 2 disques /// compacts »). Tout ce que le nettoyage ne comprend pas reste null — mieux vaut un /// champ vide qu'un chiffre inventé. /// public int? NombrePages { get; init; } /// URL de la couverture chez OpenLibrary, toujours renseignée (voir remarques du service). public string? CoverUrl { get; init; } public required SourceMetadonnees Source { get; init; } /// Forme d'ISBN qui a effectivement produit cette notice (13 ou 10 converti). public string? IsbnInterroge { get; init; } /// Identifiant chez la source : ark BnF (ark:/12148/cb…) ou clé OpenLibrary (/books/OL…M). public string? IdentifiantSource { get; init; } /// URL de consultation de la notice chez la source. public string? UrlNotice { get; init; } }