2023-05-19 16:23:37 +02:00
|
|
|
|
using Newtonsoft.Json;
|
2023-05-18 20:26:47 +02:00
|
|
|
|
|
|
|
|
|
namespace Tranga;
|
2023-05-17 23:23:01 +02:00
|
|
|
|
|
2023-05-19 19:53:59 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Contains information on a Publication (Manga)
|
|
|
|
|
/// </summary>
|
2023-05-20 01:06:00 +02:00
|
|
|
|
public readonly struct Publication
|
2023-05-17 23:23:01 +02:00
|
|
|
|
{
|
|
|
|
|
public string sortName { get; }
|
2023-05-20 01:06:12 +02:00
|
|
|
|
// ReSharper disable UnusedAutoPropertyAccessor.Global we need it, trust
|
2023-05-21 21:12:32 +02:00
|
|
|
|
[JsonIgnore]public Dictionary<string,string> altTitles { get; }
|
2023-05-20 01:06:12 +02:00
|
|
|
|
// ReSharper disable trice MemberCanBePrivate.Global, trust
|
2023-05-18 15:47:05 +02:00
|
|
|
|
public string? description { get; }
|
2023-05-17 23:23:01 +02:00
|
|
|
|
public string[] tags { get; }
|
2023-05-18 18:55:11 +02:00
|
|
|
|
public string? posterUrl { get; }
|
2023-05-21 21:12:32 +02:00
|
|
|
|
[JsonIgnore]public Dictionary<string,string> links { get; }
|
2023-05-18 15:47:05 +02:00
|
|
|
|
public int? year { get; }
|
|
|
|
|
public string? originalLanguage { get; }
|
|
|
|
|
public string status { get; }
|
2023-05-18 19:54:40 +02:00
|
|
|
|
public string folderName { get; }
|
2023-05-18 15:47:05 +02:00
|
|
|
|
public string downloadUrl { get; }
|
2023-05-21 16:22:14 +02:00
|
|
|
|
public string internalId { get; }
|
2023-05-17 23:23:01 +02:00
|
|
|
|
|
2023-05-21 21:12:32 +02:00
|
|
|
|
public readonly struct ValueTuple
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Publication(string sortName, string? description, Dictionary<string,string> altTitles, string[] tags, string? posterUrl, Dictionary<string,string>? links, int? year, string? originalLanguage, string status, string downloadUrl)
|
2023-05-17 23:23:01 +02:00
|
|
|
|
{
|
|
|
|
|
this.sortName = sortName;
|
|
|
|
|
this.description = description;
|
2023-05-18 15:47:05 +02:00
|
|
|
|
this.altTitles = altTitles;
|
2023-05-17 23:23:01 +02:00
|
|
|
|
this.tags = tags;
|
|
|
|
|
this.posterUrl = posterUrl;
|
2023-05-21 21:12:32 +02:00
|
|
|
|
this.links = links ?? new Dictionary<string, string>();
|
2023-05-18 15:47:05 +02:00
|
|
|
|
this.year = year;
|
|
|
|
|
this.originalLanguage = originalLanguage;
|
|
|
|
|
this.status = status;
|
|
|
|
|
this.downloadUrl = downloadUrl;
|
2023-05-20 01:31:06 +02:00
|
|
|
|
this.folderName = string.Concat(sortName.Split(Path.GetInvalidPathChars().Concat(Path.GetInvalidFileNameChars()).ToArray()));
|
2023-05-21 21:12:32 +02:00
|
|
|
|
this.internalId = Guid.NewGuid().ToString();
|
2023-05-17 23:23:01 +02:00
|
|
|
|
}
|
2023-05-20 15:05:41 +02:00
|
|
|
|
|
2023-05-19 19:53:59 +02:00
|
|
|
|
/// <returns>Serialized JSON String for series.json</returns>
|
2023-05-20 00:19:40 +02:00
|
|
|
|
public string GetSeriesInfoJson()
|
2023-05-18 20:26:47 +02:00
|
|
|
|
{
|
|
|
|
|
SeriesInfo si = new (new Metadata(this.sortName, this.year.ToString() ?? string.Empty, this.status, this.description ?? ""));
|
2023-05-19 16:23:37 +02:00
|
|
|
|
return System.Text.Json.JsonSerializer.Serialize(si);
|
2023-05-18 20:26:47 +02:00
|
|
|
|
}
|
2023-05-19 19:53:59 +02:00
|
|
|
|
|
|
|
|
|
//Only for series.json
|
|
|
|
|
private struct SeriesInfo
|
2023-05-18 20:26:47 +02:00
|
|
|
|
{
|
2023-05-20 01:06:12 +02:00
|
|
|
|
// ReSharper disable once UnusedAutoPropertyAccessor.Local we need it, trust
|
2023-05-18 21:08:09 +02:00
|
|
|
|
[JsonRequired]public Metadata metadata { get; }
|
2023-05-18 20:26:47 +02:00
|
|
|
|
public SeriesInfo(Metadata metadata) => this.metadata = metadata;
|
|
|
|
|
}
|
2023-05-19 19:53:59 +02:00
|
|
|
|
|
2023-05-19 23:02:08 +02:00
|
|
|
|
//Only for series.json what an abomination, why are all the fields not-null????
|
2023-05-19 19:53:59 +02:00
|
|
|
|
private struct Metadata
|
2023-05-18 20:26:47 +02:00
|
|
|
|
{
|
2023-05-20 15:05:41 +02:00
|
|
|
|
// ReSharper disable UnusedAutoPropertyAccessor.Local we need them all, trust me
|
2023-05-19 22:59:16 +02:00
|
|
|
|
[JsonRequired] public string type { get; }
|
|
|
|
|
[JsonRequired] public string publisher { get; }
|
|
|
|
|
// ReSharper disable twice IdentifierTypo
|
|
|
|
|
[JsonRequired] public int comicid { get; }
|
|
|
|
|
[JsonRequired] public string booktype { get; }
|
2023-05-20 15:05:41 +02:00
|
|
|
|
// ReSharper disable InconsistentNaming This one property is capitalized. Why?
|
2023-05-19 22:59:16 +02:00
|
|
|
|
[JsonRequired] public string ComicImage { get; }
|
|
|
|
|
[JsonRequired] public int total_issues { get; }
|
|
|
|
|
[JsonRequired] public string publication_run { get; }
|
2023-05-18 21:08:09 +02:00
|
|
|
|
[JsonRequired]public string name { get; }
|
|
|
|
|
[JsonRequired]public string year { get; }
|
|
|
|
|
[JsonRequired]public string status { get; }
|
|
|
|
|
[JsonRequired]public string description_text { get; }
|
2023-05-18 20:26:47 +02:00
|
|
|
|
|
|
|
|
|
public Metadata(string name, string year, string status, string description_text)
|
|
|
|
|
{
|
|
|
|
|
this.name = name;
|
|
|
|
|
this.year = year;
|
2023-05-19 22:59:16 +02:00
|
|
|
|
if(status == "ongoing" || status == "hiatus")
|
|
|
|
|
this.status = "Continuing";
|
|
|
|
|
else if (status == "completed" || status == "cancelled")
|
|
|
|
|
this.status = "Ended";
|
|
|
|
|
else
|
|
|
|
|
this.status = status;
|
2023-05-18 20:26:47 +02:00
|
|
|
|
this.description_text = description_text;
|
2023-05-19 22:59:16 +02:00
|
|
|
|
|
2023-05-20 15:05:41 +02:00
|
|
|
|
//kill it with fire, but otherwise Komga will not parse
|
2023-05-19 22:59:16 +02:00
|
|
|
|
type = "Manga";
|
|
|
|
|
publisher = "";
|
|
|
|
|
comicid = 0;
|
|
|
|
|
booktype = "";
|
|
|
|
|
ComicImage = "";
|
|
|
|
|
total_issues = 0;
|
|
|
|
|
publication_run = "";
|
2023-05-18 20:26:47 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
2023-05-17 23:23:01 +02:00
|
|
|
|
}
|