From 74f94fe17f31cd82a3ac7f18b2ad76c804cce20f Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Tue, 29 Jun 2021 21:56:08 -0600 Subject: [PATCH 01/18] Add book tag null checks. --- AaxDecrypter/AaxcDownloadConverter.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AaxDecrypter/AaxcDownloadConverter.cs b/AaxDecrypter/AaxcDownloadConverter.cs index 663728fd..f853cbee 100644 --- a/AaxDecrypter/AaxcDownloadConverter.cs +++ b/AaxDecrypter/AaxcDownloadConverter.cs @@ -41,9 +41,9 @@ namespace AaxDecrypter public string outDir { get; private set; } public string outputFileName { get; private set; } public ChapterInfo chapters { get; private set; } - public string Title => aaxcTagLib.Tag.Title.Replace(" (Unabridged)", ""); + public string Title => aaxcTagLib.Tag.Title?.Replace(" (Unabridged)", "") ?? "[unknown]"; public string Author => aaxcTagLib.Tag.FirstPerformer ?? "[unknown]"; - public string Narrator => aaxcTagLib.GetTag(TagLib.TagTypes.Apple).Narrator; + public string Narrator => aaxcTagLib.GetTag(TagLib.TagTypes.Apple).Narrator ?? "[unknown]"; public byte[] CoverArt => aaxcTagLib.Tag.Pictures.Length > 0 ? aaxcTagLib.Tag.Pictures[0].Data.Data : default; private TagLib.Mpeg4.File aaxcTagLib { get; set; } @@ -273,7 +273,7 @@ namespace AaxDecrypter public void Cancel() { - aaxcProcesser?.Cancel(); + aaxcProcesser.Cancel(); } } } From ac6a73d8980d139345e3d11f4ddd600d7a0af67d Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Tue, 29 Jun 2021 22:00:05 -0600 Subject: [PATCH 02/18] Removed DownloadBookDummy and related process steps. --- .../AaxcDownloadDecrypt/DownloadBookDummy.cs | 16 -- .../DownloadDecryptBook.cs | 207 ------------------ .../ProcessorAutomationController.cs | 9 - 3 files changed, 232 deletions(-) delete mode 100644 FileLiberator/AaxcDownloadDecrypt/DownloadBookDummy.cs delete mode 100644 FileLiberator/AaxcDownloadDecrypt/DownloadDecryptBook.cs diff --git a/FileLiberator/AaxcDownloadDecrypt/DownloadBookDummy.cs b/FileLiberator/AaxcDownloadDecrypt/DownloadBookDummy.cs deleted file mode 100644 index 6ebc8329..00000000 --- a/FileLiberator/AaxcDownloadDecrypt/DownloadBookDummy.cs +++ /dev/null @@ -1,16 +0,0 @@ -using DataLayer; -using Dinah.Core.ErrorHandling; -using System.Threading.Tasks; - -namespace FileLiberator.AaxcDownloadDecrypt -{ - public class DownloadBookDummy : DownloadableBase - { - public override Task ProcessItemAsync(LibraryBook libraryBook) => Task.FromResult(new StatusHandler()); - - public override bool Validate(LibraryBook libraryBook) - { - return true; - } - } -} diff --git a/FileLiberator/AaxcDownloadDecrypt/DownloadDecryptBook.cs b/FileLiberator/AaxcDownloadDecrypt/DownloadDecryptBook.cs deleted file mode 100644 index 6b5c2a78..00000000 --- a/FileLiberator/AaxcDownloadDecrypt/DownloadDecryptBook.cs +++ /dev/null @@ -1,207 +0,0 @@ -using DataLayer; -using Dinah.Core; -using Dinah.Core.ErrorHandling; -using FileManager; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AaxDecrypter; -using AudibleApi; - -namespace FileLiberator.AaxcDownloadDecrypt -{ - public class DownloadDecryptBook : IDecryptable - { - public event EventHandler Begin; - public event EventHandler DecryptBegin; - public event EventHandler TitleDiscovered; - public event EventHandler AuthorsDiscovered; - public event EventHandler NarratorsDiscovered; - public event EventHandler CoverImageFilepathDiscovered; - public event EventHandler UpdateProgress; - public event EventHandler UpdateRemainingTime; - public event EventHandler DecryptCompleted; - public event EventHandler Completed; - public event EventHandler StatusUpdate; - - private AaxcDownloadConverter aaxcDownloader; - public async Task ProcessAsync(LibraryBook libraryBook) - { - Begin?.Invoke(this, libraryBook); - - try - { - - if (AudibleFileStorage.Audio.Exists(libraryBook.Book.AudibleProductId)) - return new StatusHandler { "Cannot find decrypt. Final audio file already exists" }; - - var outputAudioFilename = await aaxToM4bConverterDecryptAsync(AudibleFileStorage.DecryptInProgress, libraryBook); - - // decrypt failed - if (outputAudioFilename is null) - return new StatusHandler { "Decrypt failed" }; - - // moves files and returns dest dir. Do not put inside of if(RetainAaxFiles) - _ = moveFilesToBooksDir(libraryBook.Book, outputAudioFilename); - - var finalAudioExists = AudibleFileStorage.Audio.Exists(libraryBook.Book.AudibleProductId); - if (!finalAudioExists) - return new StatusHandler { "Cannot find final audio file after decryption" }; - - return new StatusHandler(); - } - finally - { - Completed?.Invoke(this, libraryBook); - } - - } - - private async Task aaxToM4bConverterDecryptAsync(string destinationDir, LibraryBook libraryBook) - { - DecryptBegin?.Invoke(this, $"Begin decrypting {libraryBook}"); - - try - { - validate(libraryBook); - - var api = await InternalUtilities.AudibleApiActions.GetApiAsync(libraryBook.Account, libraryBook.Book.Locale); - - var dlLic = await api.GetDownloadLicenseAsync(libraryBook.Book.AudibleProductId); - - var aaxcDecryptDlLic = new DownloadLicense(dlLic.DownloadUrl, dlLic.AudibleKey, dlLic.AudibleIV, Resources.UserAgent); - - var destinationDirectory = Path.GetDirectoryName(destinationDir); - - if (Configuration.Instance.DownloadChapters) - { - var contentMetadata = await api.GetLibraryBookMetadataAsync(libraryBook.Book.AudibleProductId); - - var aaxcDecryptChapters = new ChapterInfo(); - - foreach (var chap in contentMetadata?.ChapterInfo?.Chapters) - aaxcDecryptChapters.AddChapter(new Chapter(chap.Title, chap.StartOffsetMs, chap.LengthMs)); - - aaxcDownloader = await AaxcDownloadConverter.CreateAsync(destinationDirectory, aaxcDecryptDlLic, aaxcDecryptChapters); - } - else - { - aaxcDownloader = await AaxcDownloadConverter.CreateAsync(destinationDirectory, aaxcDecryptDlLic); - } - - aaxcDownloader.AppName = "Libation"; - - TitleDiscovered?.Invoke(this, aaxcDownloader.Title); - AuthorsDiscovered?.Invoke(this, aaxcDownloader.Author); - NarratorsDiscovered?.Invoke(this, aaxcDownloader.Narrator); - - if (aaxcDownloader.CoverArt is not null) - CoverImageFilepathDiscovered?.Invoke(this, aaxcDownloader.CoverArt); - - // override default which was set in CreateAsync - var proposedOutputFile = Path.Combine(destinationDir, $"{PathLib.ToPathSafeString(libraryBook.Book.Title)} [{libraryBook.Book.AudibleProductId}].m4b"); - aaxcDownloader.SetOutputFilename(proposedOutputFile); - aaxcDownloader.DecryptProgressUpdate += (s, progress) => UpdateProgress?.Invoke(this, progress); - aaxcDownloader.DecryptTimeRemaining += (s, remaining) => UpdateRemainingTime?.Invoke(this, remaining); - - // REAL WORK DONE HERE - var success = await Task.Run(() => aaxcDownloader.Run()); - - // decrypt failed - if (!success) - return null; - - return aaxcDownloader.outputFileName; - } - finally - { - DecryptCompleted?.Invoke(this, $"Completed downloading and decrypting {libraryBook.Book.Title}"); - } - } - - private static string moveFilesToBooksDir(Book product, string outputAudioFilename) - { - // create final directory. move each file into it. MOVE AUDIO FILE LAST - // new dir: safetitle_limit50char + " [" + productId + "]" - - var destinationDir = AudibleFileStorage.Audio.GetDestDir(product.Title, product.AudibleProductId); - Directory.CreateDirectory(destinationDir); - - var sortedFiles = getProductFilesSorted(product, outputAudioFilename); - - var musicFileExt = Path.GetExtension(outputAudioFilename).Trim('.'); - - // audio filename: safetitle_limit50char + " [" + productId + "]." + audio_ext - var audioFileName = FileUtility.GetValidFilename(destinationDir, product.Title, musicFileExt, product.AudibleProductId); - - foreach (var f in sortedFiles) - { - var dest - = AudibleFileStorage.Audio.IsFileTypeMatch(f) - ? audioFileName - // non-audio filename: safetitle_limit50char + " [" + productId + "][" + audio_ext +"]." + non_audio_ext - : FileUtility.GetValidFilename(destinationDir, product.Title, f.Extension, product.AudibleProductId, musicFileExt); - - if (Path.GetExtension(dest).Trim('.').ToLower() == "cue") - Cue.UpdateFileName(f, audioFileName); - - File.Move(f.FullName, dest); - } - - return destinationDir; - } - - private static List getProductFilesSorted(Book product, string outputAudioFilename) - { - // files are: temp path\author\[asin].ext - var m4bDir = new FileInfo(outputAudioFilename).Directory; - var files = m4bDir - .EnumerateFiles() - .Where(f => f.Name.ContainsInsensitive(product.AudibleProductId)) - .ToList(); - - // move audio files to the end of the collection so these files are moved last - var musicFiles = files.Where(f => AudibleFileStorage.Audio.IsFileTypeMatch(f)); - var sortedFiles = files - .Except(musicFiles) - .Concat(musicFiles) - .ToList(); - - return sortedFiles; - } - - private static void validate(LibraryBook libraryBook) - { - string errorString(string field) - => $"{errorTitle()}\r\nCannot download book. {field} is not known. Try re-importing the account which owns this book."; - - string errorTitle() - { - var title - = (libraryBook.Book.Title.Length > 53) - ? $"{libraryBook.Book.Title.Truncate(50)}..." - : libraryBook.Book.Title; - var errorBookTitle = $"{title} [{libraryBook.Book.AudibleProductId}]"; - return errorBookTitle; - }; - - if (string.IsNullOrWhiteSpace(libraryBook.Account)) - throw new Exception(errorString("Account")); - - if (string.IsNullOrWhiteSpace(libraryBook.Book.Locale)) - throw new Exception(errorString("Locale")); - } - - public bool Validate(LibraryBook libraryBook) - => !AudibleFileStorage.Audio.Exists(libraryBook.Book.AudibleProductId) - && !AudibleFileStorage.AAX.Exists(libraryBook.Book.AudibleProductId); - - public void Cancel() - { - aaxcDownloader.Cancel(); - } - } -} diff --git a/LibationWinForms/BookLiberation/ProcessorAutomationController.cs b/LibationWinForms/BookLiberation/ProcessorAutomationController.cs index 6efc3550..fea8c061 100644 --- a/LibationWinForms/BookLiberation/ProcessorAutomationController.cs +++ b/LibationWinForms/BookLiberation/ProcessorAutomationController.cs @@ -70,7 +70,6 @@ namespace LibationWinForms.BookLiberation { var backupBook = new BackupBook(); - backupBook.DownloadBook.Begin += (_, __) => wireUpEvents(backupBook.DownloadBook); backupBook.DecryptBook.Begin += (_, __) => wireUpEvents(backupBook.DecryptBook); backupBook.DownloadPdf.Begin += (_, __) => wireUpEvents(backupBook.DownloadPdf); @@ -80,13 +79,11 @@ namespace LibationWinForms.BookLiberation // completedAction is to refresh grid // - want to see that book disappear from grid // also for this to work, updateIsLiberated can NOT be async - backupBook.DownloadBook.Completed += updateIsLiberated; backupBook.DecryptBook.Completed += updateIsLiberated; backupBook.DownloadPdf.Completed += updateIsLiberated; if (completedAction != null) { - backupBook.DownloadBook.Completed += completedAction; backupBook.DecryptBook.Completed += completedAction; backupBook.DownloadPdf.Completed += completedAction; } @@ -116,9 +113,6 @@ namespace LibationWinForms.BookLiberation #endregion #region subscribe new form to model's events - backupBook.DownloadBook.Begin += downloadBookBegin; - backupBook.DownloadBook.StatusUpdate += statusUpdate; - backupBook.DownloadBook.Completed += downloadBookCompleted; backupBook.DecryptBook.Begin += decryptBookBegin; backupBook.DecryptBook.StatusUpdate += statusUpdate; backupBook.DecryptBook.Completed += decryptBookCompleted; @@ -131,9 +125,6 @@ namespace LibationWinForms.BookLiberation // unsubscribe so disposed forms aren't still trying to receive notifications automatedBackupsForm.FormClosing += (_, __) => { - backupBook.DownloadBook.Begin -= downloadBookBegin; - backupBook.DownloadBook.StatusUpdate -= statusUpdate; - backupBook.DownloadBook.Completed -= downloadBookCompleted; backupBook.DecryptBook.Begin -= decryptBookBegin; backupBook.DecryptBook.StatusUpdate -= statusUpdate; backupBook.DecryptBook.Completed -= decryptBookCompleted; From 9332a6f350f11ebcc104737b485f8f28f9f540b3 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Tue, 29 Jun 2021 22:02:47 -0600 Subject: [PATCH 03/18] Remove downlaod book events. --- .../BookLiberation/ProcessorAutomationController.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/LibationWinForms/BookLiberation/ProcessorAutomationController.cs b/LibationWinForms/BookLiberation/ProcessorAutomationController.cs index fea8c061..acc79518 100644 --- a/LibationWinForms/BookLiberation/ProcessorAutomationController.cs +++ b/LibationWinForms/BookLiberation/ProcessorAutomationController.cs @@ -101,9 +101,7 @@ namespace LibationWinForms.BookLiberation #endregion #region define how model actions will affect form behavior - void downloadBookBegin(object _, LibraryBook libraryBook) => logMe.Info($"Download Step, Begin: {libraryBook.Book}"); void statusUpdate(object _, string str) => logMe.Info("- " + str); - void downloadBookCompleted(object _, LibraryBook libraryBook) => logMe.Info($"Download Step, Completed: {libraryBook.Book}"); void decryptBookBegin(object _, LibraryBook libraryBook) => logMe.Info($"Decrypt Step, Begin: {libraryBook.Book}"); // extra line after book is completely finished void decryptBookCompleted(object _, LibraryBook libraryBook) => logMe.Info($"Decrypt Step, Completed: {libraryBook.Book}{Environment.NewLine}"); From 027cce2d997a820eb3356ec22dcab65053dc2f29 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Tue, 29 Jun 2021 22:03:36 -0600 Subject: [PATCH 04/18] Remove DownloadBook from BackupBook. --- FileLiberator/BackupBook.cs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/FileLiberator/BackupBook.cs b/FileLiberator/BackupBook.cs index 604994c4..b778eec0 100644 --- a/FileLiberator/BackupBook.cs +++ b/FileLiberator/BackupBook.cs @@ -3,7 +3,7 @@ using System.Linq; using System.Threading.Tasks; using DataLayer; using Dinah.Core.ErrorHandling; -using FileLiberator.AaxcDownloadDecrypt; +using FileLiberator; using FileManager; namespace FileLiberator @@ -22,8 +22,6 @@ namespace FileLiberator public event EventHandler StatusUpdate; public event EventHandler Completed; - - public DownloadBookDummy DownloadBook { get; } = new DownloadBookDummy(); public DownloadDecryptBook DecryptBook { get; } = new DownloadDecryptBook(); public DownloadPdf DownloadPdf { get; } = new DownloadPdf(); @@ -38,12 +36,6 @@ namespace FileLiberator try { - { - var statusHandler = await DownloadBook.TryProcessAsync(libraryBook); - if (statusHandler.HasErrors) - return statusHandler; - } - { var statusHandler = await DecryptBook.TryProcessAsync(libraryBook); if (statusHandler.HasErrors) From 78f278121b9745f9ea3d72336605d4796b9e9422 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Tue, 29 Jun 2021 22:04:54 -0600 Subject: [PATCH 05/18] Add book info to DecryptForm from LibraryBook on initialization. --- FileLiberator/DownloadDecryptBook.cs | 205 ++++++++++++++++++ .../BookLiberation/DecryptForm.cs | 4 +- .../ProcessorAutomationController.cs | 59 +++-- 3 files changed, 242 insertions(+), 26 deletions(-) create mode 100644 FileLiberator/DownloadDecryptBook.cs diff --git a/FileLiberator/DownloadDecryptBook.cs b/FileLiberator/DownloadDecryptBook.cs new file mode 100644 index 00000000..8eed437e --- /dev/null +++ b/FileLiberator/DownloadDecryptBook.cs @@ -0,0 +1,205 @@ +using DataLayer; +using Dinah.Core; +using Dinah.Core.ErrorHandling; +using FileManager; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AaxDecrypter; +using AudibleApi; + +namespace FileLiberator +{ + public class DownloadDecryptBook : IDecryptable + { + public event EventHandler Begin; + public event EventHandler DecryptBegin; + public event EventHandler TitleDiscovered; + public event EventHandler AuthorsDiscovered; + public event EventHandler NarratorsDiscovered; + public event EventHandler CoverImageFilepathDiscovered; + public event EventHandler UpdateProgress; + public event EventHandler UpdateRemainingTime; + public event EventHandler DecryptCompleted; + public event EventHandler Completed; + public event EventHandler StatusUpdate; + + private AaxcDownloadConverter aaxcDownloader; + public async Task ProcessAsync(LibraryBook libraryBook) + { + Begin?.Invoke(this, libraryBook); + + try + { + if (AudibleFileStorage.Audio.Exists(libraryBook.Book.AudibleProductId)) + return new StatusHandler { "Cannot find decrypt. Final audio file already exists" }; + + var outputAudioFilename = await aaxToM4bConverterDecryptAsync(AudibleFileStorage.DecryptInProgress, libraryBook); + + // decrypt failed + if (outputAudioFilename is null) + return new StatusHandler { "Decrypt failed" }; + + // moves files and returns dest dir. Do not put inside of if(RetainAaxFiles) + _ = moveFilesToBooksDir(libraryBook.Book, outputAudioFilename); + + var finalAudioExists = AudibleFileStorage.Audio.Exists(libraryBook.Book.AudibleProductId); + if (!finalAudioExists) + return new StatusHandler { "Cannot find final audio file after decryption" }; + + return new StatusHandler(); + } + finally + { + Completed?.Invoke(this, libraryBook); + } + } + + private async Task aaxToM4bConverterDecryptAsync(string destinationDir, LibraryBook libraryBook) + { + DecryptBegin?.Invoke(this, $"Begin decrypting {libraryBook}"); + + try + { + validate(libraryBook); + + var api = await InternalUtilities.AudibleApiActions.GetApiAsync(libraryBook.Account, libraryBook.Book.Locale); + + var dlLic = await api.GetDownloadLicenseAsync(libraryBook.Book.AudibleProductId); + + var aaxcDecryptDlLic = new DownloadLicense(dlLic.DownloadUrl, dlLic.AudibleKey, dlLic.AudibleIV, Resources.UserAgent); + + var destinationDirectory = Path.GetDirectoryName(destinationDir); + + if (Configuration.Instance.DownloadChapters) + { + var contentMetadata = await api.GetLibraryBookMetadataAsync(libraryBook.Book.AudibleProductId); + + var aaxcDecryptChapters = new ChapterInfo(); + + foreach (var chap in contentMetadata?.ChapterInfo?.Chapters) + aaxcDecryptChapters.AddChapter(new Chapter(chap.Title, chap.StartOffsetMs, chap.LengthMs)); + + aaxcDownloader = await AaxcDownloadConverter.CreateAsync(destinationDirectory, aaxcDecryptDlLic, aaxcDecryptChapters); + } + else + { + aaxcDownloader = await AaxcDownloadConverter.CreateAsync(destinationDirectory, aaxcDecryptDlLic); + } + + aaxcDownloader.AppName = "Libation"; + + TitleDiscovered?.Invoke(this, aaxcDownloader.Title); + AuthorsDiscovered?.Invoke(this, aaxcDownloader.Author); + NarratorsDiscovered?.Invoke(this, aaxcDownloader.Narrator); + + if (aaxcDownloader.CoverArt is not null) + CoverImageFilepathDiscovered?.Invoke(this, aaxcDownloader.CoverArt); + + // override default which was set in CreateAsync + var proposedOutputFile = Path.Combine(destinationDir, $"{PathLib.ToPathSafeString(libraryBook.Book.Title)} [{libraryBook.Book.AudibleProductId}].m4b"); + aaxcDownloader.SetOutputFilename(proposedOutputFile); + aaxcDownloader.DecryptProgressUpdate += (s, progress) => UpdateProgress?.Invoke(this, progress); + aaxcDownloader.DecryptTimeRemaining += (s, remaining) => UpdateRemainingTime?.Invoke(this, remaining); + + // REAL WORK DONE HERE + var success = await Task.Run(() => aaxcDownloader.Run()); + + // decrypt failed + if (!success) + return null; + + return aaxcDownloader.outputFileName; + } + finally + { + DecryptCompleted?.Invoke(this, $"Completed downloading and decrypting {libraryBook.Book.Title}"); + } + } + + private static string moveFilesToBooksDir(Book product, string outputAudioFilename) + { + // create final directory. move each file into it. MOVE AUDIO FILE LAST + // new dir: safetitle_limit50char + " [" + productId + "]" + + var destinationDir = AudibleFileStorage.Audio.GetDestDir(product.Title, product.AudibleProductId); + Directory.CreateDirectory(destinationDir); + + var sortedFiles = getProductFilesSorted(product, outputAudioFilename); + + var musicFileExt = Path.GetExtension(outputAudioFilename).Trim('.'); + + // audio filename: safetitle_limit50char + " [" + productId + "]." + audio_ext + var audioFileName = FileUtility.GetValidFilename(destinationDir, product.Title, musicFileExt, product.AudibleProductId); + + foreach (var f in sortedFiles) + { + var dest + = AudibleFileStorage.Audio.IsFileTypeMatch(f) + ? audioFileName + // non-audio filename: safetitle_limit50char + " [" + productId + "][" + audio_ext +"]." + non_audio_ext + : FileUtility.GetValidFilename(destinationDir, product.Title, f.Extension, product.AudibleProductId, musicFileExt); + + if (Path.GetExtension(dest).Trim('.').ToLower() == "cue") + Cue.UpdateFileName(f, audioFileName); + + File.Move(f.FullName, dest); + } + + return destinationDir; + } + + private static List getProductFilesSorted(Book product, string outputAudioFilename) + { + // files are: temp path\author\[asin].ext + var m4bDir = new FileInfo(outputAudioFilename).Directory; + var files = m4bDir + .EnumerateFiles() + .Where(f => f.Name.ContainsInsensitive(product.AudibleProductId)) + .ToList(); + + // move audio files to the end of the collection so these files are moved last + var musicFiles = files.Where(f => AudibleFileStorage.Audio.IsFileTypeMatch(f)); + var sortedFiles = files + .Except(musicFiles) + .Concat(musicFiles) + .ToList(); + + return sortedFiles; + } + + private static void validate(LibraryBook libraryBook) + { + string errorString(string field) + => $"{errorTitle()}\r\nCannot download book. {field} is not known. Try re-importing the account which owns this book."; + + string errorTitle() + { + var title + = (libraryBook.Book.Title.Length > 53) + ? $"{libraryBook.Book.Title.Truncate(50)}..." + : libraryBook.Book.Title; + var errorBookTitle = $"{title} [{libraryBook.Book.AudibleProductId}]"; + return errorBookTitle; + }; + + if (string.IsNullOrWhiteSpace(libraryBook.Account)) + throw new Exception(errorString("Account")); + + if (string.IsNullOrWhiteSpace(libraryBook.Book.Locale)) + throw new Exception(errorString("Locale")); + } + + public bool Validate(LibraryBook libraryBook) + => !AudibleFileStorage.Audio.Exists(libraryBook.Book.AudibleProductId) + && !AudibleFileStorage.AAX.Exists(libraryBook.Book.AudibleProductId); + + public void Cancel() + { + aaxcDownloader.Cancel(); + } + } +} diff --git a/LibationWinForms/BookLiberation/DecryptForm.cs b/LibationWinForms/BookLiberation/DecryptForm.cs index 1f76bafd..0c03c76f 100644 --- a/LibationWinForms/BookLiberation/DecryptForm.cs +++ b/LibationWinForms/BookLiberation/DecryptForm.cs @@ -56,8 +56,8 @@ namespace LibationWinForms.BookLiberation private void updateBookInfo() => bookInfoLbl.UIThread(() => bookInfoLbl.Text = $"{title}\r\nBy {authorNames}\r\nNarrated by {narratorNames}"); - public void SetCoverImage(byte[] coverBytes) - => pictureBox1.UIThread(() => pictureBox1.Image = ImageReader.ToImage(coverBytes)); + public void SetCoverImage(System.Drawing.Image coverImage) + => pictureBox1.UIThread(() => pictureBox1.Image = coverImage); public void UpdateProgress(int percentage) { diff --git a/LibationWinForms/BookLiberation/ProcessorAutomationController.cs b/LibationWinForms/BookLiberation/ProcessorAutomationController.cs index acc79518..da9ca8a1 100644 --- a/LibationWinForms/BookLiberation/ProcessorAutomationController.cs +++ b/LibationWinForms/BookLiberation/ProcessorAutomationController.cs @@ -25,7 +25,7 @@ namespace LibationWinForms.BookLiberation logMe.LogErrorString += (_, text) => Serilog.Log.Logger.Error(text); logMe.LogErrorString += (_, text) => form.WriteLine(text); - logMe.LogError += (_, tuple) => Serilog.Log.Logger.Error(tuple.Item1, tuple.Item2 ?? "Automated backup: error"); + logMe.LogError += (_, tuple) => Serilog.Log.Logger.Error(tuple.Item1, tuple.Item2 ?? "Automated backup: error"); logMe.LogError += (_, tuple) => { form.WriteLine(tuple.Item2 ?? "Automated backup: error"); @@ -70,7 +70,7 @@ namespace LibationWinForms.BookLiberation { var backupBook = new BackupBook(); - backupBook.DecryptBook.Begin += (_, __) => wireUpEvents(backupBook.DecryptBook); + backupBook.DecryptBook.Begin += (_, l) => wireUpEvents(backupBook.DecryptBook, l); backupBook.DownloadPdf.Begin += (_, __) => wireUpEvents(backupBook.DownloadPdf); // must occur before completedAction. A common use case is: @@ -141,7 +141,7 @@ namespace LibationWinForms.BookLiberation var downloadPdf = getWiredUpDownloadPdf(completedAction); - (AutomatedBackupsForm automatedBackupsForm, LogMe logMe) = attachToBackupsForm(downloadPdf); + (AutomatedBackupsForm automatedBackupsForm, LogMe logMe) = attachToBackupsForm(downloadPdf); await new BackupLoop(logMe, downloadPdf, automatedBackupsForm).RunBackupAsync(); } @@ -239,19 +239,30 @@ namespace LibationWinForms.BookLiberation } // subscribed to Begin event because a new form should be created+processed+closed on each iteration - private static void wireUpEvents(IDecryptable decryptBook) + private static void wireUpEvents(IDecryptable decryptBook, LibraryBook libraryBook) { #region create form var decryptDialog = new DecryptForm(); #endregion + #region Set initially displayed book properties from library info. + decryptDialog.SetTitle(libraryBook.Book.Title); + decryptDialog.SetAuthorNames(string.Join(", ", libraryBook.Book.Authors)); + decryptDialog.SetNarratorNames(string.Join(", ", libraryBook.Book.NarratorNames)); + decryptDialog.SetCoverImage( + WindowsDesktopUtilities.WinAudibleImageServer.GetImage( + libraryBook.Book.PictureId, + FileManager.PictureSize._80x80 + )); + #endregion + #region define how model actions will affect form behavior void decryptBegin(object _, string __) => decryptDialog.Show(); void titleDiscovered(object _, string title) => decryptDialog.SetTitle(title); void authorsDiscovered(object _, string authors) => decryptDialog.SetAuthorNames(authors); void narratorsDiscovered(object _, string narrators) => decryptDialog.SetNarratorNames(narrators); - void coverImageFilepathDiscovered(object _, byte[] coverBytes) => decryptDialog.SetCoverImage(coverBytes); + void coverImageFilepathDiscovered(object _, byte[] coverBytes) => decryptDialog.SetCoverImage(Dinah.Core.Drawing.ImageReader.ToImage(coverBytes)); void updateProgress(object _, int percentage) => decryptDialog.UpdateProgress(percentage); void updateRemainingTime(object _, TimeSpan remaining) => decryptDialog.UpdateRemainingTime(remaining); @@ -407,23 +418,23 @@ Created new 'skip' file { private LibraryBook _libraryBook { get; } - protected override string SkipDialogText => @" + protected override string SkipDialogText => @" An error occurred while trying to process this book. Skip this book permanently? - Click YES to skip this book permanently. - Click NO to skip the book this time only. We'll try again later. ".Trim(); - protected override MessageBoxButtons SkipDialogButtons => MessageBoxButtons.YesNo; - protected override DialogResult CreateSkipFileResult => DialogResult.Yes; + protected override MessageBoxButtons SkipDialogButtons => MessageBoxButtons.YesNo; + protected override DialogResult CreateSkipFileResult => DialogResult.Yes; - public BackupSingle(LogMe logMe, IProcessable processable, AutomatedBackupsForm automatedBackupsForm, LibraryBook libraryBook) + public BackupSingle(LogMe logMe, IProcessable processable, AutomatedBackupsForm automatedBackupsForm, LibraryBook libraryBook) : base(logMe, processable, automatedBackupsForm) { _libraryBook = libraryBook; } - protected override async Task RunAsync() + protected override async Task RunAsync() { if (_libraryBook is not null) await ProcessOneAsync(Processable.ProcessSingleAsync, _libraryBook); @@ -431,7 +442,7 @@ An error occurred while trying to process this book. Skip this book permanently? } class BackupLoop : BackupRunner { - protected override string SkipDialogText => @" + protected override string SkipDialogText => @" An error occurred while trying to process this book - ABORT: stop processing books. @@ -450,20 +461,20 @@ An error occurred while trying to process this book { // support for 'skip this time only' requires state. iterators provide this state for free. therefore: use foreach/iterator here foreach (var libraryBook in Processable.GetValidLibraryBooks()) - { - var keepGoing = await ProcessOneAsync(Processable.ProcessBookAsync_NoValidation, libraryBook); - if (!keepGoing) - return; + { + var keepGoing = await ProcessOneAsync(Processable.ProcessBookAsync_NoValidation, libraryBook); + if (!keepGoing) + return; - if (!AutomatedBackupsForm.KeepGoing) - { - if (AutomatedBackupsForm.KeepGoingVisible && !AutomatedBackupsForm.KeepGoingChecked) - LogMe.Info("'Keep going' is unchecked"); - return; - } - } + if (!AutomatedBackupsForm.KeepGoing) + { + if (AutomatedBackupsForm.KeepGoingVisible && !AutomatedBackupsForm.KeepGoingChecked) + LogMe.Info("'Keep going' is unchecked"); + return; + } + } - LogMe.Info("Done. All books have been processed"); + LogMe.Info("Done. All books have been processed"); } - } + } } From e958944466e10dd8e4d3bda5b6dacd7bb55a282a Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 30 Jun 2021 00:54:52 -0600 Subject: [PATCH 06/18] Added TagLib through package manager and improved tag retreival. --- AaxDecrypter/AaxDecrypter.csproj | 7 +- AaxDecrypter/AaxcDownloadConverter.cs | 27 ++-- AaxDecrypter/DecryptLib/taglib-sharp.dll | Bin 433664 -> 0 bytes AaxDecrypter/NFO.cs | 31 +++-- AaxDecrypter/TagLibMpeg4Ex.cs | 149 +++++++++++++++++++++++ 5 files changed, 175 insertions(+), 39 deletions(-) delete mode 100644 AaxDecrypter/DecryptLib/taglib-sharp.dll create mode 100644 AaxDecrypter/TagLibMpeg4Ex.cs diff --git a/AaxDecrypter/AaxDecrypter.csproj b/AaxDecrypter/AaxDecrypter.csproj index a3eeee41..a7bf3b44 100644 --- a/AaxDecrypter/AaxDecrypter.csproj +++ b/AaxDecrypter/AaxDecrypter.csproj @@ -4,6 +4,10 @@ net5.0 + + + + lib\taglib-sharp.dll @@ -42,9 +46,6 @@ Always - - Always - diff --git a/AaxDecrypter/AaxcDownloadConverter.cs b/AaxDecrypter/AaxcDownloadConverter.cs index f853cbee..e8ee0a0f 100644 --- a/AaxDecrypter/AaxcDownloadConverter.cs +++ b/AaxDecrypter/AaxcDownloadConverter.cs @@ -41,12 +41,12 @@ namespace AaxDecrypter public string outDir { get; private set; } public string outputFileName { get; private set; } public ChapterInfo chapters { get; private set; } - public string Title => aaxcTagLib.Tag.Title?.Replace(" (Unabridged)", "") ?? "[unknown]"; - public string Author => aaxcTagLib.Tag.FirstPerformer ?? "[unknown]"; - public string Narrator => aaxcTagLib.GetTag(TagLib.TagTypes.Apple).Narrator ?? "[unknown]"; + public string Title => aaxcTagLib.TitleSansUnabridged ?? "[unknown]"; + public string Author => aaxcTagLib.FirstAuthor ?? "[unknown]"; + public string Narrator => aaxcTagLib.Narrator ?? "[unknown]"; public byte[] CoverArt => aaxcTagLib.Tag.Pictures.Length > 0 ? aaxcTagLib.Tag.Pictures[0].Data.Data : default; - private TagLib.Mpeg4.File aaxcTagLib { get; set; } + private AaxcTagLibFile aaxcTagLib { get; set; } private StepSequence steps { get; } private DownloadLicense downloadLicense { get; set; } private FFMpegAaxcProcesser aaxcProcesser; @@ -90,7 +90,7 @@ namespace AaxDecrypter var networkFile = await NetworkFileAbstraction.CreateAsync(client, new Uri(downloadLicense.DownloadUrl)); - aaxcTagLib = await Task.Run(() => TagLib.File.Create(networkFile, "audio/mp4", TagLib.ReadStyle.Average) as TagLib.Mpeg4.File); + aaxcTagLib = await Task.Run(() => new AaxcTagLibFile(networkFile)); var defaultFilename = Path.Combine( outDir, @@ -239,21 +239,8 @@ namespace AaxDecrypter /// public bool Step3_RestoreMetadata() { - var outFile = new TagLib.Mpeg4.File(outputFileName, TagLib.ReadStyle.Average); - - var destTags = outFile.GetTag(TagLib.TagTypes.Apple) as TagLib.Mpeg4.AppleTag; - destTags.Clear(); - - var sourceTag = aaxcTagLib.GetTag(TagLib.TagTypes.Apple) as TagLib.Mpeg4.AppleTag; - - //copy all metadata fields in the source file, even those that TagLib doesn't - //recognize, to the output file. - //NOTE: Chapters aren't stored in MPEG-4 metadata. They are encoded as a Timed - //Text Stream (MPEG-4 Part 17), so taglib doesn't read or write them. - foreach (var stag in sourceTag) - { - destTags.SetData(stag.BoxType, stag.Children.Cast().ToArray()); - } + var outFile = new AaxcTagLibFile(outputFileName); + outFile.CopyTagsFrom(aaxcTagLib); outFile.Save(); return true; diff --git a/AaxDecrypter/DecryptLib/taglib-sharp.dll b/AaxDecrypter/DecryptLib/taglib-sharp.dll deleted file mode 100644 index 87ec4bf1c7a85be3a3e3e958a1ae7a556664613b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 433664 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 diff --git a/AaxDecrypter/NFO.cs b/AaxDecrypter/NFO.cs index ab652f45..eca864ff 100644 --- a/AaxDecrypter/NFO.cs +++ b/AaxDecrypter/NFO.cs @@ -3,32 +3,31 @@ namespace AaxDecrypter { public static class NFO { - public static string CreateContents(string ripper, TagLib.File aaxcTagLib, ChapterInfo chapters) + public static string CreateContents(string ripper, AaxcTagLibFile aaxcTagLib, ChapterInfo chapters) { - var tag = aaxcTagLib.GetTag(TagLib.TagTypes.Apple); - - string narator = string.IsNullOrWhiteSpace(aaxcTagLib.Tag.FirstComposer) ? tag.Narrator : aaxcTagLib.Tag.FirstComposer; + var tag = aaxcTagLib.AppleTags; var _hours = (int)aaxcTagLib.Properties.Duration.TotalHours; var myDuration - = (_hours > 0 ? _hours + " hours, " : "") + = (_hours > 0 ? _hours + " hours, " : string.Empty) + aaxcTagLib.Properties.Duration.Minutes + " minutes, " + aaxcTagLib.Properties.Duration.Seconds + " seconds"; var header = "General Information\r\n" + "===================\r\n" - + $" Title: {aaxcTagLib.Tag.Title.Replace(" (Unabridged)", "")}\r\n" - + $" Author: {aaxcTagLib.Tag.FirstPerformer ?? "[unknown]"}\r\n" - + $" Read By: {aaxcTagLib.GetTag(TagLib.TagTypes.Apple).Narrator??"[unknown]"}\r\n" - + $" Copyright: {aaxcTagLib.Tag.Year}\r\n" - + $" Audiobook Copyright: {aaxcTagLib.Tag.Year}\r\n"; - if (!string.IsNullOrEmpty(aaxcTagLib.Tag.FirstGenre)) - header += $" Genre: {aaxcTagLib.Tag.FirstGenre}\r\n"; + + $" Title: {aaxcTagLib.TitleSansUnabridged ?? "[unknown]"}\r\n" + + $" Author: {aaxcTagLib.FirstAuthor ?? "[unknown]"}\r\n" + + $" Read By: {aaxcTagLib.Narrator ?? "[unknown]"}\r\n" + + $" Release Date: {aaxcTagLib.ReleaseDate ?? "[unknown]"}\r\n" + + $" Book Copyright: {aaxcTagLib.BookCopyright ?? "[unknown]"}\r\n" + + $" Recording Copyright: {aaxcTagLib.RecordingCopyright ?? "[unknown]"}\r\n"; + if (!string.IsNullOrEmpty(tag.FirstGenre)) + header += $" Genre: {aaxcTagLib.AppleTags.FirstGenre}\r\n"; var s = header - + $" Publisher: {tag.Publisher ?? ""}\r\n" + + $" Publisher: {aaxcTagLib.Publisher ?? string.Empty}\r\n" + $" Duration: {myDuration}\r\n" + $" Chapters: {chapters.Count}\r\n" + "\r\n" @@ -38,20 +37,20 @@ namespace AaxDecrypter + " Source Format: Audible AAX\r\n" + $" Source Sample Rate: {aaxcTagLib.Properties.AudioSampleRate} Hz\r\n" + $" Source Channels: {aaxcTagLib.Properties.AudioChannels}\r\n" - + $" Source Bitrate: {aaxcTagLib.Properties.AudioBitrate} kbits\r\n" + + $" Source Bitrate: {aaxcTagLib.Properties.AudioBitrate} Kbps\r\n" + "\r\n" + " Lossless Encode: Yes\r\n" + " Encoded Codec: AAC / M4B\r\n" + $" Encoded Sample Rate: {aaxcTagLib.Properties.AudioSampleRate} Hz\r\n" + $" Encoded Channels: {aaxcTagLib.Properties.AudioChannels}\r\n" - + $" Encoded Bitrate: {aaxcTagLib.Properties.AudioBitrate} kbits\r\n" + + $" Encoded Bitrate: {aaxcTagLib.Properties.AudioBitrate} Kbps\r\n" + "\r\n" + $" Ripper: {ripper}\r\n" + "\r\n" + "\r\n" + "Book Description\r\n" + "================\r\n" - + (!string.IsNullOrWhiteSpace(tag.LongDescription) ? tag.LongDescription : tag.Description); + + (!string.IsNullOrWhiteSpace(aaxcTagLib.LongDescription) ? aaxcTagLib.LongDescription : aaxcTagLib.Tag.Comment); return s; } diff --git a/AaxDecrypter/TagLibMpeg4Ex.cs b/AaxDecrypter/TagLibMpeg4Ex.cs new file mode 100644 index 00000000..f3ffd3c7 --- /dev/null +++ b/AaxDecrypter/TagLibMpeg4Ex.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using TagLib; +using TagLib.Mpeg4; + +namespace AaxDecrypter +{ + public class AaxcTagLibFile : TagLib.Mpeg4.File + { + public AppleTag AppleTags => GetTag(TagTypes.Apple) as AppleTag; + + private static ReadOnlyByteVector naratorType = new ReadOnlyByteVector(0xa9, (byte)'n', (byte)'r', (byte)'t'); + private static ReadOnlyByteVector descriptionType = new ReadOnlyByteVector(0xa9, (byte)'d', (byte)'e', (byte)'s'); + private static ReadOnlyByteVector publisherType = new ReadOnlyByteVector(0xa9, (byte)'p', (byte)'u', (byte)'b'); + public string Narrator { get; } + public string LongDescription { get; } + public string ReleaseDate { get; } + public string Publisher { get; } + //TagLib uses @ART, which is the Artist tag + public string[] Authors => AppleTags.Performers; + public string FirstAuthor { get; } + public string TitleSansUnabridged { get; } + public string BookCopyright { get; } + public string RecordingCopyright { get; } + + private string[] _copyright; + public AaxcTagLibFile(IFileAbstraction abstraction) + : base(abstraction, ReadStyle.Average) + { + _copyright = AppleTags.Copyright?.Replace("©", string.Empty).Replace("(P)", string.Empty)?.Split(';'); + + BookCopyright = _copyright is not null && _copyright.Length > 0 ? _copyright[0] : default; + + RecordingCopyright = _copyright is not null && _copyright.Length > 1 ? _copyright[1] : default; + + TitleSansUnabridged = AppleTags.Title?.Replace(" (Unabridged)", ""); + + FirstAuthor = Authors?.Length > 0 ? unicodeToAscii(Authors[0]) : default; + + string[] text = AppleTags.GetText(publisherType); + Publisher = text.Length == 0 ? null : text[0]; + + text = AppleTags.GetText("rldt"); + ReleaseDate = text.Length == 0 ? null : text[0]; + + text = AppleTags.GetText(descriptionType); + LongDescription = text.Length == 0 ? null : unicodeToAscii(text[0]); + + text = AppleTags.GetText(naratorType); + Narrator = text.Length == 0 ? null : unicodeToAscii(text[0]); + + } + + public AaxcTagLibFile(string path) : this(new LocalFileAbstraction(path)) + { + } + public void CopyTagsFrom(AaxcTagLibFile sourceFile) + { + AppleTags.Clear(); + + //copy all metadata fields in the source file, even those that TagLib doesn't + //recognize, to the output file. + //NOTE: Chapters aren't stored in MPEG-4 metadata. They are encoded as a Timed + //Text Stream (MPEG-4 Part 17), so taglib doesn't read or write them. + foreach (var stag in sourceFile.AppleTags) + { + AppleTags.SetData(stag.BoxType, stag.Children.Cast().ToArray()); + } + } + + + /// + /// Attempts to convert unicode characters to an approximately equal ASCII character. + /// + private string unicodeToAscii(string unicodeStr) + { + //Accents + unicodeStr = Regex.Replace(unicodeStr, "[éèëêð]", "e"); + unicodeStr = Regex.Replace(unicodeStr, "[ÉÈËÊ]", "E"); + unicodeStr = Regex.Replace(unicodeStr, "[àâä]", "a"); + unicodeStr = Regex.Replace(unicodeStr, "[ÀÁÂÃÄÅ]", "A"); + unicodeStr = Regex.Replace(unicodeStr, "[àáâãäå]", "a"); + unicodeStr = Regex.Replace(unicodeStr, "[ÙÚÛÜ]", "U"); + unicodeStr = Regex.Replace(unicodeStr, "[ùúûüµ]", "u"); + unicodeStr = Regex.Replace(unicodeStr, "[òóôõöø]", "o"); + unicodeStr = Regex.Replace(unicodeStr, "[ÒÓÔÕÖØ]", "O"); + unicodeStr = Regex.Replace(unicodeStr, "[ìíîï]", "i"); + unicodeStr = Regex.Replace(unicodeStr, "[ÌÍÎÏ]", "I"); + unicodeStr = Regex.Replace(unicodeStr, "[š]", "s"); + unicodeStr = Regex.Replace(unicodeStr, "[Š]", "S"); + unicodeStr = Regex.Replace(unicodeStr, "[ñ]", "n"); + unicodeStr = Regex.Replace(unicodeStr, "[Ñ]", "N"); + unicodeStr = Regex.Replace(unicodeStr, "[ç]", "c"); + unicodeStr = Regex.Replace(unicodeStr, "[Ç]", "C"); + unicodeStr = Regex.Replace(unicodeStr, "[ÿ]", "y"); + unicodeStr = Regex.Replace(unicodeStr, "[Ÿ]", "Y"); + unicodeStr = Regex.Replace(unicodeStr, "[ž]", "z"); + unicodeStr = Regex.Replace(unicodeStr, "[Ž]", "Z"); + unicodeStr = Regex.Replace(unicodeStr, "[Ð]", "D"); + + //Ligatures + unicodeStr = Regex.Replace(unicodeStr, "[œ]", "oe"); + unicodeStr = Regex.Replace(unicodeStr, "[Œ]", "Oe"); + unicodeStr = Regex.Replace(unicodeStr, "[ꜳ]", "aa"); + unicodeStr = Regex.Replace(unicodeStr, "[Ꜳ]", "AA"); + unicodeStr = Regex.Replace(unicodeStr, "[æ]", "ae"); + unicodeStr = Regex.Replace(unicodeStr, "[Æ]", "AE"); + unicodeStr = Regex.Replace(unicodeStr, "[ꜵ]", "ao"); + unicodeStr = Regex.Replace(unicodeStr, "[Ꜵ]", "AO"); + unicodeStr = Regex.Replace(unicodeStr, "[ꜷ]", "au"); + unicodeStr = Regex.Replace(unicodeStr, "[Ꜷ]", "AU"); + unicodeStr = Regex.Replace(unicodeStr, "[«»ꜹꜻ]", "av"); + unicodeStr = Regex.Replace(unicodeStr, "[«»ꜸꜺ]", "AV"); + unicodeStr = Regex.Replace(unicodeStr, "[🙰]", "et"); + unicodeStr = Regex.Replace(unicodeStr, "[ff]", "ff"); + unicodeStr = Regex.Replace(unicodeStr, "[ffi]", "ffi"); + unicodeStr = Regex.Replace(unicodeStr, "[ffl]", "f‌f‌l"); + unicodeStr = Regex.Replace(unicodeStr, "[fi]", "fi"); + unicodeStr = Regex.Replace(unicodeStr, "[fl]", "fl"); + unicodeStr = Regex.Replace(unicodeStr, "[ƕ]", "hv"); + unicodeStr = Regex.Replace(unicodeStr, "[Ƕ]", "Hv"); + unicodeStr = Regex.Replace(unicodeStr, "[℔]", "lb"); + unicodeStr = Regex.Replace(unicodeStr, "[ꝏ]", "oo"); + unicodeStr = Regex.Replace(unicodeStr, "[Ꝏ]", "OO"); + unicodeStr = Regex.Replace(unicodeStr, "[st]", "st"); + unicodeStr = Regex.Replace(unicodeStr, "[ꜩ]", "tz"); + unicodeStr = Regex.Replace(unicodeStr, "[Ꜩ]", "TZ"); + unicodeStr = Regex.Replace(unicodeStr, "[ᵫ]", "ue"); + unicodeStr = Regex.Replace(unicodeStr, "[ꭣ]", "uo"); + + //Punctuation + unicodeStr = Regex.Replace(unicodeStr, "[«»\u2018\u2019\u201A\u201B\u2032\u2035]", "\'"); + unicodeStr = Regex.Replace(unicodeStr, "[«»\u201C\u201D\u201E\u201F\u2033\u2036]", "\""); + unicodeStr = Regex.Replace(unicodeStr, "[\u2026]", "..."); + unicodeStr = Regex.Replace(unicodeStr, "[\u1680]", "-"); + + //Spaces + unicodeStr = Regex.Replace(unicodeStr, "[«»\u00A0\u2000\u2002\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200F\u205F\u3000]", " "); + unicodeStr = Regex.Replace(unicodeStr, "[«»\u2001\u2003]", " "); + unicodeStr = Regex.Replace(unicodeStr, "[«»\u180E\u200B\uFEFF]", ""); + + return unicodeStr; + } + } +} From bc3aa291758ecc2c3b53322624d71b0687d60914 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 30 Jun 2021 01:06:22 -0600 Subject: [PATCH 07/18] Minor tag reading improvements. --- AaxDecrypter/NFO.cs | 11 ++++------- AaxDecrypter/TagLibMpeg4Ex.cs | 15 +++++++++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/AaxDecrypter/NFO.cs b/AaxDecrypter/NFO.cs index eca864ff..65d3d5b4 100644 --- a/AaxDecrypter/NFO.cs +++ b/AaxDecrypter/NFO.cs @@ -5,8 +5,6 @@ namespace AaxDecrypter { public static string CreateContents(string ripper, AaxcTagLibFile aaxcTagLib, ChapterInfo chapters) { - var tag = aaxcTagLib.AppleTags; - var _hours = (int)aaxcTagLib.Properties.Duration.TotalHours; var myDuration = (_hours > 0 ? _hours + " hours, " : string.Empty) @@ -21,13 +19,12 @@ namespace AaxDecrypter + $" Read By: {aaxcTagLib.Narrator ?? "[unknown]"}\r\n" + $" Release Date: {aaxcTagLib.ReleaseDate ?? "[unknown]"}\r\n" + $" Book Copyright: {aaxcTagLib.BookCopyright ?? "[unknown]"}\r\n" - + $" Recording Copyright: {aaxcTagLib.RecordingCopyright ?? "[unknown]"}\r\n"; - if (!string.IsNullOrEmpty(tag.FirstGenre)) - header += $" Genre: {aaxcTagLib.AppleTags.FirstGenre}\r\n"; + + $" Recording Copyright: {aaxcTagLib.RecordingCopyright ?? "[unknown]"}\r\n" + + $" Genre: {aaxcTagLib.AppleTags.FirstGenre ?? "[unknown]"}\r\n"; var s = header - + $" Publisher: {aaxcTagLib.Publisher ?? string.Empty}\r\n" + + $" Publisher: {aaxcTagLib.Publisher ?? "[unknown]"}\r\n" + $" Duration: {myDuration}\r\n" + $" Chapters: {chapters.Count}\r\n" + "\r\n" @@ -50,7 +47,7 @@ namespace AaxDecrypter + "\r\n" + "Book Description\r\n" + "================\r\n" - + (!string.IsNullOrWhiteSpace(aaxcTagLib.LongDescription) ? aaxcTagLib.LongDescription : aaxcTagLib.Tag.Comment); + + (!string.IsNullOrWhiteSpace(aaxcTagLib.LongDescription) ? aaxcTagLib.LongDescription : aaxcTagLib.Comment); return s; } diff --git a/AaxDecrypter/TagLibMpeg4Ex.cs b/AaxDecrypter/TagLibMpeg4Ex.cs index f3ffd3c7..70c18e88 100644 --- a/AaxDecrypter/TagLibMpeg4Ex.cs +++ b/AaxDecrypter/TagLibMpeg4Ex.cs @@ -17,11 +17,11 @@ namespace AaxDecrypter private static ReadOnlyByteVector descriptionType = new ReadOnlyByteVector(0xa9, (byte)'d', (byte)'e', (byte)'s'); private static ReadOnlyByteVector publisherType = new ReadOnlyByteVector(0xa9, (byte)'p', (byte)'u', (byte)'b'); public string Narrator { get; } + public string Comment { get; } public string LongDescription { get; } public string ReleaseDate { get; } public string Publisher { get; } - //TagLib uses @ART, which is the Artist tag - public string[] Authors => AppleTags.Performers; + public string[] Authors { get; } public string FirstAuthor { get; } public string TitleSansUnabridged { get; } public string BookCopyright { get; } @@ -39,7 +39,12 @@ namespace AaxDecrypter TitleSansUnabridged = AppleTags.Title?.Replace(" (Unabridged)", ""); - FirstAuthor = Authors?.Length > 0 ? unicodeToAscii(Authors[0]) : default; + Comment = AppleTags.Comment is not null ? unicodeToAscii(AppleTags.Comment) : default; + + //TagLib uses @ART, which is the Artist tag + Authors = AppleTags.Performers.Select(author => unicodeToAscii(author)).ToArray(); + + FirstAuthor = Authors?.Length > 0 ? Authors[0] : default; string[] text = AppleTags.GetText(publisherType); Publisher = text.Length == 0 ? null : text[0]; @@ -55,9 +60,11 @@ namespace AaxDecrypter } - public AaxcTagLibFile(string path) : this(new LocalFileAbstraction(path)) + public AaxcTagLibFile(string path) + : this(new LocalFileAbstraction(path)) { } + public void CopyTagsFrom(AaxcTagLibFile sourceFile) { AppleTags.Clear(); From d6b62c0521158eed4232c6360042d1f2125d7738 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 30 Jun 2021 01:12:34 -0600 Subject: [PATCH 08/18] Removed obsolete assembly reference and minor refactoring. --- AaxDecrypter/AaxDecrypter.csproj | 6 ------ AaxDecrypter/NFO.cs | 13 +++++-------- AaxDecrypter/TagLibMpeg4Ex.cs | 29 +++++++++++++---------------- 3 files changed, 18 insertions(+), 30 deletions(-) diff --git a/AaxDecrypter/AaxDecrypter.csproj b/AaxDecrypter/AaxDecrypter.csproj index a7bf3b44..04be65c8 100644 --- a/AaxDecrypter/AaxDecrypter.csproj +++ b/AaxDecrypter/AaxDecrypter.csproj @@ -8,12 +8,6 @@ - - - lib\taglib-sharp.dll - - - diff --git a/AaxDecrypter/NFO.cs b/AaxDecrypter/NFO.cs index 65d3d5b4..9cb3dbb2 100644 --- a/AaxDecrypter/NFO.cs +++ b/AaxDecrypter/NFO.cs @@ -11,26 +11,23 @@ namespace AaxDecrypter + aaxcTagLib.Properties.Duration.Minutes + " minutes, " + aaxcTagLib.Properties.Duration.Seconds + " seconds"; - var header + var nfoString = "General Information\r\n" - + "===================\r\n" + + "======================\r\n" + $" Title: {aaxcTagLib.TitleSansUnabridged ?? "[unknown]"}\r\n" + $" Author: {aaxcTagLib.FirstAuthor ?? "[unknown]"}\r\n" + $" Read By: {aaxcTagLib.Narrator ?? "[unknown]"}\r\n" + $" Release Date: {aaxcTagLib.ReleaseDate ?? "[unknown]"}\r\n" + $" Book Copyright: {aaxcTagLib.BookCopyright ?? "[unknown]"}\r\n" + $" Recording Copyright: {aaxcTagLib.RecordingCopyright ?? "[unknown]"}\r\n" - + $" Genre: {aaxcTagLib.AppleTags.FirstGenre ?? "[unknown]"}\r\n"; - - var s - = header + + $" Genre: {aaxcTagLib.AppleTags.FirstGenre ?? "[unknown]"}\r\n" + $" Publisher: {aaxcTagLib.Publisher ?? "[unknown]"}\r\n" + $" Duration: {myDuration}\r\n" + $" Chapters: {chapters.Count}\r\n" + "\r\n" + "\r\n" + "Media Information\r\n" - + "=================\r\n" + + "======================\r\n" + " Source Format: Audible AAX\r\n" + $" Source Sample Rate: {aaxcTagLib.Properties.AudioSampleRate} Hz\r\n" + $" Source Channels: {aaxcTagLib.Properties.AudioChannels}\r\n" @@ -49,7 +46,7 @@ namespace AaxDecrypter + "================\r\n" + (!string.IsNullOrWhiteSpace(aaxcTagLib.LongDescription) ? aaxcTagLib.LongDescription : aaxcTagLib.Comment); - return s; + return nfoString; } } } diff --git a/AaxDecrypter/TagLibMpeg4Ex.cs b/AaxDecrypter/TagLibMpeg4Ex.cs index 70c18e88..8194ecce 100644 --- a/AaxDecrypter/TagLibMpeg4Ex.cs +++ b/AaxDecrypter/TagLibMpeg4Ex.cs @@ -1,9 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Linq; using System.Text.RegularExpressions; -using System.Threading.Tasks; using TagLib; using TagLib.Mpeg4; @@ -41,38 +37,39 @@ namespace AaxDecrypter Comment = AppleTags.Comment is not null ? unicodeToAscii(AppleTags.Comment) : default; - //TagLib uses @ART, which is the Artist tag + //TagLib uses @ART ID for Performers, which is the Artist tag Authors = AppleTags.Performers.Select(author => unicodeToAscii(author)).ToArray(); FirstAuthor = Authors?.Length > 0 ? Authors[0] : default; string[] text = AppleTags.GetText(publisherType); - Publisher = text.Length == 0 ? null : text[0]; + Publisher = text.Length == 0 ? default : text[0]; text = AppleTags.GetText("rldt"); - ReleaseDate = text.Length == 0 ? null : text[0]; + ReleaseDate = text.Length == 0 ? default : text[0]; text = AppleTags.GetText(descriptionType); - LongDescription = text.Length == 0 ? null : unicodeToAscii(text[0]); + LongDescription = text.Length == 0 ? default : unicodeToAscii(text[0]); text = AppleTags.GetText(naratorType); - Narrator = text.Length == 0 ? null : unicodeToAscii(text[0]); - + Narrator = text.Length == 0 ? default : unicodeToAscii(text[0]); } public AaxcTagLibFile(string path) : this(new LocalFileAbstraction(path)) { } - + /// + /// Copy all metadata fields in the source file, even those that TagLib doesn't + /// recognize, to the output file. + /// NOTE: Chapters aren't stored in MPEG-4 metadata. They are encoded as a Timed + /// Text Stream (MPEG-4 Part 17), so taglib doesn't read or write them. + /// + /// File from which tags will be coppied. public void CopyTagsFrom(AaxcTagLibFile sourceFile) { AppleTags.Clear(); - //copy all metadata fields in the source file, even those that TagLib doesn't - //recognize, to the output file. - //NOTE: Chapters aren't stored in MPEG-4 metadata. They are encoded as a Timed - //Text Stream (MPEG-4 Part 17), so taglib doesn't read or write them. foreach (var stag in sourceFile.AppleTags) { AppleTags.SetData(stag.BoxType, stag.Children.Cast().ToArray()); From 45080d16611b4674f384d9fa46ee45834fa2ff9f Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 30 Jun 2021 12:05:29 -0600 Subject: [PATCH 09/18] Refactored tags. --- AaxDecrypter/NFO.cs | 8 ++-- AaxDecrypter/TagLibMpeg4Ex.cs | 87 +++++++++++++++++++---------------- 2 files changed, 52 insertions(+), 43 deletions(-) diff --git a/AaxDecrypter/NFO.cs b/AaxDecrypter/NFO.cs index 9cb3dbb2..f2bcd8c2 100644 --- a/AaxDecrypter/NFO.cs +++ b/AaxDecrypter/NFO.cs @@ -14,9 +14,9 @@ namespace AaxDecrypter var nfoString = "General Information\r\n" + "======================\r\n" - + $" Title: {aaxcTagLib.TitleSansUnabridged ?? "[unknown]"}\r\n" - + $" Author: {aaxcTagLib.FirstAuthor ?? "[unknown]"}\r\n" - + $" Read By: {aaxcTagLib.Narrator ?? "[unknown]"}\r\n" + + $" Title: {aaxcTagLib.AsciiTitleSansUnabridged ?? "[unknown]"}\r\n" + + $" Author: {aaxcTagLib.AsciiFirstAuthor ?? "[unknown]"}\r\n" + + $" Read By: {aaxcTagLib.AsciiNarrator ?? "[unknown]"}\r\n" + $" Release Date: {aaxcTagLib.ReleaseDate ?? "[unknown]"}\r\n" + $" Book Copyright: {aaxcTagLib.BookCopyright ?? "[unknown]"}\r\n" + $" Recording Copyright: {aaxcTagLib.RecordingCopyright ?? "[unknown]"}\r\n" @@ -44,7 +44,7 @@ namespace AaxDecrypter + "\r\n" + "Book Description\r\n" + "================\r\n" - + (!string.IsNullOrWhiteSpace(aaxcTagLib.LongDescription) ? aaxcTagLib.LongDescription : aaxcTagLib.Comment); + + (!string.IsNullOrWhiteSpace(aaxcTagLib.LongDescription) ? aaxcTagLib.AsciiLongDescription : aaxcTagLib.AsciiComment); return nfoString; } diff --git a/AaxDecrypter/TagLibMpeg4Ex.cs b/AaxDecrypter/TagLibMpeg4Ex.cs index 8194ecce..cdb2a0a6 100644 --- a/AaxDecrypter/TagLibMpeg4Ex.cs +++ b/AaxDecrypter/TagLibMpeg4Ex.cs @@ -9,50 +9,59 @@ namespace AaxDecrypter { public AppleTag AppleTags => GetTag(TagTypes.Apple) as AppleTag; - private static ReadOnlyByteVector naratorType = new ReadOnlyByteVector(0xa9, (byte)'n', (byte)'r', (byte)'t'); + private static ReadOnlyByteVector narratorType = new ReadOnlyByteVector(0xa9, (byte)'n', (byte)'r', (byte)'t'); private static ReadOnlyByteVector descriptionType = new ReadOnlyByteVector(0xa9, (byte)'d', (byte)'e', (byte)'s'); private static ReadOnlyByteVector publisherType = new ReadOnlyByteVector(0xa9, (byte)'p', (byte)'u', (byte)'b'); - public string Narrator { get; } - public string Comment { get; } - public string LongDescription { get; } - public string ReleaseDate { get; } - public string Publisher { get; } - public string[] Authors { get; } - public string FirstAuthor { get; } - public string TitleSansUnabridged { get; } - public string BookCopyright { get; } - public string RecordingCopyright { get; } - private string[] _copyright; + public string AsciiTitleSansUnabridged => TitleSansUnabridged is not null? unicodeToAscii(TitleSansUnabridged) : default; + public string AsciiFirstAuthor => FirstAuthor is not null? unicodeToAscii(FirstAuthor) : default; + public string AsciiNarrator => Narrator is not null ? unicodeToAscii(Narrator) : default; + public string AsciiComment => Comment is not null ? unicodeToAscii(Comment) : default; + public string AsciiLongDescription => LongDescription is not null ? unicodeToAscii(LongDescription) : default; + + public string Comment => AppleTags.Comment; + public string[] Authors => AppleTags.Performers; + public string FirstAuthor => Authors?.Length > 0 ? Authors[0] : default; + public string TitleSansUnabridged => AppleTags.Title?.Replace(" (Unabridged)", ""); + public string BookCopyright => _copyright is not null && _copyright.Length > 0 ? _copyright[0] : default; + public string RecordingCopyright => _copyright is not null && _copyright.Length > 1 ? _copyright[1] : default; + public string Narrator + { + get + { + string[] text = AppleTags.GetText(narratorType); + return text.Length == 0 ? default : text[0]; + } + } + public string LongDescription + { + get + { + string[] text = AppleTags.GetText(descriptionType); + return text.Length == 0 ? default : text[0]; + } + } + public string ReleaseDate + { + get + { + string[] text = AppleTags.GetText("rldt"); + return text.Length == 0 ? default : text[0]; + } + } + public string Publisher + { + get + { + string[] text = AppleTags.GetText(publisherType); + return text.Length == 0 ? default : text[0]; + } + } + + private string[] _copyright => AppleTags.Copyright?.Replace("©", string.Empty)?.Replace("(P)", string.Empty)?.Split(';'); public AaxcTagLibFile(IFileAbstraction abstraction) : base(abstraction, ReadStyle.Average) - { - _copyright = AppleTags.Copyright?.Replace("©", string.Empty).Replace("(P)", string.Empty)?.Split(';'); - - BookCopyright = _copyright is not null && _copyright.Length > 0 ? _copyright[0] : default; - - RecordingCopyright = _copyright is not null && _copyright.Length > 1 ? _copyright[1] : default; - - TitleSansUnabridged = AppleTags.Title?.Replace(" (Unabridged)", ""); - - Comment = AppleTags.Comment is not null ? unicodeToAscii(AppleTags.Comment) : default; - - //TagLib uses @ART ID for Performers, which is the Artist tag - Authors = AppleTags.Performers.Select(author => unicodeToAscii(author)).ToArray(); - - FirstAuthor = Authors?.Length > 0 ? Authors[0] : default; - - string[] text = AppleTags.GetText(publisherType); - Publisher = text.Length == 0 ? default : text[0]; - - text = AppleTags.GetText("rldt"); - ReleaseDate = text.Length == 0 ? default : text[0]; - - text = AppleTags.GetText(descriptionType); - LongDescription = text.Length == 0 ? default : unicodeToAscii(text[0]); - - text = AppleTags.GetText(naratorType); - Narrator = text.Length == 0 ? default : unicodeToAscii(text[0]); + { } public AaxcTagLibFile(string path) From 0da054ccea5742404ce7e06d6bb874b0477509a7 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 30 Jun 2021 12:20:21 -0600 Subject: [PATCH 10/18] Taglib fixes. --- AaxDecrypter/AaxcDownloadConverter.cs | 12 ++++++------ AaxDecrypter/{TagLibMpeg4Ex.cs => AaxcTagLibFile.cs} | 0 2 files changed, 6 insertions(+), 6 deletions(-) rename AaxDecrypter/{TagLibMpeg4Ex.cs => AaxcTagLibFile.cs} (100%) diff --git a/AaxDecrypter/AaxcDownloadConverter.cs b/AaxDecrypter/AaxcDownloadConverter.cs index e8ee0a0f..6c6aa3b3 100644 --- a/AaxDecrypter/AaxcDownloadConverter.cs +++ b/AaxDecrypter/AaxcDownloadConverter.cs @@ -41,10 +41,10 @@ namespace AaxDecrypter public string outDir { get; private set; } public string outputFileName { get; private set; } public ChapterInfo chapters { get; private set; } - public string Title => aaxcTagLib.TitleSansUnabridged ?? "[unknown]"; + public string Title => aaxcTagLib.TitleSansUnabridged; public string Author => aaxcTagLib.FirstAuthor ?? "[unknown]"; public string Narrator => aaxcTagLib.Narrator ?? "[unknown]"; - public byte[] CoverArt => aaxcTagLib.Tag.Pictures.Length > 0 ? aaxcTagLib.Tag.Pictures[0].Data.Data : default; + public byte[] CoverArt => aaxcTagLib.AppleTags.Pictures.Length > 0 ? aaxcTagLib.Tag.Pictures[0].Data.Data : default; private AaxcTagLibFile aaxcTagLib { get; set; } private StepSequence steps { get; } @@ -90,12 +90,12 @@ namespace AaxDecrypter var networkFile = await NetworkFileAbstraction.CreateAsync(client, new Uri(downloadLicense.DownloadUrl)); - aaxcTagLib = await Task.Run(() => new AaxcTagLibFile(networkFile)); + aaxcTagLib = await Task.Run(() => new AaxcTagLibFile(networkFile)); var defaultFilename = Path.Combine( outDir, - PathLib.ToPathSafeString(aaxcTagLib.Tag.FirstPerformer??"[unknown]"), - PathLib.ToPathSafeString(aaxcTagLib.Tag.Title.Replace(" (Unabridged)", "")) + ".m4b" + PathLib.ToPathSafeString(aaxcTagLib.FirstAuthor ?? "[unknown]"), + PathLib.ToPathSafeString(aaxcTagLib.TitleSansUnabridged) + ".m4b" ); SetOutputFilename(defaultFilename); @@ -260,7 +260,7 @@ namespace AaxDecrypter public void Cancel() { - aaxcProcesser.Cancel(); + aaxcProcesser?.Cancel(); } } } diff --git a/AaxDecrypter/TagLibMpeg4Ex.cs b/AaxDecrypter/AaxcTagLibFile.cs similarity index 100% rename from AaxDecrypter/TagLibMpeg4Ex.cs rename to AaxDecrypter/AaxcTagLibFile.cs From aa3c648c4c54fb6927595af26f379895ee637eb4 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 30 Jun 2021 13:21:39 -0600 Subject: [PATCH 11/18] Refactored remaining time estimate. --- AaxDecrypter/AaxcDownloadConverter.cs | 63 +++------------------------ AaxDecrypter/FFMpegAaxcProcesser.cs | 23 ++++++++-- 2 files changed, 25 insertions(+), 61 deletions(-) diff --git a/AaxDecrypter/AaxcDownloadConverter.cs b/AaxDecrypter/AaxcDownloadConverter.cs index 6c6aa3b3..5115bb58 100644 --- a/AaxDecrypter/AaxcDownloadConverter.cs +++ b/AaxDecrypter/AaxcDownloadConverter.cs @@ -168,72 +168,19 @@ namespace AaxDecrypter return aaxcProcesser.Succeeded; } - private void AaxcProcesser_ProgressUpdate(object sender, TimeSpan e) + private void AaxcProcesser_ProgressUpdate(object sender, AaxcProcessUpdate e) { - double averageRate = getAverageProcessRate(e); - double remainingSecsToProcess = (aaxcTagLib.Properties.Duration - e).TotalSeconds; - double estTimeRemaining = remainingSecsToProcess / averageRate; + double remainingSecsToProcess = (aaxcTagLib.Properties.Duration - e.ProcessPosition).TotalSeconds; + double estTimeRemaining = remainingSecsToProcess / e.ProcessSpeed; if (double.IsNormal(estTimeRemaining)) - DecryptTimeRemaining?.Invoke(this, TimeSpan.FromSeconds(estTimeRemaining)); + DecryptTimeRemaining?.Invoke(this, TimeSpan.FromSeconds(estTimeRemaining)); - double progressPercent = 100 * e.TotalSeconds / aaxcTagLib.Properties.Duration.TotalSeconds; + double progressPercent = 100 * e.ProcessPosition.TotalSeconds / aaxcTagLib.Properties.Duration.TotalSeconds; DecryptProgressUpdate?.Invoke(this, (int)progressPercent); } - /// - /// Calculates the average processing rate based on the last 2 to samples. - /// - /// Position in the audio file last processed - /// The average processing rate, in book_duration_seconds / second. - private double getAverageProcessRate(TimeSpan lastProcessedPosition) - { - streamPositions.Enqueue(new StreamPosition - { - ProcessPosition = lastProcessedPosition, - EventTime = DateTime.Now, - }); - - if (streamPositions.Count < 2) - return double.PositiveInfinity; - - //Calculate the harmonic mean of the last 2 to MAX_NUM_AVERAGE progress updates - //Units are Book_Duration_Seconds / second - - var lastPos = streamPositions.Count > MAX_NUM_AVERAGE ? streamPositions.Dequeue() : null; - - double harmonicDenominator = 0; - int harmonicNumerator = 0; - - foreach (var pos in streamPositions) - { - if (lastPos is null) - { - lastPos = pos; - continue; - } - double dP = (pos.ProcessPosition - lastPos.ProcessPosition).TotalSeconds; - double dT = (pos.EventTime - lastPos.EventTime).TotalSeconds; - - harmonicDenominator += dT / dP; - harmonicNumerator++; - lastPos = pos; - } - - double harmonicMean = harmonicNumerator / harmonicDenominator; - return harmonicMean; - } - - private const int MAX_NUM_AVERAGE = 15; - private class StreamPosition - { - public TimeSpan ProcessPosition { get; set; } - public DateTime EventTime { get; set; } - } - - private Queue streamPositions = new Queue(); - /// /// Copy all aacx metadata to m4b file, including cover art. /// diff --git a/AaxDecrypter/FFMpegAaxcProcesser.cs b/AaxDecrypter/FFMpegAaxcProcesser.cs index 89734dcf..6c144a3f 100644 --- a/AaxDecrypter/FFMpegAaxcProcesser.cs +++ b/AaxDecrypter/FFMpegAaxcProcesser.cs @@ -7,13 +7,25 @@ using System.Threading.Tasks; namespace AaxDecrypter { + class AaxcProcessUpdate + { + public AaxcProcessUpdate(TimeSpan position, double speed) + { + ProcessPosition = position; + ProcessSpeed = speed; + EventTime = DateTime.Now; + } + public TimeSpan ProcessPosition { get; } + public double ProcessSpeed { get; } + public DateTime EventTime { get; } + } /// /// Download audible aaxc, decrypt, and remux with chapters. /// class FFMpegAaxcProcesser { - public event EventHandler ProgressUpdate; + public event EventHandler ProgressUpdate; public string FFMpegPath { get; } public DownloadLicense DownloadLicense { get; } public bool IsRunning { get; private set; } @@ -24,7 +36,7 @@ namespace AaxDecrypter private StringBuilder remuxerError = new StringBuilder(); private StringBuilder downloaderError = new StringBuilder(); - private static Regex processedTimeRegex = new Regex("time=(\\d{2}):(\\d{2}):(\\d{2}).\\d{2}", RegexOptions.IgnoreCase | RegexOptions.Compiled); + private static Regex processedTimeRegex = new Regex("time=(\\d{2}):(\\d{2}):(\\d{2}).\\d{2}.*speed=\\s{0,1}([0-9]*[.]?[0-9]+)(?:e\\+([0-9]+)){0,1}", RegexOptions.IgnoreCase | RegexOptions.Compiled); private Process downloader; private Process remuxer; @@ -115,6 +127,7 @@ namespace AaxDecrypter if (processedTimeRegex.IsMatch(e.Data)) { //get timestamp of of last processed audio stream position + //and processing speed var match = processedTimeRegex.Match(e.Data); int hours = int.Parse(match.Groups[1].Value); @@ -123,7 +136,11 @@ namespace AaxDecrypter var position = new TimeSpan(hours, minutes, seconds); - ProgressUpdate?.Invoke(sender, position); + double speed = double.Parse(match.Groups[4].Value); + int exp = match.Groups[5].Success ? int.Parse(match.Groups[5].Value) : 0; + speed *= Math.Pow(10, exp); + + ProgressUpdate?.Invoke(this, new AaxcProcessUpdate(position, speed)); } if (e.Data.Contains("aac bitstream error")) From 8d6b304a8b036fcbccfd19ac50a56b7c178d4d93 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 30 Jun 2021 17:31:01 -0600 Subject: [PATCH 12/18] Moved Taglib loading into the step sequence and added event and method to request cover art. --- AaxDecrypter/AaxcDownloadConverter.cs | 108 +++++++++++++++----------- 1 file changed, 63 insertions(+), 45 deletions(-) diff --git a/AaxDecrypter/AaxcDownloadConverter.cs b/AaxDecrypter/AaxcDownloadConverter.cs index 5115bb58..ed986bbd 100644 --- a/AaxDecrypter/AaxcDownloadConverter.cs +++ b/AaxDecrypter/AaxcDownloadConverter.cs @@ -10,51 +10,53 @@ using System.Threading.Tasks; namespace AaxDecrypter { - public interface ISimpleAaxToM4bConverter + public interface ISimpleAaxcToM4bConverter { + event EventHandler RetrievedTags; + event EventHandler RetrievedCoverArt; + event EventHandler DecryptTimeRemaining; event EventHandler DecryptProgressUpdate; bool Run(); string AppName { get; set; } string outDir { get; } string outputFileName { get; } ChapterInfo chapters { get; } + AaxcTagLibFile aaxcTagLib { get; } + byte[] coverArt { get; } + void SetCoverArt(byte[] coverArt); void SetOutputFilename(string outFileName); - string Title { get; } - string Author { get; } - string Narrator { get; } - byte[] CoverArt { get; } } - public interface IAdvancedAaxcToM4bConverter : ISimpleAaxToM4bConverter + public interface IAdvancedAaxcToM4bConverter : ISimpleAaxcToM4bConverter { void Cancel(); bool Step1_CreateDir(); - bool Step2_DownloadAndCombine(); - bool Step3_RestoreMetadata(); - bool Step4_CreateCue(); - bool Step5_CreateNfo(); + bool Step2_GetMetadata(); + bool Step3_DownloadAndCombine(); + bool Step4_RestoreMetadata(); + bool Step5_CreateCue(); + bool Step6_CreateNfo(); } public class AaxcDownloadConverter : IAdvancedAaxcToM4bConverter { + public event EventHandler RetrievedTags; + public event EventHandler RetrievedCoverArt; public event EventHandler DecryptProgressUpdate; public event EventHandler DecryptTimeRemaining; public string AppName { get; set; } = nameof(AaxcDownloadConverter); public string outDir { get; private set; } public string outputFileName { get; private set; } public ChapterInfo chapters { get; private set; } - public string Title => aaxcTagLib.TitleSansUnabridged; - public string Author => aaxcTagLib.FirstAuthor ?? "[unknown]"; - public string Narrator => aaxcTagLib.Narrator ?? "[unknown]"; - public byte[] CoverArt => aaxcTagLib.AppleTags.Pictures.Length > 0 ? aaxcTagLib.Tag.Pictures[0].Data.Data : default; + public AaxcTagLibFile aaxcTagLib { get; private set; } + public byte[] coverArt { get; private set; } - private AaxcTagLibFile aaxcTagLib { get; set; } private StepSequence steps { get; } private DownloadLicense downloadLicense { get; set; } private FFMpegAaxcProcesser aaxcProcesser; - public static async Task CreateAsync(string outDirectory, DownloadLicense dlLic, ChapterInfo chapters = null) + public static AaxcDownloadConverter Create(string outDirectory, DownloadLicense dlLic, ChapterInfo chapters = null) { - var converter = new AaxcDownloadConverter(outDirectory, dlLic, chapters); - await converter.prelimProcessing(); + var converter = new AaxcDownloadConverter(outDirectory, dlLic, chapters); + converter.SetOutputFilename(Path.GetTempFileName()); return converter; } @@ -72,35 +74,17 @@ namespace AaxDecrypter Name = "Convert Aax To M4b", ["Step 1: Create Dir"] = Step1_CreateDir, - ["Step 2: Download and Combine Audiobook"] = Step2_DownloadAndCombine, - ["Step 3: Restore Aaxc Metadata"] = Step3_RestoreMetadata, - ["Step 4: Create Cue"] = Step4_CreateCue, - ["Step 5: Create Nfo"] = Step5_CreateNfo, + ["Step 2: Get Aaxc Metadata"] = Step2_GetMetadata, + ["Step 3: Download Decrypted Audiobook"] = Step3_DownloadAndCombine, + ["Step 4: Restore Aaxc Metadata"] = Step4_RestoreMetadata, + ["Step 5: Create Cue"] = Step5_CreateCue, + ["Step 6: Create Nfo"] = Step6_CreateNfo, }; downloadLicense = dlLic; this.chapters = chapters; } - private async Task prelimProcessing() - { - //Get metadata from the file over http - var client = new System.Net.Http.HttpClient(); - client.DefaultRequestHeaders.Add("User-Agent", downloadLicense.UserAgent); - - var networkFile = await NetworkFileAbstraction.CreateAsync(client, new Uri(downloadLicense.DownloadUrl)); - - aaxcTagLib = await Task.Run(() => new AaxcTagLibFile(networkFile)); - - var defaultFilename = Path.Combine( - outDir, - PathLib.ToPathSafeString(aaxcTagLib.FirstAuthor ?? "[unknown]"), - PathLib.ToPathSafeString(aaxcTagLib.TitleSansUnabridged) + ".m4b" - ); - - SetOutputFilename(defaultFilename); - } - public void SetOutputFilename(string outFileName) { outputFileName = PathLib.ReplaceExtension(outFileName, ".m4b"); @@ -110,6 +94,14 @@ namespace AaxDecrypter File.Delete(outputFileName); } + public void SetCoverArt(byte[] coverArt) + { + if (coverArt is null) return; + + this.coverArt = coverArt; + RetrievedCoverArt?.Invoke(this, coverArt); + } + public bool Run() { var (IsSuccess, Elapsed) = steps.Run(); @@ -134,7 +126,27 @@ namespace AaxDecrypter return true; } - public bool Step2_DownloadAndCombine() + public bool Step2_GetMetadata() + { + //Get metadata from the file over http + var client = new System.Net.Http.HttpClient(); + client.DefaultRequestHeaders.Add("User-Agent", downloadLicense.UserAgent); + var networkFile = NetworkFileAbstraction.CreateAsync(client, new Uri(downloadLicense.DownloadUrl)).GetAwaiter().GetResult(); + + aaxcTagLib = new AaxcTagLibFile(networkFile); + + if (coverArt is null && aaxcTagLib.AppleTags.Pictures.Length > 0) + { + coverArt = aaxcTagLib.AppleTags.Pictures[0].Data.Data; + } + + RetrievedTags?.Invoke(this, aaxcTagLib); + RetrievedCoverArt?.Invoke(this, coverArt); + + return true; + } + + public bool Step3_DownloadAndCombine() { aaxcProcesser = new FFMpegAaxcProcesser(downloadLicense); aaxcProcesser.ProgressUpdate += AaxcProcesser_ProgressUpdate; @@ -184,22 +196,28 @@ namespace AaxDecrypter /// /// Copy all aacx metadata to m4b file, including cover art. /// - public bool Step3_RestoreMetadata() + public bool Step4_RestoreMetadata() { var outFile = new AaxcTagLibFile(outputFileName); outFile.CopyTagsFrom(aaxcTagLib); + + if (outFile.AppleTags.Pictures.Length == 0 && coverArt is not null) + { + outFile.AddPicture(coverArt); + } + outFile.Save(); return true; } - public bool Step4_CreateCue() + public bool Step5_CreateCue() { File.WriteAllText(PathLib.ReplaceExtension(outputFileName, ".cue"), Cue.CreateContents(Path.GetFileName(outputFileName), chapters)); return true; } - public bool Step5_CreateNfo() + public bool Step6_CreateNfo() { File.WriteAllText(PathLib.ReplaceExtension(outputFileName, ".nfo"), NFO.CreateContents(AppName, aaxcTagLib, chapters)); return true; From 2955e8b464cba80030994e34bc872b741c176863 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 30 Jun 2021 17:31:30 -0600 Subject: [PATCH 13/18] Added method to set cover art in tags for writing. --- AaxDecrypter/AaxcTagLibFile.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/AaxDecrypter/AaxcTagLibFile.cs b/AaxDecrypter/AaxcTagLibFile.cs index cdb2a0a6..17706b5f 100644 --- a/AaxDecrypter/AaxcTagLibFile.cs +++ b/AaxDecrypter/AaxcTagLibFile.cs @@ -84,7 +84,10 @@ namespace AaxDecrypter AppleTags.SetData(stag.BoxType, stag.Children.Cast().ToArray()); } } - + public void AddPicture(byte[] coverArt) + { + AppleTags.SetData("covr", coverArt, 0); + } /// /// Attempts to convert unicode characters to an approximately equal ASCII character. From 3af84af2e25b7bacf6e4a67de577607fce61bbc8 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 30 Jun 2021 17:32:34 -0600 Subject: [PATCH 14/18] Added events to retrieve cover art upon request using PictureStorage. --- FileLiberator/DownloadDecryptBook.cs | 38 ++++++++++++------- FileLiberator/IDecryptable.cs | 1 + .../ProcessorAutomationController.cs | 30 +++++++++++++++ 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/FileLiberator/DownloadDecryptBook.cs b/FileLiberator/DownloadDecryptBook.cs index 8eed437e..d01d5b36 100644 --- a/FileLiberator/DownloadDecryptBook.cs +++ b/FileLiberator/DownloadDecryptBook.cs @@ -15,6 +15,7 @@ namespace FileLiberator { public class DownloadDecryptBook : IDecryptable { + public event EventHandler> RequestCoverArt; public event EventHandler Begin; public event EventHandler DecryptBegin; public event EventHandler TitleDiscovered; @@ -72,38 +73,30 @@ namespace FileLiberator var aaxcDecryptDlLic = new DownloadLicense(dlLic.DownloadUrl, dlLic.AudibleKey, dlLic.AudibleIV, Resources.UserAgent); - var destinationDirectory = Path.GetDirectoryName(destinationDir); - if (Configuration.Instance.DownloadChapters) { var contentMetadata = await api.GetLibraryBookMetadataAsync(libraryBook.Book.AudibleProductId); - var aaxcDecryptChapters = new ChapterInfo(); foreach (var chap in contentMetadata?.ChapterInfo?.Chapters) aaxcDecryptChapters.AddChapter(new Chapter(chap.Title, chap.StartOffsetMs, chap.LengthMs)); - aaxcDownloader = await AaxcDownloadConverter.CreateAsync(destinationDirectory, aaxcDecryptDlLic, aaxcDecryptChapters); + aaxcDownloader = AaxcDownloadConverter.Create(destinationDir, aaxcDecryptDlLic, aaxcDecryptChapters); } else { - aaxcDownloader = await AaxcDownloadConverter.CreateAsync(destinationDirectory, aaxcDecryptDlLic); + aaxcDownloader = AaxcDownloadConverter.Create(destinationDir, aaxcDecryptDlLic); } - aaxcDownloader.AppName = "Libation"; - - TitleDiscovered?.Invoke(this, aaxcDownloader.Title); - AuthorsDiscovered?.Invoke(this, aaxcDownloader.Author); - NarratorsDiscovered?.Invoke(this, aaxcDownloader.Narrator); - - if (aaxcDownloader.CoverArt is not null) - CoverImageFilepathDiscovered?.Invoke(this, aaxcDownloader.CoverArt); + aaxcDownloader.AppName = "Libation"; // override default which was set in CreateAsync var proposedOutputFile = Path.Combine(destinationDir, $"{PathLib.ToPathSafeString(libraryBook.Book.Title)} [{libraryBook.Book.AudibleProductId}].m4b"); aaxcDownloader.SetOutputFilename(proposedOutputFile); aaxcDownloader.DecryptProgressUpdate += (s, progress) => UpdateProgress?.Invoke(this, progress); aaxcDownloader.DecryptTimeRemaining += (s, remaining) => UpdateRemainingTime?.Invoke(this, remaining); + aaxcDownloader.RetrievedCoverArt += AaxcDownloader_RetrievedCoverArt; + aaxcDownloader.RetrievedTags += aaxcDownloader_RetrievedTags; // REAL WORK DONE HERE var success = await Task.Run(() => aaxcDownloader.Run()); @@ -120,6 +113,25 @@ namespace FileLiberator } } + private void AaxcDownloader_RetrievedCoverArt(object sender, byte[] e) + { + if (e is null && Configuration.Instance.DownloadChapters) + { + RequestCoverArt?.Invoke(this, aaxcDownloader.SetCoverArt); + } + else + { + CoverImageFilepathDiscovered?.Invoke(this, e); + } + } + + private void aaxcDownloader_RetrievedTags(object sender, AaxcTagLibFile e) + { + TitleDiscovered?.Invoke(this, e.TitleSansUnabridged); + AuthorsDiscovered?.Invoke(this, e.FirstAuthor ?? "[unknown]"); + NarratorsDiscovered?.Invoke(this, e.Narrator ?? "[unknown]"); + } + private static string moveFilesToBooksDir(Book product, string outputAudioFilename) { // create final directory. move each file into it. MOVE AUDIO FILE LAST diff --git a/FileLiberator/IDecryptable.cs b/FileLiberator/IDecryptable.cs index 1c90ccfc..568c3624 100644 --- a/FileLiberator/IDecryptable.cs +++ b/FileLiberator/IDecryptable.cs @@ -6,6 +6,7 @@ namespace FileLiberator { event EventHandler DecryptBegin; + event EventHandler> RequestCoverArt; event EventHandler TitleDiscovered; event EventHandler AuthorsDiscovered; event EventHandler NarratorsDiscovered; diff --git a/LibationWinForms/BookLiberation/ProcessorAutomationController.cs b/LibationWinForms/BookLiberation/ProcessorAutomationController.cs index da9ca8a1..c25f7e6a 100644 --- a/LibationWinForms/BookLiberation/ProcessorAutomationController.cs +++ b/LibationWinForms/BookLiberation/ProcessorAutomationController.cs @@ -267,6 +267,23 @@ namespace LibationWinForms.BookLiberation void updateRemainingTime(object _, TimeSpan remaining) => decryptDialog.UpdateRemainingTime(remaining); void decryptCompleted(object _, string __) => decryptDialog.Close(); + + void requestCoverArt(object _, Action setArt) + { + var picDef = new FileManager.PictureDefinition(libraryBook.Book.PictureId, FileManager.PictureSize._500x500); + (bool isDefault, byte[] picture) = FileManager.PictureStorage.GetPicture(picDef); + + if (isDefault) + { + void pictureCached(object _, string pictureId) => onPictureCached(libraryBook, pictureId, setArt, pictureCached); + FileManager.PictureStorage.PictureCached += pictureCached; + } + else + setArt(picture); + } + + + #endregion #region subscribe new form to model's events @@ -278,6 +295,7 @@ namespace LibationWinForms.BookLiberation decryptBook.CoverImageFilepathDiscovered += coverImageFilepathDiscovered; decryptBook.UpdateProgress += updateProgress; decryptBook.UpdateRemainingTime += updateRemainingTime; + decryptBook.RequestCoverArt += requestCoverArt; decryptBook.DecryptCompleted += decryptCompleted; #endregion @@ -294,13 +312,25 @@ namespace LibationWinForms.BookLiberation decryptBook.CoverImageFilepathDiscovered -= coverImageFilepathDiscovered; decryptBook.UpdateProgress -= updateProgress; decryptBook.UpdateRemainingTime -= updateRemainingTime; + decryptBook.RequestCoverArt -= requestCoverArt; decryptBook.DecryptCompleted -= decryptCompleted; decryptBook.Cancel(); }; #endregion } + private static void onPictureCached(LibraryBook libraryBook, string picId, Action setArt, EventHandler pictureCacheDelegate) + { + if (picId == libraryBook.Book.PictureId) + { + FileManager.PictureStorage.PictureCached -= pictureCacheDelegate; + var picDef = new FileManager.PictureDefinition(libraryBook.Book.PictureId, FileManager.PictureSize._500x500); + (_, byte[] picture) = FileManager.PictureStorage.GetPicture(picDef); + + setArt(picture); + } + } private static (AutomatedBackupsForm, LogMe) attachToBackupsForm(IDownloadableProcessable downloadable) { #region create form and logger From 6696317ae622750b9f7b36733fda9df550e67eaf Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 30 Jun 2021 17:38:24 -0600 Subject: [PATCH 15/18] Changed DownloadChapters setting to AllowLibationFixup. --- FileLiberator/DownloadDecryptBook.cs | 4 ++-- FileManager/Configuration.cs | 8 +++---- LibationLauncher/Program.cs | 6 +++--- .../Dialogs/SettingsDialog.Designer.cs | 20 +++++++++--------- LibationWinForms/Dialogs/SettingsDialog.cs | 4 ++-- LibationWinForms/Dialogs/SettingsDialog.resx | 21 ------------------- 6 files changed, 21 insertions(+), 42 deletions(-) diff --git a/FileLiberator/DownloadDecryptBook.cs b/FileLiberator/DownloadDecryptBook.cs index d01d5b36..73d77050 100644 --- a/FileLiberator/DownloadDecryptBook.cs +++ b/FileLiberator/DownloadDecryptBook.cs @@ -73,7 +73,7 @@ namespace FileLiberator var aaxcDecryptDlLic = new DownloadLicense(dlLic.DownloadUrl, dlLic.AudibleKey, dlLic.AudibleIV, Resources.UserAgent); - if (Configuration.Instance.DownloadChapters) + if (Configuration.Instance.AllowLibationFixup) { var contentMetadata = await api.GetLibraryBookMetadataAsync(libraryBook.Book.AudibleProductId); var aaxcDecryptChapters = new ChapterInfo(); @@ -115,7 +115,7 @@ namespace FileLiberator private void AaxcDownloader_RetrievedCoverArt(object sender, byte[] e) { - if (e is null && Configuration.Instance.DownloadChapters) + if (e is null && Configuration.Instance.AllowLibationFixup) { RequestCoverArt?.Invoke(this, aaxcDownloader.SetCoverArt); } diff --git a/FileManager/Configuration.cs b/FileManager/Configuration.cs index 2f72616e..8df08b87 100644 --- a/FileManager/Configuration.cs +++ b/FileManager/Configuration.cs @@ -83,11 +83,11 @@ namespace FileManager set => persistentDictionary.Set(nameof(DecryptInProgressEnum), value); } - [Description("Download chapter titles from Audible?")] - public bool DownloadChapters + [Description("Allow Libation for fix up audiobook metadata?")] + public bool AllowLibationFixup { - get => persistentDictionary.Get(nameof(DownloadChapters)); - set => persistentDictionary.Set(nameof(DownloadChapters), value); + get => persistentDictionary.Get(nameof(AllowLibationFixup)); + set => persistentDictionary.Set(nameof(AllowLibationFixup), value); } // note: any potential file manager static ctors can't compensate if storage dir is changed at run time via settings. this is partly bad architecture. but the side effect is desirable. if changing LibationFiles location: restart app diff --git a/LibationLauncher/Program.cs b/LibationLauncher/Program.cs index ea9d6f09..5b664cc5 100644 --- a/LibationLauncher/Program.cs +++ b/LibationLauncher/Program.cs @@ -60,7 +60,7 @@ namespace LibationLauncher config.DownloadsInProgressEnum ??= "WinTemp"; config.DecryptInProgressEnum ??= "WinTemp"; config.Books ??= Configuration.AppDir; - config.DownloadChapters = true; + config.AllowLibationFixup = true; }; // setupDialog.BasicBtn_Click += (_, __) => // no action needed setupDialog.AdvancedBtn_Click += (_, __) => isAdvanced = true; @@ -235,9 +235,9 @@ namespace LibationLauncher { var persistentDictionary = new PersistentDictionary(Configuration.Instance.SettingsFilePath); - if (persistentDictionary.GetString("DownloadChapters") is null) + if (persistentDictionary.GetString("AllowLibationFixup") is null) { - persistentDictionary.Set("DownloadChapters", true); + persistentDictionary.Set("AllowLibationFixup", true); } if (!File.Exists(AudibleApiStorage.AccountsSettingsFile)) diff --git a/LibationWinForms/Dialogs/SettingsDialog.Designer.cs b/LibationWinForms/Dialogs/SettingsDialog.Designer.cs index 76d1791b..b51198ce 100644 --- a/LibationWinForms/Dialogs/SettingsDialog.Designer.cs +++ b/LibationWinForms/Dialogs/SettingsDialog.Designer.cs @@ -43,7 +43,7 @@ this.saveBtn = new System.Windows.Forms.Button(); this.cancelBtn = new System.Windows.Forms.Button(); this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.downloadChaptersCbox = new System.Windows.Forms.CheckBox(); + this.allowLibationFixupCbox = new System.Windows.Forms.CheckBox(); this.downloadsInProgressGb.SuspendLayout(); this.decryptInProgressGb.SuspendLayout(); this.groupBox1.SuspendLayout(); @@ -215,7 +215,7 @@ // // groupBox1 // - this.groupBox1.Controls.Add(this.downloadChaptersCbox); + this.groupBox1.Controls.Add(this.allowLibationFixupCbox); this.groupBox1.Controls.Add(this.downloadsInProgressGb); this.groupBox1.Controls.Add(this.decryptInProgressGb); this.groupBox1.Location = new System.Drawing.Point(18, 61); @@ -229,13 +229,13 @@ // // downloadChaptersCbox // - this.downloadChaptersCbox.AutoSize = true; - this.downloadChaptersCbox.Location = new System.Drawing.Point(10, 24); - this.downloadChaptersCbox.Name = "downloadChaptersCbox"; - this.downloadChaptersCbox.Size = new System.Drawing.Size(224, 19); - this.downloadChaptersCbox.TabIndex = 6; - this.downloadChaptersCbox.Text = "Download chapter titles from Audible"; - this.downloadChaptersCbox.UseVisualStyleBackColor = true; + this.allowLibationFixupCbox.AutoSize = true; + this.allowLibationFixupCbox.Location = new System.Drawing.Point(10, 24); + this.allowLibationFixupCbox.Name = "downloadChaptersCbox"; + this.allowLibationFixupCbox.Size = new System.Drawing.Size(262, 19); + this.allowLibationFixupCbox.TabIndex = 6; + this.allowLibationFixupCbox.Text = "Allow Libation to fix up audiobook metadata"; + this.allowLibationFixupCbox.UseVisualStyleBackColor = true; // // SettingsDialog // @@ -284,6 +284,6 @@ private System.Windows.Forms.Button saveBtn; private System.Windows.Forms.Button cancelBtn; private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.CheckBox downloadChaptersCbox; + private System.Windows.Forms.CheckBox allowLibationFixupCbox; } } \ No newline at end of file diff --git a/LibationWinForms/Dialogs/SettingsDialog.cs b/LibationWinForms/Dialogs/SettingsDialog.cs index 35bbb582..6aff4b0f 100644 --- a/LibationWinForms/Dialogs/SettingsDialog.cs +++ b/LibationWinForms/Dialogs/SettingsDialog.cs @@ -36,7 +36,7 @@ namespace LibationWinForms.Dialogs ? config.Books : Path.GetDirectoryName(Exe.FileLocationOnDisk); - downloadChaptersCbox.Checked = config.DownloadChapters; + allowLibationFixupCbox.Checked = config.AllowLibationFixup; switch (config.DownloadsInProgressEnum) { @@ -73,7 +73,7 @@ namespace LibationWinForms.Dialogs private void saveBtn_Click(object sender, EventArgs e) { - config.DownloadChapters = downloadChaptersCbox.Checked; + config.AllowLibationFixup = allowLibationFixupCbox.Checked; config.DownloadsInProgressEnum = downloadsInProgressLibationFilesRb.Checked ? "LibationFiles" : "WinTemp"; config.DecryptInProgressEnum = decryptInProgressLibationFilesRb.Checked ? "LibationFiles" : "WinTemp"; diff --git a/LibationWinForms/Dialogs/SettingsDialog.resx b/LibationWinForms/Dialogs/SettingsDialog.resx index b9d23b7e..88435f19 100644 --- a/LibationWinForms/Dialogs/SettingsDialog.resx +++ b/LibationWinForms/Dialogs/SettingsDialog.resx @@ -81,15 +81,6 @@ True - - True - - - True - - - True - True @@ -102,15 +93,6 @@ True - - True - - - True - - - True - True @@ -123,9 +105,6 @@ True - - True - True From 0c26c34bdd4eae3b6e28c29a760ceca2ad586792 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 30 Jun 2021 18:11:56 -0600 Subject: [PATCH 16/18] Fixed improper condition check. --- FileLiberator/DownloadDecryptBook.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/FileLiberator/DownloadDecryptBook.cs b/FileLiberator/DownloadDecryptBook.cs index 73d77050..66e57d42 100644 --- a/FileLiberator/DownloadDecryptBook.cs +++ b/FileLiberator/DownloadDecryptBook.cs @@ -119,7 +119,8 @@ namespace FileLiberator { RequestCoverArt?.Invoke(this, aaxcDownloader.SetCoverArt); } - else + + if (e is not null) { CoverImageFilepathDiscovered?.Invoke(this, e); } From 1ee6f3b9f20d7a92cab4e1ce4f16c5b02434d198 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 30 Jun 2021 18:33:32 -0600 Subject: [PATCH 17/18] Improved cancellation routine. --- AaxDecrypter/AaxcDownloadConverter.cs | 22 ++++++++++++---------- AaxDecrypter/FFMpegAaxcProcesser.cs | 8 ++++++++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/AaxDecrypter/AaxcDownloadConverter.cs b/AaxDecrypter/AaxcDownloadConverter.cs index ed986bbd..9c97aaab 100644 --- a/AaxDecrypter/AaxcDownloadConverter.cs +++ b/AaxDecrypter/AaxcDownloadConverter.cs @@ -52,6 +52,7 @@ namespace AaxDecrypter private StepSequence steps { get; } private DownloadLicense downloadLicense { get; set; } private FFMpegAaxcProcesser aaxcProcesser; + private bool isCanceled { get; set; } public static AaxcDownloadConverter Create(string outDirectory, DownloadLicense dlLic, ChapterInfo chapters = null) { @@ -81,6 +82,9 @@ namespace AaxDecrypter ["Step 6: Create Nfo"] = Step6_CreateNfo, }; + aaxcProcesser = new FFMpegAaxcProcesser(dlLic); + aaxcProcesser.ProgressUpdate += AaxcProcesser_ProgressUpdate; + downloadLicense = dlLic; this.chapters = chapters; } @@ -123,7 +127,7 @@ namespace AaxDecrypter ProcessRunner.WorkingDir = outDir; Directory.CreateDirectory(outDir); - return true; + return !isCanceled; } public bool Step2_GetMetadata() @@ -143,14 +147,11 @@ namespace AaxDecrypter RetrievedTags?.Invoke(this, aaxcTagLib); RetrievedCoverArt?.Invoke(this, coverArt); - return true; + return !isCanceled; } public bool Step3_DownloadAndCombine() { - aaxcProcesser = new FFMpegAaxcProcesser(downloadLicense); - aaxcProcesser.ProgressUpdate += AaxcProcesser_ProgressUpdate; - bool userSuppliedChapters = chapters != null; string metadataPath = null; @@ -177,7 +178,7 @@ namespace AaxDecrypter DecryptProgressUpdate?.Invoke(this, 0); - return aaxcProcesser.Succeeded; + return aaxcProcesser.Succeeded && !isCanceled; } private void AaxcProcesser_ProgressUpdate(object sender, AaxcProcessUpdate e) @@ -208,24 +209,25 @@ namespace AaxDecrypter outFile.Save(); - return true; + return !isCanceled; } public bool Step5_CreateCue() { File.WriteAllText(PathLib.ReplaceExtension(outputFileName, ".cue"), Cue.CreateContents(Path.GetFileName(outputFileName), chapters)); - return true; + return !isCanceled; } public bool Step6_CreateNfo() { File.WriteAllText(PathLib.ReplaceExtension(outputFileName, ".nfo"), NFO.CreateContents(AppName, aaxcTagLib, chapters)); - return true; + return !isCanceled; } public void Cancel() { - aaxcProcesser?.Cancel(); + isCanceled = true; + aaxcProcesser.Cancel(); } } } diff --git a/AaxDecrypter/FFMpegAaxcProcesser.cs b/AaxDecrypter/FFMpegAaxcProcesser.cs index 6c144a3f..8e20a8cb 100644 --- a/AaxDecrypter/FFMpegAaxcProcesser.cs +++ b/AaxDecrypter/FFMpegAaxcProcesser.cs @@ -39,6 +39,7 @@ namespace AaxDecrypter private static Regex processedTimeRegex = new Regex("time=(\\d{2}):(\\d{2}):(\\d{2}).\\d{2}.*speed=\\s{0,1}([0-9]*[.]?[0-9]+)(?:e\\+([0-9]+)){0,1}", RegexOptions.IgnoreCase | RegexOptions.Compiled); private Process downloader; private Process remuxer; + private bool isCanceled = false; public FFMpegAaxcProcesser( DownloadLicense downloadLicense) { @@ -72,6 +73,9 @@ namespace AaxDecrypter remuxer.Start(); remuxer.BeginErrorReadLine(); + //Thic check needs to be placed after remuxer has started + if (isCanceled) return; + var pipedOutput = downloader.StandardOutput.BaseStream; var pipedInput = remuxer.StandardInput.BaseStream; @@ -106,8 +110,12 @@ namespace AaxDecrypter } public void Cancel() { + isCanceled = true; + if (IsRunning && !remuxer.HasExited) remuxer.Kill(); + if (IsRunning && !downloader.HasExited) + downloader.Kill(); } private void Downloader_ErrorDataReceived(object sender, DataReceivedEventArgs e) { From 3aed3a5deffc5909e7ab812260c42ad8ec9194bf Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Wed, 30 Jun 2021 21:55:22 -0600 Subject: [PATCH 18/18] Added "indeterminate" progress bar mode to beginning of Step3. --- AaxDecrypter/AaxcDownloadConverter.cs | 1 + LibationWinForms/BookLiberation/DecryptForm.cs | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/AaxDecrypter/AaxcDownloadConverter.cs b/AaxDecrypter/AaxcDownloadConverter.cs index 9c97aaab..6cb90ee6 100644 --- a/AaxDecrypter/AaxcDownloadConverter.cs +++ b/AaxDecrypter/AaxcDownloadConverter.cs @@ -152,6 +152,7 @@ namespace AaxDecrypter public bool Step3_DownloadAndCombine() { + DecryptProgressUpdate?.Invoke(this, int.MaxValue); bool userSuppliedChapters = chapters != null; string metadataPath = null; diff --git a/LibationWinForms/BookLiberation/DecryptForm.cs b/LibationWinForms/BookLiberation/DecryptForm.cs index 0c03c76f..6788a774 100644 --- a/LibationWinForms/BookLiberation/DecryptForm.cs +++ b/LibationWinForms/BookLiberation/DecryptForm.cs @@ -64,7 +64,14 @@ namespace LibationWinForms.BookLiberation if (percentage == 0) remainingTimeLbl.UIThread(() => remainingTimeLbl.Text = "ETA:\r\n0 sec"); - progressBar1.UIThread(() => progressBar1.Value = percentage); + if (percentage == int.MaxValue) + progressBar1.UIThread(() => progressBar1.Style = ProgressBarStyle.Marquee); + else + progressBar1.UIThread(() => + { + progressBar1.Value = percentage; + progressBar1.Style = ProgressBarStyle.Blocks; + }); } public void UpdateRemainingTime(TimeSpan remaining)