namespace Tranga;
///
/// Executes TrangaTasks
/// Based on the TrangaTask.Task a method is called.
/// The chapterCollection is updated with new Publications/Chapters.
///
public static class TaskExecutor
{
///
/// Executes TrangaTask.
///
/// List of all available Connectors
/// Task to execute
/// Current chapterCollection to update
/// Is thrown when there is no Connector available with the name of the TrangaTask.connectorName
public static void Execute(Connector[] connectors, TrangaTask trangaTask, Dictionary> chapterCollection)
{
//Get Connector from list of available Connectors and the required Connector of the TrangaTask
Connector? connector = connectors.FirstOrDefault(c => c.name == trangaTask.connectorName);
if (connector is null)
throw new ArgumentException($"Connector {trangaTask.connectorName} is not a known connector.");
if (trangaTask.isBeingExecuted)
return;
trangaTask.isBeingExecuted = true;
trangaTask.lastExecuted = DateTime.Now;
//Call appropriate Method based on TrangaTask.Task
switch (trangaTask.task)
{
case TrangaTask.Task.DownloadNewChapters:
DownloadNewChapters(connector, (Publication)trangaTask.publication!, trangaTask.language, chapterCollection);
break;
case TrangaTask.Task.UpdateChapters:
UpdateChapters(connector, (Publication)trangaTask.publication!, trangaTask.language, chapterCollection);
break;
case TrangaTask.Task.UpdatePublications:
UpdatePublications(connector, chapterCollection);
break;
}
trangaTask.isBeingExecuted = false;
}
///
/// Updates the available Publications from a Connector (all of them)
///
/// Connector to receive Publications from
///
private static void UpdatePublications(Connector connector, Dictionary> chapterCollection)
{
Publication[] publications = connector.GetPublications();
foreach (Publication publication in publications)
chapterCollection.TryAdd(publication, new List());
}
///
/// Checks for new Chapters and Downloads new ones.
/// If no Chapters had been downloaded previously, download also cover and create series.json
///
/// Connector to use
/// Publication to check
/// Language to receive chapters for
///
private static void DownloadNewChapters(Connector connector, Publication publication, string language, Dictionary> chapterCollection)
{
List newChapters = UpdateChapters(connector, publication, language, chapterCollection);
connector.DownloadCover(publication);
connector.SaveSeriesInfo(publication);
foreach(Chapter newChapter in newChapters)
connector.DownloadChapter(publication, newChapter);
}
///
/// Updates the available Chapters of a Publication
///
/// Connector to use
/// Publication to check
/// Language to receive chapters for
///
/// List of Chapters that were previously not in collection
private static List UpdateChapters(Connector connector, Publication publication, string language, Dictionary> chapterCollection)
{
List newChaptersList = new();
if (!chapterCollection.ContainsKey(publication))
return newChaptersList;
List currentChapters = chapterCollection[publication];
Chapter[] newChapters = connector.GetChapters(publication, language);
newChaptersList = newChapters.ToList()
.ExceptBy(currentChapters.Select(cChapter => cChapter.url), nChapter => nChapter.url).ToList();
return newChaptersList;
}
}