Compare commits
No commits in common. "a1202a875d42b0e08074355409f2dfe8ecba93f4" and "e70a14ca5670990bf9e2a0ca35dfd6cbad062b4b" have entirely different histories.
a1202a875d
...
e70a14ca56
@ -276,7 +276,7 @@ public class RequestHandler
|
|||||||
return null;
|
return null;
|
||||||
if(title.Length < 4)
|
if(title.Length < 4)
|
||||||
return null;
|
return null;
|
||||||
return connector1.GetPublications(title);
|
return _taskManager.GetPublicationsFromConnector(connector1, title);
|
||||||
case "/Publications/Chapters":
|
case "/Publications/Chapters":
|
||||||
string[] yes = { "true", "yes", "1", "y" };
|
string[] yes = { "true", "yes", "1", "y" };
|
||||||
variables.TryGetValue("connectorName", out string? connectorName2);
|
variables.TryGetValue("connectorName", out string? connectorName2);
|
||||||
@ -297,7 +297,7 @@ public class RequestHandler
|
|||||||
return null;
|
return null;
|
||||||
|
|
||||||
if(newOnly)
|
if(newOnly)
|
||||||
return connector2.GetNewChaptersList((Publication)publication, language??"en", ref _taskManager.collection).ToArray();
|
return _taskManager.GetNewChaptersList(connector2, (Publication)publication, language??"en").ToArray();
|
||||||
else if (existingOnly)
|
else if (existingOnly)
|
||||||
return _taskManager.GetExistingChaptersList(connector2, (Publication)publication, language ?? "en").ToArray();
|
return _taskManager.GetExistingChaptersList(connector2, (Publication)publication, language ?? "en").ToArray();
|
||||||
else
|
else
|
||||||
|
@ -565,7 +565,7 @@ public static class Tranga_Cli
|
|||||||
Console.WriteLine("Publication search query (leave empty for all):");
|
Console.WriteLine("Publication search query (leave empty for all):");
|
||||||
string? query = Console.ReadLine();
|
string? query = Console.ReadLine();
|
||||||
|
|
||||||
Publication[] publications = connector.GetPublications(query ?? "");
|
Publication[] publications = taskManager.GetPublicationsFromConnector(connector, query ?? "");
|
||||||
|
|
||||||
if (publications.Length < 1)
|
if (publications.Length < 1)
|
||||||
{
|
{
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Xml.Linq;
|
||||||
using Logging;
|
using Logging;
|
||||||
using Tranga.TrangaTasks;
|
using Tranga.TrangaTasks;
|
||||||
using static System.IO.UnixFileMode;
|
using static System.IO.UnixFileMode;
|
||||||
@ -47,24 +48,6 @@ public abstract class Connector
|
|||||||
/// <returns>Array of Chapters matching Publication and Language</returns>
|
/// <returns>Array of Chapters matching Publication and Language</returns>
|
||||||
public abstract Chapter[] GetChapters(Publication publication, string language = "");
|
public abstract Chapter[] GetChapters(Publication publication, string language = "");
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Updates the available Chapters of a Publication
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="publication">Publication to check</param>
|
|
||||||
/// <param name="language">Language to receive chapters for</param>
|
|
||||||
/// <param name="collection"></param>
|
|
||||||
/// <returns>List of Chapters that were previously not in collection</returns>
|
|
||||||
public List<Chapter> GetNewChaptersList(Publication publication, string language, ref HashSet<Publication> collection)
|
|
||||||
{
|
|
||||||
Chapter[] newChapters = this.GetChapters(publication, language);
|
|
||||||
collection.Add(publication);
|
|
||||||
logger?.WriteLine(this.GetType().ToString(), "Checking for duplicates");
|
|
||||||
List<Chapter> newChaptersList = newChapters.Where(nChapter => !nChapter.CheckChapterIsDownloaded(settings.downloadLocation)).ToList();
|
|
||||||
logger?.WriteLine(this.GetType().ToString(), $"{newChaptersList.Count} new chapters.");
|
|
||||||
|
|
||||||
return newChaptersList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Chapter[] SelectChapters(Publication publication, string searchTerm, string? language = null)
|
public Chapter[] SelectChapters(Publication publication, string searchTerm, string? language = null)
|
||||||
{
|
{
|
||||||
Chapter[] availableChapters = this.GetChapters(publication, language??"en");
|
Chapter[] availableChapters = this.GetChapters(publication, language??"en");
|
||||||
|
@ -194,7 +194,6 @@ public class MangaDex : Connector
|
|||||||
? attributes["chapter"]!.GetValue<string>()
|
? attributes["chapter"]!.GetValue<string>()
|
||||||
: "null";
|
: "null";
|
||||||
|
|
||||||
if(chapterNum is not "null")
|
|
||||||
chapters.Add(new Chapter(publication, title, volume, chapterNum, chapterId));
|
chapters.Add(new Chapter(publication, title, volume, chapterNum, chapterId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -204,7 +203,7 @@ public class MangaDex : Connector
|
|||||||
{
|
{
|
||||||
NumberDecimalSeparator = "."
|
NumberDecimalSeparator = "."
|
||||||
};
|
};
|
||||||
logger?.WriteLine(this.GetType().ToString(), $"Done getting {chapters.Count} Chapters for {publication.internalId}");
|
logger?.WriteLine(this.GetType().ToString(), $"Done getting Chapters for {publication.internalId}");
|
||||||
return chapters.OrderBy(chapter => Convert.ToSingle(chapter.chapterNumber, chapterNumberFormatInfo)).ToArray();
|
return chapters.OrderBy(chapter => Convert.ToSingle(chapter.chapterNumber, chapterNumberFormatInfo)).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ namespace Tranga;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class TaskManager
|
public class TaskManager
|
||||||
{
|
{
|
||||||
public HashSet<Publication> collection = new();
|
public Dictionary<Publication, List<Chapter>> chapterCollection = new();
|
||||||
private HashSet<TrangaTask> _allTasks = new();
|
private HashSet<TrangaTask> _allTasks = new();
|
||||||
private readonly Dictionary<TrangaTask, CancellationTokenSource> _runningTasks = new ();
|
private readonly Dictionary<TrangaTask, CancellationTokenSource> _runningTasks = new ();
|
||||||
private bool _continueRunning = true;
|
private bool _continueRunning = true;
|
||||||
@ -89,21 +89,6 @@ public class TaskManager
|
|||||||
timedOutTask.state = TrangaTask.ExecutionState.Failed;
|
timedOutTask.state = TrangaTask.ExecutionState.Failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (TrangaTask finishedTask in _allTasks
|
|
||||||
.Where(taskQuery => taskQuery.state is TrangaTask.ExecutionState.Success).ToArray())
|
|
||||||
{
|
|
||||||
if(finishedTask is DownloadChapterTask)
|
|
||||||
{
|
|
||||||
DeleteTask(finishedTask);
|
|
||||||
finishedTask.state = TrangaTask.ExecutionState.Success;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
finishedTask.state = TrangaTask.ExecutionState.Waiting;
|
|
||||||
this._runningTasks.Remove(finishedTask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (TrangaTask failedTask in _allTasks.Where(taskQuery =>
|
foreach (TrangaTask failedTask in _allTasks.Where(taskQuery =>
|
||||||
taskQuery.state is TrangaTask.ExecutionState.Failed).ToArray())
|
taskQuery.state is TrangaTask.ExecutionState.Failed).ToArray())
|
||||||
{
|
{
|
||||||
@ -281,10 +266,40 @@ public class TaskManager
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Publication[] GetPublicationsFromConnector(Connector connector, string? title = null)
|
||||||
|
{
|
||||||
|
Publication[] ret = connector.GetPublications(title ?? "");
|
||||||
|
foreach (Publication publication in ret)
|
||||||
|
{
|
||||||
|
if(chapterCollection.All(pub => pub.Key.internalId != publication.internalId))
|
||||||
|
this.chapterCollection.TryAdd(publication, new List<Chapter>());
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/// <returns>All added Publications</returns>
|
/// <returns>All added Publications</returns>
|
||||||
public Publication[] GetAllPublications()
|
public Publication[] GetAllPublications()
|
||||||
{
|
{
|
||||||
return this.collection.ToArray();
|
return this.chapterCollection.Keys.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the available Chapters of a Publication
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="connector">Connector to use</param>
|
||||||
|
/// <param name="publication">Publication to check</param>
|
||||||
|
/// <param name="language">Language to receive chapters for</param>
|
||||||
|
/// <returns>List of Chapters that were previously not in collection</returns>
|
||||||
|
public List<Chapter> GetNewChaptersList(Connector connector, Publication publication, string language)
|
||||||
|
{
|
||||||
|
List<Chapter> newChaptersList = new();
|
||||||
|
chapterCollection.TryAdd(publication, newChaptersList); //To ensure publication is actually in collection
|
||||||
|
|
||||||
|
Chapter[] newChapters = connector.GetChapters(publication, language);
|
||||||
|
newChaptersList = newChapters.Where(nChapter => !nChapter.CheckChapterIsDownloaded(settings.downloadLocation)).ToList();
|
||||||
|
|
||||||
|
return newChaptersList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Chapter> GetExistingChaptersList(Connector connector, Publication publication, string language)
|
public List<Chapter> GetExistingChaptersList(Connector connector, Publication publication, string language)
|
||||||
@ -348,6 +363,15 @@ public class TaskManager
|
|||||||
parentTask.lastExecuted = DateTime.UnixEpoch;
|
parentTask.lastExecuted = DateTime.UnixEpoch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (File.Exists(settings.knownPublicationsPath))
|
||||||
|
{
|
||||||
|
logger?.WriteLine(this.GetType().ToString(), $"Importing known publications from {settings.knownPublicationsPath}");
|
||||||
|
buffer = File.ReadAllText(settings.knownPublicationsPath);
|
||||||
|
Publication[] publications = JsonConvert.DeserializeObject<Publication[]>(buffer)!;
|
||||||
|
foreach (Publication publication in publications)
|
||||||
|
this.chapterCollection.TryAdd(publication, new List<Chapter>());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -362,6 +386,11 @@ public class TaskManager
|
|||||||
while(IsFileInUse(settings.tasksFilePath))
|
while(IsFileInUse(settings.tasksFilePath))
|
||||||
Thread.Sleep(50);
|
Thread.Sleep(50);
|
||||||
File.WriteAllText(settings.tasksFilePath, JsonConvert.SerializeObject(this._allTasks));
|
File.WriteAllText(settings.tasksFilePath, JsonConvert.SerializeObject(this._allTasks));
|
||||||
|
|
||||||
|
logger?.WriteLine(this.GetType().ToString(), $"Exporting known publications to {settings.knownPublicationsPath}");
|
||||||
|
while(IsFileInUse(settings.knownPublicationsPath))
|
||||||
|
Thread.Sleep(50);
|
||||||
|
File.WriteAllText(settings.knownPublicationsPath, JsonConvert.SerializeObject(this.chapterCollection.Keys.ToArray()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsFileInUse(string path)
|
private bool IsFileInUse(string path)
|
||||||
|
@ -12,6 +12,7 @@ public class TrangaSettings
|
|||||||
public string workingDirectory { get; set; }
|
public string workingDirectory { get; set; }
|
||||||
[JsonIgnore] public string settingsFilePath => Path.Join(workingDirectory, "settings.json");
|
[JsonIgnore] public string settingsFilePath => Path.Join(workingDirectory, "settings.json");
|
||||||
[JsonIgnore] public string tasksFilePath => Path.Join(workingDirectory, "tasks.json");
|
[JsonIgnore] public string tasksFilePath => Path.Join(workingDirectory, "tasks.json");
|
||||||
|
[JsonIgnore] public string knownPublicationsPath => Path.Join(workingDirectory, "knownPublications.json");
|
||||||
[JsonIgnore] public string coverImageCache => Path.Join(workingDirectory, "imageCache");
|
[JsonIgnore] public string coverImageCache => Path.Join(workingDirectory, "imageCache");
|
||||||
public HashSet<LibraryManager> libraryManagers { get; }
|
public HashSet<LibraryManager> libraryManagers { get; }
|
||||||
public HashSet<NotificationManager> notificationManagers { get; }
|
public HashSet<NotificationManager> notificationManagers { get; }
|
||||||
|
@ -100,7 +100,10 @@ public abstract class TrangaTask
|
|||||||
if ((int)statusCode >= 200 && (int)statusCode < 300)
|
if ((int)statusCode >= 200 && (int)statusCode < 300)
|
||||||
{
|
{
|
||||||
this.lastExecuted = DateTime.Now;
|
this.lastExecuted = DateTime.Now;
|
||||||
|
if(this is DownloadChapterTask)
|
||||||
this.state = ExecutionState.Success;
|
this.state = ExecutionState.Success;
|
||||||
|
else
|
||||||
|
this.state = ExecutionState.Waiting;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -23,7 +23,7 @@ public class MonitorPublicationTask : TrangaTask
|
|||||||
|
|
||||||
//Check if Publication already has a Folder
|
//Check if Publication already has a Folder
|
||||||
publication.CreatePublicationFolder(taskManager.settings.downloadLocation);
|
publication.CreatePublicationFolder(taskManager.settings.downloadLocation);
|
||||||
List<Chapter> newChapters = connector.GetNewChaptersList(publication, language, ref taskManager.collection);
|
List<Chapter> newChapters = taskManager.GetNewChaptersList(connector, publication, language);
|
||||||
|
|
||||||
connector.CopyCoverFromCacheToDownloadLocation(publication, taskManager.settings);
|
connector.CopyCoverFromCacheToDownloadLocation(publication, taskManager.settings);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user