diff --git a/FileLiberator/UNTESTED/DecryptBook.cs b/FileLiberator/UNTESTED/DecryptBook.cs index 39118e35..29730ae1 100644 --- a/FileLiberator/UNTESTED/DecryptBook.cs +++ b/FileLiberator/UNTESTED/DecryptBook.cs @@ -62,9 +62,21 @@ namespace FileLiberator if (outputAudioFilename == null) return new StatusHandler { "Decrypt failed" }; - moveFilesToBooksDir(libraryBook.Book, outputAudioFilename); + var destinationDir = moveFilesToBooksDir(libraryBook.Book, outputAudioFilename); - Dinah.Core.IO.FileExt.SafeDelete(aaxFilename); + var config = Configuration.Instance; + if (config.RetainAaxFiles) + { + var newAaxFilename = FileUtility.GetValidFilename( + destinationDir, + Path.GetFileNameWithoutExtension(aaxFilename), + "aax"); + File.Move(aaxFilename, newAaxFilename); + } + else + { + Dinah.Core.IO.FileExt.SafeDelete(aaxFilename); + } var statusHandler = new StatusHandler(); var finalAudioExists = AudibleFileStorage.Audio.Exists(libraryBook.Book.AudibleProductId); @@ -120,7 +132,7 @@ namespace FileLiberator } } - private static void moveFilesToBooksDir(Book product, string outputAudioFilename) + private static string moveFilesToBooksDir(Book product, string outputAudioFilename) { // create final directory. move each file into it. MOVE AUDIO FILE LAST // new dir: safetitle_limit50char + " [" + productId + "]" @@ -142,7 +154,9 @@ namespace FileLiberator File.Move(f.FullName, dest); } - } + + return destinationDir; + } private static string getDestDir(Book product) { diff --git a/FileManager/UNTESTED/Configuration.cs b/FileManager/UNTESTED/Configuration.cs index 7710dc58..f970e7c4 100644 --- a/FileManager/UNTESTED/Configuration.cs +++ b/FileManager/UNTESTED/Configuration.cs @@ -83,6 +83,13 @@ namespace FileManager set => persistentDictionary.Set(nameof(DecryptInProgressEnum), value); } + [Description("Retain .aax files after decrypting?")] + public bool RetainAaxFiles + { + get => persistentDictionary.Get(nameof(RetainAaxFiles)); + set => persistentDictionary.Set(nameof(RetainAaxFiles), value); + } + // note: any potential file manager static ctors can't compensate if storage dir is changed at run time via settings. this is partly bad architecture. but the side effect is desirable. if changing LibationFiles location: restart app // singleton stuff diff --git a/FileManager/UNTESTED/PersistentDictionary.cs b/FileManager/UNTESTED/PersistentDictionary.cs index 677a435f..540fb94a 100644 --- a/FileManager/UNTESTED/PersistentDictionary.cs +++ b/FileManager/UNTESTED/PersistentDictionary.cs @@ -40,8 +40,13 @@ namespace FileManager return stringCache[propertyName]; } - public T Get(string propertyName) where T : class - => GetObject(propertyName) is T obj ? obj : default; + public T Get(string propertyName) + { + var o = GetObject(propertyName); + if (o is null) return default; + if (o is JToken jt) return jt.Value(); + return (T)o; + } public object GetObject(string propertyName) { diff --git a/LibationLauncher/LibationLauncher.csproj b/LibationLauncher/LibationLauncher.csproj index 770dc7dc..b96c90e6 100644 --- a/LibationLauncher/LibationLauncher.csproj +++ b/LibationLauncher/LibationLauncher.csproj @@ -13,7 +13,7 @@ win-x64 - 4.0.2.3 + 4.0.2.21 diff --git a/LibationLauncher/UNTESTED/Program.cs b/LibationLauncher/UNTESTED/Program.cs index 4e5be0a6..01bccf8f 100644 --- a/LibationLauncher/UNTESTED/Program.cs +++ b/LibationLauncher/UNTESTED/Program.cs @@ -27,7 +27,8 @@ namespace LibationLauncher AudibleApiStorage.EnsureAccountsSettingsFileExists(); - migrate_v3_to_v4(); + migrate_to_v4_0_0(); + migrate_to_v4_0_3(); // add setting for whether to delete/retain aax ensureLoggingConfig(); ensureSerilogConfig(); @@ -83,7 +84,7 @@ namespace LibationLauncher #region v3 => v4 migration static string AccountsSettingsFileLegacy30 => Path.Combine(Configuration.Instance.LibationFiles, "IdentityTokens.json"); - private static void migrate_v3_to_v4() + private static void migrate_to_v4_0_0() { migrateLegacyIdentityFile(); @@ -205,6 +206,27 @@ namespace LibationLauncher } #endregion + #region migrate_to_v4_0_3 add setting for whether to delete/retain aax + private static void migrate_to_v4_0_3() + { + if (!File.Exists(Configuration.Instance.SettingsFilePath)) + return; + + // use JObject to remove decrypt key and locale from Settings.json + var settingsContents = File.ReadAllText(Configuration.Instance.SettingsFilePath); + var jObj = JObject.Parse(settingsContents); + + var jRetainAaxFiles = jObj.Property("RetainAaxFiles"); + if (jRetainAaxFiles is null) + { + jObj.Add("RetainAaxFiles", false); + + var newContents = jObj.ToString(Formatting.Indented); + File.WriteAllText(Configuration.Instance.SettingsFilePath, newContents); + } + } + #endregion + private static string defaultLoggingLevel { get; } = "Information"; private static void ensureLoggingConfig() {