Added manga data and pipeline.

This commit is contained in:
2025-05-23 02:40:06 -04:00
parent ec1713c95f
commit f760cff21f
27 changed files with 490 additions and 326 deletions

View File

@@ -0,0 +1,11 @@
namespace MangaReader.Core.Search;
public interface IMangaSearchProvider<T>
{
Task<MangaSearchResult[]> SearchAsync(string keyword);
}
//public class MangaDexWebSearch : IMangaWebSearch
//{
// // https://api.mangadex.org/manga?title=gal can't be&limit=5
//}

View File

@@ -0,0 +1,33 @@
using MangaReader.Core.HttpService;
using System.Text.Json;
namespace MangaReader.Core.Search;
public abstract class MangaSearchProviderBase<T>(IHttpService httpService) : IMangaSearchProvider<T>
{
private static JsonSerializerOptions _jsonSerializerOptions = new()
{
PropertyNameCaseInsensitive = true
};
public async Task<MangaSearchResult[]> SearchAsync(string keyword)
{
T? searchResult = await GetSearchResultAsync(keyword);
if (searchResult == null)
return [];
return GetSearchResult(searchResult);
}
private async Task<T?> GetSearchResultAsync(string keyword)
{
string url = GetSearchUrl(keyword);
string response = await httpService.GetStringAsync(url);
return JsonSerializer.Deserialize<T>(response, _jsonSerializerOptions);
}
protected abstract string GetSearchUrl(string keyword);
protected abstract MangaSearchResult[] GetSearchResult(T searchResult);
}

View File

@@ -0,0 +1,10 @@
namespace MangaReader.Core.Search;
public record MangaSearchResult
{
public required string Source { get; init; }
public required string Url { get; init; }
public required string Title { get; init; }
public string? Author { get; init; }
public string? Description { get; init; }
}

View File

@@ -0,0 +1,26 @@
using MangaReader.Core.HttpService;
namespace MangaReader.Core.Search.NatoManga;
public class NatoMangaSearchProvider(IHttpService httpService) : MangaSearchProviderBase<NatoMangaSearchResult[]>(httpService)
{
// https://www.natomanga.com/home/search/json?searchword=gal_can_t_be_kind
protected override string GetSearchUrl(string keyword)
{
return $"https://www.natomanga.com/home/search/json?searchword={keyword}";
}
protected override MangaSearchResult[] GetSearchResult(NatoMangaSearchResult[] searchResult)
{
IEnumerable<MangaSearchResult> mangaSearchResults = searchResult.Select(searchResult =>
new MangaSearchResult()
{
Source = "NatoManga",
Title = searchResult.Name,
Url = searchResult.Url
});
return [.. mangaSearchResults];
}
}

View File

@@ -0,0 +1,12 @@
namespace MangaReader.Core.Search.NatoManga;
public record NatoMangaSearchResult
{
public int Id { get; init; }
public string? Author { get; init; }
public required string Name { get; init; }
public string? ChapterLatest { get; init; }
public required string Url { get; init; }
public string? Thumb { get; init; }
public string? Slug { get; init; }
}