diff --git a/Source/AaxDecrypter/AaxcDownloadMultiConverter.cs b/Source/AaxDecrypter/AaxcDownloadMultiConverter.cs index 76026a2e..ebd4d024 100644 --- a/Source/AaxDecrypter/AaxcDownloadMultiConverter.cs +++ b/Source/AaxDecrypter/AaxcDownloadMultiConverter.cs @@ -13,27 +13,27 @@ namespace AaxDecrypter { protected override StepSequence Steps { get; } - private Func multipartFileNameCallback { get; } + private Func multipartFileNameCallback { get; } - private static TimeSpan minChapterLength { get; } = TimeSpan.FromSeconds(3); + private static TimeSpan minChapterLength { get; } = TimeSpan.FromSeconds(3); private List multiPartFilePaths { get; } = new List(); - public AaxcDownloadMultiConverter(string outFileName, string cacheDirectory, DownloadOptions dlLic, - Func multipartFileNameCallback = null) + public AaxcDownloadMultiConverter(string outFileName, string cacheDirectory, DownloadOptions dlLic, + Func multipartFileNameCallback = null) : base(outFileName, cacheDirectory, dlLic) - { - Steps = new StepSequence - { - Name = "Download and Convert Aaxc To " + DownloadOptions.OutputFormat, + { + Steps = new StepSequence + { + Name = "Download and Convert Aaxc To " + DownloadOptions.OutputFormat, - ["Step 1: Get Aaxc Metadata"] = Step_GetMetadata, - ["Step 2: Download Decrypted Audiobook"] = Step_DownloadAudiobookAsMultipleFilesPerChapter, - ["Step 3: Cleanup"] = Step_Cleanup, - }; - this.multipartFileNameCallback = multipartFileNameCallback ?? MultiConvertFileProperties.DefaultMultipartFilename; - } + ["Step 1: Get Aaxc Metadata"] = Step_GetMetadata, + ["Step 2: Download Decrypted Audiobook"] = Step_DownloadAudiobookAsMultipleFilesPerChapter, + ["Step 3: Cleanup"] = Step_Cleanup, + }; + this.multipartFileNameCallback = multipartFileNameCallback ?? MultiConvertFileProperties.DefaultMultipartFilename; + } - /* + /* https://github.com/rmcrackan/Libation/pull/127#issuecomment-939088489 If the chapter truly is empty, that is, 0 audio frames in length, then yes it is ignored. @@ -56,95 +56,95 @@ The book will be split into the following files: 01:41:00 - 02:05:00 | Book - 04 - Chapter 4.m4b That naming may not be desirable for everyone, but it's an easy change to instead use the last of the combined chapter's title in the file name. - */ - private bool Step_DownloadAudiobookAsMultipleFilesPerChapter() - { - var zeroProgress = Step_DownloadAudiobook_Start(); + */ + private bool Step_DownloadAudiobookAsMultipleFilesPerChapter() + { + var zeroProgress = Step_DownloadAudiobook_Start(); - var chapters = DownloadOptions.ChapterInfo.Chapters; + var chapters = DownloadOptions.ChapterInfo.Chapters; - // Ensure split files are at least minChapterLength in duration. - var splitChapters = new ChapterInfo(DownloadOptions.ChapterInfo.StartOffset); + // Ensure split files are at least minChapterLength in duration. + var splitChapters = new ChapterInfo(DownloadOptions.ChapterInfo.StartOffset); - var runningTotal = TimeSpan.Zero; - string title = ""; + var runningTotal = TimeSpan.Zero; + string title = ""; - for (int i = 0; i < chapters.Count; i++) - { - if (runningTotal == TimeSpan.Zero) - title = chapters[i].Title; + for (int i = 0; i < chapters.Count; i++) + { + if (runningTotal == TimeSpan.Zero) + title = chapters[i].Title; - runningTotal += chapters[i].Duration; + runningTotal += chapters[i].Duration; - if (runningTotal >= minChapterLength) - { - splitChapters.AddChapter(title, runningTotal); - runningTotal = TimeSpan.Zero; - } - } + if (runningTotal >= minChapterLength) + { + splitChapters.AddChapter(title, runningTotal); + runningTotal = TimeSpan.Zero; + } + } - // reset, just in case - multiPartFilePaths.Clear(); + // reset, just in case + multiPartFilePaths.Clear(); - ConversionResult result; + ConversionResult result; - AaxFile.ConversionProgressUpdate += AaxFile_ConversionProgressUpdate; - if (DownloadOptions.OutputFormat == OutputFormat.M4b) - result = ConvertToMultiMp4a(splitChapters); - else - result = ConvertToMultiMp3(splitChapters); - AaxFile.ConversionProgressUpdate -= AaxFile_ConversionProgressUpdate; + AaxFile.ConversionProgressUpdate += AaxFile_ConversionProgressUpdate; + if (DownloadOptions.OutputFormat == OutputFormat.M4b) + result = ConvertToMultiMp4a(splitChapters); + else + result = ConvertToMultiMp3(splitChapters); + AaxFile.ConversionProgressUpdate -= AaxFile_ConversionProgressUpdate; - Step_DownloadAudiobook_End(zeroProgress); + Step_DownloadAudiobook_End(zeroProgress); - return result == ConversionResult.NoErrorsDetected; - } + return result == ConversionResult.NoErrorsDetected; + } - private ConversionResult ConvertToMultiMp4a(ChapterInfo splitChapters) - { - var chapterCount = 0; - return AaxFile.ConvertToMultiMp4a(splitChapters, newSplitCallback => - { - createOutputFileStream(++chapterCount, splitChapters, newSplitCallback); + private ConversionResult ConvertToMultiMp4a(ChapterInfo splitChapters) + { + var chapterCount = 0; + return AaxFile.ConvertToMultiMp4a(splitChapters, newSplitCallback => + { + createOutputFileStream(++chapterCount, splitChapters, newSplitCallback); - newSplitCallback.TrackNumber = chapterCount; - newSplitCallback.TrackCount = splitChapters.Count; + newSplitCallback.TrackNumber = chapterCount; + newSplitCallback.TrackCount = splitChapters.Count; - }, DownloadOptions.TrimOutputToChapterLength); - } + }, DownloadOptions.TrimOutputToChapterLength); + } - private ConversionResult ConvertToMultiMp3(ChapterInfo splitChapters) - { - var chapterCount = 0; - return AaxFile.ConvertToMultiMp3(splitChapters, newSplitCallback => - { - createOutputFileStream(++chapterCount, splitChapters, newSplitCallback); + private ConversionResult ConvertToMultiMp3(ChapterInfo splitChapters) + { + var chapterCount = 0; + return AaxFile.ConvertToMultiMp3(splitChapters, newSplitCallback => + { + createOutputFileStream(++chapterCount, splitChapters, newSplitCallback); - newSplitCallback.TrackNumber = chapterCount; - newSplitCallback.TrackCount = splitChapters.Count; + newSplitCallback.TrackNumber = chapterCount; + newSplitCallback.TrackCount = splitChapters.Count; - }, DownloadOptions.LameConfig, DownloadOptions.TrimOutputToChapterLength); - } + }, DownloadOptions.LameConfig, DownloadOptions.TrimOutputToChapterLength); + } - private void createOutputFileStream(int currentChapter, ChapterInfo splitChapters, NewSplitCallback newSplitCallback) - { - var fileName = multipartFileNameCallback(new() - { - OutputFileName = OutputFileName, - PartsPosition = currentChapter, - PartsTotal = splitChapters.Count, - Title = newSplitCallback?.Chapter?.Title, + private void createOutputFileStream(int currentChapter, ChapterInfo splitChapters, NewSplitCallback newSplitCallback) + { + var fileName = multipartFileNameCallback(new() + { + OutputFileName = OutputFileName, + PartsPosition = currentChapter, + PartsTotal = splitChapters.Count, + Title = newSplitCallback?.Chapter?.Title, - }); - fileName = FileUtility.GetValidFilename(fileName); + }); + fileName = FileUtility.GetValidFilename(fileName); - multiPartFilePaths.Add(fileName); + multiPartFilePaths.Add(fileName); - FileUtility.SaferDelete(fileName); + FileUtility.SaferDelete(fileName); - newSplitCallback.OutputFile = File.Open(fileName, FileMode.OpenOrCreate); + newSplitCallback.OutputFile = File.Open(fileName, FileMode.OpenOrCreate); - OnFileCreated(fileName); - } - } + OnFileCreated(fileName); + } + } } diff --git a/Source/AaxDecrypter/AaxcDownloadSingleConverter.cs b/Source/AaxDecrypter/AaxcDownloadSingleConverter.cs index 243cc7c4..4e25aed7 100644 --- a/Source/AaxDecrypter/AaxcDownloadSingleConverter.cs +++ b/Source/AaxDecrypter/AaxcDownloadSingleConverter.cs @@ -11,45 +11,45 @@ namespace AaxDecrypter { protected override StepSequence Steps { get; } - public AaxcDownloadSingleConverter(string outFileName, string cacheDirectory, DownloadOptions dlLic) + public AaxcDownloadSingleConverter(string outFileName, string cacheDirectory, DownloadOptions dlLic) : base(outFileName, cacheDirectory, dlLic) - { - Steps = new StepSequence - { - Name = "Download and Convert Aaxc To " + DownloadOptions.OutputFormat, + { + Steps = new StepSequence + { + Name = "Download and Convert Aaxc To " + DownloadOptions.OutputFormat, - ["Step 1: Get Aaxc Metadata"] = Step_GetMetadata, - ["Step 2: Download Decrypted Audiobook"] = Step_DownloadAudiobookAsSingleFile, - ["Step 3: Create Cue"] = Step_CreateCue, - ["Step 4: Cleanup"] = Step_Cleanup, - }; - } + ["Step 1: Get Aaxc Metadata"] = Step_GetMetadata, + ["Step 2: Download Decrypted Audiobook"] = Step_DownloadAudiobookAsSingleFile, + ["Step 3: Create Cue"] = Step_CreateCue, + ["Step 4: Cleanup"] = Step_Cleanup, + }; + } - private bool Step_DownloadAudiobookAsSingleFile() - { - var zeroProgress = Step_DownloadAudiobook_Start(); + private bool Step_DownloadAudiobookAsSingleFile() + { + var zeroProgress = Step_DownloadAudiobook_Start(); - FileUtility.SaferDelete(OutputFileName); + FileUtility.SaferDelete(OutputFileName); - var outputFile = File.Open(OutputFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite); - OnFileCreated(OutputFileName); + var outputFile = File.Open(OutputFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite); + OnFileCreated(OutputFileName); - AaxFile.ConversionProgressUpdate += AaxFile_ConversionProgressUpdate; - var decryptionResult - = DownloadOptions.OutputFormat == OutputFormat.M4b - ? AaxFile.ConvertToMp4a(outputFile, DownloadOptions.ChapterInfo, DownloadOptions.TrimOutputToChapterLength) - : AaxFile.ConvertToMp3(outputFile, DownloadOptions.LameConfig, DownloadOptions.ChapterInfo, DownloadOptions.TrimOutputToChapterLength); - AaxFile.ConversionProgressUpdate -= AaxFile_ConversionProgressUpdate; + AaxFile.ConversionProgressUpdate += AaxFile_ConversionProgressUpdate; + var decryptionResult + = DownloadOptions.OutputFormat == OutputFormat.M4b + ? AaxFile.ConvertToMp4a(outputFile, DownloadOptions.ChapterInfo, DownloadOptions.TrimOutputToChapterLength) + : AaxFile.ConvertToMp3(outputFile, DownloadOptions.LameConfig, DownloadOptions.ChapterInfo, DownloadOptions.TrimOutputToChapterLength); + AaxFile.ConversionProgressUpdate -= AaxFile_ConversionProgressUpdate; - DownloadOptions.ChapterInfo = AaxFile.Chapters; + DownloadOptions.ChapterInfo = AaxFile.Chapters; - Step_DownloadAudiobook_End(zeroProgress); + Step_DownloadAudiobook_End(zeroProgress); - var success = decryptionResult == ConversionResult.NoErrorsDetected && !IsCanceled; - if (success) - base.OnFileCreated(OutputFileName); + var success = decryptionResult == ConversionResult.NoErrorsDetected && !IsCanceled; + if (success) + base.OnFileCreated(OutputFileName); - return success; - } - } + return success; + } + } } diff --git a/Source/FileManager/FileNamingTemplate.cs b/Source/FileManager/FileNamingTemplate.cs index b22f0007..0b0ea81c 100644 --- a/Source/FileManager/FileNamingTemplate.cs +++ b/Source/FileManager/FileNamingTemplate.cs @@ -41,12 +41,12 @@ namespace FileManager //Build the filename in parts, replacing replacement parameters with //their values, and storing the parts in a list. while(!string.IsNullOrEmpty(filename)) - { + { int openIndex = filename.IndexOf('<'); int closeIndex = filename.IndexOf('>'); if (openIndex == 0 && closeIndex > 0) - { + { var key = filename[..(closeIndex + 1)]; if (paramReplacements.ContainsKey(key)) @@ -57,22 +57,22 @@ namespace FileManager filename = filename[(closeIndex + 1)..]; } else if (openIndex > 0 && closeIndex > openIndex) - { + { var other = filename[..openIndex]; filenameParts.Add(new StringBuilder(other)); filename = filename[openIndex..]; } else - { + { filenameParts.Add(new StringBuilder(filename)); filename = string.Empty; } - } + } //Remove 1 character from the end of the longest filename part until //the total filename is less than max filename length while(filenameParts.Sum(p => p.Length) > LongPath.MaxFilenameLength) - { + { int maxLength = filenameParts.Max(p => p.Length); var maxEntry = filenameParts.First(p => p.Length == maxLength); diff --git a/Source/FileManager/FileUtility.cs b/Source/FileManager/FileUtility.cs index 9a3c3a83..a7b33433 100644 --- a/Source/FileManager/FileUtility.cs +++ b/Source/FileManager/FileUtility.cs @@ -208,7 +208,7 @@ namespace FileManager }); /// Move file. No error when source does not exist. Retry up to 3 times before throwing exception. - public static void SaferMove(LongPath source, LongPath destination) + public static void SaferMove(LongPath source, LongPath destination) => retryPolicy.Execute(() => { try @@ -260,9 +260,9 @@ namespace FileManager catch (UnauthorizedAccessException) { } catch (PathTooLongException) { } catch(Exception ex) - { + { - } + } } try