diff --git a/Tranga/Connector.cs b/Tranga/Connector.cs index 49c8172..3331517 100644 --- a/Tranga/Connector.cs +++ b/Tranga/Connector.cs @@ -166,7 +166,7 @@ public abstract class Connector new XElement("Tags", string.Join(',',publication.tags)), new XElement("LanguageISO", publication.originalLanguage), new XElement("Title", chapter.name), - new XElement("Writer", publication.author), + new XElement("Writer", string.Join(',', publication.authors)), new XElement("Volume", chapter.volumeNumber), new XElement("Number", chapter.chapterNumber) ); diff --git a/Tranga/Connectors/MangaDex.cs b/Tranga/Connectors/MangaDex.cs index 6e0962d..6f192ee 100644 --- a/Tranga/Connectors/MangaDex.cs +++ b/Tranga/Connectors/MangaDex.cs @@ -93,19 +93,21 @@ public class MangaDex : Connector } string? posterId = null; - string? authorId = null; + HashSet authorIds = new(); if (manga.ContainsKey("relationships") && manga["relationships"] is not null) { JsonArray relationships = manga["relationships"]!.AsArray(); posterId = relationships.FirstOrDefault(relationship => relationship!["type"]!.GetValue() == "cover_art")!["id"]!.GetValue(); - authorId = relationships.FirstOrDefault(relationship => relationship!["type"]!.GetValue() == "author")!["id"]!.GetValue(); + foreach (JsonNode node in relationships.Where(relationship => + relationship!["type"]!.GetValue() == "author")) + authorIds.Add(node!["id"]!.GetValue()); } string? coverUrl = GetCoverUrl(publicationId, posterId); string? coverCacheName = null; if (coverUrl is not null) coverCacheName = SaveCoverImageToCache(coverUrl, (byte)RequestType.AtHomeServer); - - string? author = GetAuthor(authorId); + + List authors = GetAuthors(authorIds); Dictionary linksDict = new(); if (attributes.ContainsKey("links") && attributes["links"] is not null) @@ -129,7 +131,7 @@ public class MangaDex : Connector Publication pub = new ( title, - author, + authors, description, altTitlesDict, tags.ToArray(), @@ -257,21 +259,23 @@ public class MangaDex : Connector return coverUrl; } - private string? GetAuthor(string? authorId) + private List GetAuthors(IEnumerable authorIds) { - if (authorId is null) - return null; - - DownloadClient.RequestResult requestResult = - downloadClient.MakeRequest($"https://api.mangadex.org/author/{authorId}", (byte)RequestType.Author); - if (requestResult.statusCode != HttpStatusCode.OK) - return null; - JsonObject? result = JsonSerializer.Deserialize(requestResult.result); - if (result is null) - return null; + List ret = new(); + foreach (string authorId in authorIds) + { + DownloadClient.RequestResult requestResult = + downloadClient.MakeRequest($"https://api.mangadex.org/author/{authorId}", (byte)RequestType.Author); + if (requestResult.statusCode != HttpStatusCode.OK) + return ret; + JsonObject? result = JsonSerializer.Deserialize(requestResult.result); + if (result is null) + return ret; - string author = result["data"]!["attributes"]!["name"]!.GetValue(); - logger?.WriteLine(this.GetType().ToString(), $"Got author {authorId} -> {author}"); - return author; + string authorName = result["data"]!["attributes"]!["name"]!.GetValue(); + ret.Add(authorName); + logger?.WriteLine(this.GetType().ToString(), $"Got author {authorId} -> {authorName}"); + } + return ret; } } \ No newline at end of file diff --git a/Tranga/Connectors/Manganato.cs b/Tranga/Connectors/Manganato.cs index 3a1d0ab..4e5b2d1 100644 --- a/Tranga/Connectors/Manganato.cs +++ b/Tranga/Connectors/Manganato.cs @@ -71,8 +71,8 @@ public class Manganato : Connector Dictionary altTitles = new(); Dictionary? links = null; HashSet tags = new(); - string? author = null, originalLanguage = null; - int? year = DateTime.Now.Year; + string[] authors = Array.Empty(); + string originalLanguage = ""; HtmlNode infoNode = document.DocumentNode.Descendants("div").First(d => d.HasClass("story-info-right")); @@ -94,7 +94,7 @@ public class Manganato : Connector altTitles.Add(i.ToString(), alts[i]); break; case "authors": - author = value; + authors = value.Split('-'); break; case "status": status = value; @@ -119,9 +119,9 @@ public class Manganato : Connector string yearString = document.DocumentNode.Descendants("li").Last(li => li.HasClass("a-h")).Descendants("span") .First(s => s.HasClass("chapter-time")).InnerText; - year = Convert.ToInt32(yearString.Split(',')[^1]) + 2000; + int year = Convert.ToInt32(yearString.Split(',')[^1]) + 2000; - return new Publication(sortName, author, description, altTitles, tags.ToArray(), posterUrl, coverFileNameInCache, links, + return new Publication(sortName, authors.ToList(), description, altTitles, tags.ToArray(), posterUrl, coverFileNameInCache, links, year, originalLanguage, status, publicationId); } diff --git a/Tranga/Connectors/Mangasee.cs b/Tranga/Connectors/Mangasee.cs index 1e8f9d4..33c4256 100644 --- a/Tranga/Connectors/Mangasee.cs +++ b/Tranga/Connectors/Mangasee.cs @@ -141,10 +141,9 @@ public class Mangasee : Connector HtmlNode[] authorsNodes = attributes.Descendants("li") .First(node => node.InnerText.Contains("author(s):", StringComparison.CurrentCultureIgnoreCase)) .Descendants("a").ToArray(); - string[] authors = new string[authorsNodes.Length]; - for (int j = 0; j < authors.Length; j++) - authors[j] = authorsNodes[j].InnerText; - string author = string.Join(" - ", authors); + List authors = new(); + foreach(HtmlNode authorNode in authorsNodes) + authors.Add(authorNode.InnerText); HtmlNode[] genreNodes = attributes.Descendants("li") .First(node => node.InnerText.Contains("genre(s):", StringComparison.CurrentCultureIgnoreCase)) @@ -171,7 +170,7 @@ public class Mangasee : Connector foreach(string at in a) altTitles.Add((i++).ToString(), at); - return new Publication(sortName, author, description, altTitles, tags.ToArray(), posterUrl, coverFileNameInCache, links, + return new Publication(sortName, authors, description, altTitles, tags.ToArray(), posterUrl, coverFileNameInCache, links, year, originalLanguage, status, publicationId); } diff --git a/Tranga/Publication.cs b/Tranga/Publication.cs index 82a1247..60ea847 100644 --- a/Tranga/Publication.cs +++ b/Tranga/Publication.cs @@ -12,7 +12,7 @@ namespace Tranga; public readonly struct Publication { public string sortName { get; } - public string? author { get; } + public List authors { get; } public Dictionary altTitles { get; } // ReSharper disable trice MemberCanBePrivate.Global, trust public string? description { get; } @@ -29,10 +29,10 @@ public readonly struct Publication private static readonly Regex LegalCharacters = new Regex(@"[A-Z]*[a-z]*[0-9]* *\.*-*,*'*\'*\)*\(*~*!*"); - public Publication(string sortName, string? author, string? description, Dictionary altTitles, string[] tags, string? posterUrl, string? coverFileNameInCache, Dictionary? links, int? year, string? originalLanguage, string status, string publicationId) + public Publication(string sortName, List authors, string? description, Dictionary altTitles, string[] tags, string? posterUrl, string? coverFileNameInCache, Dictionary? links, int? year, string? originalLanguage, string status, string publicationId) { this.sortName = sortName; - this.author = author; + this.authors = authors; this.description = description; this.altTitles = altTitles; this.tags = tags;