more LibationFileManager rename. and bug fix

This commit is contained in:
Robert McRackan 2021-10-11 17:10:37 -04:00
parent c43e03b228
commit 6a81b9b02d
19 changed files with 105 additions and 63 deletions

View File

@ -3,7 +3,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>net5.0</TargetFramework> <TargetFramework>net5.0</TargetFramework>
<Version>6.2.6.1</Version> <Version>6.2.6.4</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -45,10 +45,20 @@ namespace FileLiberator
if (libraryBook.Book.Audio_Exists) if (libraryBook.Book.Audio_Exists)
return new StatusHandler { "Cannot find decrypt. Final audio file already exists" }; return new StatusHandler { "Cannot find decrypt. Final audio file already exists" };
FilePathCache.Inserted += FilePathCache_Inserted; bool success = false;
FilePathCache.Removed += FilePathCache_Removed; try
{
FilePathCache.Inserted += FilePathCache_Inserted;
FilePathCache.Removed += FilePathCache_Removed;
success = await downloadAudiobookAsync(libraryBook);
}
finally
{
FilePathCache.Inserted -= FilePathCache_Inserted;
FilePathCache.Removed -= FilePathCache_Removed;
}
var success = await downloadAudiobookAsync(libraryBook);
// decrypt failed // decrypt failed
if (!success) if (!success)
@ -67,9 +77,6 @@ namespace FileLiberator
} }
finally finally
{ {
FilePathCache.Inserted -= FilePathCache_Inserted;
FilePathCache.Removed -= FilePathCache_Removed;
OnCompleted(libraryBook); OnCompleted(libraryBook);
} }
} }
@ -109,7 +116,7 @@ namespace FileLiberator
audiobookDlLic.ChapterInfo.AddChapter(chap.Title, TimeSpan.FromMilliseconds(chap.LengthMs)); audiobookDlLic.ChapterInfo.AddChapter(chap.Title, TimeSpan.FromMilliseconds(chap.LengthMs));
} }
var outFileName = Path.Combine(AudibleFileStorage.DecryptInProgressDirectory, $"{PathLib.ToPathSafeString(libraryBook.Book.Title)} [{libraryBook.Book.AudibleProductId}].{outputFormat.ToString().ToLower()}"); var outFileName = FileUtility.GetValidFilename(AudibleFileStorage.DecryptInProgressDirectory, libraryBook.Book.Title, outputFormat.ToString().ToLower(), libraryBook.Book.AudibleProductId);
var cacheDir = AudibleFileStorage.DownloadsInProgressDirectory; var cacheDir = AudibleFileStorage.DownloadsInProgressDirectory;
@ -170,10 +177,16 @@ namespace FileLiberator
/// <returns>True if audiobook file(s) were successfully created and can be located on disk. Else false.</returns> /// <returns>True if audiobook file(s) were successfully created and can be located on disk. Else false.</returns>
private static bool moveFilesToBooksDir(Book book, List<FilePathCache.CacheEntry> entries) private static bool moveFilesToBooksDir(Book book, List<FilePathCache.CacheEntry> entries)
{ {
// create final directory. move each file into it. MOVE AUDIO FILE LAST // create final directory. move each file into it
// new dir: safetitle_limit50char + " [" + productId + "]" var title = book.Title;
// TODO make this method handle multiple audio files or a single audio file. var asin = book.AudibleProductId;
var destinationDir = AudibleFileStorage.Audio.GetDestDir(book.Title, book.AudibleProductId); // to prevent the paths from getting too long, we don't need after the 1st ":" for the folder
var underscoreIndex = title.IndexOf(':');
var titleDir
= underscoreIndex < 4
? title
: title.Substring(0, underscoreIndex);
var destinationDir = FileUtility.GetValidFilename(AudibleFileStorage.BooksDirectory, titleDir, null, asin);
Directory.CreateDirectory(destinationDir); Directory.CreateDirectory(destinationDir);
var music = entries.FirstOrDefault(f => f.FileType == FileType.Audio); var music = entries.FirstOrDefault(f => f.FileType == FileType.Audio);
@ -183,18 +196,15 @@ namespace FileLiberator
var musicFileExt = Path.GetExtension(music.Path).Trim('.'); var musicFileExt = Path.GetExtension(music.Path).Trim('.');
// audio filename: safetitle_limit50char + " [" + productId + "]." + audio_ext
var audioFileName = FileUtility.GetValidFilename(destinationDir, book.Title, musicFileExt, book.AudibleProductId); var audioFileName = FileUtility.GetValidFilename(destinationDir, book.Title, musicFileExt, book.AudibleProductId);
foreach (var entry in entries) foreach (var entry in entries)
{ {
var fileInfo = new FileInfo(entry.Path); var fileInfo = new FileInfo(entry.Path);
var isAudio = entry.FileType == FileType.Audio;
var dest var dest
= isAudio = entry.FileType == FileType.Audio
? Path.Join(destinationDir, fileInfo.Name) ? Path.Join(destinationDir, fileInfo.Name)
// non-audio filename: safetitle_limit50char + " [" + productId + "][" + audio_ext + "]." + non_audio_ext
: FileUtility.GetValidFilename(destinationDir, book.Title, fileInfo.Extension, book.AudibleProductId, musicFileExt); : FileUtility.GetValidFilename(destinationDir, book.Title, fileInfo.Extension, book.AudibleProductId, musicFileExt);
if (Path.GetExtension(dest).Trim('.').ToLower() == "cue") if (Path.GetExtension(dest).Trim('.').ToLower() == "cue")

View File

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
<PackageReference Include="MSTest.TestAdapter" Version="2.2.3" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.3" />
<PackageReference Include="coverlet.collector" Version="3.0.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\FileManager\FileManager.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,13 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace FileUtilityTests
{
[TestClass]
public class GetValidFilename
{
[TestMethod]
public void TestMethod1()
{
}
}
}

View File

@ -1,10 +1,13 @@
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
namespace FileManager namespace FileManager
{ {
public static class FileUtility public static class FileUtility
{ {
//public static string GetValidFilename(string template, Dictionary<string, object> parameters) { }
public static string GetValidFilename(string dirFullPath, string filename, string extension, params string[] metadataSuffixes) public static string GetValidFilename(string dirFullPath, string filename, string extension, params string[] metadataSuffixes)
{ {
if (string.IsNullOrWhiteSpace(dirFullPath)) if (string.IsNullOrWhiteSpace(dirFullPath))
@ -26,7 +29,7 @@ namespace FileManager
if (metadataSuffixes != null && metadataSuffixes.Length > 0) if (metadataSuffixes != null && metadataSuffixes.Length > 0)
filename += " [" + string.Join("][", metadataSuffixes) + "]"; filename += " [" + string.Join("][", metadataSuffixes) + "]";
// this method may also be used for directory names, so no guarantee of extension // extension is null when this method is used for directory names
if (!string.IsNullOrWhiteSpace(extension)) if (!string.IsNullOrWhiteSpace(extension))
extension = '.' + extension.Trim('.'); extension = '.' + extension.Trim('.');

View File

@ -58,6 +58,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AppScaffolding", "AppScaffo
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileManager", "FileManager\FileManager.csproj", "{E86014F9-E4B3-4CD4-A210-2B3DB571DD86}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileManager", "FileManager\FileManager.csproj", "{E86014F9-E4B3-4CD4-A210-2B3DB571DD86}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileManager.Tests", "FileManager.Tests\FileManager.Tests.csproj", "{3B58450C-FBDA-4D48-8418-A3C750596D7D}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -124,6 +126,10 @@ Global
{E86014F9-E4B3-4CD4-A210-2B3DB571DD86}.Debug|Any CPU.Build.0 = Debug|Any CPU {E86014F9-E4B3-4CD4-A210-2B3DB571DD86}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E86014F9-E4B3-4CD4-A210-2B3DB571DD86}.Release|Any CPU.ActiveCfg = Release|Any CPU {E86014F9-E4B3-4CD4-A210-2B3DB571DD86}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E86014F9-E4B3-4CD4-A210-2B3DB571DD86}.Release|Any CPU.Build.0 = Release|Any CPU {E86014F9-E4B3-4CD4-A210-2B3DB571DD86}.Release|Any CPU.Build.0 = Release|Any CPU
{3B58450C-FBDA-4D48-8418-A3C750596D7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3B58450C-FBDA-4D48-8418-A3C750596D7D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3B58450C-FBDA-4D48-8418-A3C750596D7D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3B58450C-FBDA-4D48-8418-A3C750596D7D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -144,6 +150,7 @@ Global
{428163C3-D558-4914-B570-A92069521877} = {8679CAC8-9164-4007-BDD2-F004810EDA14} {428163C3-D558-4914-B570-A92069521877} = {8679CAC8-9164-4007-BDD2-F004810EDA14}
{595E7C4D-506D-486D-98B7-5FDDF398D033} = {8679CAC8-9164-4007-BDD2-F004810EDA14} {595E7C4D-506D-486D-98B7-5FDDF398D033} = {8679CAC8-9164-4007-BDD2-F004810EDA14}
{E86014F9-E4B3-4CD4-A210-2B3DB571DD86} = {43E3ACB3-E0BC-4370-8DBB-E3720C8C8FD1} {E86014F9-E4B3-4CD4-A210-2B3DB571DD86} = {43E3ACB3-E0BC-4370-8DBB-E3720C8C8FD1}
{3B58450C-FBDA-4D48-8418-A3C750596D7D} = {67E66E82-5532-4440-AFB3-9FB1DF9DEF53}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {615E00ED-BAEF-4E8E-A92A-9B82D87942A9} SolutionGuid = {615E00ED-BAEF-4E8E-A92A-9B82D87942A9}

View File

@ -87,18 +87,6 @@ namespace LibationFileManager
public void Refresh() => BookDirectoryFiles.RefreshFiles(); public void Refresh() => BookDirectoryFiles.RefreshFiles();
public string GetDestDir(string title, string asin)
{
// to prevent the paths from getting too long, we don't need after the 1st ":" for the folder
var underscoreIndex = title.IndexOf(':');
var titleDir
= underscoreIndex < 4
? title
: title.Substring(0, underscoreIndex);
var finalDir = FileUtility.GetValidFilename(BooksDirectory, titleDir, null, asin);
return finalDir;
}
public string GetPath(string productId) => GetFilePath(productId); public string GetPath(string productId) => GetFilePath(productId);
} }

View File

@ -39,7 +39,7 @@ namespace LibationFileManager
public static string GetFirstPath(string id, FileType type) public static string GetFirstPath(string id, FileType type)
=> getEntries(entry => entry.Id == id && entry.FileType == type) => getEntries(entry => entry.Id == id && entry.FileType == type)
.FirstOrDefault() ?.FirstOrDefault()
?.Path; ?.Path;
private static List<CacheEntry> getEntries(Func<CacheEntry, bool> predicate) private static List<CacheEntry> getEntries(Func<CacheEntry, bool> predicate)

View File

@ -1,6 +1,6 @@
using DataLayer; using System;
using FileManager; using DataLayer;
using System; using LibationFileManager;
namespace LibationWinForms.BookLiberation namespace LibationWinForms.BookLiberation
{ {

View File

@ -2,6 +2,7 @@
using DataLayer; using DataLayer;
using Dinah.Core.Net.Http; using Dinah.Core.Net.Http;
using Dinah.Core.Threading; using Dinah.Core.Threading;
using LibationFileManager;
using LibationWinForms.BookLiberation.BaseForms; using LibationWinForms.BookLiberation.BaseForms;
namespace LibationWinForms.BookLiberation namespace LibationWinForms.BookLiberation
@ -23,20 +24,20 @@ namespace LibationWinForms.BookLiberation
{ {
base.Processable_Begin(sender, libraryBook); base.Processable_Begin(sender, libraryBook);
GetCoverArtDelegate = () => FileManager.PictureStorage.GetPictureSynchronously( GetCoverArtDelegate = () => PictureStorage.GetPictureSynchronously(
new FileManager.PictureDefinition( new PictureDefinition(
libraryBook.Book.PictureId, libraryBook.Book.PictureId,
FileManager.PictureSize._500x500)); PictureSize._500x500));
//Set default values from library //Set default values from library
AudioDecodable_TitleDiscovered(sender, libraryBook.Book.Title); AudioDecodable_TitleDiscovered(sender, libraryBook.Book.Title);
AudioDecodable_AuthorsDiscovered(sender, string.Join(", ", libraryBook.Book.Authors)); AudioDecodable_AuthorsDiscovered(sender, string.Join(", ", libraryBook.Book.Authors));
AudioDecodable_NarratorsDiscovered(sender, string.Join(", ", libraryBook.Book.NarratorNames)); AudioDecodable_NarratorsDiscovered(sender, string.Join(", ", libraryBook.Book.NarratorNames));
AudioDecodable_CoverImageDiscovered(sender, AudioDecodable_CoverImageDiscovered(sender,
FileManager.PictureStorage.GetPicture( PictureStorage.GetPicture(
new FileManager.PictureDefinition( new PictureDefinition(
libraryBook.Book.PictureId, libraryBook.Book.PictureId,
FileManager.PictureSize._80x80)).bytes); PictureSize._80x80)).bytes);
} }
#endregion #endregion

View File

@ -1,6 +1,6 @@
using DataLayer; using System;
using FileManager; using DataLayer;
using System; using LibationFileManager;
namespace LibationWinForms.BookLiberation namespace LibationWinForms.BookLiberation
{ {

View File

@ -1,11 +1,11 @@
using DataLayer; using System;
using Dinah.Core;
using FileLiberator;
using LibationWinForms.BookLiberation.BaseForms;
using System;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using DataLayer;
using Dinah.Core;
using FileLiberator;
using LibationFileManager;
using LibationWinForms.BookLiberation.BaseForms;
namespace LibationWinForms.BookLiberation namespace LibationWinForms.BookLiberation
{ {
@ -218,12 +218,12 @@ namespace LibationWinForms.BookLiberation
{ {
LogMe.Error("ERROR. All books have not been processed. Most recent book: processing failed"); LogMe.Error("ERROR. All books have not been processed. Most recent book: processing failed");
DialogResult? dialogResult = FileManager.Configuration.Instance.BadBook switch DialogResult? dialogResult = Configuration.Instance.BadBook switch
{ {
FileManager.Configuration.BadBookAction.Abort => DialogResult.Abort, Configuration.BadBookAction.Abort => DialogResult.Abort,
FileManager.Configuration.BadBookAction.Retry => DialogResult.Retry, Configuration.BadBookAction.Retry => DialogResult.Retry,
FileManager.Configuration.BadBookAction.Ignore => DialogResult.Ignore, Configuration.BadBookAction.Ignore => DialogResult.Ignore,
FileManager.Configuration.BadBookAction.Ask => null, Configuration.BadBookAction.Ask => null,
_ => null _ => null
}; };

View File

@ -4,6 +4,7 @@ using System.Linq;
using System.Windows.Forms; using System.Windows.Forms;
using DataLayer; using DataLayer;
using Dinah.Core; using Dinah.Core;
using LibationFileManager;
namespace LibationWinForms.Dialogs namespace LibationWinForms.Dialogs
{ {
@ -39,7 +40,7 @@ namespace LibationWinForms.Dialogs
{ {
this.Text = Book.Title; this.Text = Book.Title;
(var isDefault, var picture) = FileManager.PictureStorage.GetPicture(new FileManager.PictureDefinition(Book.PictureId, FileManager.PictureSize._80x80)); (_, var picture) = PictureStorage.GetPicture(new PictureDefinition(Book.PictureId, PictureSize._80x80));
this.coverPb.Image = Dinah.Core.Drawing.ImageReader.ToImage(picture); this.coverPb.Image = Dinah.Core.Drawing.ImageReader.ToImage(picture);
var t = @$" var t = @$"

View File

@ -1,7 +1,7 @@
using FileManager; using System;
using System;
using System.Linq; using System.Linq;
using System.Windows.Forms; using System.Windows.Forms;
using LibationFileManager;
namespace LibationWinForms.Dialogs namespace LibationWinForms.Dialogs
{ {

View File

@ -1,7 +1,6 @@
using FileManager; using System;
using System;
using System.Linq;
using System.Windows.Forms; using System.Windows.Forms;
using LibationFileManager;
namespace LibationWinForms.Dialogs namespace LibationWinForms.Dialogs
{ {

View File

@ -50,7 +50,7 @@ namespace LibationWinForms.Dialogs
string dir = ""; string dir = "";
try try
{ {
dir = FileManager.Configuration.Instance.LibationFiles; dir = LibationFileManager.Configuration.Instance.LibationFiles;
} }
catch { } catch { }

View File

@ -1,8 +1,8 @@
using ApplicationServices; using ApplicationServices;
using DataLayer; using DataLayer;
using Dinah.Core.DataBinding; using Dinah.Core.DataBinding;
using FileManager;
using InternalUtilities; using InternalUtilities;
using LibationFileManager;
using LibationWinForms.Login; using LibationWinForms.Login;
using System; using System;
using System.Collections; using System.Collections;

View File

@ -6,8 +6,8 @@ using ApplicationServices;
using Dinah.Core; using Dinah.Core;
using Dinah.Core.Drawing; using Dinah.Core.Drawing;
using Dinah.Core.Threading; using Dinah.Core.Threading;
using FileManager;
using InternalUtilities; using InternalUtilities;
using LibationFileManager;
using LibationWinForms.Dialogs; using LibationWinForms.Dialogs;
namespace LibationWinForms namespace LibationWinForms

View File

@ -78,7 +78,7 @@ namespace LibationWinForms
// liberated: open explorer to file // liberated: open explorer to file
if (libraryBook.Book.Audio_Exists) if (libraryBook.Book.Audio_Exists)
{ {
var filePath = FileManager.AudibleFileStorage.Audio.GetPath(libraryBook.Book.AudibleProductId); var filePath = LibationFileManager.AudibleFileStorage.Audio.GetPath(libraryBook.Book.AudibleProductId);
if (!Go.To.File(filePath)) if (!Go.To.File(filePath))
{ {
var suffix = string.IsNullOrWhiteSpace(filePath) ? "" : $":\r\n{filePath}"; var suffix = string.IsNullOrWhiteSpace(filePath) ? "" : $":\r\n{filePath}";