Compare commits

...

2 Commits

Author SHA1 Message Date
5c753e7a7d Added fields to TrangaTask:
executionStarted,
executionApproximatelyFinished,
executionApproximatelyRemaining
to track progress
2023-06-06 21:19:30 +02:00
17ce820cf3 Changed taskProgress increment to call method that updates progress accordingly (with parent-tasks being also updated) 2023-06-06 20:54:21 +02:00
5 changed files with 69 additions and 23 deletions

View File

@ -135,8 +135,12 @@ public static class Tranga_Cli
switch (selection) switch (selection)
{ {
case ConsoleKey.L: case ConsoleKey.L:
PrintTasks(taskManager.GetAllTasks(), logger); while (!Console.KeyAvailable)
Console.WriteLine("Press any key."); {
PrintTasks(taskManager.GetAllTasks(), logger);
Console.WriteLine("Press any key.");
Thread.Sleep(500);
}
Console.ReadKey(); Console.ReadKey();
break; break;
case ConsoleKey.C: case ConsoleKey.C:
@ -160,17 +164,26 @@ public static class Tranga_Cli
Console.ReadKey(); Console.ReadKey();
break; break;
case ConsoleKey.R: case ConsoleKey.R:
PrintTasks( while (!Console.KeyAvailable)
taskManager.GetAllTasks().Where(eTask => eTask.state == TrangaTask.ExecutionState.Running) {
.ToArray(), logger); PrintTasks(
Console.WriteLine("Press any key."); taskManager.GetAllTasks().Where(eTask => eTask.state == TrangaTask.ExecutionState.Running)
.ToArray(), logger);
Console.WriteLine("Press any key.");
Thread.Sleep(500);
}
Console.ReadKey(); Console.ReadKey();
break; break;
case ConsoleKey.K: case ConsoleKey.K:
PrintTasks( while (!Console.KeyAvailable)
taskManager.GetAllTasks().Where(qTask => qTask.state is TrangaTask.ExecutionState.Enqueued) {
.ToArray(), logger); PrintTasks(
Console.WriteLine("Press any key."); taskManager.GetAllTasks()
.Where(qTask => qTask.state is TrangaTask.ExecutionState.Enqueued)
.ToArray(), logger);
Console.WriteLine("Press any key.");
Thread.Sleep(500);
}
Console.ReadKey(); Console.ReadKey();
break; break;
case ConsoleKey.F: case ConsoleKey.F:
@ -240,13 +253,13 @@ public static class Tranga_Cli
int tIndex = 0; int tIndex = 0;
Console.WriteLine($"Tasks (Running/Queue/Total): {taskRunningCount}/{taskEnqueuedCount}/{taskCount}"); Console.WriteLine($"Tasks (Running/Queue/Total): {taskRunningCount}/{taskEnqueuedCount}/{taskCount}");
string header = string header =
$"{"",-5}{"Task",-20} | {"Last Executed",-20} | {"Reoccurrence",-12} | {"State",-10} | {"Progress",-9} | {"Connector",-15} | Publication/Manga "; $"{"",-5}{"Task",-20} | {"Last Executed",-20} | {"Reoccurrence",-12} | {"State",-10} | {"Progress",-9} | {"Finished",-20} | {"Remaining",-12} | {"Connector",-15} | Publication/Manga ";
Console.WriteLine(header); Console.WriteLine(header);
Console.WriteLine(new string('-', header.Length)); Console.WriteLine(new string('-', header.Length));
foreach (TrangaTask trangaTask in tasks) foreach (TrangaTask trangaTask in tasks)
{ {
string[] taskSplit = trangaTask.ToString().Split(", "); string[] taskSplit = trangaTask.ToString().Split(", ");
Console.WriteLine($"{tIndex++:000}: {taskSplit[0],-20} | {taskSplit[1],-20} | {taskSplit[2],-12} | {taskSplit[3],-10} | {(taskSplit.Length > 4 ? taskSplit[4] : ""),-9} | {(taskSplit.Length > 5 ? taskSplit[5] : ""),-15} | {(taskSplit.Length > 6 ? taskSplit[6] : "")} {(taskSplit.Length > 7 ? taskSplit[7] : "")} {(taskSplit.Length > 8 ? taskSplit[8] : "")}"); Console.WriteLine($"{tIndex++:000}: {taskSplit[0],-20} | {taskSplit[1],-20} | {taskSplit[2],-12} | {taskSplit[3],-10} | {taskSplit[4],-9} | {taskSplit[5],-20} | {taskSplit[6][..12],-12} | {(taskSplit.Length > 7 ? taskSplit[7] : ""),-15} | {(taskSplit.Length > 8 ? taskSplit[8] : "")} {(taskSplit.Length > 9 ? taskSplit[9] : "")} {(taskSplit.Length > 10 ? taskSplit[10] : "")}");
} }
} }

View File

@ -183,7 +183,7 @@ public abstract class Connector
string extension = split[^1]; string extension = split[^1];
logger?.WriteLine("Connector", $"Downloading Image {chapter + 1:000}/{imageUrls.Length:000} {parentTask.publication.sortName} {parentTask.publication.internalId} Vol.{parentTask.chapter.volumeNumber} Ch.{parentTask.chapter.chapterNumber} {parentTask.progress:P2}"); logger?.WriteLine("Connector", $"Downloading Image {chapter + 1:000}/{imageUrls.Length:000} {parentTask.publication.sortName} {parentTask.publication.internalId} Vol.{parentTask.chapter.volumeNumber} Ch.{parentTask.chapter.chapterNumber} {parentTask.progress:P2}");
DownloadImage(imageUrl, Path.Join(tempFolder, $"{chapter++}.{extension}"), requestType, referrer); DownloadImage(imageUrl, Path.Join(tempFolder, $"{chapter++}.{extension}"), requestType, referrer);
parentTask.progress += 1f / imageUrls.Length; parentTask.IncrementProgress(1f / imageUrls.Length);
} }
if(comicInfoPath is not null) if(comicInfoPath is not null)

View File

@ -21,8 +21,17 @@ public abstract class TrangaTask
public DateTime lastExecuted { get; set; } public DateTime lastExecuted { get; set; }
public Task task { get; } public Task task { get; }
[Newtonsoft.Json.JsonIgnore]public ExecutionState state { get; set; } [Newtonsoft.Json.JsonIgnore]public ExecutionState state { get; set; }
[Newtonsoft.Json.JsonIgnore]public float progress { get; set; } [Newtonsoft.Json.JsonIgnore]public float progress { get; protected set; }
[Newtonsoft.Json.JsonIgnore]public DateTime nextExecution => lastExecuted.Add(reoccurrence); [Newtonsoft.Json.JsonIgnore]public DateTime nextExecution => lastExecuted.Add(reoccurrence);
[Newtonsoft.Json.JsonIgnore]public DateTime executionStarted { get; protected set; }
[Newtonsoft.Json.JsonIgnore]
public DateTime executionApproximatelyFinished => this.progress != 0
? this.executionStarted.Add(DateTime.Now.Subtract(this.executionStarted) / this.progress)
: DateTime.MaxValue;
[Newtonsoft.Json.JsonIgnore]
public TimeSpan executionApproximatelyRemaining => this.executionApproximatelyFinished.Subtract(DateTime.Now);
public enum ExecutionState public enum ExecutionState
{ {
@ -37,6 +46,13 @@ public abstract class TrangaTask
this.lastExecuted = DateTime.Now.Subtract(reoccurrence); this.lastExecuted = DateTime.Now.Subtract(reoccurrence);
this.task = task; this.task = task;
this.progress = 0f; this.progress = 0f;
this.executionStarted = DateTime.Now;
}
public float IncrementProgress(float amount)
{
this.progress += amount;
return this.progress;
} }
/// <summary> /// <summary>
@ -55,6 +71,7 @@ public abstract class TrangaTask
{ {
logger?.WriteLine(this.GetType().ToString(), $"Executing Task {this}"); logger?.WriteLine(this.GetType().ToString(), $"Executing Task {this}");
this.state = ExecutionState.Running; this.state = ExecutionState.Running;
this.executionStarted = DateTime.Now;
ExecuteTask(taskManager, logger); ExecuteTask(taskManager, logger);
this.lastExecuted = DateTime.Now; this.lastExecuted = DateTime.Now;
this.state = ExecutionState.Waiting; this.state = ExecutionState.Waiting;
@ -76,7 +93,7 @@ public abstract class TrangaTask
public override string ToString() public override string ToString()
{ {
return $"{task}, {lastExecuted}, {reoccurrence}, {state}, {progress:P2}"; return $"{task}, {lastExecuted}, {reoccurrence}, {state}, {progress:P2}, {executionApproximatelyFinished}, {executionApproximatelyRemaining}";
} }
public class TrangaTaskJsonConverter : JsonConverter public class TrangaTaskJsonConverter : JsonConverter

View File

@ -1,4 +1,5 @@
using Logging; using Logging;
using Newtonsoft.Json;
namespace Tranga.TrangaTasks; namespace Tranga.TrangaTasks;
@ -8,12 +9,15 @@ public class DownloadChapterTask : TrangaTask
public Publication publication { get; } public Publication publication { get; }
public string language { get; } public string language { get; }
public Chapter chapter { get; } public Chapter chapter { get; }
public DownloadChapterTask(Task task, string connectorName, Publication publication, Chapter chapter, string language = "en") : base(task, TimeSpan.Zero) [JsonIgnore]private DownloadNewChaptersTask? parentTask { get; init; }
public DownloadChapterTask(Task task, string connectorName, Publication publication, Chapter chapter, string language = "en", DownloadNewChaptersTask? parentTask = null) : base(task, TimeSpan.Zero)
{ {
this.chapter = chapter; this.chapter = chapter;
this.connectorName = connectorName; this.connectorName = connectorName;
this.publication = publication; this.publication = publication;
this.language = language; this.language = language;
this.parentTask = parentTask;
} }
protected override void ExecuteTask(TaskManager taskManager, Logger? logger) protected override void ExecuteTask(TaskManager taskManager, Logger? logger)
@ -24,6 +28,13 @@ public class DownloadChapterTask : TrangaTask
taskManager.DeleteTask(this); taskManager.DeleteTask(this);
} }
public new float IncrementProgress(float amount)
{
this.progress += amount;
parentTask?.IncrementProgress(amount);
return this.progress;
}
public override string ToString() public override string ToString()
{ {
return $"{base.ToString()}, {connectorName}, {publication.sortName} {publication.internalId}, Vol.{chapter.volumeNumber} Ch.{chapter.chapterNumber}"; return $"{base.ToString()}, {connectorName}, {publication.sortName} {publication.internalId}, Vol.{chapter.volumeNumber} Ch.{chapter.chapterNumber}";

View File

@ -1,4 +1,5 @@
using Logging; using Logging;
using Newtonsoft.Json;
namespace Tranga.TrangaTasks; namespace Tranga.TrangaTasks;
@ -7,34 +8,38 @@ public class DownloadNewChaptersTask : TrangaTask
public string connectorName { get; } public string connectorName { get; }
public Publication publication { get; } public Publication publication { get; }
public string language { get; } public string language { get; }
[JsonIgnore]private int childTaskAmount { get; set; }
public DownloadNewChaptersTask(Task task, string connectorName, Publication publication, TimeSpan reoccurrence, string language = "en") : base(task, reoccurrence) public DownloadNewChaptersTask(Task task, string connectorName, Publication publication, TimeSpan reoccurrence, string language = "en") : base(task, reoccurrence)
{ {
this.connectorName = connectorName; this.connectorName = connectorName;
this.publication = publication; this.publication = publication;
this.language = language; this.language = language;
childTaskAmount = 0;
}
public new float IncrementProgress(float amount)
{
this.progress += amount / this.childTaskAmount;
return this.progress;
} }
protected override void ExecuteTask(TaskManager taskManager, Logger? logger) protected override void ExecuteTask(TaskManager taskManager, Logger? logger)
{ {
Publication pub = publication!; Publication pub = publication!;
Connector connector = taskManager.GetConnector(this.connectorName); Connector connector = taskManager.GetConnector(this.connectorName);
this.progress = 0.1f;
//Check if Publication already has a Folder //Check if Publication already has a Folder
pub.CreatePublicationFolder(taskManager.settings.downloadLocation); pub.CreatePublicationFolder(taskManager.settings.downloadLocation);
this.progress = 0.2f;
List<Chapter> newChapters = GetNewChaptersList(connector, pub, language!, ref taskManager.chapterCollection); List<Chapter> newChapters = GetNewChaptersList(connector, pub, language!, ref taskManager.chapterCollection);
this.progress = 0.6f; this.childTaskAmount = newChapters.Count;
connector.CopyCoverFromCacheToDownloadLocation(pub, taskManager.settings); connector.CopyCoverFromCacheToDownloadLocation(pub, taskManager.settings);
this.progress = 0.7f;
pub.SaveSeriesInfoJson(connector.downloadLocation); pub.SaveSeriesInfoJson(connector.downloadLocation);
this.progress = 0.8f;
foreach (Chapter newChapter in newChapters) foreach (Chapter newChapter in newChapters)
taskManager.AddTask(new DownloadChapterTask(Task.DownloadChapter, this.connectorName!, pub, newChapter, this.language)); taskManager.AddTask(new DownloadChapterTask(Task.DownloadChapter, this.connectorName!, pub, newChapter, this.language, this));
this.progress = 1f;
} }
/// <summary> /// <summary>