Compare commits

..

6 Commits

Author SHA1 Message Date
4156365b18 Improved logic on QueueContainsJob and AddJobTo Queue
Added some documentation
2023-10-04 09:38:40 +02:00
d3ccddd8db Fix multiple enumeration 2023-10-04 09:33:11 +02:00
13075a8704 Improved logic in LoadJobsList 2023-10-04 09:31:03 +02:00
e7d9f53a93 Prevent override of List-jobs in AddJobsQueue-method 2023-10-04 09:30:42 +02:00
dc6dfd4aa1 Renamed method ExportJob(s) to UpdateJobFiles 2023-10-04 09:30:08 +02:00
0fba09b1e8 Logic removed unecessary call 2023-10-04 09:24:21 +02:00

View File

@ -27,7 +27,7 @@ public class JobBoss : GlobalBase
{ {
Log($"Added {job}"); Log($"Added {job}");
this.jobs.Add(job); this.jobs.Add(job);
ExportJob(job); UpdateJobFile(job);
} }
} }
@ -37,6 +37,10 @@ public class JobBoss : GlobalBase
AddJob(job); AddJob(job);
} }
/// <summary>
/// Compares contents of the provided job and all current jobs
/// Does not check if objects are the same
/// </summary>
public bool ContainsJobLike(Job job) public bool ContainsJobLike(Job job)
{ {
if (job is DownloadChapter dcJob) if (job is DownloadChapter dcJob)
@ -57,13 +61,14 @@ public class JobBoss : GlobalBase
this.jobs.Remove(job); this.jobs.Remove(job);
if(job.subJobs is not null && job.subJobs.Any()) if(job.subJobs is not null && job.subJobs.Any())
RemoveJobs(job.subJobs); RemoveJobs(job.subJobs);
ExportJob(job); UpdateJobFile(job);
} }
public void RemoveJobs(IEnumerable<Job?> jobsToRemove) public void RemoveJobs(IEnumerable<Job?> jobsToRemove)
{ {
Log($"Removing {jobsToRemove.Count()} jobs."); List<Job?> toRemove = jobsToRemove.ToList(); //Prevent multiple enumeration
foreach (Job? job in jobsToRemove) Log($"Removing {toRemove.Count()} jobs.");
foreach (Job? job in toRemove)
if(job is not null) if(job is not null)
RemoveJob(job); RemoveJob(job);
} }
@ -122,47 +127,52 @@ public class JobBoss : GlobalBase
private bool QueueContainsJob(Job job) private bool QueueContainsJob(Job job)
{ {
mangaConnectorJobQueue.TryAdd(job.mangaConnector, new Queue<Job>()); if (mangaConnectorJobQueue.TryAdd(job.mangaConnector, new Queue<Job>()))//If we can add the queue, there is certainly no job in it
return true;
return mangaConnectorJobQueue[job.mangaConnector].Contains(job); return mangaConnectorJobQueue[job.mangaConnector].Contains(job);
} }
public void AddJobToQueue(Job job) public void AddJobToQueue(Job job)
{ {
Log($"Adding Job to Queue. {job}"); Log($"Adding Job to Queue. {job}");
mangaConnectorJobQueue.TryAdd(job.mangaConnector, new Queue<Job>()); if(!QueueContainsJob(job))
Queue<Job> connectorJobQueue = mangaConnectorJobQueue[job.mangaConnector]; mangaConnectorJobQueue[job.mangaConnector].Enqueue(job);
if(!connectorJobQueue.Contains(job))
connectorJobQueue.Enqueue(job);
job.ExecutionEnqueue(); job.ExecutionEnqueue();
} }
public void AddJobsToQueue(IEnumerable<Job> jobs) private void AddJobsToQueue(IEnumerable<Job> newJobs)
{ {
foreach(Job job in jobs) foreach(Job job in newJobs)
AddJobToQueue(job); AddJobToQueue(job);
} }
public void LoadJobsList(HashSet<MangaConnector> connectors) private void LoadJobsList(HashSet<MangaConnector> connectors)
{ {
Directory.CreateDirectory(settings.jobsFolderPath); if (!Directory.Exists(settings.jobsFolderPath)) //No jobs to load
{
Directory.CreateDirectory(settings.jobsFolderPath);
return;
}
Regex idRex = new (@"(.*)\.json"); Regex idRex = new (@"(.*)\.json");
foreach (FileInfo file in new DirectoryInfo(settings.jobsFolderPath).EnumerateFiles()) //Load json-job-files
if (idRex.IsMatch(file.Name)) foreach (FileInfo file in new DirectoryInfo(settings.jobsFolderPath).EnumerateFiles().Where(fileInfo => idRex.IsMatch(fileInfo.Name)))
{ {
Job job = JsonConvert.DeserializeObject<Job>(File.ReadAllText(file.FullName), Job job = JsonConvert.DeserializeObject<Job>(File.ReadAllText(file.FullName),
new JobJsonConverter(this, new MangaConnectorJsonConverter(this, connectors)))!; new JobJsonConverter(this, new MangaConnectorJsonConverter(this, connectors)))!;
this.jobs.Add(job); this.jobs.Add(job);
} }
foreach (Job job in this.jobs)
this.jobs.FirstOrDefault(jjob => jjob.id == job.parentJobId)?.AddSubJob(job);
foreach (DownloadNewChapters ncJob in this.jobs.Where(job => job is DownloadNewChapters)) //Connect jobs to parent-jobs and add Publications to cache
cachedPublications.Add(ncJob.manga); foreach (Job job in this.jobs)
{
this.jobs.FirstOrDefault(jjob => jjob.id == job.parentJobId)?.AddSubJob(job);
if(job is DownloadNewChapters dncJob)
cachedPublications.Add(dncJob.manga);
}
} }
public void ExportJob(Job job) private void UpdateJobFile(Job job)
{ {
string jobFilePath = Path.Join(settings.jobsFolderPath, $"{job.id}.json"); string jobFilePath = Path.Join(settings.jobsFolderPath, $"{job.id}.json");
@ -190,11 +200,11 @@ public class JobBoss : GlobalBase
} }
} }
public void ExportJobsList() private void UpdateAllJobFiles()
{ {
Log("Exporting Jobs"); Log("Exporting Jobs");
foreach (Job job in this.jobs) foreach (Job job in this.jobs)
ExportJob(job); UpdateJobFile(job);
//Remove files with jobs not in this.jobs-list //Remove files with jobs not in this.jobs-list
Regex idRex = new (@"(.*)\.json"); Regex idRex = new (@"(.*)\.json");
@ -228,9 +238,10 @@ public class JobBoss : GlobalBase
Job queueHead = jobQueue.Peek(); Job queueHead = jobQueue.Peek();
if (queueHead.progressToken.state is ProgressToken.State.Complete or ProgressToken.State.Cancelled) if (queueHead.progressToken.state is ProgressToken.State.Complete or ProgressToken.State.Cancelled)
{ {
queueHead.ResetProgress();
if(!queueHead.recurring) if(!queueHead.recurring)
RemoveJob(queueHead); RemoveJob(queueHead);
else
queueHead.ResetProgress();
jobQueue.Dequeue(); jobQueue.Dequeue();
Log($"Next job in {jobs.MinBy(job => job.nextExecution)?.nextExecution.Subtract(DateTime.Now)} {jobs.MinBy(job => job.nextExecution)?.id}"); Log($"Next job in {jobs.MinBy(job => job.nextExecution)?.nextExecution.Subtract(DateTime.Now)} {jobs.MinBy(job => job.nextExecution)?.id}");
}else if (queueHead.progressToken.state is ProgressToken.State.Standby) }else if (queueHead.progressToken.state is ProgressToken.State.Standby)