From 3b7d5a354f6c30a90766d81ccd4dce2bbcf94c2f Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Fri, 28 Feb 2025 10:42:14 -0700 Subject: [PATCH] Re-add books to queue that failed or were cancelled. --- .../ViewModels/ProcessQueueViewModel.cs | 10 +++++++++- Source/LibationUiBase/TrackedQueue[T].cs | 10 ++++++++++ .../ProcessQueue/ProcessQueueControl.cs | 10 +++++++++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Source/LibationAvalonia/ViewModels/ProcessQueueViewModel.cs b/Source/LibationAvalonia/ViewModels/ProcessQueueViewModel.cs index d1005185..5ed38d96 100644 --- a/Source/LibationAvalonia/ViewModels/ProcessQueueViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/ProcessQueueViewModel.cs @@ -118,7 +118,15 @@ namespace LibationAvalonia.ViewModels #region Add Books to Queue private bool isBookInQueue(LibraryBook libraryBook) - => Queue.Any(b => b?.LibraryBook?.Book?.AudibleProductId == libraryBook.Book.AudibleProductId); + { + var entry = Queue.FirstOrDefault(b => b?.LibraryBook?.Book?.AudibleProductId == libraryBook.Book.AudibleProductId); + if (entry == null) + return false; + else if (entry.Status is ProcessBookStatus.Cancelled or ProcessBookStatus.Failed) + return !Queue.RemoveCompleted(entry); + else + return true; + } public void AddDownloadPdf(LibraryBook libraryBook) => AddDownloadPdf(new List() { libraryBook }); diff --git a/Source/LibationUiBase/TrackedQueue[T].cs b/Source/LibationUiBase/TrackedQueue[T].cs index 2df99d7e..51f36f0b 100644 --- a/Source/LibationUiBase/TrackedQueue[T].cs +++ b/Source/LibationUiBase/TrackedQueue[T].cs @@ -169,6 +169,16 @@ namespace LibationUiBase } } + public T FirstOrDefault(Func predicate) + { + lock (lockObject) + { + return Current != null && predicate(Current) ? Current + : _completed.FirstOrDefault(predicate) is T completed ? completed + : _queued.FirstOrDefault(predicate); + } + } + public void MoveQueuePosition(T item, QueuePosition requestedPosition) { lock (lockObject) diff --git a/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.cs b/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.cs index da7bebbc..c993c8b6 100644 --- a/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.cs +++ b/Source/LibationWinForms/ProcessQueue/ProcessQueueControl.cs @@ -82,7 +82,15 @@ namespace LibationWinForms.ProcessQueue } private bool isBookInQueue(DataLayer.LibraryBook libraryBook) - => Queue.Any(b => b?.LibraryBook?.Book?.AudibleProductId == libraryBook.Book.AudibleProductId); + { + var entry = Queue.FirstOrDefault(b => b?.LibraryBook?.Book?.AudibleProductId == libraryBook.Book.AudibleProductId); + if (entry == null) + return false; + else if (entry.Status is ProcessBookStatus.Cancelled or ProcessBookStatus.Failed) + return !Queue.RemoveCompleted(entry); + else + return true; + } public void AddDownloadPdf(DataLayer.LibraryBook libraryBook) => AddDownloadPdf(new List() { libraryBook });