using Kavita.Models.Metadata; using Nager.ArticleNumber; namespace Kavita.Services.Extensions; public static class ComicInfoExtensions { extension(ComicInfo? info) { public void CleanComicInfo() { if (info == null) return; info.Series = info.Series.Trim(); info.SeriesSort = info.SeriesSort.Trim(); info.LocalizedSeries = info.LocalizedSeries.Trim(); info.Writer = Scanner.Parser.CleanAuthor(info.Writer); info.Colorist = Scanner.Parser.CleanAuthor(info.Colorist); info.Editor = Scanner.Parser.CleanAuthor(info.Editor); info.Inker = Scanner.Parser.CleanAuthor(info.Inker); info.Letterer = Scanner.Parser.CleanAuthor(info.Letterer); info.Penciller = Scanner.Parser.CleanAuthor(info.Penciller); info.Publisher = Scanner.Parser.CleanAuthor(info.Publisher); info.Imprint = Scanner.Parser.CleanAuthor(info.Imprint); info.Characters = Scanner.Parser.CleanAuthor(info.Characters); info.Translator = Scanner.Parser.CleanAuthor(info.Translator); info.CoverArtist = Scanner.Parser.CleanAuthor(info.CoverArtist); info.Teams = Scanner.Parser.CleanAuthor(info.Teams); info.Locations = Scanner.Parser.CleanAuthor(info.Locations); // We need to convert GTIN to ISBN info.Isbn = ParseGtin(info.GTIN); if (!string.IsNullOrEmpty(info.Number)) { info.Number = info.Number.Trim().Replace(",", "."); // Corrective measure for non English OSes } if (!string.IsNullOrEmpty(info.Volume)) { info.Volume = info.Volume.Trim(); } } } /// /// For a given GTIN, attempts to parse out an ISBN and set the Isbn property. /// /// /// public static string ParseGtin(string? gtin) { if (string.IsNullOrEmpty(gtin)) return string.Empty; // This is likely a valid ISBN if (gtin[0] == '0') { var offset = gtin[1] == '-' ? 0 : 1; var potentialIsbn = gtin[offset..]; if (ArticleNumberHelper.IsValidIsbn13(potentialIsbn)) { return potentialIsbn; } } if (ArticleNumberHelper.IsValidIsbn10(gtin) || ArticleNumberHelper.IsValidIsbn13(gtin)) { return gtin; } return string.Empty; } }