Compare commits
No commits in common. "32fd75bdae0314f04528f54852f030a9aa4d0641" and "14ba71005f06592fc552366ef2fb179ae5765e3b" have entirely different histories.
32fd75bdae
...
14ba71005f
@ -6,7 +6,6 @@ public class MemoryLogger : LoggerBase
|
|||||||
{
|
{
|
||||||
private readonly SortedList<DateTime, LogMessage> _logMessages = new();
|
private readonly SortedList<DateTime, LogMessage> _logMessages = new();
|
||||||
private int _lastLogMessageIndex = 0;
|
private int _lastLogMessageIndex = 0;
|
||||||
private bool _lockLogMessages = false;
|
|
||||||
|
|
||||||
public MemoryLogger(Encoding? encoding = null) : base(encoding)
|
public MemoryLogger(Encoding? encoding = null) : base(encoding)
|
||||||
{
|
{
|
||||||
@ -15,13 +14,8 @@ public class MemoryLogger : LoggerBase
|
|||||||
|
|
||||||
protected override void Write(LogMessage value)
|
protected override void Write(LogMessage value)
|
||||||
{
|
{
|
||||||
if (!_lockLogMessages)
|
|
||||||
{
|
|
||||||
_lockLogMessages = true;
|
|
||||||
while(!_logMessages.TryAdd(DateTime.Now, value))
|
while(!_logMessages.TryAdd(DateTime.Now, value))
|
||||||
Thread.Sleep(10);
|
Thread.Sleep(10);
|
||||||
_lockLogMessages = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string[] GetLogMessage()
|
public string[] GetLogMessage()
|
||||||
@ -41,12 +35,7 @@ public class MemoryLogger : LoggerBase
|
|||||||
|
|
||||||
for (int retIndex = 0; retIndex < ret.Length; retIndex++)
|
for (int retIndex = 0; retIndex < ret.Length; retIndex++)
|
||||||
{
|
{
|
||||||
if (!_lockLogMessages)
|
|
||||||
{
|
|
||||||
_lockLogMessages = true;
|
|
||||||
ret[retIndex] = _logMessages.GetValueAtIndex(_logMessages.Count - retLength + retIndex).ToString();
|
ret[retIndex] = _logMessages.GetValueAtIndex(_logMessages.Count - retLength + retIndex).ToString();
|
||||||
_lockLogMessages = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_lastLogMessageIndex = _logMessages.Count - 1;
|
_lastLogMessageIndex = _logMessages.Count - 1;
|
||||||
@ -63,12 +52,7 @@ public class MemoryLogger : LoggerBase
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!_lockLogMessages)
|
|
||||||
{
|
|
||||||
_lockLogMessages = true;
|
|
||||||
ret.Add(_logMessages.GetValueAtIndex(_lastLogMessageIndex + retIndex).ToString());
|
ret.Add(_logMessages.GetValueAtIndex(_lastLogMessageIndex + retIndex).ToString());
|
||||||
_lockLogMessages = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (NullReferenceException e)//Called when LogMessage has not finished writing
|
catch (NullReferenceException e)//Called when LogMessage has not finished writing
|
||||||
{
|
{
|
||||||
|
@ -29,9 +29,7 @@ public abstract class MangaConnector : GlobalBase
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="publicationTitle">Search-Query</param>
|
/// <param name="publicationTitle">Search-Query</param>
|
||||||
/// <returns>Publications matching the query</returns>
|
/// <returns>Publications matching the query</returns>
|
||||||
public abstract Manga[] GetManga(string publicationTitle = "");
|
public abstract Manga[] GetPublications(string publicationTitle = "");
|
||||||
|
|
||||||
public abstract Manga? GetMangaFromUrl(string url);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns all Chapters of the publication in the provided language.
|
/// Returns all Chapters of the publication in the provided language.
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
using System.Text.Json;
|
||||||
using System.Text.Json.Nodes;
|
using System.Text.Json.Nodes;
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using Tranga.Jobs;
|
using Tranga.Jobs;
|
||||||
using JsonSerializer = System.Text.Json.JsonSerializer;
|
|
||||||
|
|
||||||
namespace Tranga.MangaConnectors;
|
namespace Tranga.MangaConnectors;
|
||||||
public class MangaDex : MangaConnector
|
public class MangaDex : MangaConnector
|
||||||
@ -32,13 +31,13 @@ public class MangaDex : MangaConnector
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Manga[] GetManga(string publicationTitle = "")
|
public override Manga[] GetPublications(string publicationTitle = "")
|
||||||
{
|
{
|
||||||
Log($"Searching Publications. Term=\"{publicationTitle}\"");
|
Log($"Searching Publications. Term=\"{publicationTitle}\"");
|
||||||
const int limit = 100; //How many values we want returned at once
|
const int limit = 100; //How many values we want returned at once
|
||||||
int offset = 0; //"Page"
|
int offset = 0; //"Page"
|
||||||
int total = int.MaxValue; //How many total results are there, is updated on first request
|
int total = int.MaxValue; //How many total results are there, is updated on first request
|
||||||
HashSet<Manga> retManga = new();
|
HashSet<Manga> publications = new();
|
||||||
int loadedPublicationData = 0;
|
int loadedPublicationData = 0;
|
||||||
while (offset < total) //As long as we haven't requested all "Pages"
|
while (offset < total) //As long as we haven't requested all "Pages"
|
||||||
{
|
{
|
||||||
@ -58,34 +57,10 @@ public class MangaDex : MangaConnector
|
|||||||
|
|
||||||
JsonArray mangaInResult = result["data"]!.AsArray(); //Manga-data-Array
|
JsonArray mangaInResult = result["data"]!.AsArray(); //Manga-data-Array
|
||||||
//Loop each Manga and extract information from JSON
|
//Loop each Manga and extract information from JSON
|
||||||
foreach (JsonNode? mangaNode in mangaInResult)
|
foreach (JsonNode? mangeNode in mangaInResult)
|
||||||
{
|
{
|
||||||
Log($"Getting publication data. {++loadedPublicationData}/{total}");
|
Log($"Getting publication data. {++loadedPublicationData}/{total}");
|
||||||
Manga manga = MangaFromJsonObject((JsonObject)mangaNode);
|
JsonObject manga = (JsonObject)mangeNode!;
|
||||||
retManga.Add(manga); //Add Publication (Manga) to result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Log($"Retrieved {retManga.Count} publications. Term=\"{publicationTitle}\"");
|
|
||||||
return retManga.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Manga? GetMangaFromUrl(string url)
|
|
||||||
{
|
|
||||||
Regex idRex = new (@"https:\/\/mangadex.org\/title\/([A-z0-9-]*)\/.*");
|
|
||||||
string id = idRex.Match(url).Groups[1].Value;
|
|
||||||
Log($"Got id {id} from {url}");
|
|
||||||
DownloadClient.RequestResult requestResult =
|
|
||||||
downloadClient.MakeRequest($"https://api.mangadex.org/manga/{id}", (byte)RequestType.Manga);
|
|
||||||
if ((int)requestResult.statusCode < 200 || (int)requestResult.statusCode >= 300)
|
|
||||||
return null;
|
|
||||||
JsonObject? result = JsonSerializer.Deserialize<JsonObject>(requestResult.result);
|
|
||||||
if(result is not null)
|
|
||||||
return MangaFromJsonObject(result["data"]!.AsObject());
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Manga MangaFromJsonObject(JsonObject manga)
|
|
||||||
{
|
|
||||||
JsonObject attributes = manga["attributes"]!.AsObject();
|
JsonObject attributes = manga["attributes"]!.AsObject();
|
||||||
|
|
||||||
string publicationId = manga["id"]!.GetValue<string>();
|
string publicationId = manga["id"]!.GetValue<string>();
|
||||||
@ -147,8 +122,7 @@ public class MangaDex : MangaConnector
|
|||||||
? attributes["year"]!.GetValue<int?>()
|
? attributes["year"]!.GetValue<int?>()
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
string? originalLanguage =
|
string? originalLanguage = attributes.ContainsKey("originalLanguage") && attributes["originalLanguage"] is not null
|
||||||
attributes.ContainsKey("originalLanguage") && attributes["originalLanguage"] is not null
|
|
||||||
? attributes["originalLanguage"]!.GetValue<string?>()
|
? attributes["originalLanguage"]!.GetValue<string?>()
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
@ -168,8 +142,13 @@ public class MangaDex : MangaConnector
|
|||||||
status,
|
status,
|
||||||
publicationId
|
publicationId
|
||||||
);
|
);
|
||||||
cachedPublications.Add(pub);
|
publications.Add(pub); //Add Publication (Manga) to result
|
||||||
return pub;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cachedPublications.AddRange(publications);
|
||||||
|
Log($"Retrieved {publications.Count} publications. Term=\"{publicationTitle}\"");
|
||||||
|
return publications.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Chapter[] GetChapters(Manga manga, string language="en")
|
public override Chapter[] GetChapters(Manga manga, string language="en")
|
||||||
|
@ -19,7 +19,7 @@ public class MangaKatana : MangaConnector
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Manga[] GetManga(string publicationTitle = "")
|
public override Manga[] GetPublications(string publicationTitle = "")
|
||||||
{
|
{
|
||||||
Log($"Searching Publications. Term=\"{publicationTitle}\"");
|
Log($"Searching Publications. Term=\"{publicationTitle}\"");
|
||||||
string sanitizedTitle = string.Join('_', Regex.Matches(publicationTitle, "[A-z]*").Where(m => m.Value.Length > 0)).ToLower();
|
string sanitizedTitle = string.Join('_', Regex.Matches(publicationTitle, "[A-z]*").Where(m => m.Value.Length > 0)).ToLower();
|
||||||
@ -39,19 +39,11 @@ public class MangaKatana : MangaConnector
|
|||||||
}
|
}
|
||||||
|
|
||||||
Manga[] publications = ParsePublicationsFromHtml(requestResult.result);
|
Manga[] publications = ParsePublicationsFromHtml(requestResult.result);
|
||||||
|
cachedPublications.AddRange(publications);
|
||||||
Log($"Retrieved {publications.Length} publications. Term=\"{publicationTitle}\"");
|
Log($"Retrieved {publications.Length} publications. Term=\"{publicationTitle}\"");
|
||||||
return publications;
|
return publications;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Manga? GetMangaFromUrl(string url)
|
|
||||||
{
|
|
||||||
DownloadClient.RequestResult requestResult =
|
|
||||||
downloadClient.MakeRequest(url, 1);
|
|
||||||
if ((int)requestResult.statusCode < 200 || (int)requestResult.statusCode >= 300)
|
|
||||||
return null;
|
|
||||||
return ParseSinglePublicationFromHtml(requestResult.result, url.Split('/')[^1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Manga[] ParsePublicationsFromHtml(Stream html)
|
private Manga[] ParsePublicationsFromHtml(Stream html)
|
||||||
{
|
{
|
||||||
StreamReader reader = new(html);
|
StreamReader reader = new(html);
|
||||||
@ -71,9 +63,12 @@ public class MangaKatana : MangaConnector
|
|||||||
HashSet<Manga> ret = new();
|
HashSet<Manga> ret = new();
|
||||||
foreach (string url in urls)
|
foreach (string url in urls)
|
||||||
{
|
{
|
||||||
Manga? manga = GetMangaFromUrl(url);
|
DownloadClient.RequestResult requestResult =
|
||||||
if (manga is not null)
|
downloadClient.MakeRequest(url, 1);
|
||||||
ret.Add((Manga)manga);
|
if ((int)requestResult.statusCode < 200 || (int)requestResult.statusCode >= 300)
|
||||||
|
return Array.Empty<Manga>();
|
||||||
|
|
||||||
|
ret.Add(ParseSinglePublicationFromHtml(requestResult.result, url.Split('/')[^1]));
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret.ToArray();
|
return ret.ToArray();
|
||||||
@ -139,10 +134,8 @@ public class MangaKatana : MangaConnector
|
|||||||
year = Convert.ToInt32(yearString);
|
year = Convert.ToInt32(yearString);
|
||||||
}
|
}
|
||||||
|
|
||||||
Manga manga = new (sortName, authors.ToList(), description, altTitles, tags.ToArray(), posterUrl, coverFileNameInCache, links,
|
return new Manga(sortName, authors.ToList(), description, altTitles, tags.ToArray(), posterUrl, coverFileNameInCache, links,
|
||||||
year, originalLanguage, status, publicationId);
|
year, originalLanguage, status, publicationId);
|
||||||
cachedPublications.Add(manga);
|
|
||||||
return manga;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Chapter[] GetChapters(Manga manga, string language="en")
|
public override Chapter[] GetChapters(Manga manga, string language="en")
|
||||||
|
@ -19,7 +19,7 @@ public class Manganato : MangaConnector
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Manga[] GetManga(string publicationTitle = "")
|
public override Manga[] GetPublications(string publicationTitle = "")
|
||||||
{
|
{
|
||||||
Log($"Searching Publications. Term=\"{publicationTitle}\"");
|
Log($"Searching Publications. Term=\"{publicationTitle}\"");
|
||||||
string sanitizedTitle = string.Join('_', Regex.Matches(publicationTitle, "[A-z]*")).ToLower();
|
string sanitizedTitle = string.Join('_', Regex.Matches(publicationTitle, "[A-z]*")).ToLower();
|
||||||
@ -30,6 +30,7 @@ public class Manganato : MangaConnector
|
|||||||
return Array.Empty<Manga>();
|
return Array.Empty<Manga>();
|
||||||
|
|
||||||
Manga[] publications = ParsePublicationsFromHtml(requestResult.result);
|
Manga[] publications = ParsePublicationsFromHtml(requestResult.result);
|
||||||
|
cachedPublications.AddRange(publications);
|
||||||
Log($"Retrieved {publications.Length} publications. Term=\"{publicationTitle}\"");
|
Log($"Retrieved {publications.Length} publications. Term=\"{publicationTitle}\"");
|
||||||
return publications;
|
return publications;
|
||||||
}
|
}
|
||||||
@ -50,23 +51,16 @@ public class Manganato : MangaConnector
|
|||||||
|
|
||||||
HashSet<Manga> ret = new();
|
HashSet<Manga> ret = new();
|
||||||
foreach (string url in urls)
|
foreach (string url in urls)
|
||||||
{
|
|
||||||
Manga? manga = GetMangaFromUrl(url);
|
|
||||||
if (manga is not null)
|
|
||||||
ret.Add((Manga)manga);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Manga? GetMangaFromUrl(string url)
|
|
||||||
{
|
{
|
||||||
DownloadClient.RequestResult requestResult =
|
DownloadClient.RequestResult requestResult =
|
||||||
downloadClient.MakeRequest(url, 1);
|
downloadClient.MakeRequest(url, 1);
|
||||||
if ((int)requestResult.statusCode < 200 || (int)requestResult.statusCode >= 300)
|
if ((int)requestResult.statusCode < 200 || (int)requestResult.statusCode >= 300)
|
||||||
return null;
|
return Array.Empty<Manga>();
|
||||||
|
|
||||||
return ParseSinglePublicationFromHtml(requestResult.result, url.Split('/')[^1]);
|
ret.Add(ParseSinglePublicationFromHtml(requestResult.result, url.Split('/')[^1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Manga ParseSinglePublicationFromHtml(Stream html, string publicationId)
|
private Manga ParseSinglePublicationFromHtml(Stream html, string publicationId)
|
||||||
@ -128,10 +122,8 @@ public class Manganato : MangaConnector
|
|||||||
.First(s => s.HasClass("chapter-time")).InnerText;
|
.First(s => s.HasClass("chapter-time")).InnerText;
|
||||||
int year = Convert.ToInt32(yearString.Split(',')[^1]) + 2000;
|
int year = Convert.ToInt32(yearString.Split(',')[^1]) + 2000;
|
||||||
|
|
||||||
Manga manga = new (sortName, authors.ToList(), description, altTitles, tags.ToArray(), posterUrl, coverFileNameInCache, links,
|
return new Manga(sortName, authors.ToList(), description, altTitles, tags.ToArray(), posterUrl, coverFileNameInCache, links,
|
||||||
year, originalLanguage, status, publicationId);
|
year, originalLanguage, status, publicationId);
|
||||||
cachedPublications.Add(manga);
|
|
||||||
return manga;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Chapter[] GetChapters(Manga manga, string language="en")
|
public override Chapter[] GetChapters(Manga manga, string language="en")
|
||||||
|
@ -69,7 +69,7 @@ public class Mangasee : MangaConnector
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Manga[] GetManga(string publicationTitle = "")
|
public override Manga[] GetPublications(string publicationTitle = "")
|
||||||
{
|
{
|
||||||
Log($"Searching Publications. Term=\"{publicationTitle}\"");
|
Log($"Searching Publications. Term=\"{publicationTitle}\"");
|
||||||
string requestUrl = $"https://mangasee123.com/_search.php";
|
string requestUrl = $"https://mangasee123.com/_search.php";
|
||||||
@ -79,32 +79,11 @@ public class Mangasee : MangaConnector
|
|||||||
return Array.Empty<Manga>();
|
return Array.Empty<Manga>();
|
||||||
|
|
||||||
Manga[] publications = ParsePublicationsFromHtml(requestResult.result, publicationTitle);
|
Manga[] publications = ParsePublicationsFromHtml(requestResult.result, publicationTitle);
|
||||||
|
cachedPublications.AddRange(publications);
|
||||||
Log($"Retrieved {publications.Length} publications. Term=\"{publicationTitle}\"");
|
Log($"Retrieved {publications.Length} publications. Term=\"{publicationTitle}\"");
|
||||||
return publications;
|
return publications;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Manga? GetMangaFromUrl(string url)
|
|
||||||
{
|
|
||||||
while (this._browser is null)
|
|
||||||
{
|
|
||||||
Log("Waiting for headless browser to download...");
|
|
||||||
Thread.Sleep(1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
IPage page = _browser!.NewPageAsync().Result;
|
|
||||||
IResponse response = page.GoToAsync(url, WaitUntilNavigation.DOMContentLoaded).Result;
|
|
||||||
if (response.Ok)
|
|
||||||
{
|
|
||||||
HtmlDocument document = new();
|
|
||||||
document.LoadHtml(page.GetContentAsync().Result);
|
|
||||||
page.CloseAsync();
|
|
||||||
return ParseSinglePublicationFromHtml(document);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Manga[] ParsePublicationsFromHtml(Stream html, string publicationTitle)
|
private Manga[] ParsePublicationsFromHtml(Stream html, string publicationTitle)
|
||||||
{
|
{
|
||||||
string jsonString = new StreamReader(html).ReadToEnd();
|
string jsonString = new StreamReader(html).ReadToEnd();
|
||||||
@ -126,54 +105,74 @@ public class Mangasee : MangaConnector
|
|||||||
List<SearchResultItem> orderedFiltered =
|
List<SearchResultItem> orderedFiltered =
|
||||||
queryFiltered.OrderBy(item => item.Value).ToDictionary(item => item.Key, item => item.Value).Keys.ToList();
|
queryFiltered.OrderBy(item => item.Value).ToDictionary(item => item.Key, item => item.Value).Keys.ToList();
|
||||||
|
|
||||||
|
uint index = 1;
|
||||||
foreach (SearchResultItem orderedItem in orderedFiltered)
|
foreach (SearchResultItem orderedItem in orderedFiltered)
|
||||||
{
|
{
|
||||||
Manga? manga = GetMangaFromUrl($"https://mangasee123.com/manga/{orderedItem.i}");
|
DownloadClient.RequestResult requestResult =
|
||||||
if (manga is not null)
|
downloadClient.MakeRequest($"https://mangasee123.com/manga/{orderedItem.i}", 1);
|
||||||
ret.Add((Manga)manga);
|
if ((int)requestResult.statusCode >= 200 || (int)requestResult.statusCode < 300)
|
||||||
|
{
|
||||||
|
Log($"Retrieving Publication info: {orderedItem.s} {index++}/{orderedFiltered.Count}");
|
||||||
|
ret.Add(ParseSinglePublicationFromHtml(requestResult.result, orderedItem.s, orderedItem.i, orderedItem.a));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret.ToArray();
|
return ret.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private Manga ParseSinglePublicationFromHtml(HtmlDocument document)
|
private Manga ParseSinglePublicationFromHtml(Stream html, string sortName, string publicationId, string[] a)
|
||||||
{
|
{
|
||||||
|
StreamReader reader = new (html);
|
||||||
|
HtmlDocument document = new ();
|
||||||
|
document.LoadHtml(reader.ReadToEnd());
|
||||||
|
|
||||||
string originalLanguage = "", status = "";
|
string originalLanguage = "", status = "";
|
||||||
Dictionary<string, string> altTitles = new(), links = new();
|
Dictionary<string, string> altTitles = new(), links = new();
|
||||||
HashSet<string> tags = new();
|
HashSet<string> tags = new();
|
||||||
|
|
||||||
HtmlNode posterNode = document.DocumentNode.SelectSingleNode("//div[@class='BoxBody']//div[@class='row']//img");
|
HtmlNode posterNode =
|
||||||
|
document.DocumentNode.Descendants("img").First(img => img.HasClass("img-fluid") && img.HasClass("bottom-5"));
|
||||||
string posterUrl = posterNode.GetAttributeValue("src", "");
|
string posterUrl = posterNode.GetAttributeValue("src", "");
|
||||||
string coverFileNameInCache = SaveCoverImageToCache(posterUrl, 1);
|
string coverFileNameInCache = SaveCoverImageToCache(posterUrl, 1);
|
||||||
|
|
||||||
HtmlNode titleNode = document.DocumentNode.SelectSingleNode("//div[@class='BoxBody']//div[@class='row']//h1");
|
HtmlNode attributes = document.DocumentNode.Descendants("div")
|
||||||
string sortName = titleNode.InnerText;
|
.First(div => div.HasClass("col-md-9") && div.HasClass("col-sm-8") && div.HasClass("top-5"))
|
||||||
string publicationId = sortName;
|
.Descendants("ul").First();
|
||||||
|
|
||||||
HtmlNode[] authorsNodes = document.DocumentNode.SelectNodes("//div[@class='BoxBody']//div[@class='row']//span[text()='Author(s):']/..").Descendants("a").ToArray();
|
HtmlNode[] authorsNodes = attributes.Descendants("li")
|
||||||
|
.First(node => node.InnerText.Contains("author(s):", StringComparison.CurrentCultureIgnoreCase))
|
||||||
|
.Descendants("a").ToArray();
|
||||||
List<string> authors = new();
|
List<string> authors = new();
|
||||||
foreach(HtmlNode authorNode in authorsNodes)
|
foreach(HtmlNode authorNode in authorsNodes)
|
||||||
authors.Add(authorNode.InnerText);
|
authors.Add(authorNode.InnerText);
|
||||||
|
|
||||||
HtmlNode[] genreNodes = document.DocumentNode.SelectNodes("//div[@class='BoxBody']//div[@class='row']//span[text()='Genre(s):']/..").Descendants("a").ToArray();
|
HtmlNode[] genreNodes = attributes.Descendants("li")
|
||||||
|
.First(node => node.InnerText.Contains("genre(s):", StringComparison.CurrentCultureIgnoreCase))
|
||||||
|
.Descendants("a").ToArray();
|
||||||
foreach (HtmlNode genreNode in genreNodes)
|
foreach (HtmlNode genreNode in genreNodes)
|
||||||
tags.Add(genreNode.InnerText);
|
tags.Add(genreNode.InnerText);
|
||||||
|
|
||||||
HtmlNode yearNode = document.DocumentNode.SelectNodes("//div[@class='BoxBody']//div[@class='row']//span[text()='Released:']/..").Descendants("a").First();
|
HtmlNode yearNode = attributes.Descendants("li")
|
||||||
|
.First(node => node.InnerText.Contains("released:", StringComparison.CurrentCultureIgnoreCase))
|
||||||
|
.Descendants("a").First();
|
||||||
int year = Convert.ToInt32(yearNode.InnerText);
|
int year = Convert.ToInt32(yearNode.InnerText);
|
||||||
|
|
||||||
HtmlNode[] statusNodes = document.DocumentNode.SelectNodes("//div[@class='BoxBody']//div[@class='row']//span[text()='Status:']/..").Descendants("a").ToArray();
|
HtmlNode[] statusNodes = attributes.Descendants("li")
|
||||||
|
.First(node => node.InnerText.Contains("status:", StringComparison.CurrentCultureIgnoreCase))
|
||||||
|
.Descendants("a").ToArray();
|
||||||
foreach(HtmlNode statusNode in statusNodes)
|
foreach(HtmlNode statusNode in statusNodes)
|
||||||
if (statusNode.InnerText.Contains("publish", StringComparison.CurrentCultureIgnoreCase))
|
if (statusNode.InnerText.Contains("publish", StringComparison.CurrentCultureIgnoreCase))
|
||||||
status = statusNode.InnerText.Split(' ')[0];
|
status = statusNode.InnerText.Split(' ')[0];
|
||||||
|
|
||||||
HtmlNode descriptionNode = document.DocumentNode.SelectNodes("//div[@class='BoxBody']//div[@class='row']//span[text()='Description:']/..").Descendants("div").First();
|
HtmlNode descriptionNode = attributes.Descendants("li").First(node => node.InnerText.Contains("description:", StringComparison.CurrentCultureIgnoreCase)).Descendants("div").First();
|
||||||
string description = descriptionNode.InnerText;
|
string description = descriptionNode.InnerText;
|
||||||
|
|
||||||
Manga manga = new (sortName, authors.ToList(), description, altTitles, tags.ToArray(), posterUrl, coverFileNameInCache, links,
|
int i = 0;
|
||||||
|
foreach(string at in a)
|
||||||
|
altTitles.Add((i++).ToString(), at);
|
||||||
|
|
||||||
|
return new Manga(sortName, authors, description, altTitles, tags.ToArray(), posterUrl, coverFileNameInCache, links,
|
||||||
year, originalLanguage, status, publicationId);
|
year, originalLanguage, status, publicationId);
|
||||||
cachedPublications.Add(manga);
|
|
||||||
return manga;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReSharper disable once ClassNeverInstantiated.Local Will be instantiated during deserialization
|
// ReSharper disable once ClassNeverInstantiated.Local Will be instantiated during deserialization
|
||||||
|
@ -134,25 +134,14 @@ public class Server : GlobalBase
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "Manga/FromConnector":
|
case "Manga/FromConnector":
|
||||||
requestVariables.TryGetValue("title", out string? title);
|
|
||||||
requestVariables.TryGetValue("url", out string? url);
|
|
||||||
if (!requestVariables.TryGetValue("connector", out connectorName) ||
|
if (!requestVariables.TryGetValue("connector", out connectorName) ||
|
||||||
!_parent.TryGetConnector(connectorName, out connector) ||
|
!requestVariables.TryGetValue("title", out string? title) ||
|
||||||
(title is null && url is null))
|
!_parent.TryGetConnector(connectorName, out connector))
|
||||||
{
|
{
|
||||||
SendResponse(HttpStatusCode.BadRequest, response);
|
SendResponse(HttpStatusCode.BadRequest, response);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
SendResponse(HttpStatusCode.OK, response, connector!.GetPublications(title));
|
||||||
if (url is not null)
|
|
||||||
{
|
|
||||||
HashSet<Manga> ret = new();
|
|
||||||
manga = connector!.GetMangaFromUrl(url);
|
|
||||||
if (manga is not null)
|
|
||||||
ret.Add((Manga)manga);
|
|
||||||
SendResponse(HttpStatusCode.OK, response, ret);
|
|
||||||
}else
|
|
||||||
SendResponse(HttpStatusCode.OK, response, connector!.GetManga(title!));
|
|
||||||
break;
|
break;
|
||||||
case "Manga/Chapters":
|
case "Manga/Chapters":
|
||||||
if(!requestVariables.TryGetValue("connector", out connectorName) ||
|
if(!requestVariables.TryGetValue("connector", out connectorName) ||
|
||||||
|
Loading…
Reference in New Issue
Block a user