diff --git a/MangaReader.Core/Extensions/ServiceCollectionExtensions.cs b/MangaReader.Core/Extensions/ServiceCollectionExtensions.cs index 4a10bb1..de57399 100644 --- a/MangaReader.Core/Extensions/ServiceCollectionExtensions.cs +++ b/MangaReader.Core/Extensions/ServiceCollectionExtensions.cs @@ -22,18 +22,22 @@ public static class ServiceCollectionExtensions client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0"); }); + // Http services.AddScoped(); + services.AddScoped(); + // NatoManga //services.AddScoped(); - services.AddScoped(); - //services.AddScoped(); - services.AddScoped(); - services.AddScoped(); + //services.AddScoped(); - ///services.AddScoped(); + // MangaDex + services.AddScoped(); + services.AddScoped(); services.AddScoped(); + services.AddScoped(); + return services; } } \ No newline at end of file diff --git a/MangaReader.Core/Pages/IMangaPageProvider.cs b/MangaReader.Core/Pages/IMangaPageProvider.cs new file mode 100644 index 0000000..a8e8455 --- /dev/null +++ b/MangaReader.Core/Pages/IMangaPageProvider.cs @@ -0,0 +1,8 @@ +using MangaReader.Core.Sources; + +namespace MangaReader.Core.Pages; + +public interface IMangaPageProvider : IMangaSourceComponent +{ + Task> GetPageImageUrlsAsync(string chapterUrl, CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/MangaReader.Core/Sources/NatoManga/Pages/NatoMangaPageProvider.cs b/MangaReader.Core/Sources/NatoManga/Pages/NatoMangaPageProvider.cs new file mode 100644 index 0000000..71e3348 --- /dev/null +++ b/MangaReader.Core/Sources/NatoManga/Pages/NatoMangaPageProvider.cs @@ -0,0 +1,43 @@ +using HtmlAgilityPack; +using MangaReader.Core.Http; +using MangaReader.Core.Pages; + +namespace MangaReader.Core.Sources.NatoManga.Pages; + +public class NatoMangaPageProvider(IHtmlLoader htmlLoader) : IMangaPageProvider +{ + public string SourceId => "NatoManga"; + + public async Task> GetPageImageUrlsAsync(string chapterUrl, CancellationToken cancellationToken) + { + List imageUrlCollection = []; + + HtmlDocument document = await htmlLoader.GetHtmlDocumentAsync(chapterUrl, cancellationToken); + HtmlNodeCollection? htmlNodeCollection = GetImageNodeCollection(document); + + if (htmlNodeCollection == null) + return imageUrlCollection; + + foreach (var htmlNode in htmlNodeCollection) + { + string imageSourceUrl = htmlNode.GetAttributeValue("src", string.Empty); + + if (string.IsNullOrWhiteSpace(imageSourceUrl)) + continue; + + imageUrlCollection.Add(imageSourceUrl); + } + + return imageUrlCollection; + } + + private static HtmlNodeCollection? GetImageNodeCollection(HtmlDocument document) + { + HtmlNode? chapterReaderNode = document.DocumentNode.SelectSingleNode(".//div[@class='container-chapter-reader']"); + + if (chapterReaderNode == null) + return null; + + return chapterReaderNode.SelectNodes(".//img"); + } +} \ No newline at end of file diff --git a/MangaReader.Tests/MangaReader.Tests.csproj b/MangaReader.Tests/MangaReader.Tests.csproj index f5613a0..25a418e 100644 --- a/MangaReader.Tests/MangaReader.Tests.csproj +++ b/MangaReader.Tests/MangaReader.Tests.csproj @@ -31,7 +31,7 @@ - + diff --git a/MangaReader.Tests/Sources/NatoManga/Metadata/Manga-Chapter-Response.html b/MangaReader.Tests/Sources/NatoManga/Pages/Manga-Chapter-Response.html similarity index 100% rename from MangaReader.Tests/Sources/NatoManga/Metadata/Manga-Chapter-Response.html rename to MangaReader.Tests/Sources/NatoManga/Pages/Manga-Chapter-Response.html diff --git a/MangaReader.Tests/Sources/NatoManga/Pages/NatoMangaPageTests.cs b/MangaReader.Tests/Sources/NatoManga/Pages/NatoMangaPageTests.cs new file mode 100644 index 0000000..ac9a07e --- /dev/null +++ b/MangaReader.Tests/Sources/NatoManga/Pages/NatoMangaPageTests.cs @@ -0,0 +1,35 @@ +using MangaReader.Core.Http; +using MangaReader.Core.Sources.NatoManga.Pages; +using MangaReader.Tests.Utilities; +using NSubstitute; +using Shouldly; + +namespace MangaReader.Tests.Sources.NatoManga.Pages; + +public class NatoMangaPageTests +{ + [Fact] + public async Task Get_Pages() + { + string mangaHtml = await ReadJsonResourceAsync("Manga-Chapter-Response.html"); + + IHttpService httpService = Substitute.For(); + + httpService.GetStringAsync(Arg.Any(), CancellationToken.None) + .Returns(Task.FromResult(mangaHtml)); + + HtmlLoader htmlLoader = new(httpService); + + NatoMangaPageProvider pageProvider = new(htmlLoader); + IReadOnlyList pageImageUrls = await pageProvider.GetPageImageUrlsAsync("/test-url", CancellationToken.None); + + pageImageUrls.Count.ShouldBe(13); + pageImageUrls[0].ShouldBe("https://img-r1.2xstorage.com/gal-cant-be-kind-to-otaku/69/0.webp"); + pageImageUrls[12].ShouldBe("https://img-r1.2xstorage.com/gal-cant-be-kind-to-otaku/69/12.webp"); + } + + private static async Task ReadJsonResourceAsync(string resourceName) + { + return await ResourceHelper.ReadJsonResourceAsync($"MangaReader.Tests.Sources.NatoManga.Pages.{resourceName}"); + } +} \ No newline at end of file diff --git a/MangaReader.WinUI/Resources/Fonts.xaml b/MangaReader.WinUI/Resources/Fonts.xaml index f2e2d19..070fb4c 100644 --- a/MangaReader.WinUI/Resources/Fonts.xaml +++ b/MangaReader.WinUI/Resources/Fonts.xaml @@ -1,11 +1,10 @@ + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> - ms-appx:///Assets/Fonts/Poppins-Regular.ttf#Poppins Regular - ms-appx:///Assets/Fonts/Poppins-Medium.ttf#Poppins Medium - ms-appx:///Assets/Fonts/Poppins-SemiBold.ttf#Poppins SemiBold + ms-appx:///Assets/Fonts/Poppins-Regular.otf#Poppins Regular + ms-appx:///Assets/Fonts/Poppins-Medium.otf#Poppins Medium + ms-appx:///Assets/Fonts/Poppins-SemiBold.otf#Poppins SemiBold \ No newline at end of file