From d7b46a075666fe650f7e25a5dbcd8c43df7091f4 Mon Sep 17 00:00:00 2001 From: Lev Rusanov <30170278+JDM170@users.noreply.github.com> Date: Mon, 23 Jun 2025 21:34:41 +0700 Subject: [PATCH] Update Signed-off-by: Lev Rusanov <30170278+JDM170@users.noreply.github.com> --- ...des_csharp.csproj => EpisodeRenamer.csproj | 20 ++++- ..._episodes_csharp.sln => EpisodeRenamer.sln | 4 +- Program.cs | 79 +++++++++++++++---- Properties/AssemblyInfo.cs | 6 +- config.json | 27 +++++++ packages.config | 5 ++ 6 files changed, 119 insertions(+), 22 deletions(-) rename rename_anime_episodes_csharp.csproj => EpisodeRenamer.csproj (58%) rename rename_anime_episodes_csharp.sln => EpisodeRenamer.sln (81%) create mode 100644 config.json create mode 100644 packages.config diff --git a/rename_anime_episodes_csharp.csproj b/EpisodeRenamer.csproj similarity index 58% rename from rename_anime_episodes_csharp.csproj rename to EpisodeRenamer.csproj index 81030d3..f92d1b6 100644 --- a/rename_anime_episodes_csharp.csproj +++ b/EpisodeRenamer.csproj @@ -6,12 +6,14 @@ AnyCPU {AAFB0AE9-6F89-4DDF-821B-1AE016FC4CFB} Exe - rename_anime_episodes_csharp - rename_anime_episodes_csharp + EpisodeRenamer + EpisodeRenamer v4.8 512 true true + + AnyCPU @@ -33,6 +35,9 @@ 4 + + packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + @@ -48,6 +53,17 @@ + + Always + + + + + + Данный проект ссылается на пакеты NuGet, отсутствующие на этом компьютере. Используйте восстановление пакетов NuGet, чтобы скачать их. Дополнительную информацию см. по адресу: http://go.microsoft.com/fwlink/?LinkID=322105. Отсутствует следующий файл: {0}. + + + \ No newline at end of file diff --git a/rename_anime_episodes_csharp.sln b/EpisodeRenamer.sln similarity index 81% rename from rename_anime_episodes_csharp.sln rename to EpisodeRenamer.sln index b17f5e9..e2201b0 100644 --- a/rename_anime_episodes_csharp.sln +++ b/EpisodeRenamer.sln @@ -1,9 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 -VisualStudioVersion = 17.13.35931.197 d17.13 +VisualStudioVersion = 17.13.35931.197 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "rename_anime_episodes_csharp", "rename_anime_episodes_csharp.csproj", "{AAFB0AE9-6F89-4DDF-821B-1AE016FC4CFB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EpisodeRenamer", "EpisodeRenamer.csproj", "{AAFB0AE9-6F89-4DDF-821B-1AE016FC4CFB}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/Program.cs b/Program.cs index d13da25..a1a1f9b 100644 --- a/Program.cs +++ b/Program.cs @@ -1,24 +1,28 @@ using System; using System.Collections.Generic; using System.IO; +using System.Reflection; using System.Text.RegularExpressions; +using Newtonsoft.Json; class EpisodeRenamer { - // Паттерны для поиска номера эпизода (регулярные выражения + правила обработки) - private static readonly List patterns = new List + private class PatternConfig { - new Pattern(new Regex(@"\[\d+\]"), 1, -1), - new Pattern(new Regex(@"[s]\d+[e]\d+", RegexOptions.IgnoreCase), 4, null), - new Pattern(new Regex(@"[s]\d+[.][e]\d+", RegexOptions.IgnoreCase), 5, null), - new Pattern(new Regex(@"\d+$"), 0, null) - }; + public string Regex { get; set; } + public int? Start { get; set; } + public int? End { get; set; } + public bool IgnoreCase { get; set; } + } - // Поддерживаемые расширения файлов - private static readonly HashSet extensions = new HashSet(StringComparer.OrdinalIgnoreCase) + private class Config { - ".mkv", ".avi", ".mp4" - }; + public List Patterns { get; set; } + public List Extensions { get; set; } + } + + private static List patterns; + private static HashSet extensions; private class Pattern { @@ -36,6 +40,20 @@ class EpisodeRenamer static void Main() { + Console.Title = Assembly.GetExecutingAssembly().GetCustomAttribute().Title; + + try + { + LoadConfiguration(); + } + catch (Exception ex) + { + Console.WriteLine($"Ошибка загрузки конфигурации: {ex.Message}"); + Console.WriteLine("Программа будет завершена."); + Console.ReadLine(); + return; + } + Console.CancelKeyPress += (sender, e) => { Console.WriteLine("\nВыход из программы."); @@ -50,7 +68,7 @@ class EpisodeRenamer try { Console.Write("\nВведите путь до папки с эпизодами: "); - string input = Console.ReadLine()?.Trim() ?? string.Empty; + string input = Console.ReadLine().Trim() ?? string.Empty; string folder = string.IsNullOrEmpty(input) ? Directory.GetCurrentDirectory() @@ -72,6 +90,34 @@ class EpisodeRenamer } } + private static void LoadConfiguration() + { + string configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.json"); + + if (!File.Exists(configPath)) + { + throw new FileNotFoundException("Конфигурационный файл config.json не найден"); + } + + string json = File.ReadAllText(configPath); + Config config = JsonConvert.DeserializeObject(json); + + // Загружаем расширения файлов + extensions = new HashSet(config.Extensions, StringComparer.OrdinalIgnoreCase); + + // Загружаем паттерны + patterns = new List(); + foreach (PatternConfig patternConfig in config.Patterns) + { + RegexOptions options = patternConfig.IgnoreCase ? RegexOptions.IgnoreCase : RegexOptions.None; + Regex regex = new Regex(patternConfig.Regex, options); + patterns.Add(new Pattern(regex, patternConfig.Start, patternConfig.End)); + } + + Console.WriteLine("Конфигурация успешно загружена."); + Console.WriteLine($"Загружено {patterns.Count} паттернов и {extensions.Count} расширений."); + } + private static void ProcessFolder(string folder) { foreach (string filePath in Directory.GetFiles(folder)) @@ -93,7 +139,8 @@ class EpisodeRenamer foreach (var pattern in patterns) { Match match = pattern.Regex.Match(nameWithoutExt); - if (!match.Success) continue; + if (!match.Success) + continue; string found = match.Value; int startIndex = AdjustIndex(pattern.Start, found.Length); @@ -126,8 +173,10 @@ class EpisodeRenamer private static int AdjustIndex(int? index, int length) { - if (!index.HasValue) return length; - if (index.Value < 0) return length + index.Value; + if (!index.HasValue) + return length; + if (index.Value < 0) + return length + index.Value; return index.Value; } } \ No newline at end of file diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index d20ee74..a502081 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -5,12 +5,12 @@ using System.Runtime.InteropServices; // Общие сведения об этой сборке предоставляются следующим набором // набора атрибутов. Измените значения этих атрибутов для изменения сведений, // связанные с этой сборкой. -[assembly: AssemblyTitle("rename_anime_episodes_csharp")] +[assembly: AssemblyTitle("EpisodeRenamer")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("rename_anime_episodes_csharp")] -[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyProduct("EpisodeRenamer")] +[assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/config.json b/config.json new file mode 100644 index 0000000..6e9c82e --- /dev/null +++ b/config.json @@ -0,0 +1,27 @@ +{ + "Patterns": [ + { + "Regex": "\\[\\d+\\]", + "Start": 1, + "End": -1 + }, + { + "Regex": "[s]\\d+[e]\\d+", + "Start": 4, + "End": null, + "IgnoreCase": true + }, + { + "Regex": "[s]\\d+[.][e]\\d+", + "Start": 5, + "End": null, + "IgnoreCase": true + }, + { + "Regex": "\\d+$", + "Start": 0, + "End": null + } + ], + "Extensions": [".mkv", ".avi", ".mp4"] +} \ No newline at end of file diff --git a/packages.config b/packages.config new file mode 100644 index 0000000..8348ad9 --- /dev/null +++ b/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file