diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 8a69d1c..9ae4910 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -2,6 +2,7 @@ using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.IO; +using System.Text.RegularExpressions; using System.Threading; using System.Windows; using System.Windows.Controls; @@ -77,6 +78,42 @@ public partial class MainWindow : FluentWindow // ── Helpers ────────────────────────────────────────────────────────────── + /// + /// If the file's parent folder has a bracketed prefix (e.g. "[neoHEVC] ") + /// and the file itself doesn't, renames the file on disk to include that + /// prefix and returns the new path. Returns the original path unchanged if + /// the condition isn't met or the rename fails. + /// + private static string TryApplyFolderPrefix(string filePath) + { + string? folder = Path.GetDirectoryName(filePath); + if (string.IsNullOrEmpty(folder)) return filePath; + + string folderName = Path.GetFileName(folder); + var match = Regex.Match(folderName, @"^\[.+?\] "); + if (!match.Success) return filePath; + + string prefix = match.Value; + string fileName = Path.GetFileName(filePath); + + if (fileName.StartsWith(prefix, StringComparison.Ordinal)) return filePath; + + string newFileName = prefix + fileName; + string newFilePath = Path.Combine(folder, newFileName); + + if (File.Exists(newFilePath)) return filePath; + + try + { + File.Move(filePath, newFilePath); + return newFilePath; + } + catch + { + return filePath; + } + } + private static void RestartApplication() { try @@ -212,20 +249,23 @@ public partial class MainWindow : FluentWindow && !_fileQueue.Any(q => string.Equals(q.FilePath, p, StringComparison.OrdinalIgnoreCase))) .ToList(); + var addedPaths = new List(); foreach (var path in newFiles) { - var item = new QueuedFileItem(path); + string effectivePath = TryApplyFolderPrefix(path); + var item = new QueuedFileItem(effectivePath); item.PropertyChanged += QueuedFileItem_PropertyChanged; _fileQueue.Add(item); _ = ScanFileItemAsync(item); + addedPaths.Add(effectivePath); } UpdateLoadingOverlay(); - if (newFiles.Count > 0) + if (addedPaths.Count > 0) { var first = _fileQueue.FirstOrDefault(q => - string.Equals(q.FilePath, newFiles[0], StringComparison.OrdinalIgnoreCase)); + string.Equals(q.FilePath, addedPaths[0], StringComparison.OrdinalIgnoreCase)); if (first != null) FileQueueList.SelectedItem = first; } }