From 7029409792b0527c455ddf024ce02ec827ac80fb Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Mon, 23 Jan 2023 14:54:24 -0700 Subject: [PATCH] Upgrade AAXClean.Codecs to 0.5.10 and fix #459 --- Source/AaxDecrypter/AaxDecrypter.csproj | 2 +- .../AaxDecrypter/AaxcDownloadConvertBase.cs | 7 ++-- .../AaxcDownloadMultiConverter.cs | 21 +++++----- .../AaxcDownloadSingleConverter.cs | 23 +++++++---- Source/FileLiberator/ConvertToMp3.cs | 38 ++++++++++--------- Source/FileManager/FileUtility.cs | 4 +- Source/LibationFileManager/Templates.cs | 6 +-- .../TemplatesTests.cs | 1 + 8 files changed, 57 insertions(+), 45 deletions(-) diff --git a/Source/AaxDecrypter/AaxDecrypter.csproj b/Source/AaxDecrypter/AaxDecrypter.csproj index aea11238..83492352 100644 --- a/Source/AaxDecrypter/AaxDecrypter.csproj +++ b/Source/AaxDecrypter/AaxDecrypter.csproj @@ -13,7 +13,7 @@ - + diff --git a/Source/AaxDecrypter/AaxcDownloadConvertBase.cs b/Source/AaxDecrypter/AaxcDownloadConvertBase.cs index c42fc4d4..994c07ae 100644 --- a/Source/AaxDecrypter/AaxcDownloadConvertBase.cs +++ b/Source/AaxDecrypter/AaxcDownloadConvertBase.cs @@ -10,6 +10,7 @@ namespace AaxDecrypter public event EventHandler RetrievedMetadata; protected AaxFile AaxFile; + protected Mp4Operation aaxConversion; protected AaxcDownloadConvertBase(string outFileName, string cacheDirectory, IDownloadOptions dlOptions) : base(outFileName, cacheDirectory, dlOptions) { } @@ -101,9 +102,9 @@ namespace AaxDecrypter public override async Task CancelAsync() { IsCanceled = true; - if (AaxFile != null) - await AaxFile.CancelAsync(); - AaxFile?.Dispose(); + if (aaxConversion != null) + await aaxConversion.CancelAsync(); + AaxFile?.Close(); CloseInputFileStream(); } } diff --git a/Source/AaxDecrypter/AaxcDownloadMultiConverter.cs b/Source/AaxDecrypter/AaxcDownloadMultiConverter.cs index a1fdb7bd..325bdd8c 100644 --- a/Source/AaxDecrypter/AaxcDownloadMultiConverter.cs +++ b/Source/AaxDecrypter/AaxcDownloadMultiConverter.cs @@ -133,32 +133,33 @@ That naming may not be desirable for everyone, but it's an easy change to instea try { - ConversionResult result; - - AaxFile.ConversionProgressUpdate += AaxFile_ConversionProgressUpdate; if (DownloadOptions.OutputFormat == OutputFormat.M4b) - result = await ConvertToMultiMp4a(splitChapters); + aaxConversion = ConvertToMultiMp4a(splitChapters); else - result = await ConvertToMultiMp3(splitChapters); + aaxConversion = ConvertToMultiMp3(splitChapters); - return result == ConversionResult.NoErrorsDetected; + aaxConversion.ConversionProgressUpdate += AaxFile_ConversionProgressUpdate; + await aaxConversion; + return aaxConversion.IsCompletedSuccessfully; } catch(Exception ex) { Serilog.Log.Error(ex, "AAXClean Error"); workingFileStream?.Close(); - FileUtility.SaferDelete(workingFileStream.Name); + if (workingFileStream?.Name is not null) + FileUtility.SaferDelete(workingFileStream.Name); return false; } finally { - AaxFile.ConversionProgressUpdate -= AaxFile_ConversionProgressUpdate; + if (aaxConversion is not null) + aaxConversion.ConversionProgressUpdate -= AaxFile_ConversionProgressUpdate; Step_DownloadAudiobook_End(zeroProgress); } } - private Task ConvertToMultiMp4a(ChapterInfo splitChapters) + private Mp4Operation ConvertToMultiMp4a(ChapterInfo splitChapters) { var chapterCount = 0; return AaxFile.ConvertToMultiMp4aAsync @@ -169,7 +170,7 @@ That naming may not be desirable for everyone, but it's an easy change to instea ); } - private Task ConvertToMultiMp3(ChapterInfo splitChapters) + private Mp4Operation ConvertToMultiMp3(ChapterInfo splitChapters) { var chapterCount = 0; return AaxFile.ConvertToMultiMp3Async diff --git a/Source/AaxDecrypter/AaxcDownloadSingleConverter.cs b/Source/AaxDecrypter/AaxcDownloadSingleConverter.cs index 288c06af..e41389a6 100644 --- a/Source/AaxDecrypter/AaxcDownloadSingleConverter.cs +++ b/Source/AaxDecrypter/AaxcDownloadSingleConverter.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using AAXClean; using AAXClean.Codecs; using FileManager; +using Mpeg4Lib.Util; namespace AaxDecrypter { @@ -90,16 +91,20 @@ namespace AaxDecrypter var outputFile = File.Open(OutputFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite); OnFileCreated(OutputFileName); - AaxFile.ConversionProgressUpdate += AaxFile_ConversionProgressUpdate; try { - ConversionResult decryptionResult = await decryptAsync(outputFile); - var success = decryptionResult == ConversionResult.NoErrorsDetected && !IsCanceled; - if (success) - base.OnFileCreated(OutputFileName); + aaxConversion = decryptAsync(outputFile); + aaxConversion.ConversionProgressUpdate += AaxFile_ConversionProgressUpdate; + await aaxConversion; - return success; + if (aaxConversion.IsCompletedSuccessfully) + { + outputFile.Close(); + base.OnFileCreated(OutputFileName); + } + + return aaxConversion.IsCompletedSuccessfully; } catch(Exception ex) { @@ -110,13 +115,15 @@ namespace AaxDecrypter finally { outputFile.Close(); - AaxFile.ConversionProgressUpdate -= AaxFile_ConversionProgressUpdate; + + if (aaxConversion is not null) + aaxConversion.ConversionProgressUpdate += AaxFile_ConversionProgressUpdate; Step_DownloadAudiobook_End(zeroProgress); } } - private Task decryptAsync(Stream outputFile) + private Mp4Operation decryptAsync(Stream outputFile) => DownloadOptions.OutputFormat == OutputFormat.Mp3 ? AaxFile.ConvertToMp3Async ( diff --git a/Source/FileLiberator/ConvertToMp3.cs b/Source/FileLiberator/ConvertToMp3.cs index 5ec07045..1296037a 100644 --- a/Source/FileLiberator/ConvertToMp3.cs +++ b/Source/FileLiberator/ConvertToMp3.cs @@ -15,12 +15,12 @@ namespace FileLiberator public class ConvertToMp3 : AudioDecodable { public override string Name => "Convert to Mp3"; - private Mp4File m4bBook; - + private Mp4Operation Mp4Operation; + private TimeSpan bookDuration; private long fileSize; private static string Mp3FileName(string m4bPath) => Path.ChangeExtension(m4bPath ?? "", ".mp3"); - public override Task CancelAsync() => m4bBook?.CancelAsync() ?? Task.CompletedTask; + public override Task CancelAsync() => Mp4Operation?.CancelAsync() ?? Task.CompletedTask; public static bool ValidateMp3(LibraryBook libraryBook) { @@ -43,9 +43,9 @@ namespace FileLiberator var proposedMp3Path = Mp3FileName(m4bPath); if (File.Exists(proposedMp3Path) || !File.Exists(m4bPath)) continue; - m4bBook = await Task.Run(() => new Mp4File(m4bPath, FileAccess.Read)); - m4bBook.ConversionProgressUpdate += M4bBook_ConversionProgressUpdate; + var m4bBook = await Task.Run(() => new Mp4File(m4bPath, FileAccess.Read)); + bookDuration = m4bBook.Duration; fileSize = m4bBook.InputStream.Length; OnTitleDiscovered(m4bBook.AppleTags.Title); @@ -66,20 +66,20 @@ namespace FileLiberator using var mp3File = File.OpenWrite(Path.GetTempFileName()); try { - var result = await m4bBook.ConvertToMp3Async(mp3File, lameConfig); + Mp4Operation = m4bBook.ConvertToMp3Async(mp3File, lameConfig); + Mp4Operation.ConversionProgressUpdate += M4bBook_ConversionProgressUpdate; + await Mp4Operation; - var realMp3Path = FileUtility.SaferMoveToValidPath(mp3File.Name, proposedMp3Path, Configuration.Instance.ReplacementCharacters); - OnFileCreated(libraryBook, realMp3Path); - - if (result == ConversionResult.Failed) - { - FileUtility.SaferDelete(mp3File.Name); - } - else if (result == ConversionResult.Cancelled) + if (Mp4Operation.IsCanceled) { FileUtility.SaferDelete(mp3File.Name); return new StatusHandler { "Cancelled" }; } + else + { + var realMp3Path = FileUtility.SaferMoveToValidPath(mp3File.Name, proposedMp3Path, Configuration.Instance.ReplacementCharacters, "mp3"); + OnFileCreated(libraryBook, realMp3Path); + } } catch (Exception ex) { @@ -88,6 +88,9 @@ namespace FileLiberator } finally { + if (Mp4Operation is not null) + Mp4Operation.ConversionProgressUpdate -= M4bBook_ConversionProgressUpdate; + m4bBook.InputStream.Close(); mp3File.Close(); } @@ -102,14 +105,13 @@ namespace FileLiberator private void M4bBook_ConversionProgressUpdate(object sender, ConversionProgressEventArgs e) { - var duration = m4bBook.Duration; - var remainingSecsToProcess = (duration - e.ProcessPosition).TotalSeconds; + var remainingSecsToProcess = (bookDuration - e.ProcessPosition).TotalSeconds; var estTimeRemaining = remainingSecsToProcess / e.ProcessSpeed; - + if (double.IsNormal(estTimeRemaining)) OnStreamingTimeRemaining(TimeSpan.FromSeconds(estTimeRemaining)); - double progressPercent = 100 * e.ProcessPosition.TotalSeconds / duration.TotalSeconds; + double progressPercent = 100 * e.ProcessPosition.TotalSeconds / bookDuration.TotalSeconds; OnStreamingProgressChanged( new DownloadProgress diff --git a/Source/FileManager/FileUtility.cs b/Source/FileManager/FileUtility.cs index a3f46de3..0b83866b 100644 --- a/Source/FileManager/FileUtility.cs +++ b/Source/FileManager/FileUtility.cs @@ -151,9 +151,9 @@ namespace FileManager ///
- Perform ///
- Return valid path /// - public static string SaferMoveToValidPath(LongPath source, LongPath destination, ReplacementCharacters replacements) + public static string SaferMoveToValidPath(LongPath source, LongPath destination, ReplacementCharacters replacements, string extension = null) { - var extension = Path.GetExtension(source); + extension = extension ?? Path.GetExtension(source); destination = GetValidFilename(destination, replacements, extension); SaferMove(source, destination); return destination; diff --git a/Source/LibationFileManager/Templates.cs b/Source/LibationFileManager/Templates.cs index 8880efd1..e1d33236 100644 --- a/Source/LibationFileManager/Templates.cs +++ b/Source/LibationFileManager/Templates.cs @@ -107,9 +107,9 @@ namespace LibationFileManager .GetFilePath(fileExtension).PathWithoutPrefix; public const string DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; - private static Regex fileDateTagRegex { get; } = new Regex(@"", RegexOptions.Compiled | RegexOptions.IgnoreCase); - private static Regex dateAddedTagRegex { get; } = new Regex(@"", RegexOptions.Compiled | RegexOptions.IgnoreCase); - private static Regex datePublishedTagRegex { get; } = new Regex(@"", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static Regex fileDateTagRegex { get; } = new Regex(@"", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static Regex dateAddedTagRegex { get; } = new Regex(@"", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static Regex datePublishedTagRegex { get; } = new Regex(@"", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static Regex ifSeriesRegex { get; } = new Regex("(.*?)<-if series>", RegexOptions.Compiled | RegexOptions.IgnoreCase); internal static FileNamingTemplate getFileNamingTemplate(LibraryBookDto libraryBookDto, string template, string dirFullPath, string extension, ReplacementCharacters replacements) diff --git a/Source/_Tests/LibationFileManager.Tests/TemplatesTests.cs b/Source/_Tests/LibationFileManager.Tests/TemplatesTests.cs index 400565d3..da1760c6 100644 --- a/Source/_Tests/LibationFileManager.Tests/TemplatesTests.cs +++ b/Source/_Tests/LibationFileManager.Tests/TemplatesTests.cs @@ -153,6 +153,7 @@ namespace TemplatesTests [DataRow("", @"C:\foo\bar", ".m4b", @"C:\foo\bar\<filedate[h]>.m4b")] [DataRow("< filedate[yyyy]>", @"C:\foo\bar", ".m4b", @"C:\foo\bar\< filedate[yyyy]>.m4b")] [DataRow("", @"C:\foo\bar", ".m4b", @"C:\foo\bar\<filedate[yyyy][]>.m4b")] + [DataRow("", @"C:\foo\bar", ".m4b", @"C:\foo\bar\<filedate[[yyyy]]>.m4b")] [DataRow("", @"C:\foo\bar", ".m4b", @"C:\foo\bar\<filedate[yyyy[]]>.m4b")] [DataRow("", @"C:\foo\bar", ".m4b", @"C:\foo\bar\<filedate yyyy]>.m4b")] [DataRow("", @"C:\foo\bar", ".m4b", @"C:\foo\bar\<filedate ]yyyy]>.m4b")]