Added manga data and pipeline.
This commit is contained in:
11
MangaReader.Core/Search/IMangaSearchProvider.cs
Normal file
11
MangaReader.Core/Search/IMangaSearchProvider.cs
Normal 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
|
||||
//}
|
||||
33
MangaReader.Core/Search/MangaSearchProviderBase.cs
Normal file
33
MangaReader.Core/Search/MangaSearchProviderBase.cs
Normal 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);
|
||||
}
|
||||
10
MangaReader.Core/Search/MangaSearchResult.cs
Normal file
10
MangaReader.Core/Search/MangaSearchResult.cs
Normal 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; }
|
||||
}
|
||||
26
MangaReader.Core/Search/NatoManga/NatoMangaSearchProvider.cs
Normal file
26
MangaReader.Core/Search/NatoManga/NatoMangaSearchProvider.cs
Normal 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];
|
||||
}
|
||||
}
|
||||
12
MangaReader.Core/Search/NatoManga/NatoMangaSearchResult.cs
Normal file
12
MangaReader.Core/Search/NatoManga/NatoMangaSearchResult.cs
Normal 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; }
|
||||
}
|
||||
Reference in New Issue
Block a user