diff --git a/Application/FileConverter/Application.xaml.cs b/Application/FileConverter/Application.xaml.cs
index e974b62..6e693a1 100644
--- a/Application/FileConverter/Application.xaml.cs
+++ b/Application/FileConverter/Application.xaml.cs
@@ -1,7 +1,7 @@
// License: http://www.gnu.org/licenses/gpl.html GPL version 3.
/* File Converter - This program allow you to convert file format to another.
- Copyright (C) 2024 Adrien Allard
+ Copyright (C) 2025 Adrien Allard
email: adrien.allard.pro@gmail.com
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
diff --git a/Application/FileConverter/Helpers.cs b/Application/FileConverter/Helpers.cs
index b119ba0..a1e3b02 100644
--- a/Application/FileConverter/Helpers.cs
+++ b/Application/FileConverter/Helpers.cs
@@ -1,359 +1,359 @@
-// License: http://www.gnu.org/licenses/gpl.html GPL version 3.
-
-namespace FileConverter
-{
- using System;
- using System.Collections.Generic;
- using System.Globalization;
- using System.IO;
- using System.Reflection;
- using System.Threading;
-
- using FileConverter.ConversionJobs;
- using FileConverter.Services;
-
- using SharpShell.Helpers;
-
- using Microsoft.Win32;
- using CommunityToolkit.Mvvm.DependencyInjection;
-
- public static class Helpers
- {
- public static readonly string[] CompatibleInputExtensions = {
- "3gp","3gpp","aac","aiff","ape","arw","avi","bik","bmp","cda","cr2","dds","dng","doc","docx",
- "exr","flac","flv","gif","heic","ico","jfif","jpg","jpeg","m4a","m4b","m4v","mkv","mov","mp3","mp4",
- "mpg","mpeg","nef","odp","ods","odt","oga","ogg","ogv","opus","pdf","png","ppt","pptx","psd",
- "raf", "rm","svg","tga","tif","tiff", "ts", "vob","wav","webm","webp","wma","wmv","xls","xlsx"
- };
-
- public static string GetExtensionCategory(string extension)
- {
- switch (extension)
- {
- case "aac":
- case "aiff":
- case "ape":
- case "cda":
- case "flac":
- case "mp3":
- case "m4a":
- case "m4b":
- case "oga":
- case "ogg":
- case "opus":
- case "wav":
- case "wma":
- return InputCategoryNames.Audio;
-
- case "3gp":
- case "3gpp":
- case "avi":
- case "bik":
- case "flv":
- case "m4v":
- case "mp4":
- case "mpg":
- case "mpeg":
- case "mov":
- case "mkv":
- case "ogv":
- case "rm":
- case "ts":
- case "vob":
- case "webm":
- case "wmv":
- return InputCategoryNames.Video;
-
- case "arw":
- case "bmp":
- case "cr2":
- case "dds":
- case "dng":
- case "exr":
- case "heic":
- case "ico":
- case "jfif":
- case "jpg":
- case "jpeg":
- case "nef":
- case "png":
- case "psd":
- case "raf":
- case "tga":
- case "tif":
- case "tiff":
- case "svg":
- case "xcf":
- case "webp":
- return InputCategoryNames.Image;
-
- case "gif":
- return InputCategoryNames.AnimatedImage;
-
- case "pdf":
- case "doc":
- case "docx":
- case "ppt":
- case "pptx":
- case "odp":
- case "ods":
- case "odt":
- case "xls":
- case "xlsx":
- return InputCategoryNames.Document;
- }
-
- return InputCategoryNames.Misc;
- }
-
- public static bool RegisterShellExtension(string shellExtensionPath)
- {
- if (!Application.IsInAdmininstratorPrivileges)
- {
- Diagnostics.Debug.LogError("File Converter needs administrator privileges to register the shell extension.");
- return false;
- }
-
- if (!File.Exists(shellExtensionPath))
- {
- Diagnostics.Debug.LogError($"Shell extension {shellExtensionPath} does not exists.");
- return false;
- }
-
- Diagnostics.Debug.Log($"Install and register shell extension: {shellExtensionPath}.");
-
- var regasm = new RegAsm();
- var success = regasm.Register64(shellExtensionPath, true);
- if (success)
- {
- Diagnostics.Debug.Log($"{shellExtensionPath} installed and registered.");
- Diagnostics.Debug.Log(regasm.StandardOutput);
- return true;
- }
- else
- {
- Diagnostics.Debug.LogError(errorCode: 0x05, $"{shellExtensionPath} failed to register.");
- Diagnostics.Debug.LogError(regasm.StandardError);
- return false;
- }
- }
-
- public static bool UnregisterExtension(string shellExtensionPath)
- {
- if (!Application.IsInAdmininstratorPrivileges)
- {
- Diagnostics.Debug.LogError("File Converter needs administrator privileges to unregister the shell extension.");
- return false;
- }
-
- if (!File.Exists(shellExtensionPath))
- {
- Diagnostics.Debug.LogError($"Shell extension {shellExtensionPath} does not exists.");
- return false;
- }
-
- Diagnostics.Debug.Log($"Unregister and uninstall shell extension: {shellExtensionPath}.");
-
- var regasm = new RegAsm();
- var success = regasm.Unregister64(shellExtensionPath);
- if (success)
- {
- Diagnostics.Debug.Log($"{shellExtensionPath} uninstalled.");
- Diagnostics.Debug.Log(regasm.StandardOutput);
- return true;
- }
- else
- {
- Diagnostics.Debug.LogError(errorCode: 0x05, $"{shellExtensionPath} failed to uninstall.");
- Diagnostics.Debug.LogError(regasm.StandardError);
- return false;
- }
- }
-
- public static IEnumerable GetSupportedCultures()
- {
- // Get all cultures.
- CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
-
- // Find the location where application installed.
- string exeLocation = Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path));
-
- // Return all culture for which satellite folder found with culture code.
- foreach (CultureInfo cultureInfo in cultures)
- {
- if (!string.IsNullOrEmpty(cultureInfo.Name) && Directory.Exists(Path.Combine(exeLocation, "Languages", cultureInfo.Name)))
- {
- yield return cultureInfo;
- }
- }
- }
-
- public static bool IsOutputTypeCompatibleWithCategory(OutputType outputType, string category)
- {
- if (category == InputCategoryNames.Misc)
- {
- // Misc category contains unsorted input extensions, so we consider that they are compatible to be tolerant.
- return true;
- }
-
- switch (outputType)
- {
- case OutputType.Aac:
- case OutputType.Flac:
- case OutputType.Mp3:
- case OutputType.Ogg:
- case OutputType.Wav:
- return category == InputCategoryNames.Audio || category == InputCategoryNames.Video;
-
- case OutputType.Avi:
- case OutputType.Mkv:
- case OutputType.Mp4:
- case OutputType.Ogv:
- case OutputType.Webm:
- return category == InputCategoryNames.Video || category == InputCategoryNames.AnimatedImage;
-
- case OutputType.Ico:
- case OutputType.Jpg:
- case OutputType.Png:
- case OutputType.Webp:
- return category == InputCategoryNames.Image || category == InputCategoryNames.Document || category == InputCategoryNames.AnimatedImage;
-
- case OutputType.Gif:
- return category == InputCategoryNames.Image || category == InputCategoryNames.Video || category == InputCategoryNames.AnimatedImage;
-
- case OutputType.Pdf:
- return category == InputCategoryNames.Image || category == InputCategoryNames.Document;
-
- default:
- return false;
- }
- }
-
- public static Thread InstantiateThread(string name, ThreadStart threadStart)
- {
- ISettingsService settingsService = Ioc.Default.GetRequiredService();
- CultureInfo currentCulture = settingsService?.Settings?.ApplicationLanguage;
-
- Thread thread = new Thread(threadStart);
- thread.Name = name;
-
- if (currentCulture != null)
- {
- thread.CurrentCulture = currentCulture;
- thread.CurrentUICulture = currentCulture;
- }
-
- return thread;
- }
-
- public static Thread InstantiateThread(string name, ParameterizedThreadStart parameterizedThreadStart)
- {
- ISettingsService settingsService = Ioc.Default.GetRequiredService();
- CultureInfo currentCulture = settingsService?.Settings?.ApplicationLanguage;
-
- Thread thread = new Thread(parameterizedThreadStart);
- thread.Name = name;
-
- if (currentCulture != null)
- {
- thread.CurrentCulture = currentCulture;
- thread.CurrentUICulture = currentCulture;
- }
-
- return thread;
- }
-
- ///
- /// Check whether Microsoft office is available or not.
- ///
- /// The office application name.
- /// Returns true if Office is installed on the computer.
- /// source: http://stackoverflow.com/questions/3266675/how-to-detect-installed-version-of-ms-office/3267832#3267832
- /// source: http://www.codeproject.com/Articles/26520/Getting-Office-s-Version
- public static bool IsMicrosoftOfficeApplicationAvailable(ConversionJobs.ConversionJob_Office.ApplicationName application)
- {
- string registryKeyPattern = @"Software\Microsoft\Windows\CurrentVersion\App Paths\";
- switch (application)
- {
- case ConversionJob_Office.ApplicationName.Word:
- registryKeyPattern += "winword.exe";
- break;
-
- case ConversionJob_Office.ApplicationName.PowerPoint:
- registryKeyPattern += "powerpnt.exe";
- break;
-
- case ConversionJob_Office.ApplicationName.Excel:
- registryKeyPattern += "excel.exe";
- break;
-
- case ConversionJob_Office.ApplicationName.None:
- return false;
- }
-
- // Looks inside CURRENT_USER.
- RegistryKey winwordKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(registryKeyPattern, false);
- if (winwordKey != null)
- {
- string winwordPath = winwordKey.GetValue(string.Empty).ToString();
- if (!string.IsNullOrEmpty(winwordPath))
- {
- return true;
- }
- }
-
- // If not found, looks inside LOCAL_MACHINE.
- winwordKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(registryKeyPattern, false);
- if (winwordKey != null)
- {
- string winwordPath = winwordKey.GetValue(string.Empty).ToString();
- if (!string.IsNullOrEmpty(winwordPath))
- {
- return true;
- }
- }
-
- return false;
- }
-
- public static ConversionJob_Office.ApplicationName GetOfficeApplicationCompatibleWithExtension(string extension)
- {
- switch (extension)
- {
- case "doc":
- case "docx":
- case "odt":
- return ConversionJob_Office.ApplicationName.Word;
-
- case "ppt":
- case "pptx":
- case "odp":
- return ConversionJob_Office.ApplicationName.PowerPoint;
-
- case "ods":
- case "xls":
- case "xlsx":
- return ConversionJob_Office.ApplicationName.Excel;
- }
-
- return ConversionJob_Office.ApplicationName.None;
- }
-
- public static class InputCategoryNames
- {
- public const string Audio = "Audio";
- public const string Video = "Video";
- public const string Image = "Image";
- public const string AnimatedImage = "Animated Image";
- public const string Document = "Document";
-
- public const string Misc = "Misc";
- }
-
+// License: http://www.gnu.org/licenses/gpl.html GPL version 3.
+
+namespace FileConverter
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Globalization;
+ using System.IO;
+ using System.Reflection;
+ using System.Threading;
+
+ using FileConverter.ConversionJobs;
+ using FileConverter.Services;
+
+ using SharpShell.Helpers;
+
+ using Microsoft.Win32;
+ using CommunityToolkit.Mvvm.DependencyInjection;
+
+ public static class Helpers
+ {
+ public static readonly string[] CompatibleInputExtensions = {
+ "3gp","3gpp","aac","aiff","ape","arw","avi","bik","bmp","cda","cr2","dds","dng","doc","docx",
+ "exr","flac","flv","gif","heic","ico","jfif","jpg","jpeg","m4a","m4b","m4v","mkv","mov","mp3","mp4",
+ "mpg","mpeg","nef","odp","ods","odt","oga","ogg","ogv","opus","pdf","png","ppt","pptx","psd",
+ "raf", "rm","svg","tga","tif","tiff", "ts", "vob","wav","webm","webp","wma","wmv","xls","xlsx"
+ };
+
+ public static string GetExtensionCategory(string extension)
+ {
+ switch (extension)
+ {
+ case "aac":
+ case "aiff":
+ case "ape":
+ case "cda":
+ case "flac":
+ case "mp3":
+ case "m4a":
+ case "m4b":
+ case "oga":
+ case "ogg":
+ case "opus":
+ case "wav":
+ case "wma":
+ return InputCategoryNames.Audio;
+
+ case "3gp":
+ case "3gpp":
+ case "avi":
+ case "bik":
+ case "flv":
+ case "m4v":
+ case "mp4":
+ case "mpg":
+ case "mpeg":
+ case "mov":
+ case "mkv":
+ case "ogv":
+ case "rm":
+ case "ts":
+ case "vob":
+ case "webm":
+ case "wmv":
+ return InputCategoryNames.Video;
+
+ case "arw":
+ case "bmp":
+ case "cr2":
+ case "dds":
+ case "dng":
+ case "exr":
+ case "heic":
+ case "ico":
+ case "jfif":
+ case "jpg":
+ case "jpeg":
+ case "nef":
+ case "png":
+ case "psd":
+ case "raf":
+ case "tga":
+ case "tif":
+ case "tiff":
+ case "svg":
+ case "xcf":
+ case "webp":
+ return InputCategoryNames.Image;
+
+ case "gif":
+ return InputCategoryNames.AnimatedImage;
+
+ case "pdf":
+ case "doc":
+ case "docx":
+ case "ppt":
+ case "pptx":
+ case "odp":
+ case "ods":
+ case "odt":
+ case "xls":
+ case "xlsx":
+ return InputCategoryNames.Document;
+ }
+
+ return InputCategoryNames.Misc;
+ }
+
+ public static bool RegisterShellExtension(string shellExtensionPath)
+ {
+ if (!Application.IsInAdmininstratorPrivileges)
+ {
+ Diagnostics.Debug.LogError("File Converter needs administrator privileges to register the shell extension.");
+ return false;
+ }
+
+ if (!File.Exists(shellExtensionPath))
+ {
+ Diagnostics.Debug.LogError($"Shell extension {shellExtensionPath} does not exists.");
+ return false;
+ }
+
+ Diagnostics.Debug.Log($"Install and register shell extension: {shellExtensionPath}.");
+
+ var regasm = new RegAsm();
+ var success = regasm.Register64(shellExtensionPath, true);
+ if (success)
+ {
+ Diagnostics.Debug.Log($"{shellExtensionPath} installed and registered.");
+ Diagnostics.Debug.Log(regasm.StandardOutput);
+ return true;
+ }
+ else
+ {
+ Diagnostics.Debug.LogError(errorCode: 0x05, $"{shellExtensionPath} failed to register.");
+ Diagnostics.Debug.LogError(regasm.StandardError);
+ return false;
+ }
+ }
+
+ public static bool UnregisterExtension(string shellExtensionPath)
+ {
+ if (!Application.IsInAdmininstratorPrivileges)
+ {
+ Diagnostics.Debug.LogError("File Converter needs administrator privileges to unregister the shell extension.");
+ return false;
+ }
+
+ if (!File.Exists(shellExtensionPath))
+ {
+ Diagnostics.Debug.LogError($"Shell extension {shellExtensionPath} does not exists.");
+ return false;
+ }
+
+ Diagnostics.Debug.Log($"Unregister and uninstall shell extension: {shellExtensionPath}.");
+
+ var regasm = new RegAsm();
+ var success = regasm.Unregister64(shellExtensionPath);
+ if (success)
+ {
+ Diagnostics.Debug.Log($"{shellExtensionPath} uninstalled.");
+ Diagnostics.Debug.Log(regasm.StandardOutput);
+ return true;
+ }
+ else
+ {
+ Diagnostics.Debug.LogError(errorCode: 0x05, $"{shellExtensionPath} failed to uninstall.");
+ Diagnostics.Debug.LogError(regasm.StandardError);
+ return false;
+ }
+ }
+
+ public static IEnumerable GetSupportedCultures()
+ {
+ // Get all cultures.
+ CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
+
+ // Find the location where application installed.
+ string exeLocation = Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path));
+
+ // Return all culture for which satellite folder found with culture code.
+ foreach (CultureInfo cultureInfo in cultures)
+ {
+ if (!string.IsNullOrEmpty(cultureInfo.Name) && Directory.Exists(Path.Combine(exeLocation, "Languages", cultureInfo.Name)))
+ {
+ yield return cultureInfo;
+ }
+ }
+ }
+
+ public static bool IsOutputTypeCompatibleWithCategory(OutputType outputType, string category)
+ {
+ if (category == InputCategoryNames.Misc)
+ {
+ // Misc category contains unsorted input extensions, so we consider that they are compatible to be tolerant.
+ return true;
+ }
+
+ switch (outputType)
+ {
+ case OutputType.Aac:
+ case OutputType.Flac:
+ case OutputType.Mp3:
+ case OutputType.Ogg:
+ case OutputType.Wav:
+ return category == InputCategoryNames.Audio || category == InputCategoryNames.Video;
+
+ case OutputType.Avi:
+ case OutputType.Mkv:
+ case OutputType.Mp4:
+ case OutputType.Ogv:
+ case OutputType.Webm:
+ return category == InputCategoryNames.Video || category == InputCategoryNames.AnimatedImage;
+
+ case OutputType.Ico:
+ case OutputType.Jpg:
+ case OutputType.Png:
+ case OutputType.Webp:
+ return category == InputCategoryNames.Image || category == InputCategoryNames.Document || category == InputCategoryNames.AnimatedImage;
+
+ case OutputType.Gif:
+ return category == InputCategoryNames.Image || category == InputCategoryNames.Video || category == InputCategoryNames.AnimatedImage;
+
+ case OutputType.Pdf:
+ return category == InputCategoryNames.Image || category == InputCategoryNames.Document;
+
+ default:
+ return false;
+ }
+ }
+
+ public static Thread InstantiateThread(string name, ThreadStart threadStart)
+ {
+ ISettingsService settingsService = Ioc.Default.GetRequiredService();
+ CultureInfo currentCulture = settingsService?.Settings?.ApplicationLanguage;
+
+ Thread thread = new Thread(threadStart);
+ thread.Name = name;
+
+ if (currentCulture != null)
+ {
+ thread.CurrentCulture = currentCulture;
+ thread.CurrentUICulture = currentCulture;
+ }
+
+ return thread;
+ }
+
+ public static Thread InstantiateThread(string name, ParameterizedThreadStart parameterizedThreadStart)
+ {
+ ISettingsService settingsService = Ioc.Default.GetRequiredService();
+ CultureInfo currentCulture = settingsService?.Settings?.ApplicationLanguage;
+
+ Thread thread = new Thread(parameterizedThreadStart);
+ thread.Name = name;
+
+ if (currentCulture != null)
+ {
+ thread.CurrentCulture = currentCulture;
+ thread.CurrentUICulture = currentCulture;
+ }
+
+ return thread;
+ }
+
+ ///
+ /// Check whether Microsoft office is available or not.
+ ///
+ /// The office application name.
+ /// Returns true if Office is installed on the computer.
+ /// source: http://stackoverflow.com/questions/3266675/how-to-detect-installed-version-of-ms-office/3267832#3267832
+ /// source: http://www.codeproject.com/Articles/26520/Getting-Office-s-Version
+ public static bool IsMicrosoftOfficeApplicationAvailable(ConversionJobs.ConversionJob_Office.ApplicationName application)
+ {
+ string registryKeyPattern = @"Software\Microsoft\Windows\CurrentVersion\App Paths\";
+ switch (application)
+ {
+ case ConversionJob_Office.ApplicationName.Word:
+ registryKeyPattern += "winword.exe";
+ break;
+
+ case ConversionJob_Office.ApplicationName.PowerPoint:
+ registryKeyPattern += "powerpnt.exe";
+ break;
+
+ case ConversionJob_Office.ApplicationName.Excel:
+ registryKeyPattern += "excel.exe";
+ break;
+
+ case ConversionJob_Office.ApplicationName.None:
+ return false;
+ }
+
+ // Looks inside CURRENT_USER.
+ RegistryKey winwordKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(registryKeyPattern, false);
+ if (winwordKey != null)
+ {
+ string winwordPath = winwordKey.GetValue(string.Empty).ToString();
+ if (!string.IsNullOrEmpty(winwordPath))
+ {
+ return true;
+ }
+ }
+
+ // If not found, looks inside LOCAL_MACHINE.
+ winwordKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(registryKeyPattern, false);
+ if (winwordKey != null)
+ {
+ string winwordPath = winwordKey.GetValue(string.Empty).ToString();
+ if (!string.IsNullOrEmpty(winwordPath))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public static ConversionJob_Office.ApplicationName GetOfficeApplicationCompatibleWithExtension(string extension)
+ {
+ switch (extension)
+ {
+ case "doc":
+ case "docx":
+ case "odt":
+ return ConversionJob_Office.ApplicationName.Word;
+
+ case "ppt":
+ case "pptx":
+ case "odp":
+ return ConversionJob_Office.ApplicationName.PowerPoint;
+
+ case "ods":
+ case "xls":
+ case "xlsx":
+ return ConversionJob_Office.ApplicationName.Excel;
+ }
+
+ return ConversionJob_Office.ApplicationName.None;
+ }
+
+ public static class InputCategoryNames
+ {
+ public const string Audio = "Audio";
+ public const string Video = "Video";
+ public const string Image = "Image";
+ public const string AnimatedImage = "Animated Image";
+ public const string Document = "Document";
+
+ public const string Misc = "Misc";
+ }
+
public enum HardwareAccelerationMode
{
Off,
CUDA
- }
- }
+ }
+ }
}
\ No newline at end of file
diff --git a/Application/FileConverter/Properties/AssemblyInfo.cs b/Application/FileConverter/Properties/AssemblyInfo.cs
index d51fe70..54160ae 100644
--- a/Application/FileConverter/Properties/AssemblyInfo.cs
+++ b/Application/FileConverter/Properties/AssemblyInfo.cs
@@ -10,7 +10,7 @@ using System.Windows;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("FileConverter")]
-[assembly: AssemblyCopyright("Copyright © 2024")]
+[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
diff --git a/Application/FileConverter/Views/SettingsWindow.xaml b/Application/FileConverter/Views/SettingsWindow.xaml
index bb53253..e7ede27 100644
--- a/Application/FileConverter/Views/SettingsWindow.xaml
+++ b/Application/FileConverter/Views/SettingsWindow.xaml
@@ -487,7 +487,7 @@
-
+
diff --git a/Application/FileConverterExtension/Properties/AssemblyInfo.cs b/Application/FileConverterExtension/Properties/AssemblyInfo.cs
index 40ef7c7..abf8d1d 100644
--- a/Application/FileConverterExtension/Properties/AssemblyInfo.cs
+++ b/Application/FileConverterExtension/Properties/AssemblyInfo.cs
@@ -9,7 +9,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("FileConverterExtension")]
-[assembly: AssemblyCopyright("Copyright © 2024")]
+[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]