Added common language enum. Fixed "romaji" spelling. More UI updates.

This commit is contained in:
2025-06-08 11:13:52 -04:00
parent 70513559cb
commit b5d22c3c7e
20 changed files with 224 additions and 55 deletions

View File

@@ -2,7 +2,8 @@
public enum Language
{
Unknown,
Japanese,
Romanji,
Romaji,
English
}

View File

@@ -31,7 +31,7 @@ public static class ServiceCollectionExtensions
services.AddScoped<IMangaSearchProvider, MangaDexSearchProvider>();
services.AddScoped<IMangaSearchCoordinator, MangaSearchCoordinator>();
//services.AddScoped<IMangaMetadataProvider, NatoMangaWebCrawler>();
///services.AddScoped<IMangaMetadataProvider, NatoMangaWebCrawler>();
services.AddScoped<IMangaMetadataProvider, MangaDexMetadataProvider>();
return services;

View File

@@ -1,16 +1,25 @@
namespace MangaReader.Core.HttpService;
public class HttpService : IHttpService
public class HttpService(HttpClient httpClient) : IHttpService
{
private readonly HttpClient _httpClient;
public Task<string> GetStringAsync(string url, CancellationToken cancellationToken)
=> GetStringAsync(url, new Dictionary<string, string>(), cancellationToken);
public HttpService(HttpClient httpClient)
public async Task<string> GetStringAsync(string url, IDictionary<string, string> headers, CancellationToken cancellationToken)
{
using HttpRequestMessage request = new(HttpMethod.Get, url);
foreach (KeyValuePair<string, string> header in headers)
{
request.Headers.TryAddWithoutValidation(header.Key, header.Value);
}
//httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("MangaReader/1.0");
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0");
_httpClient = httpClient;
}
using HttpResponseMessage response = await httpClient.SendAsync(request, cancellationToken);
response.EnsureSuccessStatusCode();
public Task<string> GetStringAsync(string url, CancellationToken cancellationToken)
=> _httpClient.GetStringAsync(url, cancellationToken);
return await response.Content.ReadAsStringAsync(cancellationToken);
}
}

View File

@@ -3,4 +3,5 @@
public interface IHttpService
{
Task<string> GetStringAsync(string url, CancellationToken cancellationToken);
Task<string> GetStringAsync(string url, IDictionary<string, string> headers, CancellationToken cancellationToken);
}

View File

@@ -1,9 +1,9 @@
namespace MangaReader.Core.Metadata;
public enum SourceMangaLanguage
{
Unknown,
Japanese,
Romanji,
English
}
//public enum SourceMangaLanguage
//{
// Unknown,
// Japanese,
// Romanji,
// English
//}

View File

@@ -1,7 +1,9 @@
namespace MangaReader.Core.Metadata;
using MangaReader.Core.Common;
namespace MangaReader.Core.Metadata;
public class SourceMangaTitle
{
public required string Title { get; set; }
public SourceMangaLanguage Language { get; set; }
public Language Language { get; set; }
}

View File

@@ -10,11 +10,14 @@ public partial class MangaPipeline(MangaContext context) : IMangaPipeline
public async Task RunAsync(MangaPipelineRequest request)
{
string sourceName = request.SourceName;
string sourceUrl = request.SourceUrl;
SourceManga sourceManga = request.SourceManga;
Source source = await GetOrAddSourceAsync(sourceName);
Manga manga = await GetOrAddMangaAsync(sourceManga);
await AddMangaSourceAsync(sourceUrl, manga, source);
foreach (SourceMangaTitle alternateTitle in sourceManga.AlternateTitles)
{
await AddTitleAsync(manga, alternateTitle);
@@ -83,6 +86,24 @@ public partial class MangaPipeline(MangaContext context) : IMangaPipeline
[GeneratedRegex(@"\s+")]
private static partial Regex RemoveSpacesWithDashRegex();
private async Task AddMangaSourceAsync(string sourceUrl, Manga manga, Source source)
{
MangaSource? mangaSource = await context.MangaSources.FirstOrDefaultAsync(ms =>
ms.Manga == manga && ms.Source == source && ms.Url == sourceUrl);
if (mangaSource != null)
return;
mangaSource = new()
{
Manga = manga,
Source = source,
Url = sourceUrl
};
context.MangaSources.Add(mangaSource);
}
private async Task AddTitleAsync(Manga manga, SourceMangaTitle sourceMangaTitle)
{
MangaTitle? mangaTitle = await context.MangaTitles.FirstOrDefaultAsync(mt =>

View File

@@ -5,5 +5,6 @@ namespace MangaReader.Core.Pipeline;
public class MangaPipelineRequest
{
public required string SourceName { get; init; }
public required string SourceUrl { get; init; }
public required SourceManga SourceManga { get; init; }
}

View File

@@ -1,4 +1,5 @@
using MangaReader.Core.Metadata;
using MangaReader.Core.Common;
using MangaReader.Core.Metadata;
using MangaReader.Core.Sources.MangaDex.Api;
namespace MangaReader.Core.Sources.MangaDex.Metadata;
@@ -62,11 +63,11 @@ public class MangaDexMetadataProvider(IMangaDexClient mangaDexClient) : IMangaMe
if (attributes.AltTitles == null || attributes.AltTitles.Count == 0)
return [];
Dictionary<string, SourceMangaLanguage> languageIdMap = new()
Dictionary<string, Language> languageIdMap = new()
{
{ "en", SourceMangaLanguage.English },
{ "ja", SourceMangaLanguage.Japanese },
{ "ja-ro", SourceMangaLanguage.Romanji },
{ "en", Language.English },
{ "ja", Language.Japanese },
{ "ja-ro", Language.Romaji },
};
List<SourceMangaTitle> sourceMangaTitles = [];
@@ -75,7 +76,7 @@ public class MangaDexMetadataProvider(IMangaDexClient mangaDexClient) : IMangaMe
{
foreach (string alternateTitleKey in alternateTitle.Keys)
{
if (languageIdMap.TryGetValue(alternateTitleKey, out SourceMangaLanguage language) == false)
if (languageIdMap.TryGetValue(alternateTitleKey, out Language language) == false)
continue;
SourceMangaTitle sourceMangaTitle = new()

View File

@@ -45,7 +45,7 @@ public partial class MangaDexSearchProvider(IMangaDexClient mangaDexClient) : IM
if (thing.Count > 0)
{
Guid[] mangaGuids = thing.Select(x => x.Key).ToArray();
Guid[] mangaGuids = [.. thing.Select(x => x.Key)];
var reults = await GetCoverArtFileNamesAsync(mangaGuids, cancellationToken);
//var reults = await mangaDexClient.GetCoverArtAsync(mangaGuids, cancellationToken);
}

View File

@@ -1,4 +1,5 @@
using HtmlAgilityPack;
using MangaReader.Core.Common;
using MangaReader.Core.Metadata;
using System.Text;
using System.Web;
@@ -46,7 +47,7 @@ public class MangaNatoWebCrawler : MangaWebCrawler
SourceMangaTitle sourceMangaTitle = new()
{
Title = title,
Language = SourceMangaLanguage.Unknown
Language = Language.Unknown
};
sourceMangaTitles.Add(sourceMangaTitle);

View File

@@ -23,12 +23,15 @@ public partial class NatoMangaClient(IHttpService httpService) : INatoMangaClien
{
string url = GetSearchUrl(searchWord);
string response = await httpService.GetStringAsync(url, cancellationToken);
Dictionary<string,string> requestHeader = [];
requestHeader.Add("Referer", "https://www.natomanga.com/");
string response = await httpService.GetStringAsync(url, requestHeader, cancellationToken);
return JsonSerializer.Deserialize<NatoMangaSearchResult[]>(response, _jsonSerializerOptions) ?? [];
}
protected string GetSearchUrl(string searchWord)
protected static string GetSearchUrl(string searchWord)
{
string formattedSeachWord = GetFormattedSearchWord(searchWord);