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")]