diff --git a/Tranga/Connector.cs b/Tranga/Connector.cs index c2339ea..150ba11 100644 --- a/Tranga/Connector.cs +++ b/Tranga/Connector.cs @@ -14,9 +14,9 @@ public abstract class Connector internal string downloadLocation { get; } //Location of local files protected DownloadClient downloadClient { get; init; } - protected Logger? logger; + protected readonly Logger? logger; - protected string imageCachePath; + protected readonly string imageCachePath; protected Connector(string downloadLocation, string imageCachePath, Logger? logger) { @@ -61,23 +61,25 @@ public abstract class Connector /// /// Publication to retrieve Cover for /// TrangaSettings - public abstract void CloneCoverFromCache(Publication publication, TrangaSettings settings); - - /// - /// Saves the series-info to series.json in the Publication Folder - /// - /// Publication to save series.json for - public void SaveSeriesInfo(Publication publication) + public void CloneCoverFromCache(Publication publication, TrangaSettings settings) { - logger?.WriteLine(this.GetType().ToString(), $"Saving series.json for {publication.sortName}"); - //Check if Publication already has a Folder and a series.json + logger?.WriteLine(this.GetType().ToString(), $"Cloning cover {publication.sortName}"); + //Check if Publication already has a Folder and cover string publicationFolder = Path.Join(downloadLocation, publication.folderName); + if(!Directory.Exists(publicationFolder)) Directory.CreateDirectory(publicationFolder); - - string seriesInfoPath = Path.Join(publicationFolder, "series.json"); - if(!File.Exists(seriesInfoPath)) - File.WriteAllText(seriesInfoPath,publication.GetSeriesInfoJson()); + DirectoryInfo dirInfo = new (publicationFolder); + if (dirInfo.EnumerateFiles().Any(info => info.Name.Contains("cover."))) + { + logger?.WriteLine(this.GetType().ToString(), $"Cover exists {publication.sortName}"); + return; + } + + string fileInCache = Path.Join(settings.coverImageCache, publication.coverFileNameInCache); + string newFilePath = Path.Join(publicationFolder, $"cover.{Path.GetFileName(fileInCache).Split('.')[^1]}" ); + logger?.WriteLine(this.GetType().ToString(), $"Cloning cover {fileInCache} -> {newFilePath}"); + File.Copy(fileInCache, newFilePath, true); } /// @@ -85,7 +87,7 @@ public abstract class Connector /// See ComicInfo.xml /// /// XML-string - protected static string CreateComicInfo(Publication publication, Chapter chapter, Logger? logger) + protected static string GetComicInfoXmlString(Publication publication, Chapter chapter, Logger? logger) { logger?.WriteLine("Connector", $"Creating ComicInfo.Xml for {publication.sortName} {publication.internalId} {chapter.volumeNumber}-{chapter.chapterNumber}"); XElement comicInfo = new XElement("ComicInfo", @@ -103,16 +105,16 @@ public abstract class Connector /// Checks if a chapter-archive is already present /// /// true if chapter is present - public bool ChapterIsDownloaded(Publication publication, Chapter chapter) + public bool CheckChapterIsDownloaded(Publication publication, Chapter chapter) { - return File.Exists(CreateFullFilepath(publication, chapter)); + return File.Exists(GetArchiveFilePath(publication, chapter)); } /// /// Creates full file path of chapter-archive /// /// Filepath - protected string CreateFullFilepath(Publication publication, Chapter chapter) + protected string GetArchiveFilePath(Publication publication, Chapter chapter) { return Path.Join(downloadLocation, publication.folderName, $"{chapter.fileName}.cbz"); } @@ -122,9 +124,8 @@ public abstract class Connector /// /// /// - /// DownloadClient of the connector /// Requesttype for ratelimit - protected static void DownloadImage(string imageUrl, string fullPath, DownloadClient downloadClient, byte requestType) + private void DownloadImage(string imageUrl, string fullPath, byte requestType) { DownloadClient.RequestResult requestResult = downloadClient.MakeRequest(imageUrl, requestType); byte[] buffer = new byte[requestResult.result.Length]; @@ -137,11 +138,9 @@ public abstract class Connector /// /// List of URLs to download Images from /// Full path to save archive to (without file ending .cbz) - /// DownloadClient of the connector - /// /// Path of the generate Chapter ComicInfo.xml, if it was generated /// RequestType for RateLimits - protected static void DownloadChapterImages(string[] imageUrls, string saveArchiveFilePath, DownloadClient downloadClient, byte requestType, Logger? logger, string? comicInfoPath = null) + protected void DownloadChapterImages(string[] imageUrls, string saveArchiveFilePath, byte requestType, string? comicInfoPath = null) { logger?.WriteLine("Connector", $"Downloading Images for {saveArchiveFilePath}"); //Check if Publication Directory already exists @@ -162,7 +161,7 @@ public abstract class Connector string[] split = imageUrl.Split('.'); string extension = split[^1]; logger?.WriteLine("Connector", $"Downloading Image {chapter + 1}/{imageUrls.Length}"); - DownloadImage(imageUrl, Path.Join(tempFolder, $"{chapter++}.{extension}"), downloadClient, requestType); + DownloadImage(imageUrl, Path.Join(tempFolder, $"{chapter++}.{extension}"), requestType); } if(comicInfoPath is not null) diff --git a/Tranga/Connectors/MangaDex.cs b/Tranga/Connectors/MangaDex.cs index 37beaac..b3bad9b 100644 --- a/Tranga/Connectors/MangaDex.cs +++ b/Tranga/Connectors/MangaDex.cs @@ -38,6 +38,7 @@ public class MangaDex : Connector int offset = 0; //"Page" int total = int.MaxValue; //How many total results are there, is updated on first request HashSet publications = new(); + int loadedPublicationData = 0; while (offset < total) //As long as we haven't requested all "Pages" { //Request next Page @@ -55,10 +56,10 @@ public class MangaDex : Connector total = result["total"]!.GetValue(); //Update the total number of Publications JsonArray mangaInResult = result["data"]!.AsArray(); //Manga-data-Array - logger?.WriteLine(this.GetType().ToString(), $"Getting publication data."); //Loop each Manga and extract information from JSON foreach (JsonNode? mangeNode in mangaInResult) { + logger?.WriteLine(this.GetType().ToString(), $"Getting publication data. {++loadedPublicationData}/{total}"); JsonObject manga = (JsonObject)mangeNode!; JsonObject attributes = manga["attributes"]!.AsObject(); @@ -224,10 +225,10 @@ public class MangaDex : Connector imageUrls.Add($"{baseUrl}/data/{hash}/{image!.GetValue()}"); string comicInfoPath = Path.GetTempFileName(); - File.WriteAllText(comicInfoPath, CreateComicInfo(publication, chapter, logger)); + File.WriteAllText(comicInfoPath, GetComicInfoXmlString(publication, chapter, logger)); //Download Chapter-Images - DownloadChapterImages(imageUrls.ToArray(), CreateFullFilepath(publication, chapter), downloadClient, (byte)RequestType.AtHomeServer, logger, comicInfoPath); + DownloadChapterImages(imageUrls.ToArray(), GetArchiveFilePath(publication, chapter), (byte)RequestType.AtHomeServer, comicInfoPath); } private string? GetCoverUrl(string publicationId, string? posterId) @@ -273,27 +274,6 @@ public class MangaDex : Connector return author; } - public override void CloneCoverFromCache(Publication publication, TrangaSettings settings) - { - logger?.WriteLine(this.GetType().ToString(), $"Cloning cover {publication.sortName}"); - //Check if Publication already has a Folder and cover - string publicationFolder = Path.Join(downloadLocation, publication.folderName); - - if(!Directory.Exists(publicationFolder)) - Directory.CreateDirectory(publicationFolder); - DirectoryInfo dirInfo = new (publicationFolder); - if (dirInfo.EnumerateFiles().Any(info => info.Name.Contains("cover."))) - { - logger?.WriteLine(this.GetType().ToString(), $"Cover exists {publication.sortName}"); - return; - } - - string fileInCache = Path.Join(settings.coverImageCache, publication.coverFileNameInCache); - string newFilePath = Path.Join(publicationFolder, $"cover.{Path.GetFileName(fileInCache).Split('.')[^1]}" ); - logger?.WriteLine(this.GetType().ToString(), $"Cloning cover {fileInCache} -> {newFilePath}"); - File.Copy(fileInCache, newFilePath, true); - } - private string SaveImage(string url) { string[] split = url.Split('/'); diff --git a/Tranga/Publication.cs b/Tranga/Publication.cs index bc8004a..07e7715 100644 --- a/Tranga/Publication.cs +++ b/Tranga/Publication.cs @@ -47,6 +47,16 @@ public readonly struct Publication string onlyLowerLetters = string.Concat(this.sortName.ToLower().Where(Char.IsLetter)); this.internalId = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{onlyLowerLetters}{this.year}")); } + + public void SaveSeriesInfoJson(string downloadDirectory) + { + string publicationFolder = Path.Join(downloadDirectory, this.folderName); + if(!Directory.Exists(publicationFolder)) + Directory.CreateDirectory(publicationFolder); + string seriesInfoPath = Path.Join(publicationFolder, "series.json"); + if(!File.Exists(seriesInfoPath)) + File.WriteAllText(seriesInfoPath,this.GetSeriesInfoJson()); + } /// Serialized JSON String for series.json public string GetSeriesInfoJson() diff --git a/Tranga/TaskExecutor.cs b/Tranga/TaskExecutor.cs index b9cd75b..284cb1e 100644 --- a/Tranga/TaskExecutor.cs +++ b/Tranga/TaskExecutor.cs @@ -100,9 +100,7 @@ public static class TaskExecutor connector.CloneCoverFromCache(publication, settings); - string seriesInfoPath = Path.Join(publicationFolder, "series.json"); - if(!File.Exists(seriesInfoPath)) - File.WriteAllText(seriesInfoPath,publication.GetSeriesInfoJson()); + publication.SaveSeriesInfoJson(connector.downloadLocation); foreach(Chapter newChapter in newChapters) connector.DownloadChapter(publication, newChapter); @@ -122,7 +120,7 @@ public static class TaskExecutor chapterCollection.TryAdd(publication, newChaptersList); //To ensure publication is actually in collection Chapter[] newChapters = connector.GetChapters(publication, language); - newChaptersList = newChapters.Where(nChapter => !connector.ChapterIsDownloaded(publication, nChapter)).ToList(); + newChaptersList = newChapters.Where(nChapter => !connector.CheckChapterIsDownloaded(publication, nChapter)).ToList(); return newChaptersList; }