All audible-related file naming terminates at FileUtility

File extensions: Dinah.Core => Libation FileUtility
This commit is contained in:
Robert McRackan 2021-10-12 14:48:32 -04:00
parent 6a81b9b02d
commit 648b84ee55
15 changed files with 162 additions and 101 deletions

View file

@ -6,7 +6,11 @@
<ItemGroup>
<PackageReference Include="AAXClean" Version="0.1.9" />
<PackageReference Include="Dinah.Core" Version="1.1.1.2" />
<PackageReference Include="Dinah.Core" Version="2.0.0.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\FileManager\FileManager.csproj" />
</ItemGroup>
</Project>

View file

@ -3,10 +3,9 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using AAXClean;
using Dinah.Core;
using Dinah.Core.IO;
using Dinah.Core.Net.Http;
using Dinah.Core.StepRunner;
using FileManager;
namespace AaxDecrypter
{
@ -66,8 +65,7 @@ namespace AaxDecrypter
{
var zeroProgress = Step2_Start();
if (File.Exists(OutputFileName))
FileExt.SafeDelete(OutputFileName);
FileUtility.SafeDelete(OutputFileName);
var outputFile = File.Open(OutputFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
@ -185,12 +183,8 @@ That naming may not be desirable for everyone, but it's an easy change to instea
{
var chapterCount = 0;
aaxFile.ConvertToMultiMp4a(splitChapters, newSplitCallback =>
{
var fileName = GetMultipartFileName(++chapterCount, splitChapters.Count, newSplitCallback.Chapter.Title);
if (File.Exists(fileName))
FileExt.SafeDelete(fileName);
newSplitCallback.OutputFile = File.Open(fileName, FileMode.OpenOrCreate);
});
createOutputFileStream(++chapterCount, splitChapters, newSplitCallback)
);
}
private void ConvertToMultiMp3(ChapterInfo splitChapters)
@ -198,37 +192,22 @@ That naming may not be desirable for everyone, but it's an easy change to instea
var chapterCount = 0;
aaxFile.ConvertToMultiMp3(splitChapters, newSplitCallback =>
{
var fileName = GetMultipartFileName(++chapterCount, splitChapters.Count, newSplitCallback.Chapter.Title);
if (File.Exists(fileName))
FileExt.SafeDelete(fileName);
newSplitCallback.OutputFile = File.Open(fileName, FileMode.OpenOrCreate);
createOutputFileStream(++chapterCount, splitChapters, newSplitCallback);
newSplitCallback.LameConfig.ID3.Track = chapterCount.ToString();
});
}
private string GetMultipartFileName(int chapterCount, int chaptersTotal, string chapterTitle)
{
const int MAX_FILENAME_LENGTH = 255;
private void createOutputFileStream(int currentChapter, ChapterInfo splitChapters, NewSplitCallback newSplitCallback)
{
var fileName = FileUtility.GetMultipartFileName(OutputFileName, currentChapter, splitChapters.Count, newSplitCallback.Chapter.Title);
multiPartFilePaths.Add(fileName);
// 1-9 => 1-9
// 10-99 => 01-99
// 100-999 => 001-999
var chapterCountLeadingZeros = chapterCount.ToString().PadLeft(chaptersTotal.ToString().Length, '0');
FileUtility.SafeDelete(fileName);
string extension = Path.GetExtension(OutputFileName);
newSplitCallback.OutputFile = File.Open(fileName, FileMode.OpenOrCreate);
}
var filenameBase = $"{Path.GetFileNameWithoutExtension(OutputFileName)} - {chapterCountLeadingZeros} - {chapterTitle}";
// Replace illegal path characters with spaces
var filenameBaseSafe = string.Join(" ", filenameBase.Split(Path.GetInvalidFileNameChars()));
var fileName = filenameBaseSafe.Truncate(MAX_FILENAME_LENGTH - extension.Length);
var path = Path.Combine(Path.GetDirectoryName(OutputFileName), fileName + extension);
multiPartFilePaths.Add(path);
return path;
}
private void AaxFile_ConversionProgressUpdate(object sender, ConversionProgressEventArgs e)
private void AaxFile_ConversionProgressUpdate(object sender, ConversionProgressEventArgs e)
{
var duration = aaxFile.Duration;
double remainingSecsToProcess = (duration - e.ProcessPosition).TotalSeconds;

View file

@ -1,13 +1,9 @@
using Dinah.Core;
using Dinah.Core.IO;
using System;
using System.IO;
using Dinah.Core;
using Dinah.Core.Net.Http;
using Dinah.Core.StepRunner;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FileManager;
namespace AaxDecrypter
{
@ -24,11 +20,13 @@ namespace AaxDecrypter
public event EventHandler<string> FileCreated;
protected bool IsCanceled { get; set; }
protected string OutputFileName { get; }
protected string OutputFileName { get; private set; }
protected string CacheDir { get; }
protected DownloadLicense DownloadLicense { get; }
protected NetworkFileStream InputFileStream => (nfsPersister ??= OpenNetworkFileStream()).NetworkFileStream;
// Don't give the property a 'set'. This should have to be an obvious choice; not accidental
protected void SetOutputFileName(string newOutputFileName) => OutputFileName = newOutputFileName;
protected abstract StepSequence Steps { get; }
private NetworkFileStreamPersister nfsPersister;
@ -42,14 +40,14 @@ namespace AaxDecrypter
var outDir = Path.GetDirectoryName(OutputFileName);
if (!Directory.Exists(outDir))
throw new ArgumentNullException(nameof(outDir), "Directory does not exist");
if (File.Exists(OutputFileName))
File.Delete(OutputFileName);
throw new DirectoryNotFoundException($"Directory does not exist: {nameof(outDir)}");
if (!Directory.Exists(cacheDirectory))
throw new ArgumentNullException(nameof(cacheDirectory), "Directory does not exist");
throw new DirectoryNotFoundException($"Directory does not exist: {nameof(cacheDirectory)}");
CacheDir = cacheDirectory;
// delete file after validation is complete
FileUtility.SafeDelete(OutputFileName);
DownloadLicense = ArgumentValidator.EnsureNotNull(dlLic, nameof(dlLic));
}
@ -105,6 +103,7 @@ namespace AaxDecrypter
try
{
var path = PathLib.ReplaceExtension(OutputFileName, ".cue");
path = FileUtility.GetValidFilename(path);
File.WriteAllText(path, Cue.CreateContents(Path.GetFileName(OutputFileName), DownloadLicense.ChapterInfo));
OnFileCreated(path);
}
@ -117,8 +116,8 @@ namespace AaxDecrypter
protected bool Step4_Cleanup()
{
FileExt.SafeDelete(jsonDownloadState);
FileExt.SafeDelete(tempFile);
FileUtility.SafeDelete(jsonDownloadState);
FileUtility.SafeDelete(tempFile);
return !IsCanceled;
}
@ -137,8 +136,8 @@ namespace AaxDecrypter
}
catch
{
FileExt.SafeDelete(jsonDownloadState);
FileExt.SafeDelete(tempFile);
FileUtility.SafeDelete(jsonDownloadState);
FileUtility.SafeDelete(tempFile);
return NewNetworkFilePersister();
}
}

View file

@ -1,10 +1,8 @@
using Dinah.Core.IO;
using System;
using System.Threading;
using Dinah.Core.Net.Http;
using Dinah.Core.StepRunner;
using System;
using System.IO;
using System.Linq;
using System.Threading;
using FileManager;
namespace AaxDecrypter
{
@ -68,10 +66,8 @@ namespace AaxDecrypter
CloseInputFileStream();
if (File.Exists(OutputFileName))
FileExt.SafeDelete(OutputFileName);
FileExt.SafeMove(InputFileStream.SaveFilePath, OutputFileName);
var realOutputFileName = FileUtility.Move(InputFileStream.SaveFilePath, OutputFileName);
SetOutputFileName(realOutputFileName);
OnFileCreated(OutputFileName);
return !IsCanceled;