diff --git a/API/Schema/MangaConnectors/WeebCentral.cs b/API/Schema/MangaConnectors/WeebCentral.cs index a329994..aa1e6a9 100644 --- a/API/Schema/MangaConnectors/WeebCentral.cs +++ b/API/Schema/MangaConnectors/WeebCentral.cs @@ -17,37 +17,38 @@ public class Weebcentral : MangaConnector downloadClient = new ChromiumDownloadClient(); } - public override (Manga, List?, List?, List?, List?)[] GetManga(string publicationTitle = "") + public override (Manga, List?, List?, List?, List?)[] GetManga( + string publicationTitle = "") { const int limit = 32; //How many values we want returned at once - var offset = 0; //"Page" - var requestUrl = + int offset = 0; //"Page" + string requestUrl = $"{_baseUrl}/search/data?limit={limit}&offset={offset}&text={publicationTitle}&sort=Best+Match&order=Ascending&official=Any&display_mode=Minimal%20Display"; - var requestResult = + RequestResult requestResult = downloadClient.MakeRequest(requestUrl, RequestType.Default); if ((int)requestResult.statusCode < 200 || (int)requestResult.statusCode >= 300 || requestResult.htmlDocument == null) - { return []; - } - var publications = ParsePublicationsFromHtml(requestResult.htmlDocument); + (Manga, List, List, List, List)[] publications = + ParsePublicationsFromHtml(requestResult.htmlDocument); return publications; } - private (Manga, List?, List?, List?, List?)[] ParsePublicationsFromHtml(HtmlDocument document) + private (Manga, List?, List?, List?, List?)[] ParsePublicationsFromHtml( + HtmlDocument document) { if (document.DocumentNode.SelectNodes("//article") == null) return []; - var urls = document.DocumentNode.SelectNodes("/html/body/article/a[@class='link link-hover']") + List urls = document.DocumentNode.SelectNodes("/html/body/article/a[@class='link link-hover']") .Select(elem => elem.GetAttributeValue("href", "")).ToList(); List<(Manga, List?, List?, List?, List?)> ret = new(); - foreach (var url in urls) + foreach (string url in urls) { - var manga = GetMangaFromUrl(url); + (Manga, List, List, List, List)? manga = GetMangaFromUrl(url); if (manga is { } x) ret.Add(x); } @@ -55,30 +56,32 @@ public class Weebcentral : MangaConnector return ret.ToArray(); } - public override (Manga, List?, List?, List?, List?)? GetMangaFromUrl(string url) + public override (Manga, List?, List?, List?, List?)? + GetMangaFromUrl(string url) { Regex publicationIdRex = new(@"https:\/\/weebcentral\.com\/series\/(\w*)\/(.*)"); - var publicationId = publicationIdRex.Match(url).Groups[1].Value; + string publicationId = publicationIdRex.Match(url).Groups[1].Value; - var requestResult = downloadClient.MakeRequest(url, RequestType.MangaInfo); + RequestResult requestResult = downloadClient.MakeRequest(url, RequestType.MangaInfo); if ((int)requestResult.statusCode < 300 && (int)requestResult.statusCode >= 200 && requestResult.htmlDocument is not null) return ParseSinglePublicationFromHtml(requestResult.htmlDocument, publicationId, url); return null; } - private (Manga, List?, List?, List?, List?) ParseSinglePublicationFromHtml(HtmlDocument document, string publicationId, string websiteUrl) + private (Manga, List?, List?, List?, List?) ParseSinglePublicationFromHtml( + HtmlDocument document, string publicationId, string websiteUrl) { - var posterNode = + HtmlNode? posterNode = document.DocumentNode.SelectSingleNode("//section[@class='flex items-center justify-center']/picture/img"); - var coverUrl = posterNode?.GetAttributeValue("src", "") ?? ""; + string coverUrl = posterNode?.GetAttributeValue("src", "") ?? ""; - var titleNode = document.DocumentNode.SelectSingleNode("//section/h1"); - var sortName = titleNode?.InnerText ?? "Undefined"; + HtmlNode? titleNode = document.DocumentNode.SelectSingleNode("//section/h1"); + string sortName = titleNode?.InnerText ?? "Undefined"; HtmlNode[] authorsNodes = document.DocumentNode.SelectNodes("//ul/li[strong/text() = 'Author(s): ']/span")?.ToArray() ?? []; - var authorNames = authorsNodes.Select(n => n.InnerText).ToList(); + List authorNames = authorsNodes.Select(n => n.InnerText).ToList(); List authors = authorNames.Select(n => new Author(n)).ToList(); HtmlNode[] genreNodes = @@ -86,9 +89,9 @@ public class Weebcentral : MangaConnector HashSet tags = genreNodes.Select(n => n.InnerText).ToHashSet(); List mangaTags = tags.Select(t => new MangaTag(t)).ToList(); - var statusNode = document.DocumentNode.SelectSingleNode("//ul/li[strong/text() = 'Status: ']/a"); - var status = statusNode?.InnerText ?? ""; - var releaseStatus = MangaReleaseStatus.Unreleased; + HtmlNode? statusNode = document.DocumentNode.SelectSingleNode("//ul/li[strong/text() = 'Status: ']/a"); + string status = statusNode?.InnerText ?? ""; + MangaReleaseStatus releaseStatus = MangaReleaseStatus.Unreleased; switch (status.ToLower()) { case "cancelled": releaseStatus = MangaReleaseStatus.Cancelled; break; @@ -97,33 +100,34 @@ public class Weebcentral : MangaConnector case "ongoing": releaseStatus = MangaReleaseStatus.Continuing; break; } - var yearNode = document.DocumentNode.SelectSingleNode("//ul/li[strong/text() = 'Released: ']/span"); - var year = uint.Parse(yearNode?.InnerText ?? "0"); + HtmlNode? yearNode = document.DocumentNode.SelectSingleNode("//ul/li[strong/text() = 'Released: ']/span"); + uint year = uint.Parse(yearNode?.InnerText ?? "0"); - var descriptionNode = document.DocumentNode.SelectSingleNode("//ul/li[strong/text() = 'Description']/p"); - var description = descriptionNode?.InnerText ?? "Undefined"; + HtmlNode? descriptionNode = document.DocumentNode.SelectSingleNode("//ul/li[strong/text() = 'Description']/p"); + string description = descriptionNode?.InnerText ?? "Undefined"; HtmlNode[] altTitleNodes = document.DocumentNode .SelectNodes("//ul/li[strong/text() = 'Associated Name(s)']/ul/li")?.ToArray() ?? []; Dictionary altTitlesDict = new(), links = new(); - for (var i = 0; i < altTitleNodes.Length; i++) + for (int i = 0; i < altTitleNodes.Length; i++) altTitlesDict.Add(i.ToString(), altTitleNodes[i].InnerText); List altTitles = altTitlesDict.Select(a => new MangaAltTitle(a.Key, a.Value)).ToList(); - var originalLanguage = ""; + string originalLanguage = ""; - Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year, + Manga manga = new(publicationId, sortName, description, websiteUrl, coverUrl, null, year, originalLanguage, releaseStatus, -1, - this, - authors, - mangaTags, + this, + authors, + mangaTags, [], altTitles); - + return (manga, authors, mangaTags, [], altTitles); } - public override (Manga, List?, List?, List?, List?)? GetMangaFromId(string publicationId) + public override (Manga, List?, List?, List?, List?)? GetMangaFromId( + string publicationId) { return GetMangaFromUrl($"https://weebcentral.com/series/{publicationId}"); } @@ -136,68 +140,67 @@ public class Weebcentral : MangaConnector private SearchResult[] FilteredResults(string publicationTitle, SearchResult[] unfilteredSearchResults) { Dictionary similarity = new(); - foreach (var sr in unfilteredSearchResults) + foreach (SearchResult sr in unfilteredSearchResults) { List scores = new(); - var filteredPublicationString = ToFilteredString(publicationTitle); - var filteredSString = ToFilteredString(sr.s); + string filteredPublicationString = ToFilteredString(publicationTitle); + string filteredSString = ToFilteredString(sr.s); scores.Add(NeedlemanWunschStringUtil.CalculateSimilarity(filteredSString, filteredPublicationString)); - foreach (var srA in sr.a) + foreach (string srA in sr.a) { - var filteredAString = ToFilteredString(srA); + string filteredAString = ToFilteredString(srA); scores.Add(NeedlemanWunschStringUtil.CalculateSimilarity(filteredAString, filteredPublicationString)); } similarity.Add(sr, scores.Sum() / scores.Count); } - var ret = similarity.OrderBy(s => s.Value).Take(10).Select(s => s.Key).ToList(); + List ret = similarity.OrderBy(s => s.Value).Take(10).Select(s => s.Key).ToList(); return ret.ToArray(); } public override Chapter[] GetChapters(Manga manga, string language = "en") { - var requestUrl = $"{_baseUrl}/series/{manga.ConnectorId}/full-chapter-list"; - var requestResult = + string requestUrl = $"{_baseUrl}/series/{manga.ConnectorId}/full-chapter-list"; + RequestResult requestResult = downloadClient.MakeRequest(requestUrl, RequestType.Default); if ((int)requestResult.statusCode < 200 || (int)requestResult.statusCode >= 300) - return Array.Empty(); + return []; //Return Chapters ordered by Chapter-Number if (requestResult.htmlDocument is null) - return Array.Empty(); - var chapters = ParseChaptersFromHtml(manga, requestResult.htmlDocument); + return []; + List chapters = ParseChaptersFromHtml(manga, requestResult.htmlDocument); return chapters.Order().ToArray(); } private List ParseChaptersFromHtml(Manga manga, HtmlDocument document) { - var chaptersWrapper = document.DocumentNode.SelectSingleNode("/html/body"); + HtmlNode? chaptersWrapper = document.DocumentNode.SelectSingleNode("/html/body"); - Regex chapterRex = new(@".* (\d+)"); + Regex chapterRex = new(@"(\d+(?:\.\d+)*)"); Regex idRex = new(@"https:\/\/weebcentral\.com\/chapters\/(\w*)"); - var ret = chaptersWrapper.Descendants("a").Select(elem => + List ret = chaptersWrapper.Descendants("a").Select(elem => { - var url = elem.GetAttributeValue("href", "") ?? "Undefined"; + string url = elem.GetAttributeValue("href", "") ?? "Undefined"; if (!url.StartsWith("https://") && !url.StartsWith("http://")) - return new Chapter(manga, "undefined", "-1", null, null); + return new Chapter(manga, "undefined", "-1"); - var idMatch = idRex.Match(url); - var id = idMatch.Success ? idMatch.Groups[1].Value : null; + Match idMatch = idRex.Match(url); + string? id = idMatch.Success ? idMatch.Groups[1].Value : null; - var chapterNode = elem.SelectSingleNode("span[@class='grow flex items-center gap-2']/span")?.InnerText ?? - "Undefined"; + string chapterNode = elem.SelectSingleNode("span[@class='grow flex items-center gap-2']/span")?.InnerText ?? + "Undefined"; - var chapterNumberMatch = chapterRex.Match(chapterNode); + Match chapterNumberMatch = chapterRex.Match(chapterNode); - if(!chapterNumberMatch.Success) - return new Chapter(manga, "undefined", "-1", null, null); - - string chapterNumber = new(chapterNumberMatch.Groups[1].Value); - var chapter = new Chapter(manga, url, chapterNumber, null, null); - return chapter; + if (!chapterNumberMatch.Success) + return new Chapter(manga, "undefined", "-1"); + + string chapterNumber = chapterNumberMatch.Groups[1].Value; + return new Chapter(manga, url, chapterNumber); }).Where(elem => elem.ChapterNumber.CompareTo("-1") != 0 && elem.Url != "undefined").ToList(); ret.Reverse(); @@ -206,17 +209,15 @@ public class Weebcentral : MangaConnector internal override string[] GetChapterImageUrls(Chapter chapter) { - var requestResult = downloadClient.MakeRequest(chapter.Url, RequestType.Default); - if ((int)requestResult.statusCode < 200 || (int)requestResult.statusCode >= 300 ||requestResult.htmlDocument is null) - { - return []; - } + RequestResult requestResult = downloadClient.MakeRequest(chapter.Url, RequestType.Default); + if ((int)requestResult.statusCode < 200 || (int)requestResult.statusCode >= 300 || + requestResult.htmlDocument is null) return []; - var document = requestResult.htmlDocument; + HtmlDocument? document = requestResult.htmlDocument; - var imageNodes = + HtmlNode[] imageNodes = document.DocumentNode.SelectNodes($"//section[@hx-get='{chapter.Url}/images']/img")?.ToArray() ?? []; - var urls = imageNodes.Select(imgNode => imgNode.GetAttributeValue("src", "")).ToArray(); + string[] urls = imageNodes.Select(imgNode => imgNode.GetAttributeValue("src", "")).ToArray(); return urls; }