Added manga data and pipeline.
This commit is contained in:
8
MangaReader.Core/Pipeline/IMangaPipeline.cs
Normal file
8
MangaReader.Core/Pipeline/IMangaPipeline.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
using MangaReader.Core.WebCrawlers;
|
||||
|
||||
namespace MangaReader.Core.Pipeline;
|
||||
|
||||
public interface IMangaPipeline
|
||||
{
|
||||
Task RunAsync(SourceManga mangaDto);
|
||||
}
|
||||
144
MangaReader.Core/Pipeline/MangaPipeline.cs
Normal file
144
MangaReader.Core/Pipeline/MangaPipeline.cs
Normal file
@@ -0,0 +1,144 @@
|
||||
using MangaReader.Core.Data;
|
||||
using MangaReader.Core.WebCrawlers;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace MangaReader.Core.Pipeline;
|
||||
|
||||
public partial class MangaPipeline(MangaContext context) : IMangaPipeline
|
||||
{
|
||||
public async Task RunAsync(SourceManga sourceManga)
|
||||
{
|
||||
Manga manga = await GetOrAddMangaAsync(sourceManga);
|
||||
|
||||
foreach (string alternateTitle in sourceManga.AlternateTitles)
|
||||
{
|
||||
await AddTitleAsync(manga, alternateTitle);
|
||||
}
|
||||
|
||||
foreach (string genre in sourceManga.Genres)
|
||||
{
|
||||
await LinkGenreAsync(manga, genre);
|
||||
}
|
||||
|
||||
foreach (SourceMangaChapter chapter in sourceManga.Chapters)
|
||||
{
|
||||
await AddChapterAsync(manga, chapter);
|
||||
}
|
||||
|
||||
context.SaveChanges();
|
||||
}
|
||||
|
||||
private async Task<Manga> GetOrAddMangaAsync(SourceManga sourceManga)
|
||||
{
|
||||
Manga? manga = await context.Mangas.FirstOrDefaultAsync(manga => manga.Title == sourceManga.Title);
|
||||
|
||||
if (manga != null)
|
||||
return manga;
|
||||
|
||||
manga = new()
|
||||
{
|
||||
Title = sourceManga.Title,
|
||||
Slug = GenerateSlug(sourceManga.Title),
|
||||
};
|
||||
|
||||
context.Add(manga);
|
||||
|
||||
return manga;
|
||||
}
|
||||
|
||||
private static string GenerateSlug(string title)
|
||||
{
|
||||
title = title.ToLowerInvariant();
|
||||
title = RemoveInvalidCharsRegex().Replace(title, ""); // remove invalid chars
|
||||
title = RemoveSpacesWithDashRegex().Replace(title, "-"); // replace spaces with dash
|
||||
|
||||
return title.Trim('-');
|
||||
}
|
||||
|
||||
[GeneratedRegex(@"[^a-z0-9\s-]")]
|
||||
private static partial Regex RemoveInvalidCharsRegex();
|
||||
|
||||
[GeneratedRegex(@"\s+")]
|
||||
private static partial Regex RemoveSpacesWithDashRegex();
|
||||
|
||||
private async Task AddTitleAsync(Manga manga, string title)
|
||||
{
|
||||
MangaTitle? mangaTitle = await context.MangaTitles.FirstOrDefaultAsync(mt => mt.Manga == manga && mt.TitleEntry == title);
|
||||
|
||||
if (mangaTitle != null)
|
||||
return;
|
||||
|
||||
mangaTitle = new()
|
||||
{
|
||||
Manga = manga,
|
||||
TitleEntry = title,
|
||||
};
|
||||
|
||||
context.MangaTitles.Add(mangaTitle);
|
||||
}
|
||||
|
||||
private async Task LinkGenreAsync(Manga manga, string genreName)
|
||||
{
|
||||
Genre genre = await GetOrAddGenreAsync(genreName);
|
||||
|
||||
MangaGenre? mangaGenre = await context.MangaGenres.FirstOrDefaultAsync(x => x.Manga == manga && x.Genre == genre);
|
||||
|
||||
if (mangaGenre != null)
|
||||
return;
|
||||
|
||||
mangaGenre = new()
|
||||
{
|
||||
Manga = manga,
|
||||
Genre = genre
|
||||
};
|
||||
|
||||
context.MangaGenres.Add(mangaGenre);
|
||||
}
|
||||
|
||||
private async Task<Genre> GetOrAddGenreAsync(string genreName)
|
||||
{
|
||||
Genre? genre = await context.Genres.FirstOrDefaultAsync(x => x.Name == genreName);
|
||||
|
||||
if (genre != null)
|
||||
return genre;
|
||||
|
||||
genre = new()
|
||||
{
|
||||
Name = genreName,
|
||||
};
|
||||
|
||||
await context.Genres.AddAsync(genre);
|
||||
|
||||
return genre;
|
||||
}
|
||||
|
||||
private async Task AddChapterAsync(Manga manga, SourceMangaChapter sourceeMangaChapter)
|
||||
{
|
||||
MangaChapter mangaChapter = await context.MangaChapters.FirstOrDefaultAsync(x => x.ChapterNumber == sourceeMangaChapter.Number)
|
||||
?? AddMangaChapter(manga, sourceeMangaChapter);
|
||||
|
||||
if (mangaChapter.VolumeNumber is null && sourceeMangaChapter.Volume is not null)
|
||||
{
|
||||
mangaChapter.VolumeNumber = sourceeMangaChapter.Volume;
|
||||
}
|
||||
|
||||
if (mangaChapter.Title is null && sourceeMangaChapter.Name is not null)
|
||||
{
|
||||
mangaChapter.Title = sourceeMangaChapter.Name;
|
||||
}
|
||||
}
|
||||
|
||||
private MangaChapter AddMangaChapter(Manga manga, SourceMangaChapter sourceeMangaChapter)
|
||||
{
|
||||
MangaChapter mangaChapter = new()
|
||||
{
|
||||
Manga = manga,
|
||||
ChapterNumber = sourceeMangaChapter.Number
|
||||
};
|
||||
|
||||
context.MangaChapters.Add(mangaChapter);
|
||||
|
||||
return mangaChapter;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user