Add support for multipart title naming templates
This commit is contained in:
parent
a24c929acf
commit
45c5efffbd
@ -4,6 +4,7 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using AAXClean;
|
using AAXClean;
|
||||||
using AAXClean.Codecs;
|
using AAXClean.Codecs;
|
||||||
|
using Dinah.Core;
|
||||||
using Dinah.Core.StepRunner;
|
using Dinah.Core.StepRunner;
|
||||||
using FileManager;
|
using FileManager;
|
||||||
|
|
||||||
@ -14,14 +15,22 @@ namespace AaxDecrypter
|
|||||||
protected override StepSequence Steps { get; }
|
protected override StepSequence Steps { get; }
|
||||||
|
|
||||||
private Func<MultiConvertFileProperties, string> multipartFileNameCallback { get; }
|
private Func<MultiConvertFileProperties, string> multipartFileNameCallback { get; }
|
||||||
|
private Func<MultiConvertFileProperties, string> multipartTitleNameCallback { get; }
|
||||||
|
|
||||||
private static TimeSpan minChapterLength { get; } = TimeSpan.FromSeconds(3);
|
private static TimeSpan minChapterLength { get; } = TimeSpan.FromSeconds(3);
|
||||||
private List<string> multiPartFilePaths { get; } = new List<string>();
|
private List<string> multiPartFilePaths { get; } = new List<string>();
|
||||||
|
|
||||||
public AaxcDownloadMultiConverter(string outFileName, string cacheDirectory, DownloadOptions dlLic,
|
public AaxcDownloadMultiConverter(
|
||||||
Func<MultiConvertFileProperties, string> multipartFileNameCallback = null)
|
string outFileName,
|
||||||
|
string cacheDirectory,
|
||||||
|
DownloadOptions dlLic,
|
||||||
|
Func<MultiConvertFileProperties, string> multipartFileNameCallback,
|
||||||
|
Func<MultiConvertFileProperties, string> multipartTitleNameCallback
|
||||||
|
)
|
||||||
: base(outFileName, cacheDirectory, dlLic)
|
: base(outFileName, cacheDirectory, dlLic)
|
||||||
{
|
{
|
||||||
|
ArgumentValidator.EnsureNotNull(multipartFileNameCallback, nameof(multipartFileNameCallback));
|
||||||
|
ArgumentValidator.EnsureNotNull(multipartTitleNameCallback, nameof(multipartTitleNameCallback));
|
||||||
Steps = new StepSequence
|
Steps = new StepSequence
|
||||||
{
|
{
|
||||||
Name = "Download and Convert Aaxc To " + DownloadOptions.OutputFormat,
|
Name = "Download and Convert Aaxc To " + DownloadOptions.OutputFormat,
|
||||||
@ -30,7 +39,8 @@ namespace AaxDecrypter
|
|||||||
["Step 2: Download Decrypted Audiobook"] = Step_DownloadAudiobookAsMultipleFilesPerChapter,
|
["Step 2: Download Decrypted Audiobook"] = Step_DownloadAudiobookAsMultipleFilesPerChapter,
|
||||||
["Step 3: Cleanup"] = Step_Cleanup,
|
["Step 3: Cleanup"] = Step_Cleanup,
|
||||||
};
|
};
|
||||||
this.multipartFileNameCallback = multipartFileNameCallback ?? MultiConvertFileProperties.DefaultMultipartFilename;
|
this.multipartFileNameCallback = multipartFileNameCallback;
|
||||||
|
this.multipartTitleNameCallback = multipartTitleNameCallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -103,48 +113,57 @@ That naming may not be desirable for everyone, but it's an easy change to instea
|
|||||||
private ConversionResult ConvertToMultiMp4a(ChapterInfo splitChapters)
|
private ConversionResult ConvertToMultiMp4a(ChapterInfo splitChapters)
|
||||||
{
|
{
|
||||||
var chapterCount = 0;
|
var chapterCount = 0;
|
||||||
return AaxFile.ConvertToMultiMp4a(splitChapters, newSplitCallback =>
|
return AaxFile.ConvertToMultiMp4a
|
||||||
{
|
(
|
||||||
createOutputFileStream(++chapterCount, splitChapters, newSplitCallback);
|
splitChapters,
|
||||||
|
newSplitCallback => Callback(++chapterCount, splitChapters, newSplitCallback),
|
||||||
newSplitCallback.TrackNumber = chapterCount;
|
DownloadOptions.TrimOutputToChapterLength
|
||||||
newSplitCallback.TrackCount = splitChapters.Count;
|
);
|
||||||
|
|
||||||
}, DownloadOptions.TrimOutputToChapterLength);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ConversionResult ConvertToMultiMp3(ChapterInfo splitChapters)
|
private ConversionResult ConvertToMultiMp3(ChapterInfo splitChapters)
|
||||||
{
|
{
|
||||||
var chapterCount = 0;
|
var chapterCount = 0;
|
||||||
return AaxFile.ConvertToMultiMp3(splitChapters, newSplitCallback =>
|
return AaxFile.ConvertToMultiMp3
|
||||||
{
|
(
|
||||||
createOutputFileStream(++chapterCount, splitChapters, newSplitCallback);
|
splitChapters,
|
||||||
|
newSplitCallback => Callback(++chapterCount, splitChapters, newSplitCallback),
|
||||||
newSplitCallback.TrackNumber = chapterCount;
|
DownloadOptions.LameConfig,
|
||||||
newSplitCallback.TrackCount = splitChapters.Count;
|
DownloadOptions.TrimOutputToChapterLength
|
||||||
|
);
|
||||||
}, DownloadOptions.LameConfig, DownloadOptions.TrimOutputToChapterLength);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createOutputFileStream(int currentChapter, ChapterInfo splitChapters, NewSplitCallback newSplitCallback)
|
|
||||||
|
private void Callback(int currentChapter, ChapterInfo splitChapters, NewMP3SplitCallback newSplitCallback)
|
||||||
|
=> Callback(currentChapter, splitChapters, newSplitCallback);
|
||||||
|
|
||||||
|
private void Callback(int currentChapter, ChapterInfo splitChapters, NewSplitCallback newSplitCallback)
|
||||||
{
|
{
|
||||||
var fileName = multipartFileNameCallback(new()
|
MultiConvertFileProperties props = new()
|
||||||
{
|
{
|
||||||
OutputFileName = OutputFileName,
|
OutputFileName = OutputFileName,
|
||||||
PartsPosition = currentChapter,
|
PartsPosition = currentChapter,
|
||||||
PartsTotal = splitChapters.Count,
|
PartsTotal = splitChapters.Count,
|
||||||
Title = newSplitCallback?.Chapter?.Title,
|
Title = newSplitCallback?.Chapter?.Title,
|
||||||
|
};
|
||||||
|
newSplitCallback.OutputFile = createOutputFileStream(props);
|
||||||
|
newSplitCallback.TrackTitle = multipartTitleNameCallback(props);
|
||||||
|
newSplitCallback.TrackNumber = currentChapter;
|
||||||
|
newSplitCallback.TrackCount = splitChapters.Count;
|
||||||
|
}
|
||||||
|
|
||||||
});
|
private FileStream createOutputFileStream(MultiConvertFileProperties multiConvertFileProperties)
|
||||||
|
{
|
||||||
|
var fileName = multipartFileNameCallback(multiConvertFileProperties);
|
||||||
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);
|
var file = File.Open(fileName, FileMode.OpenOrCreate);
|
||||||
|
|
||||||
OnFileCreated(fileName);
|
OnFileCreated(fileName);
|
||||||
|
return file;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -126,6 +126,9 @@ namespace AppScaffolding
|
|||||||
if (!config.Exists(nameof(config.ChapterFileTemplate)))
|
if (!config.Exists(nameof(config.ChapterFileTemplate)))
|
||||||
config.ChapterFileTemplate = Templates.ChapterFile.DefaultTemplate;
|
config.ChapterFileTemplate = Templates.ChapterFile.DefaultTemplate;
|
||||||
|
|
||||||
|
if (!config.Exists(nameof(config.ChapterTitleTemplate)))
|
||||||
|
config.ChapterTitleTemplate = Templates.ChapterTitle.DefaultTemplate;
|
||||||
|
|
||||||
if (!config.Exists(nameof(config.AutoScan)))
|
if (!config.Exists(nameof(config.AutoScan)))
|
||||||
config.AutoScan = true;
|
config.AutoScan = true;
|
||||||
|
|
||||||
|
|||||||
@ -18,9 +18,22 @@ namespace FileLiberator
|
|||||||
=> Templates.ChapterFile.GetFilename(libraryBook.ToDto(), props);
|
=> Templates.ChapterFile.GetFilename(libraryBook.ToDto(), props);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class MultipartTitleNamer
|
||||||
|
{
|
||||||
|
private LibraryBook libraryBook { get; }
|
||||||
|
|
||||||
|
internal MultipartTitleNamer(LibraryBook libraryBook) => this.libraryBook = libraryBook;
|
||||||
|
|
||||||
|
internal string MultipartTitle(AaxDecrypter.MultiConvertFileProperties props)
|
||||||
|
=> Templates.ChapterTitle.GetTitle(libraryBook.ToDto(), props);
|
||||||
|
}
|
||||||
|
|
||||||
public static Func<AaxDecrypter.MultiConvertFileProperties, string> CreateMultipartRenamerFunc(this AudioFileStorage _, LibraryBook libraryBook)
|
public static Func<AaxDecrypter.MultiConvertFileProperties, string> CreateMultipartRenamerFunc(this AudioFileStorage _, LibraryBook libraryBook)
|
||||||
=> new MultipartRenamer(libraryBook).MultipartFilename;
|
=> new MultipartRenamer(libraryBook).MultipartFilename;
|
||||||
|
|
||||||
|
public static Func<AaxDecrypter.MultiConvertFileProperties, string> CreateMultipartTitleNamer(this AudioFileStorage _, LibraryBook libraryBook)
|
||||||
|
=> new MultipartTitleNamer(libraryBook).MultipartTitle;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// DownloadDecryptBook:
|
/// DownloadDecryptBook:
|
||||||
/// File path for where to move files into.
|
/// File path for where to move files into.
|
||||||
|
|||||||
@ -112,9 +112,12 @@ namespace FileLiberator
|
|||||||
{
|
{
|
||||||
AaxcDownloadConvertBase converter
|
AaxcDownloadConvertBase converter
|
||||||
= config.SplitFilesByChapter ?
|
= config.SplitFilesByChapter ?
|
||||||
new AaxcDownloadMultiConverter(
|
new AaxcDownloadMultiConverter
|
||||||
|
(
|
||||||
outFileName, cacheDir, audiobookDlLic,
|
outFileName, cacheDir, audiobookDlLic,
|
||||||
AudibleFileStorage.Audio.CreateMultipartRenamerFunc(libraryBook)) :
|
AudibleFileStorage.Audio.CreateMultipartRenamerFunc(libraryBook),
|
||||||
|
AudibleFileStorage.Audio.CreateMultipartTitleNamer(libraryBook)
|
||||||
|
) :
|
||||||
new AaxcDownloadSingleConverter(outFileName, cacheDir, audiobookDlLic);
|
new AaxcDownloadSingleConverter(outFileName, cacheDir, audiobookDlLic);
|
||||||
|
|
||||||
if (config.AllowLibationFixup)
|
if (config.AllowLibationFixup)
|
||||||
|
|||||||
@ -2,26 +2,14 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Dinah.Core;
|
|
||||||
|
|
||||||
namespace FileManager
|
namespace FileManager
|
||||||
{
|
{
|
||||||
/// <summary>Get valid filename. Advanced features incl. parameterized template</summary>
|
/// <summary>Get valid filename. Advanced features incl. parameterized template</summary>
|
||||||
public class FileNamingTemplate
|
public class FileNamingTemplate : NamingTemplate
|
||||||
{
|
{
|
||||||
/// <summary>Proposed full file path. May contain optional html-styled template tags. Eg: <name></summary>
|
|
||||||
public string Template { get; }
|
|
||||||
|
|
||||||
/// <param name="template">Proposed file name with optional html-styled template tags.</param>
|
/// <param name="template">Proposed file name with optional html-styled template tags.</param>
|
||||||
public FileNamingTemplate(string template) => Template = ArgumentValidator.EnsureNotNullOrWhiteSpace(template, nameof(template));
|
public FileNamingTemplate(string template) : base(template) { }
|
||||||
|
|
||||||
/// <summary>Optional step 1: Replace html-styled template tags with parameters. Eg {"name", "Bill Gates"} => /<name>/ => /Bill Gates/</summary>
|
|
||||||
public Dictionary<string, object> ParameterReplacements { get; } = new Dictionary<string, object>();
|
|
||||||
|
|
||||||
/// <summary>Convenience method</summary>
|
|
||||||
public void AddParameterReplacement(string key, object value)
|
|
||||||
// using .Add() instead of "[key] = value" will make unintended overwriting throw exception
|
|
||||||
=> ParameterReplacements.Add(key, value);
|
|
||||||
|
|
||||||
/// <summary>Optional step 2: Replace all illegal characters with this. Default=<see cref="string.Empty"/></summary>
|
/// <summary>Optional step 2: Replace all illegal characters with this. Default=<see cref="string.Empty"/></summary>
|
||||||
public string IllegalCharacterReplacements { get; set; }
|
public string IllegalCharacterReplacements { get; set; }
|
||||||
@ -84,11 +72,6 @@ namespace FileManager
|
|||||||
return FileUtility.GetValidFilename(directoryName + filename, IllegalCharacterReplacements, returnFirstExisting);
|
return FileUtility.GetValidFilename(directoryName + filename, IllegalCharacterReplacements, returnFirstExisting);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string formatKey(string key)
|
|
||||||
=> key
|
|
||||||
.Replace("<", "")
|
|
||||||
.Replace(">", "");
|
|
||||||
|
|
||||||
private string formatValue(object value)
|
private string formatValue(object value)
|
||||||
{
|
{
|
||||||
if (value is null)
|
if (value is null)
|
||||||
|
|||||||
@ -251,7 +251,6 @@ namespace FileManager
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var list = Directory.EnumerateDirectories(path).ToList();
|
|
||||||
IEnumerable <LongPath> subDirs = Directory.EnumerateDirectories(path).Select(p => (LongPath)p);
|
IEnumerable <LongPath> subDirs = Directory.EnumerateDirectories(path).Select(p => (LongPath)p);
|
||||||
// Add files in subdirectories recursively to the list
|
// Add files in subdirectories recursively to the list
|
||||||
foreach (string dir in subDirs)
|
foreach (string dir in subDirs)
|
||||||
@ -259,10 +258,6 @@ namespace FileManager
|
|||||||
}
|
}
|
||||||
catch (UnauthorizedAccessException) { }
|
catch (UnauthorizedAccessException) { }
|
||||||
catch (PathTooLongException) { }
|
catch (PathTooLongException) { }
|
||||||
catch(Exception ex)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
|
|||||||
20
Source/FileManager/MetadataNamingTemplate.cs
Normal file
20
Source/FileManager/MetadataNamingTemplate.cs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace FileManager
|
||||||
|
{
|
||||||
|
public class MetadataNamingTemplate : NamingTemplate
|
||||||
|
{
|
||||||
|
public MetadataNamingTemplate(string template) : base(template) { }
|
||||||
|
|
||||||
|
public string GetTagContents()
|
||||||
|
{
|
||||||
|
var tagValue = Template;
|
||||||
|
|
||||||
|
foreach (var r in ParameterReplacements)
|
||||||
|
tagValue = tagValue.Replace($"<{formatKey(r.Key)}>", r.Value.ToString());
|
||||||
|
|
||||||
|
return tagValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
28
Source/FileManager/NamingTemplate.cs
Normal file
28
Source/FileManager/NamingTemplate.cs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
using Dinah.Core;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace FileManager
|
||||||
|
{
|
||||||
|
public class NamingTemplate
|
||||||
|
{
|
||||||
|
/// <summary>Proposed full name. May contain optional html-styled template tags. Eg: <name></summary>
|
||||||
|
public string Template { get; }
|
||||||
|
|
||||||
|
/// <param name="template">Proposed file name with optional html-styled template tags.</param>
|
||||||
|
public NamingTemplate(string template) => Template = ArgumentValidator.EnsureNotNullOrWhiteSpace(template, nameof(template));
|
||||||
|
|
||||||
|
/// <summary>Optional step 1: Replace html-styled template tags with parameters. Eg {"name", "Bill Gates"} => /<name>/ => /Bill Gates/</summary>
|
||||||
|
public Dictionary<string, object> ParameterReplacements { get; } = new Dictionary<string, object>();
|
||||||
|
|
||||||
|
/// <summary>Convenience method</summary>
|
||||||
|
public void AddParameterReplacement(string key, object value)
|
||||||
|
// using .Add() instead of "[key] = value" will make unintended overwriting throw exception
|
||||||
|
=> ParameterReplacements.Add(key, value);
|
||||||
|
|
||||||
|
protected static string formatKey(string key)
|
||||||
|
=> key
|
||||||
|
.Replace("<", "")
|
||||||
|
.Replace(">", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -124,7 +124,7 @@ namespace LibationFileManager
|
|||||||
set => persistentDictionary.SetNonString(nameof(StripUnabridged), value);
|
set => persistentDictionary.SetNonString(nameof(StripUnabridged), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Description("Allow Libation to remove audible branding from the start\r\nand end of audiobooks. (e.g. \"This is Audible\")")]
|
[Description("Strip audible branding from the start and end of audiobooks.\r\n(e.g. \"This is Audible\")")]
|
||||||
public bool StripAudibleBrandAudio
|
public bool StripAudibleBrandAudio
|
||||||
{
|
{
|
||||||
get => persistentDictionary.GetNonString<bool>(nameof(StripAudibleBrandAudio));
|
get => persistentDictionary.GetNonString<bool>(nameof(StripAudibleBrandAudio));
|
||||||
@ -305,6 +305,13 @@ namespace LibationFileManager
|
|||||||
set => setTemplate(nameof(ChapterFileTemplate), Templates.ChapterFile, value);
|
set => setTemplate(nameof(ChapterFileTemplate), Templates.ChapterFile, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Description("How to format the file's Tile stored in metadata")]
|
||||||
|
public string ChapterTitleTemplate
|
||||||
|
{
|
||||||
|
get => getTemplate(nameof(ChapterTitleTemplate), Templates.ChapterTitle);
|
||||||
|
set => setTemplate(nameof(ChapterTitleTemplate), Templates.ChapterTitle, value);
|
||||||
|
}
|
||||||
|
|
||||||
private string getTemplate(string settingName, Templates templ) => templ.GetValid(persistentDictionary.GetString(settingName));
|
private string getTemplate(string settingName, Templates templ) => templ.GetValid(persistentDictionary.GetString(settingName));
|
||||||
private void setTemplate(string settingName, Templates templ, string newValue)
|
private void setTemplate(string settingName, Templates templ, string newValue)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -24,6 +24,7 @@ namespace LibationFileManager
|
|||||||
public static FolderTemplate Folder { get; } = new FolderTemplate();
|
public static FolderTemplate Folder { get; } = new FolderTemplate();
|
||||||
public static FileTemplate File { get; } = new FileTemplate();
|
public static FileTemplate File { get; } = new FileTemplate();
|
||||||
public static ChapterFileTemplate ChapterFile { get; } = new ChapterFileTemplate();
|
public static ChapterFileTemplate ChapterFile { get; } = new ChapterFileTemplate();
|
||||||
|
public static ChapterTitleTemplate ChapterTitle { get; } = new ChapterTitleTemplate();
|
||||||
|
|
||||||
public abstract string Name { get; }
|
public abstract string Name { get; }
|
||||||
public abstract string Description { get; }
|
public abstract string Description { get; }
|
||||||
@ -146,7 +147,7 @@ namespace LibationFileManager
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public IEnumerable<TemplateTags> GetTemplateTags()
|
public virtual IEnumerable<TemplateTags> GetTemplateTags()
|
||||||
=> TemplateTags.GetAll()
|
=> TemplateTags.GetAll()
|
||||||
// yeah, this line is a little funky but it works when you think through it. also: trust the unit tests
|
// yeah, this line is a little funky but it works when you think through it. also: trust the unit tests
|
||||||
.Where(t => IsChapterized || !t.IsChapterOnly);
|
.Where(t => IsChapterized || !t.IsChapterOnly);
|
||||||
@ -280,5 +281,57 @@ namespace LibationFileManager
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ChapterTitleTemplate : Templates
|
||||||
|
{
|
||||||
|
private List<TemplateTags> _templateTags { get; } = new()
|
||||||
|
{
|
||||||
|
TemplateTags.Title,
|
||||||
|
TemplateTags.TitleShort,
|
||||||
|
TemplateTags.Series,
|
||||||
|
TemplateTags.ChCount,
|
||||||
|
TemplateTags.ChNumber,
|
||||||
|
TemplateTags.ChNumber0,
|
||||||
|
TemplateTags.ChTitle,
|
||||||
|
};
|
||||||
|
public override string Name => "Chapter Title Template";
|
||||||
|
|
||||||
|
public override string Description => Configuration.GetDescription(nameof(Configuration.ChapterTitleTemplate));
|
||||||
|
|
||||||
|
public override string DefaultTemplate => "<ch#> - <title short>: <ch title>";
|
||||||
|
|
||||||
|
protected override bool IsChapterized => true;
|
||||||
|
|
||||||
|
public override IEnumerable<string> GetErrors(string template)
|
||||||
|
=> new List<string>();
|
||||||
|
|
||||||
|
public override IEnumerable<string> GetWarnings(string template)
|
||||||
|
=> GetStandardWarnings(template).ToList();
|
||||||
|
|
||||||
|
public string GetTitle(LibraryBookDto libraryBookDto, AaxDecrypter.MultiConvertFileProperties props)
|
||||||
|
=> GetPortionTitle(libraryBookDto, Configuration.Instance.ChapterTitleTemplate, props);
|
||||||
|
|
||||||
|
public string GetPortionTitle(LibraryBookDto libraryBookDto, string template, AaxDecrypter.MultiConvertFileProperties props)
|
||||||
|
{
|
||||||
|
ArgumentValidator.EnsureNotNullOrWhiteSpace(template, nameof(template));
|
||||||
|
ArgumentValidator.EnsureNotNull(libraryBookDto, nameof(libraryBookDto));
|
||||||
|
|
||||||
|
var fileNamingTemplate = new MetadataNamingTemplate(template);
|
||||||
|
|
||||||
|
var title = libraryBookDto.Title ?? "";
|
||||||
|
var titleShort = title.IndexOf(':') < 1 ? title : title.Substring(0, title.IndexOf(':'));
|
||||||
|
|
||||||
|
fileNamingTemplate.AddParameterReplacement(TemplateTags.Title, title);
|
||||||
|
fileNamingTemplate.AddParameterReplacement(TemplateTags.TitleShort, titleShort);
|
||||||
|
fileNamingTemplate.AddParameterReplacement(TemplateTags.Series, libraryBookDto.SeriesName);
|
||||||
|
fileNamingTemplate.AddParameterReplacement(TemplateTags.ChCount, props.PartsTotal);
|
||||||
|
fileNamingTemplate.AddParameterReplacement(TemplateTags.ChNumber, props.PartsPosition);
|
||||||
|
fileNamingTemplate.AddParameterReplacement(TemplateTags.ChNumber0, FileUtility.GetSequenceFormatted(props.PartsPosition, props.PartsTotal));
|
||||||
|
fileNamingTemplate.AddParameterReplacement(TemplateTags.ChTitle, props.Title ?? "");
|
||||||
|
|
||||||
|
return fileNamingTemplate.GetTagContents();
|
||||||
|
}
|
||||||
|
public override IEnumerable<TemplateTags> GetTemplateTags() => _templateTags;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,7 @@ namespace LibationFileManager
|
|||||||
{
|
{
|
||||||
public static class UtilityExtensions
|
public static class UtilityExtensions
|
||||||
{
|
{
|
||||||
public static void AddParameterReplacement(this FileNamingTemplate fileNamingTemplate, TemplateTags templateTags, object value)
|
public static void AddParameterReplacement(this NamingTemplate fileNamingTemplate, TemplateTags templateTags, object value)
|
||||||
=> fileNamingTemplate.AddParameterReplacement(templateTags.TagName, value);
|
=> fileNamingTemplate.AddParameterReplacement(templateTags.TagName, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -67,7 +67,7 @@ namespace LibationWinForms.Dialogs
|
|||||||
private void templateTb_TextChanged(object sender, EventArgs e)
|
private void templateTb_TextChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
workingTemplateText = templateTb.Text;
|
workingTemplateText = templateTb.Text;
|
||||||
|
var isChapterTitle = template == Templates.ChapterTitle;
|
||||||
var isFolder = template == Templates.Folder;
|
var isFolder = template == Templates.Folder;
|
||||||
|
|
||||||
var libraryBookDto = new LibraryBookDto
|
var libraryBookDto = new LibraryBookDto
|
||||||
@ -85,22 +85,35 @@ namespace LibationWinForms.Dialogs
|
|||||||
var chapterNumber = 4;
|
var chapterNumber = 4;
|
||||||
var chaptersTotal = 10;
|
var chaptersTotal = 10;
|
||||||
|
|
||||||
|
var partFileProperties = new AaxDecrypter.MultiConvertFileProperties()
|
||||||
|
{
|
||||||
|
OutputFileName = "",
|
||||||
|
PartsPosition = chapterNumber,
|
||||||
|
PartsTotal = chaptersTotal,
|
||||||
|
Title = chapterName
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
var books = config.Books;
|
var books = config.Books;
|
||||||
var folder = Templates.Folder.GetPortionFilename(
|
var folder = Templates.Folder.GetPortionFilename(
|
||||||
libraryBookDto,
|
libraryBookDto,
|
||||||
isFolder ? workingTemplateText : config.FolderTemplate);
|
isFolder ? workingTemplateText : config.FolderTemplate);
|
||||||
|
|
||||||
|
|
||||||
var file
|
var file
|
||||||
= template == Templates.ChapterFile
|
= template == Templates.ChapterFile
|
||||||
? Templates.ChapterFile.GetPortionFilename(
|
? Templates.ChapterFile.GetPortionFilename(
|
||||||
libraryBookDto,
|
libraryBookDto,
|
||||||
workingTemplateText,
|
workingTemplateText,
|
||||||
new() { OutputFileName = "", PartsPosition = chapterNumber, PartsTotal = chaptersTotal, Title = chapterName },
|
partFileProperties,
|
||||||
"")
|
"")
|
||||||
: Templates.File.GetPortionFilename(
|
: Templates.File.GetPortionFilename(
|
||||||
libraryBookDto,
|
libraryBookDto,
|
||||||
isFolder ? config.FileTemplate : workingTemplateText);
|
isFolder ? config.FileTemplate : workingTemplateText);
|
||||||
var ext = config.DecryptToLossy ? "mp3" : "m4b";
|
var ext = config.DecryptToLossy ? "mp3" : "m4b";
|
||||||
|
|
||||||
|
var chapterTitle = Templates.ChapterTitle.GetPortionTitle(libraryBookDto, workingTemplateText, partFileProperties);
|
||||||
|
|
||||||
const char ZERO_WIDTH_SPACE = '\u200B';
|
const char ZERO_WIDTH_SPACE = '\u200B';
|
||||||
var sing = $"{Path.DirectorySeparatorChar}";
|
var sing = $"{Path.DirectorySeparatorChar}";
|
||||||
|
|
||||||
@ -126,6 +139,14 @@ namespace LibationWinForms.Dialogs
|
|||||||
richTextBox1.Clear();
|
richTextBox1.Clear();
|
||||||
richTextBox1.SelectionFont = reg;
|
richTextBox1.SelectionFont = reg;
|
||||||
|
|
||||||
|
if (isChapterTitle)
|
||||||
|
richTextBox1.SelectionFont = bold;
|
||||||
|
|
||||||
|
richTextBox1.AppendText(chapterTitle);
|
||||||
|
|
||||||
|
if (isChapterTitle)
|
||||||
|
return;
|
||||||
|
|
||||||
richTextBox1.AppendText(slashWrap(books));
|
richTextBox1.AppendText(slashWrap(books));
|
||||||
richTextBox1.AppendText(sing);
|
richTextBox1.AppendText(sing);
|
||||||
|
|
||||||
|
|||||||
@ -1,13 +1,69 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using LibationFileManager;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace LibationWinForms.Dialogs
|
namespace LibationWinForms.Dialogs
|
||||||
{
|
{
|
||||||
partial class SettingsDialog
|
partial class SettingsDialog
|
||||||
{
|
{
|
||||||
|
private void Load_AudioSettings(Configuration config)
|
||||||
|
{
|
||||||
|
this.allowLibationFixupCbox.Text = desc(nameof(config.AllowLibationFixup));
|
||||||
|
this.createCueSheetCbox.Text = desc(nameof(config.CreateCueSheet));
|
||||||
|
this.downloadCoverArtCbox.Text = desc(nameof(config.DownloadCoverArt));
|
||||||
|
this.retainAaxFileCbox.Text = desc(nameof(config.RetainAaxFile));
|
||||||
|
this.splitFilesByChapterCbox.Text = desc(nameof(config.SplitFilesByChapter));
|
||||||
|
this.stripAudibleBrandingCbox.Text = desc(nameof(config.StripAudibleBrandAudio));
|
||||||
|
this.stripUnabridgedCbox.Text = desc(nameof(config.StripUnabridged));
|
||||||
|
|
||||||
|
allowLibationFixupCbox.Checked = config.AllowLibationFixup;
|
||||||
|
createCueSheetCbox.Checked = config.CreateCueSheet;
|
||||||
|
downloadCoverArtCbox.Checked = config.DownloadCoverArt;
|
||||||
|
retainAaxFileCbox.Checked = config.RetainAaxFile;
|
||||||
|
splitFilesByChapterCbox.Checked = config.SplitFilesByChapter;
|
||||||
|
stripUnabridgedCbox.Checked = config.StripUnabridged;
|
||||||
|
stripAudibleBrandingCbox.Checked = config.StripAudibleBrandAudio;
|
||||||
|
convertLosslessRb.Checked = !config.DecryptToLossy;
|
||||||
|
convertLossyRb.Checked = config.DecryptToLossy;
|
||||||
|
|
||||||
|
lameTargetBitrateRb.Checked = config.LameTargetBitrate;
|
||||||
|
lameTargetQualityRb.Checked = !config.LameTargetBitrate;
|
||||||
|
lameDownsampleMonoCbox.Checked = config.LameDownsampleMono;
|
||||||
|
lameBitrateTb.Value = config.LameBitrate;
|
||||||
|
lameConstantBitrateCbox.Checked = config.LameConstantBitrate;
|
||||||
|
LameMatchSourceBRCbox.Checked = config.LameMatchSourceBR;
|
||||||
|
lameVBRQualityTb.Value = config.LameVBRQuality;
|
||||||
|
|
||||||
|
chapterTitleTemplateGb.Text = desc(nameof(config.ChapterTitleTemplate));
|
||||||
|
chapterTitleTemplateTb.Text = config.ChapterTitleTemplate;
|
||||||
|
|
||||||
|
lameTargetRb_CheckedChanged(this, EventArgs.Empty);
|
||||||
|
LameMatchSourceBRCbox_CheckedChanged(this, EventArgs.Empty);
|
||||||
|
convertFormatRb_CheckedChanged(this, EventArgs.Empty);
|
||||||
|
allowLibationFixupCbox_CheckedChanged(this, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Save_AudioSettings(Configuration config)
|
||||||
|
{
|
||||||
|
config.AllowLibationFixup = allowLibationFixupCbox.Checked;
|
||||||
|
config.CreateCueSheet = createCueSheetCbox.Checked;
|
||||||
|
config.DownloadCoverArt = downloadCoverArtCbox.Checked;
|
||||||
|
config.RetainAaxFile = retainAaxFileCbox.Checked;
|
||||||
|
config.SplitFilesByChapter = splitFilesByChapterCbox.Checked;
|
||||||
|
config.StripUnabridged = stripUnabridgedCbox.Checked;
|
||||||
|
config.StripAudibleBrandAudio = stripAudibleBrandingCbox.Checked;
|
||||||
|
config.DecryptToLossy = convertLossyRb.Checked;
|
||||||
|
|
||||||
|
config.LameTargetBitrate = lameTargetBitrateRb.Checked;
|
||||||
|
config.LameDownsampleMono = lameDownsampleMonoCbox.Checked;
|
||||||
|
config.LameBitrate = lameBitrateTb.Value;
|
||||||
|
config.LameConstantBitrate = lameConstantBitrateCbox.Checked;
|
||||||
|
config.LameMatchSourceBR = LameMatchSourceBRCbox.Checked;
|
||||||
|
config.LameVBRQuality = lameVBRQualityTb.Value;
|
||||||
|
|
||||||
|
config.ChapterTitleTemplate = chapterTitleTemplateTb.Text;
|
||||||
|
}
|
||||||
|
|
||||||
private void lameTargetRb_CheckedChanged(object sender, EventArgs e)
|
private void lameTargetRb_CheckedChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
lameBitrateGb.Enabled = lameTargetBitrateRb.Checked;
|
lameBitrateGb.Enabled = lameTargetBitrateRb.Checked;
|
||||||
@ -19,6 +75,13 @@ namespace LibationWinForms.Dialogs
|
|||||||
lameBitrateTb.Enabled = !LameMatchSourceBRCbox.Checked;
|
lameBitrateTb.Enabled = !LameMatchSourceBRCbox.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void splitFilesByChapterCbox_CheckedChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
chapterTitleTemplateGb.Enabled = splitFilesByChapterCbox.Checked;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void chapterTitleTemplateBtn_Click(object sender, EventArgs e) => editTemplate(Templates.ChapterTitle, chapterTitleTemplateTb);
|
||||||
|
|
||||||
private void convertFormatRb_CheckedChanged(object sender, EventArgs e)
|
private void convertFormatRb_CheckedChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
lameTargetRb_CheckedChanged(sender, e);
|
lameTargetRb_CheckedChanged(sender, e);
|
||||||
|
|||||||
@ -52,6 +52,7 @@
|
|||||||
this.tabControl = new System.Windows.Forms.TabControl();
|
this.tabControl = new System.Windows.Forms.TabControl();
|
||||||
this.tab1ImportantSettings = new System.Windows.Forms.TabPage();
|
this.tab1ImportantSettings = new System.Windows.Forms.TabPage();
|
||||||
this.booksGb = new System.Windows.Forms.GroupBox();
|
this.booksGb = new System.Windows.Forms.GroupBox();
|
||||||
|
this.saveEpisodesToSeriesFolderCbox = new System.Windows.Forms.CheckBox();
|
||||||
this.tab2ImportLibrary = new System.Windows.Forms.TabPage();
|
this.tab2ImportLibrary = new System.Windows.Forms.TabPage();
|
||||||
this.autoDownloadEpisodesCb = new System.Windows.Forms.CheckBox();
|
this.autoDownloadEpisodesCb = new System.Windows.Forms.CheckBox();
|
||||||
this.autoScanCb = new System.Windows.Forms.CheckBox();
|
this.autoScanCb = new System.Windows.Forms.CheckBox();
|
||||||
@ -69,6 +70,9 @@
|
|||||||
this.folderTemplateTb = new System.Windows.Forms.TextBox();
|
this.folderTemplateTb = new System.Windows.Forms.TextBox();
|
||||||
this.folderTemplateLbl = new System.Windows.Forms.Label();
|
this.folderTemplateLbl = new System.Windows.Forms.Label();
|
||||||
this.tab4AudioFileOptions = new System.Windows.Forms.TabPage();
|
this.tab4AudioFileOptions = new System.Windows.Forms.TabPage();
|
||||||
|
this.chapterTitleTemplateGb = new System.Windows.Forms.GroupBox();
|
||||||
|
this.chapterTitleTemplateBtn = new System.Windows.Forms.Button();
|
||||||
|
this.chapterTitleTemplateTb = new System.Windows.Forms.TextBox();
|
||||||
this.lameOptionsGb = new System.Windows.Forms.GroupBox();
|
this.lameOptionsGb = new System.Windows.Forms.GroupBox();
|
||||||
this.lameDownsampleMonoCbox = new System.Windows.Forms.CheckBox();
|
this.lameDownsampleMonoCbox = new System.Windows.Forms.CheckBox();
|
||||||
this.lameBitrateGb = new System.Windows.Forms.GroupBox();
|
this.lameBitrateGb = new System.Windows.Forms.GroupBox();
|
||||||
@ -103,7 +107,6 @@
|
|||||||
this.retainAaxFileCbox = new System.Windows.Forms.CheckBox();
|
this.retainAaxFileCbox = new System.Windows.Forms.CheckBox();
|
||||||
this.downloadCoverArtCbox = new System.Windows.Forms.CheckBox();
|
this.downloadCoverArtCbox = new System.Windows.Forms.CheckBox();
|
||||||
this.createCueSheetCbox = new System.Windows.Forms.CheckBox();
|
this.createCueSheetCbox = new System.Windows.Forms.CheckBox();
|
||||||
this.saveEpisodesToSeriesFolderCbox = new System.Windows.Forms.CheckBox();
|
|
||||||
this.badBookGb.SuspendLayout();
|
this.badBookGb.SuspendLayout();
|
||||||
this.tabControl.SuspendLayout();
|
this.tabControl.SuspendLayout();
|
||||||
this.tab1ImportantSettings.SuspendLayout();
|
this.tab1ImportantSettings.SuspendLayout();
|
||||||
@ -113,6 +116,7 @@
|
|||||||
this.inProgressFilesGb.SuspendLayout();
|
this.inProgressFilesGb.SuspendLayout();
|
||||||
this.customFileNamingGb.SuspendLayout();
|
this.customFileNamingGb.SuspendLayout();
|
||||||
this.tab4AudioFileOptions.SuspendLayout();
|
this.tab4AudioFileOptions.SuspendLayout();
|
||||||
|
this.chapterTitleTemplateGb.SuspendLayout();
|
||||||
this.lameOptionsGb.SuspendLayout();
|
this.lameOptionsGb.SuspendLayout();
|
||||||
this.lameBitrateGb.SuspendLayout();
|
this.lameBitrateGb.SuspendLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.lameBitrateTb)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.lameBitrateTb)).BeginInit();
|
||||||
@ -262,6 +266,7 @@
|
|||||||
this.splitFilesByChapterCbox.TabIndex = 13;
|
this.splitFilesByChapterCbox.TabIndex = 13;
|
||||||
this.splitFilesByChapterCbox.Text = "[SplitFilesByChapter desc]";
|
this.splitFilesByChapterCbox.Text = "[SplitFilesByChapter desc]";
|
||||||
this.splitFilesByChapterCbox.UseVisualStyleBackColor = true;
|
this.splitFilesByChapterCbox.UseVisualStyleBackColor = true;
|
||||||
|
this.splitFilesByChapterCbox.CheckedChanged += new System.EventHandler(this.splitFilesByChapterCbox_CheckedChanged);
|
||||||
//
|
//
|
||||||
// allowLibationFixupCbox
|
// allowLibationFixupCbox
|
||||||
//
|
//
|
||||||
@ -391,6 +396,16 @@
|
|||||||
this.booksGb.TabStop = false;
|
this.booksGb.TabStop = false;
|
||||||
this.booksGb.Text = "Books location";
|
this.booksGb.Text = "Books location";
|
||||||
//
|
//
|
||||||
|
// saveEpisodesToSeriesFolderCbox
|
||||||
|
//
|
||||||
|
this.saveEpisodesToSeriesFolderCbox.AutoSize = true;
|
||||||
|
this.saveEpisodesToSeriesFolderCbox.Location = new System.Drawing.Point(7, 131);
|
||||||
|
this.saveEpisodesToSeriesFolderCbox.Name = "saveEpisodesToSeriesFolderCbox";
|
||||||
|
this.saveEpisodesToSeriesFolderCbox.Size = new System.Drawing.Size(191, 19);
|
||||||
|
this.saveEpisodesToSeriesFolderCbox.TabIndex = 3;
|
||||||
|
this.saveEpisodesToSeriesFolderCbox.Text = "[Save Episodes To Series Folder]";
|
||||||
|
this.saveEpisodesToSeriesFolderCbox.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
// tab2ImportLibrary
|
// tab2ImportLibrary
|
||||||
//
|
//
|
||||||
this.tab2ImportLibrary.Controls.Add(this.autoDownloadEpisodesCb);
|
this.tab2ImportLibrary.Controls.Add(this.autoDownloadEpisodesCb);
|
||||||
@ -508,9 +523,9 @@
|
|||||||
this.chapterFileTemplateLbl.AutoSize = true;
|
this.chapterFileTemplateLbl.AutoSize = true;
|
||||||
this.chapterFileTemplateLbl.Location = new System.Drawing.Point(6, 107);
|
this.chapterFileTemplateLbl.Location = new System.Drawing.Point(6, 107);
|
||||||
this.chapterFileTemplateLbl.Name = "chapterFileTemplateLbl";
|
this.chapterFileTemplateLbl.Name = "chapterFileTemplateLbl";
|
||||||
this.chapterFileTemplateLbl.Size = new System.Drawing.Size(123, 15);
|
this.chapterFileTemplateLbl.Size = new System.Drawing.Size(132, 15);
|
||||||
this.chapterFileTemplateLbl.TabIndex = 6;
|
this.chapterFileTemplateLbl.TabIndex = 6;
|
||||||
this.chapterFileTemplateLbl.Text = "[folder template desc]";
|
this.chapterFileTemplateLbl.Text = "[chapter template desc]";
|
||||||
//
|
//
|
||||||
// fileTemplateBtn
|
// fileTemplateBtn
|
||||||
//
|
//
|
||||||
@ -538,9 +553,9 @@
|
|||||||
this.fileTemplateLbl.AutoSize = true;
|
this.fileTemplateLbl.AutoSize = true;
|
||||||
this.fileTemplateLbl.Location = new System.Drawing.Point(6, 63);
|
this.fileTemplateLbl.Location = new System.Drawing.Point(6, 63);
|
||||||
this.fileTemplateLbl.Name = "fileTemplateLbl";
|
this.fileTemplateLbl.Name = "fileTemplateLbl";
|
||||||
this.fileTemplateLbl.Size = new System.Drawing.Size(123, 15);
|
this.fileTemplateLbl.Size = new System.Drawing.Size(108, 15);
|
||||||
this.fileTemplateLbl.TabIndex = 3;
|
this.fileTemplateLbl.TabIndex = 3;
|
||||||
this.fileTemplateLbl.Text = "[folder template desc]";
|
this.fileTemplateLbl.Text = "[file template desc]";
|
||||||
//
|
//
|
||||||
// folderTemplateBtn
|
// folderTemplateBtn
|
||||||
//
|
//
|
||||||
@ -574,6 +589,7 @@
|
|||||||
//
|
//
|
||||||
// tab4AudioFileOptions
|
// tab4AudioFileOptions
|
||||||
//
|
//
|
||||||
|
this.tab4AudioFileOptions.Controls.Add(this.chapterTitleTemplateGb);
|
||||||
this.tab4AudioFileOptions.Controls.Add(this.lameOptionsGb);
|
this.tab4AudioFileOptions.Controls.Add(this.lameOptionsGb);
|
||||||
this.tab4AudioFileOptions.Controls.Add(this.convertLossyRb);
|
this.tab4AudioFileOptions.Controls.Add(this.convertLossyRb);
|
||||||
this.tab4AudioFileOptions.Controls.Add(this.stripAudibleBrandingCbox);
|
this.tab4AudioFileOptions.Controls.Add(this.stripAudibleBrandingCbox);
|
||||||
@ -592,6 +608,38 @@
|
|||||||
this.tab4AudioFileOptions.Text = "Audio File Options";
|
this.tab4AudioFileOptions.Text = "Audio File Options";
|
||||||
this.tab4AudioFileOptions.UseVisualStyleBackColor = true;
|
this.tab4AudioFileOptions.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
|
// chapterTitleTemplateGb
|
||||||
|
//
|
||||||
|
this.chapterTitleTemplateGb.Controls.Add(this.chapterTitleTemplateBtn);
|
||||||
|
this.chapterTitleTemplateGb.Controls.Add(this.chapterTitleTemplateTb);
|
||||||
|
this.chapterTitleTemplateGb.Location = new System.Drawing.Point(6, 335);
|
||||||
|
this.chapterTitleTemplateGb.Name = "chapterTitleTemplateGb";
|
||||||
|
this.chapterTitleTemplateGb.Size = new System.Drawing.Size(842, 54);
|
||||||
|
this.chapterTitleTemplateGb.TabIndex = 18;
|
||||||
|
this.chapterTitleTemplateGb.TabStop = false;
|
||||||
|
this.chapterTitleTemplateGb.Text = "[chapter title template desc]";
|
||||||
|
//
|
||||||
|
// chapterTitleTemplateBtn
|
||||||
|
//
|
||||||
|
this.chapterTitleTemplateBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.chapterTitleTemplateBtn.Location = new System.Drawing.Point(764, 22);
|
||||||
|
this.chapterTitleTemplateBtn.Name = "chapterTitleTemplateBtn";
|
||||||
|
this.chapterTitleTemplateBtn.Size = new System.Drawing.Size(75, 23);
|
||||||
|
this.chapterTitleTemplateBtn.TabIndex = 17;
|
||||||
|
this.chapterTitleTemplateBtn.Text = "Edit...";
|
||||||
|
this.chapterTitleTemplateBtn.UseVisualStyleBackColor = true;
|
||||||
|
this.chapterTitleTemplateBtn.Click += new System.EventHandler(this.chapterTitleTemplateBtn_Click);
|
||||||
|
//
|
||||||
|
// chapterTitleTemplateTb
|
||||||
|
//
|
||||||
|
this.chapterTitleTemplateTb.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.chapterTitleTemplateTb.Location = new System.Drawing.Point(6, 22);
|
||||||
|
this.chapterTitleTemplateTb.Name = "chapterTitleTemplateTb";
|
||||||
|
this.chapterTitleTemplateTb.ReadOnly = true;
|
||||||
|
this.chapterTitleTemplateTb.Size = new System.Drawing.Size(752, 23);
|
||||||
|
this.chapterTitleTemplateTb.TabIndex = 16;
|
||||||
|
//
|
||||||
// lameOptionsGb
|
// lameOptionsGb
|
||||||
//
|
//
|
||||||
this.lameOptionsGb.Controls.Add(this.lameDownsampleMonoCbox);
|
this.lameOptionsGb.Controls.Add(this.lameDownsampleMonoCbox);
|
||||||
@ -599,9 +647,9 @@
|
|||||||
this.lameOptionsGb.Controls.Add(this.label1);
|
this.lameOptionsGb.Controls.Add(this.label1);
|
||||||
this.lameOptionsGb.Controls.Add(this.lameQualityGb);
|
this.lameOptionsGb.Controls.Add(this.lameQualityGb);
|
||||||
this.lameOptionsGb.Controls.Add(this.groupBox2);
|
this.lameOptionsGb.Controls.Add(this.groupBox2);
|
||||||
this.lameOptionsGb.Location = new System.Drawing.Point(415, 18);
|
this.lameOptionsGb.Location = new System.Drawing.Point(415, 6);
|
||||||
this.lameOptionsGb.Name = "lameOptionsGb";
|
this.lameOptionsGb.Name = "lameOptionsGb";
|
||||||
this.lameOptionsGb.Size = new System.Drawing.Size(433, 371);
|
this.lameOptionsGb.Size = new System.Drawing.Size(433, 323);
|
||||||
this.lameOptionsGb.TabIndex = 14;
|
this.lameOptionsGb.TabIndex = 14;
|
||||||
this.lameOptionsGb.TabStop = false;
|
this.lameOptionsGb.TabStop = false;
|
||||||
this.lameOptionsGb.Text = "Mp3 Encoding Options";
|
this.lameOptionsGb.Text = "Mp3 Encoding Options";
|
||||||
@ -629,7 +677,7 @@
|
|||||||
this.lameBitrateGb.Controls.Add(this.lameBitrateTb);
|
this.lameBitrateGb.Controls.Add(this.lameBitrateTb);
|
||||||
this.lameBitrateGb.Location = new System.Drawing.Point(6, 84);
|
this.lameBitrateGb.Location = new System.Drawing.Point(6, 84);
|
||||||
this.lameBitrateGb.Name = "lameBitrateGb";
|
this.lameBitrateGb.Name = "lameBitrateGb";
|
||||||
this.lameBitrateGb.Size = new System.Drawing.Size(421, 112);
|
this.lameBitrateGb.Size = new System.Drawing.Size(421, 101);
|
||||||
this.lameBitrateGb.TabIndex = 0;
|
this.lameBitrateGb.TabIndex = 0;
|
||||||
this.lameBitrateGb.TabStop = false;
|
this.lameBitrateGb.TabStop = false;
|
||||||
this.lameBitrateGb.Text = "Bitrate";
|
this.lameBitrateGb.Text = "Bitrate";
|
||||||
@ -637,7 +685,7 @@
|
|||||||
// LameMatchSourceBRCbox
|
// LameMatchSourceBRCbox
|
||||||
//
|
//
|
||||||
this.LameMatchSourceBRCbox.AutoSize = true;
|
this.LameMatchSourceBRCbox.AutoSize = true;
|
||||||
this.LameMatchSourceBRCbox.Location = new System.Drawing.Point(260, 87);
|
this.LameMatchSourceBRCbox.Location = new System.Drawing.Point(260, 77);
|
||||||
this.LameMatchSourceBRCbox.Name = "LameMatchSourceBRCbox";
|
this.LameMatchSourceBRCbox.Name = "LameMatchSourceBRCbox";
|
||||||
this.LameMatchSourceBRCbox.Size = new System.Drawing.Size(140, 19);
|
this.LameMatchSourceBRCbox.Size = new System.Drawing.Size(140, 19);
|
||||||
this.LameMatchSourceBRCbox.TabIndex = 3;
|
this.LameMatchSourceBRCbox.TabIndex = 3;
|
||||||
@ -648,7 +696,7 @@
|
|||||||
// lameConstantBitrateCbox
|
// lameConstantBitrateCbox
|
||||||
//
|
//
|
||||||
this.lameConstantBitrateCbox.AutoSize = true;
|
this.lameConstantBitrateCbox.AutoSize = true;
|
||||||
this.lameConstantBitrateCbox.Location = new System.Drawing.Point(6, 87);
|
this.lameConstantBitrateCbox.Location = new System.Drawing.Point(6, 77);
|
||||||
this.lameConstantBitrateCbox.Name = "lameConstantBitrateCbox";
|
this.lameConstantBitrateCbox.Name = "lameConstantBitrateCbox";
|
||||||
this.lameConstantBitrateCbox.Size = new System.Drawing.Size(216, 19);
|
this.lameConstantBitrateCbox.Size = new System.Drawing.Size(216, 19);
|
||||||
this.lameConstantBitrateCbox.TabIndex = 2;
|
this.lameConstantBitrateCbox.TabIndex = 2;
|
||||||
@ -734,7 +782,7 @@
|
|||||||
this.label1.AutoSize = true;
|
this.label1.AutoSize = true;
|
||||||
this.label1.Enabled = false;
|
this.label1.Enabled = false;
|
||||||
this.label1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point);
|
this.label1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point);
|
||||||
this.label1.Location = new System.Drawing.Point(6, 353);
|
this.label1.Location = new System.Drawing.Point(6, 298);
|
||||||
this.label1.Name = "label1";
|
this.label1.Name = "label1";
|
||||||
this.label1.Size = new System.Drawing.Size(172, 15);
|
this.label1.Size = new System.Drawing.Size(172, 15);
|
||||||
this.label1.TabIndex = 1;
|
this.label1.TabIndex = 1;
|
||||||
@ -755,7 +803,7 @@
|
|||||||
this.lameQualityGb.Controls.Add(this.label14);
|
this.lameQualityGb.Controls.Add(this.label14);
|
||||||
this.lameQualityGb.Controls.Add(this.label2);
|
this.lameQualityGb.Controls.Add(this.label2);
|
||||||
this.lameQualityGb.Controls.Add(this.lameVBRQualityTb);
|
this.lameQualityGb.Controls.Add(this.lameVBRQualityTb);
|
||||||
this.lameQualityGb.Location = new System.Drawing.Point(6, 202);
|
this.lameQualityGb.Location = new System.Drawing.Point(6, 186);
|
||||||
this.lameQualityGb.Name = "lameQualityGb";
|
this.lameQualityGb.Name = "lameQualityGb";
|
||||||
this.lameQualityGb.Size = new System.Drawing.Size(421, 109);
|
this.lameQualityGb.Size = new System.Drawing.Size(421, 109);
|
||||||
this.lameQualityGb.TabIndex = 0;
|
this.lameQualityGb.TabIndex = 0;
|
||||||
@ -963,16 +1011,6 @@
|
|||||||
this.createCueSheetCbox.UseVisualStyleBackColor = true;
|
this.createCueSheetCbox.UseVisualStyleBackColor = true;
|
||||||
this.createCueSheetCbox.CheckedChanged += new System.EventHandler(this.allowLibationFixupCbox_CheckedChanged);
|
this.createCueSheetCbox.CheckedChanged += new System.EventHandler(this.allowLibationFixupCbox_CheckedChanged);
|
||||||
//
|
//
|
||||||
// saveEpisodesToSeriesFolderCbox
|
|
||||||
//
|
|
||||||
this.saveEpisodesToSeriesFolderCbox.AutoSize = true;
|
|
||||||
this.saveEpisodesToSeriesFolderCbox.Location = new System.Drawing.Point(7, 131);
|
|
||||||
this.saveEpisodesToSeriesFolderCbox.Name = "saveEpisodesToSeriesFolderCbox";
|
|
||||||
this.saveEpisodesToSeriesFolderCbox.Size = new System.Drawing.Size(191, 19);
|
|
||||||
this.saveEpisodesToSeriesFolderCbox.TabIndex = 3;
|
|
||||||
this.saveEpisodesToSeriesFolderCbox.Text = "[Save Episodes To Series Folder]";
|
|
||||||
this.saveEpisodesToSeriesFolderCbox.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// SettingsDialog
|
// SettingsDialog
|
||||||
//
|
//
|
||||||
this.AcceptButton = this.saveBtn;
|
this.AcceptButton = this.saveBtn;
|
||||||
@ -1007,6 +1045,8 @@
|
|||||||
this.customFileNamingGb.PerformLayout();
|
this.customFileNamingGb.PerformLayout();
|
||||||
this.tab4AudioFileOptions.ResumeLayout(false);
|
this.tab4AudioFileOptions.ResumeLayout(false);
|
||||||
this.tab4AudioFileOptions.PerformLayout();
|
this.tab4AudioFileOptions.PerformLayout();
|
||||||
|
this.chapterTitleTemplateGb.ResumeLayout(false);
|
||||||
|
this.chapterTitleTemplateGb.PerformLayout();
|
||||||
this.lameOptionsGb.ResumeLayout(false);
|
this.lameOptionsGb.ResumeLayout(false);
|
||||||
this.lameOptionsGb.PerformLayout();
|
this.lameOptionsGb.PerformLayout();
|
||||||
this.lameBitrateGb.ResumeLayout(false);
|
this.lameBitrateGb.ResumeLayout(false);
|
||||||
@ -1098,5 +1138,8 @@
|
|||||||
private System.Windows.Forms.CheckBox downloadCoverArtCbox;
|
private System.Windows.Forms.CheckBox downloadCoverArtCbox;
|
||||||
private System.Windows.Forms.CheckBox autoDownloadEpisodesCb;
|
private System.Windows.Forms.CheckBox autoDownloadEpisodesCb;
|
||||||
private System.Windows.Forms.CheckBox saveEpisodesToSeriesFolderCbox;
|
private System.Windows.Forms.CheckBox saveEpisodesToSeriesFolderCbox;
|
||||||
|
private System.Windows.Forms.GroupBox chapterTitleTemplateGb;
|
||||||
|
private System.Windows.Forms.Button chapterTitleTemplateBtn;
|
||||||
|
private System.Windows.Forms.TextBox chapterTitleTemplateTb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,67 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using Dinah.Core;
|
||||||
|
using LibationFileManager;
|
||||||
|
|
||||||
|
namespace LibationWinForms.Dialogs
|
||||||
|
{
|
||||||
|
public partial class SettingsDialog
|
||||||
|
{
|
||||||
|
private void folderTemplateBtn_Click(object sender, EventArgs e) => editTemplate(Templates.Folder, folderTemplateTb);
|
||||||
|
private void fileTemplateBtn_Click(object sender, EventArgs e) => editTemplate(Templates.File, fileTemplateTb);
|
||||||
|
private void chapterFileTemplateBtn_Click(object sender, EventArgs e) => editTemplate(Templates.ChapterFile, chapterFileTemplateTb);
|
||||||
|
|
||||||
|
private void Load_DownloadDecrypt(Configuration config)
|
||||||
|
{
|
||||||
|
inProgressDescLbl.Text = desc(nameof(config.InProgress));
|
||||||
|
badBookGb.Text = desc(nameof(config.BadBook));
|
||||||
|
badBookAskRb.Text = Configuration.BadBookAction.Ask.GetDescription();
|
||||||
|
badBookAbortRb.Text = Configuration.BadBookAction.Abort.GetDescription();
|
||||||
|
badBookRetryRb.Text = Configuration.BadBookAction.Retry.GetDescription();
|
||||||
|
badBookIgnoreRb.Text = Configuration.BadBookAction.Ignore.GetDescription();
|
||||||
|
|
||||||
|
inProgressSelectControl.SetDirectoryItems(new()
|
||||||
|
{
|
||||||
|
Configuration.KnownDirectories.WinTemp,
|
||||||
|
Configuration.KnownDirectories.UserProfile,
|
||||||
|
Configuration.KnownDirectories.AppDir,
|
||||||
|
Configuration.KnownDirectories.MyDocs,
|
||||||
|
Configuration.KnownDirectories.LibationFiles
|
||||||
|
}, Configuration.KnownDirectories.WinTemp);
|
||||||
|
inProgressSelectControl.SelectDirectory(config.InProgress);
|
||||||
|
|
||||||
|
var rb = config.BadBook switch
|
||||||
|
{
|
||||||
|
Configuration.BadBookAction.Ask => this.badBookAskRb,
|
||||||
|
Configuration.BadBookAction.Abort => this.badBookAbortRb,
|
||||||
|
Configuration.BadBookAction.Retry => this.badBookRetryRb,
|
||||||
|
Configuration.BadBookAction.Ignore => this.badBookIgnoreRb,
|
||||||
|
_ => this.badBookAskRb
|
||||||
|
};
|
||||||
|
rb.Checked = true;
|
||||||
|
|
||||||
|
folderTemplateLbl.Text = desc(nameof(config.FolderTemplate));
|
||||||
|
fileTemplateLbl.Text = desc(nameof(config.FileTemplate));
|
||||||
|
chapterFileTemplateLbl.Text = desc(nameof(config.ChapterFileTemplate));
|
||||||
|
folderTemplateTb.Text = config.FolderTemplate;
|
||||||
|
fileTemplateTb.Text = config.FileTemplate;
|
||||||
|
chapterFileTemplateTb.Text = config.ChapterFileTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Save_DownloadDecrypt(Configuration config)
|
||||||
|
{
|
||||||
|
config.InProgress = inProgressSelectControl.SelectedDirectory;
|
||||||
|
|
||||||
|
config.BadBook
|
||||||
|
= badBookAskRb.Checked ? Configuration.BadBookAction.Ask
|
||||||
|
: badBookAbortRb.Checked ? Configuration.BadBookAction.Abort
|
||||||
|
: badBookRetryRb.Checked ? Configuration.BadBookAction.Retry
|
||||||
|
: badBookIgnoreRb.Checked ? Configuration.BadBookAction.Ignore
|
||||||
|
: Configuration.BadBookAction.Ask;
|
||||||
|
|
||||||
|
config.FolderTemplate = folderTemplateTb.Text;
|
||||||
|
config.FileTemplate = fileTemplateTb.Text;
|
||||||
|
config.ChapterFileTemplate = chapterFileTemplateTb.Text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
using LibationFileManager;
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace LibationWinForms.Dialogs
|
||||||
|
{
|
||||||
|
public partial class SettingsDialog
|
||||||
|
{
|
||||||
|
private void Load_ImportLibrary(Configuration config)
|
||||||
|
{
|
||||||
|
this.autoScanCb.Text = desc(nameof(config.AutoScan));
|
||||||
|
this.showImportedStatsCb.Text = desc(nameof(config.ShowImportedStats));
|
||||||
|
this.importEpisodesCb.Text = desc(nameof(config.ImportEpisodes));
|
||||||
|
this.downloadEpisodesCb.Text = desc(nameof(config.DownloadEpisodes));
|
||||||
|
this.autoDownloadEpisodesCb.Text = desc(nameof(config.AutoDownloadEpisodes));
|
||||||
|
|
||||||
|
autoScanCb.Checked = config.AutoScan;
|
||||||
|
showImportedStatsCb.Checked = config.ShowImportedStats;
|
||||||
|
importEpisodesCb.Checked = config.ImportEpisodes;
|
||||||
|
downloadEpisodesCb.Checked = config.DownloadEpisodes;
|
||||||
|
autoDownloadEpisodesCb.Checked = config.AutoDownloadEpisodes;
|
||||||
|
}
|
||||||
|
private void Save_ImportLibrary(Configuration config)
|
||||||
|
{
|
||||||
|
config.AutoScan = autoScanCb.Checked;
|
||||||
|
config.ShowImportedStats = showImportedStatsCb.Checked;
|
||||||
|
config.ImportEpisodes = importEpisodesCb.Checked;
|
||||||
|
config.DownloadEpisodes = downloadEpisodesCb.Checked;
|
||||||
|
config.AutoDownloadEpisodes = autoDownloadEpisodesCb.Checked;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
98
Source/LibationWinForms/Dialogs/SettingsDialog.Important.cs
Normal file
98
Source/LibationWinForms/Dialogs/SettingsDialog.Important.cs
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
using Dinah.Core;
|
||||||
|
using FileManager;
|
||||||
|
using LibationFileManager;
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace LibationWinForms.Dialogs
|
||||||
|
{
|
||||||
|
public partial class SettingsDialog
|
||||||
|
{
|
||||||
|
private void logsBtn_Click(object sender, EventArgs e) => Go.To.Folder(((LongPath)Configuration.Instance.LibationFiles).ShortPathName);
|
||||||
|
|
||||||
|
private void Load_Important(Configuration config)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
loggingLevelCb.Items.Clear();
|
||||||
|
foreach (var level in Enum<Serilog.Events.LogEventLevel>.GetValues())
|
||||||
|
loggingLevelCb.Items.Add(level);
|
||||||
|
loggingLevelCb.SelectedItem = config.LogLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
booksLocationDescLbl.Text = desc(nameof(config.Books));
|
||||||
|
this.saveEpisodesToSeriesFolderCbox.Text = desc(nameof(config.SavePodcastsToParentFolder));
|
||||||
|
|
||||||
|
booksSelectControl.SetSearchTitle("books location");
|
||||||
|
booksSelectControl.SetDirectoryItems(
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Configuration.KnownDirectories.UserProfile,
|
||||||
|
Configuration.KnownDirectories.AppDir,
|
||||||
|
Configuration.KnownDirectories.MyDocs
|
||||||
|
},
|
||||||
|
Configuration.KnownDirectories.UserProfile,
|
||||||
|
"Books");
|
||||||
|
booksSelectControl.SelectDirectory(config.Books);
|
||||||
|
|
||||||
|
saveEpisodesToSeriesFolderCbox.Checked = config.SavePodcastsToParentFolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Save_Important(Configuration config)
|
||||||
|
{
|
||||||
|
var newBooks = booksSelectControl.SelectedDirectory;
|
||||||
|
|
||||||
|
#region validation
|
||||||
|
static void validationError(string text, string caption)
|
||||||
|
=> MessageBox.Show(text, caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
if (string.IsNullOrWhiteSpace(newBooks))
|
||||||
|
{
|
||||||
|
validationError("Cannot set Books Location to blank", "Location is blank");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Directory.Exists(newBooks) && booksSelectControl.SelectedDirectoryIsCustom)
|
||||||
|
{
|
||||||
|
validationError($"Not saving change to Books location. This folder does not exist:\r\n{newBooks}", "Folder does not exist");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// these 3 should do nothing. Configuration will only init these with a valid value. EditTemplateDialog ensures valid before returning
|
||||||
|
if (!Templates.Folder.IsValid(folderTemplateTb.Text))
|
||||||
|
{
|
||||||
|
validationError($"Not saving change to folder naming template. Invalid format.", "Invalid folder template");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!Templates.File.IsValid(fileTemplateTb.Text))
|
||||||
|
{
|
||||||
|
validationError($"Not saving change to file naming template. Invalid format.", "Invalid file template");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!Templates.ChapterFile.IsValid(chapterFileTemplateTb.Text))
|
||||||
|
{
|
||||||
|
validationError($"Not saving change to chapter file naming template. Invalid format.", "Invalid chapter file template");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
if (!Directory.Exists(newBooks) && booksSelectControl.SelectedDirectoryIsKnown)
|
||||||
|
Directory.CreateDirectory(newBooks);
|
||||||
|
|
||||||
|
config.Books = newBooks;
|
||||||
|
|
||||||
|
{
|
||||||
|
var logLevelOld = config.LogLevel;
|
||||||
|
var logLevelNew = (Serilog.Events.LogEventLevel)loggingLevelCb.SelectedItem;
|
||||||
|
|
||||||
|
config.LogLevel = logLevelNew;
|
||||||
|
|
||||||
|
// only warn if changed during this time. don't want to warn every time user happens to change settings while level is verbose
|
||||||
|
if (logLevelOld != logLevelNew)
|
||||||
|
MessageBoxLib.VerboseLoggingWarning_ShowIfTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
config.SavePodcastsToParentFolder = saveEpisodesToSeriesFolderCbox.Checked;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,10 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.IO;
|
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Dinah.Core;
|
|
||||||
using LibationFileManager;
|
using LibationFileManager;
|
||||||
using FileManager;
|
|
||||||
|
|
||||||
namespace LibationWinForms.Dialogs
|
namespace LibationWinForms.Dialogs
|
||||||
{
|
{
|
||||||
@ -24,111 +21,12 @@ namespace LibationWinForms.Dialogs
|
|||||||
if (this.DesignMode)
|
if (this.DesignMode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
{
|
Load_Important(config);
|
||||||
loggingLevelCb.Items.Clear();
|
Load_ImportLibrary(config);
|
||||||
foreach (var level in Enum<Serilog.Events.LogEventLevel>.GetValues())
|
Load_DownloadDecrypt(config);
|
||||||
loggingLevelCb.Items.Add(level);
|
Load_AudioSettings(config);
|
||||||
loggingLevelCb.SelectedItem = config.LogLevel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.autoScanCb.Text = desc(nameof(config.AutoScan));
|
|
||||||
this.showImportedStatsCb.Text = desc(nameof(config.ShowImportedStats));
|
|
||||||
this.importEpisodesCb.Text = desc(nameof(config.ImportEpisodes));
|
|
||||||
this.downloadEpisodesCb.Text = desc(nameof(config.DownloadEpisodes));
|
|
||||||
this.autoDownloadEpisodesCb.Text = desc(nameof(config.AutoDownloadEpisodes));
|
|
||||||
|
|
||||||
this.booksLocationDescLbl.Text = desc(nameof(config.Books));
|
|
||||||
this.inProgressDescLbl.Text = desc(nameof(config.InProgress));
|
|
||||||
this.allowLibationFixupCbox.Text = desc(nameof(config.AllowLibationFixup));
|
|
||||||
this.splitFilesByChapterCbox.Text = desc(nameof(config.SplitFilesByChapter));
|
|
||||||
this.stripAudibleBrandingCbox.Text = desc(nameof(config.StripAudibleBrandAudio));
|
|
||||||
this.retainAaxFileCbox.Text = desc(nameof(config.RetainAaxFile));
|
|
||||||
this.stripUnabridgedCbox.Text = desc(nameof(config.StripUnabridged));
|
|
||||||
this.createCueSheetCbox.Text = desc(nameof(config.CreateCueSheet));
|
|
||||||
this.downloadCoverArtCbox.Text = desc(nameof(config.DownloadCoverArt));
|
|
||||||
this.saveEpisodesToSeriesFolderCbox.Text = desc(nameof(config.SavePodcastsToParentFolder));
|
|
||||||
|
|
||||||
booksSelectControl.SetSearchTitle("books location");
|
|
||||||
booksSelectControl.SetDirectoryItems(
|
|
||||||
new()
|
|
||||||
{
|
|
||||||
Configuration.KnownDirectories.UserProfile,
|
|
||||||
Configuration.KnownDirectories.AppDir,
|
|
||||||
Configuration.KnownDirectories.MyDocs
|
|
||||||
},
|
|
||||||
Configuration.KnownDirectories.UserProfile,
|
|
||||||
"Books");
|
|
||||||
booksSelectControl.SelectDirectory(config.Books);
|
|
||||||
|
|
||||||
saveEpisodesToSeriesFolderCbox.Checked = config.SavePodcastsToParentFolder;
|
|
||||||
|
|
||||||
allowLibationFixupCbox.Checked = config.AllowLibationFixup;
|
|
||||||
createCueSheetCbox.Checked = config.CreateCueSheet;
|
|
||||||
retainAaxFileCbox.Checked = config.RetainAaxFile;
|
|
||||||
splitFilesByChapterCbox.Checked = config.SplitFilesByChapter;
|
|
||||||
stripUnabridgedCbox.Checked = config.StripUnabridged;
|
|
||||||
stripAudibleBrandingCbox.Checked = config.StripAudibleBrandAudio;
|
|
||||||
convertLosslessRb.Checked = !config.DecryptToLossy;
|
|
||||||
convertLossyRb.Checked = config.DecryptToLossy;
|
|
||||||
|
|
||||||
lameTargetBitrateRb.Checked = config.LameTargetBitrate;
|
|
||||||
lameTargetQualityRb.Checked = !config.LameTargetBitrate;
|
|
||||||
lameDownsampleMonoCbox.Checked = config.LameDownsampleMono;
|
|
||||||
lameBitrateTb.Value = config.LameBitrate;
|
|
||||||
lameConstantBitrateCbox.Checked = config.LameConstantBitrate;
|
|
||||||
LameMatchSourceBRCbox.Checked = config.LameMatchSourceBR;
|
|
||||||
lameVBRQualityTb.Value = config.LameVBRQuality;
|
|
||||||
downloadCoverArtCbox.Checked = config.DownloadCoverArt;
|
|
||||||
|
|
||||||
autoScanCb.Checked = config.AutoScan;
|
|
||||||
showImportedStatsCb.Checked = config.ShowImportedStats;
|
|
||||||
importEpisodesCb.Checked = config.ImportEpisodes;
|
|
||||||
downloadEpisodesCb.Checked = config.DownloadEpisodes;
|
|
||||||
autoDownloadEpisodesCb.Checked = config.AutoDownloadEpisodes;
|
|
||||||
|
|
||||||
lameTargetRb_CheckedChanged(this, e);
|
|
||||||
LameMatchSourceBRCbox_CheckedChanged(this, e);
|
|
||||||
convertFormatRb_CheckedChanged(this, e);
|
|
||||||
allowLibationFixupCbox_CheckedChanged(this, e);
|
|
||||||
|
|
||||||
inProgressSelectControl.SetDirectoryItems(new()
|
|
||||||
{
|
|
||||||
Configuration.KnownDirectories.WinTemp,
|
|
||||||
Configuration.KnownDirectories.UserProfile,
|
|
||||||
Configuration.KnownDirectories.AppDir,
|
|
||||||
Configuration.KnownDirectories.MyDocs,
|
|
||||||
Configuration.KnownDirectories.LibationFiles
|
|
||||||
}, Configuration.KnownDirectories.WinTemp);
|
|
||||||
inProgressSelectControl.SelectDirectory(config.InProgress);
|
|
||||||
|
|
||||||
badBookGb.Text = desc(nameof(config.BadBook));
|
|
||||||
badBookAskRb.Text = Configuration.BadBookAction.Ask.GetDescription();
|
|
||||||
badBookAbortRb.Text = Configuration.BadBookAction.Abort.GetDescription();
|
|
||||||
badBookRetryRb.Text = Configuration.BadBookAction.Retry.GetDescription();
|
|
||||||
badBookIgnoreRb.Text = Configuration.BadBookAction.Ignore.GetDescription();
|
|
||||||
var rb = config.BadBook switch
|
|
||||||
{
|
|
||||||
Configuration.BadBookAction.Ask => this.badBookAskRb,
|
|
||||||
Configuration.BadBookAction.Abort => this.badBookAbortRb,
|
|
||||||
Configuration.BadBookAction.Retry => this.badBookRetryRb,
|
|
||||||
Configuration.BadBookAction.Ignore => this.badBookIgnoreRb,
|
|
||||||
_ => this.badBookAskRb
|
|
||||||
};
|
|
||||||
rb.Checked = true;
|
|
||||||
|
|
||||||
folderTemplateLbl.Text = desc(nameof(config.FolderTemplate));
|
|
||||||
fileTemplateLbl.Text = desc(nameof(config.FileTemplate));
|
|
||||||
chapterFileTemplateLbl.Text = desc(nameof(config.ChapterFileTemplate));
|
|
||||||
folderTemplateTb.Text = config.FolderTemplate;
|
|
||||||
fileTemplateTb.Text = config.FileTemplate;
|
|
||||||
chapterFileTemplateTb.Text = config.ChapterFileTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void logsBtn_Click(object sender, EventArgs e) => Go.To.Folder(((LongPath)Configuration.Instance.LibationFiles).ShortPathName);
|
|
||||||
|
|
||||||
private void folderTemplateBtn_Click(object sender, EventArgs e) => editTemplate(Templates.Folder, folderTemplateTb);
|
|
||||||
private void fileTemplateBtn_Click(object sender, EventArgs e) => editTemplate(Templates.File, fileTemplateTb);
|
|
||||||
private void chapterFileTemplateBtn_Click(object sender, EventArgs e) => editTemplate(Templates.ChapterFile, chapterFileTemplateTb);
|
|
||||||
private static void editTemplate(Templates template, TextBox textBox)
|
private static void editTemplate(Templates template, TextBox textBox)
|
||||||
{
|
{
|
||||||
var form = new EditTemplateDialog(template, textBox.Text);
|
var form = new EditTemplateDialog(template, textBox.Text);
|
||||||
@ -138,93 +36,10 @@ namespace LibationWinForms.Dialogs
|
|||||||
|
|
||||||
private void saveBtn_Click(object sender, EventArgs e)
|
private void saveBtn_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var newBooks = booksSelectControl.SelectedDirectory;
|
Save_Important(config);
|
||||||
|
Save_ImportLibrary(config);
|
||||||
#region validation
|
Save_DownloadDecrypt(config);
|
||||||
static void validationError(string text, string caption)
|
Save_AudioSettings(config);
|
||||||
=> MessageBox.Show(text, caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
||||||
if (string.IsNullOrWhiteSpace(newBooks))
|
|
||||||
{
|
|
||||||
validationError("Cannot set Books Location to blank", "Location is blank");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Directory.Exists(newBooks) && booksSelectControl.SelectedDirectoryIsCustom)
|
|
||||||
{
|
|
||||||
validationError($"Not saving change to Books location. This folder does not exist:\r\n{newBooks}", "Folder does not exist");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// these 3 should do nothing. Configuration will only init these with a valid value. EditTemplateDialog ensures valid before returning
|
|
||||||
if (!Templates.Folder.IsValid(folderTemplateTb.Text))
|
|
||||||
{
|
|
||||||
validationError($"Not saving change to folder naming template. Invalid format.", "Invalid folder template");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!Templates.File.IsValid(fileTemplateTb.Text))
|
|
||||||
{
|
|
||||||
validationError($"Not saving change to file naming template. Invalid format.", "Invalid file template");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!Templates.ChapterFile.IsValid(chapterFileTemplateTb.Text))
|
|
||||||
{
|
|
||||||
validationError($"Not saving change to chapter file naming template. Invalid format.", "Invalid chapter file template");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
if (!Directory.Exists(newBooks) && booksSelectControl.SelectedDirectoryIsKnown)
|
|
||||||
Directory.CreateDirectory(newBooks);
|
|
||||||
|
|
||||||
config.Books = newBooks;
|
|
||||||
|
|
||||||
{
|
|
||||||
var logLevelOld = config.LogLevel;
|
|
||||||
var logLevelNew = (Serilog.Events.LogEventLevel)loggingLevelCb.SelectedItem;
|
|
||||||
|
|
||||||
config.LogLevel = logLevelNew;
|
|
||||||
|
|
||||||
// only warn if changed during this time. don't want to warn every time user happens to change settings while level is verbose
|
|
||||||
if (logLevelOld != logLevelNew)
|
|
||||||
MessageBoxLib.VerboseLoggingWarning_ShowIfTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
config.SavePodcastsToParentFolder = saveEpisodesToSeriesFolderCbox.Checked;
|
|
||||||
|
|
||||||
config.AllowLibationFixup = allowLibationFixupCbox.Checked;
|
|
||||||
config.CreateCueSheet = createCueSheetCbox.Checked;
|
|
||||||
config.RetainAaxFile = retainAaxFileCbox.Checked;
|
|
||||||
config.SplitFilesByChapter = splitFilesByChapterCbox.Checked;
|
|
||||||
config.StripUnabridged = stripUnabridgedCbox.Checked;
|
|
||||||
config.StripAudibleBrandAudio = stripAudibleBrandingCbox.Checked;
|
|
||||||
config.DecryptToLossy = convertLossyRb.Checked;
|
|
||||||
|
|
||||||
config.LameTargetBitrate = lameTargetBitrateRb.Checked;
|
|
||||||
config.LameDownsampleMono = lameDownsampleMonoCbox.Checked;
|
|
||||||
config.LameBitrate = lameBitrateTb.Value;
|
|
||||||
config.LameConstantBitrate = lameConstantBitrateCbox.Checked;
|
|
||||||
config.LameMatchSourceBR = LameMatchSourceBRCbox.Checked;
|
|
||||||
config.LameVBRQuality = lameVBRQualityTb.Value;
|
|
||||||
config.DownloadCoverArt = downloadCoverArtCbox.Checked;
|
|
||||||
|
|
||||||
config.AutoScan = autoScanCb.Checked;
|
|
||||||
config.ShowImportedStats = showImportedStatsCb.Checked;
|
|
||||||
config.ImportEpisodes = importEpisodesCb.Checked;
|
|
||||||
config.DownloadEpisodes = downloadEpisodesCb.Checked;
|
|
||||||
config.AutoDownloadEpisodes = autoDownloadEpisodesCb.Checked;
|
|
||||||
|
|
||||||
config.InProgress = inProgressSelectControl.SelectedDirectory;
|
|
||||||
|
|
||||||
config.BadBook
|
|
||||||
= badBookAskRb.Checked ? Configuration.BadBookAction.Ask
|
|
||||||
: badBookAbortRb.Checked ? Configuration.BadBookAction.Abort
|
|
||||||
: badBookRetryRb.Checked ? Configuration.BadBookAction.Retry
|
|
||||||
: badBookIgnoreRb.Checked ? Configuration.BadBookAction.Ignore
|
|
||||||
: Configuration.BadBookAction.Ask;
|
|
||||||
|
|
||||||
config.FolderTemplate = folderTemplateTb.Text;
|
|
||||||
config.FileTemplate = fileTemplateTb.Text;
|
|
||||||
config.ChapterFileTemplate = chapterFileTemplateTb.Text;
|
|
||||||
|
|
||||||
this.DialogResult = DialogResult.OK;
|
this.DialogResult = DialogResult.OK;
|
||||||
this.Close();
|
this.Close();
|
||||||
@ -235,6 +50,5 @@ namespace LibationWinForms.Dialogs
|
|||||||
this.DialogResult = DialogResult.Cancel;
|
this.DialogResult = DialogResult.Cancel;
|
||||||
this.Close();
|
this.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user