using System; using System.Linq; using System.Threading.Tasks; using DataLayer; using Dinah.Core.ErrorHandling; using FileLiberator; using FileManager; namespace FileLiberator { /// /// Download DRM book and decrypt audiobook files /// /// Processes: /// Download: download aax file: the DRM encrypted audiobook /// Decrypt: remove DRM encryption from audiobook. Store final book /// Backup: perform all steps (downloaded, decrypt) still needed to get final book /// public class BackupBook : IProcessable { public event EventHandler Begin; public event EventHandler StatusUpdate; public event EventHandler Completed; public DownloadDecryptBook DecryptBook { get; } = new DownloadDecryptBook(); public DownloadPdf DownloadPdf { get; } = new DownloadPdf(); public bool Validate(LibraryBook libraryBook) => !AudibleFileStorage.Audio.Exists(libraryBook.Book.AudibleProductId); // do NOT use ConfigureAwait(false) on ProcessAsync() // often calls events which prints to forms in the UI context public async Task ProcessAsync(LibraryBook libraryBook) { Begin?.Invoke(this, libraryBook); try { { var statusHandler = await DecryptBook.TryProcessAsync(libraryBook); if (statusHandler.HasErrors) return statusHandler; } { var statusHandler = await DownloadPdf.TryProcessAsync(libraryBook); if (statusHandler.HasErrors) return statusHandler; } return new StatusHandler(); } finally { Completed?.Invoke(this, libraryBook); } } } }