diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index c011f2e..6c643a7 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -743,7 +743,7 @@ public partial class DlibDotNet if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) { List filteredItems = GetItems(argZero, containers); - mapLogic.SaveShortcutsForOutputResolutions(personKeyToIds, filteredItems, mappingCollection); + mapLogic.SaveShortcutsForOutputResolutionsDuringMapLogic(personKeyToIds, filteredItems, mappingCollection); } if (_Configuration.PersonCharactersCopyCount > 0 && !string.IsNullOrEmpty(_Configuration.PersonCharacters)) mapLogic.CopyAtLeastOneMappedFiles(dFacesContentDirectory, a2PeopleSingletonDirectory, mappingCollection); @@ -1100,7 +1100,7 @@ public partial class DlibDotNet if (_PropertyRootExistedBefore || container is not null) break; if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) - mapLogic.SaveShortcutsForOutputResolutions(a2PeopleContentDirectory, personKeyToIds, idToLocationContainers, mappingCollection, totalNotMapped); + mapLogic.SaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, idToLocationContainers, mappingCollection, totalNotMapped); if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions.Contains(outputResolution)) mapLogic.SaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, _PersonContainers, a2PeopleContentDirectory, personKeyToIds, mappingCollection, totalNotMapped); (cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution); diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index 3974602..df1ddf6 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -2,6 +2,7 @@ using Humanizer; using ShellProgressBar; using System.Collections.ObjectModel; using System.Text.Json; +using System.Text.RegularExpressions; using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models.Stateless.Methods; using WindowsShortcutFactory; @@ -1082,20 +1083,18 @@ public class MapLogic : Shared.Models.Methods.IMapLogic SaveContainers(totalNotMapped, null, saveContainers); } - public void SaveShortcutsForOutputResolutions(string a2PeopleContentDirectory, Dictionary> personKeyToIds, Dictionary>> idToLocationContainers, Mapping[] mappingCollection, int totalNotMapped) + private List GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, Dictionary> personKeyToIds, Dictionary>> idToLocationContainers, Mapping[] mappingCollection) { + List results = new(); if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); string? model; long personKey; string fileName; string directory; - string hiddenFile; List? personKeys; string personKeyFormatted; - WindowsShortcut windowsShortcut; IReadOnlyList directories; - List collection = new(); List>? locationContainers; Dictionary> idToPersonKeys = Stateless.Methods.IMapLogic.GetIdToPersonKeys(personKeyToIds); foreach (Mapping mapping in mappingCollection) @@ -1114,9 +1113,10 @@ public class MapLogic : Shared.Models.Methods.IMapLogic model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(directories); if (!string.IsNullOrEmpty(model) && !string.IsNullOrEmpty(model.Trim())) { - directory = Path.Combine(a2PeopleContentDirectory, "Model Shortcuts", model, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName)); + model = Regex.Replace(model, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_"); + directory = Path.Combine(eDistanceContentDirectory, "Model Shortcuts", model, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName)); fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk"); - collection.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); + results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); } if (!idToPersonKeys.TryGetValue(mapping.MappingFromItem.Id, out personKeys)) continue; @@ -1124,20 +1124,29 @@ public class MapLogic : Shared.Models.Methods.IMapLogic if (!personKeys.Contains(mapping.MappingFromPerson.PersonBirthday.Value.Ticks)) continue; personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday); - directory = Path.Combine(a2PeopleContentDirectory, "Person Key Shortcuts", personKeyFormatted, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName)); + directory = Path.Combine(eDistanceContentDirectory, "Person Key Shortcuts", personKeyFormatted, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName)); fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk"); - collection.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); - directory = Path.Combine(a2PeopleContentDirectory, "Name Shortcuts", mapping.MappingFromPerson.DisplayDirectoryName, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName)); + results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); + directory = Path.Combine(eDistanceContentDirectory, "Name Shortcuts", mapping.MappingFromPerson.DisplayDirectoryName, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName)); fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk"); - collection.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); + results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); } + return results; + } + + public void SaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, Dictionary> personKeyToIds, Dictionary>> idToLocationContainers, Mapping[] mappingCollection, int totalNotMapped) + { + string hiddenFile; + WindowsShortcut windowsShortcut; + List collection = new(); + collection = GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, idToLocationContainers, mappingCollection); string[] distinctDirectories = (from l in collection select l.Directory).Distinct().ToArray(); - foreach (string d in distinctDirectories) + foreach (string directory in distinctDirectories) { - if (string.IsNullOrEmpty(d)) + if (string.IsNullOrEmpty(directory)) continue; - if (!Directory.Exists(d)) - _ = Directory.CreateDirectory(d); + if (!Directory.Exists(directory)) + _ = Directory.CreateDirectory(directory); } foreach (SaveShortcutsForOutputResolutions s in collection) { @@ -1161,7 +1170,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic } } - private (List<(string, DateTime[])>, List) GetCollectionForSaveShortcutsForOutputResolutions(Dictionary> personKeyToIds, List filteredItems, Mapping[] mappingCollection) + private (List<(string, DateTime[])>, List) GetCollectionForSaveShortcutsForOutputResolutionsDuringMapLogic(Dictionary> personKeyToIds, List filteredItems, Mapping[] mappingCollection) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); @@ -1242,14 +1251,14 @@ public class MapLogic : Shared.Models.Methods.IMapLogic return new(directoriesAndDateTimes, collection); } - public void SaveShortcutsForOutputResolutions(Dictionary> personKeyToIds, List filteredItems, Mapping[] mappingCollection) + public void SaveShortcutsForOutputResolutionsDuringMapLogic(Dictionary> personKeyToIds, List filteredItems, Mapping[] mappingCollection) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); WindowsShortcut windowsShortcut; List<(string, DateTime[])> directoriesAndDateTimes; List collection; - (directoriesAndDateTimes, collection) = GetCollectionForSaveShortcutsForOutputResolutions(personKeyToIds, filteredItems, mappingCollection); + (directoriesAndDateTimes, collection) = GetCollectionForSaveShortcutsForOutputResolutionsDuringMapLogic(personKeyToIds, filteredItems, mappingCollection); string[] directories = (from l in collection select l.Directory).Distinct().ToArray(); foreach (string directory in directories) { @@ -1258,15 +1267,16 @@ public class MapLogic : Shared.Models.Methods.IMapLogic if (!Directory.Exists(directory)) _ = Directory.CreateDirectory(directory); } - foreach (SaveShortcutsForOutputResolutions saveShortcutsForOutputResolutions in collection) + foreach (SaveShortcutsForOutputResolutions s in collection) { - if (File.Exists(saveShortcutsForOutputResolutions.FileName)) + if (File.Exists(s.FileName)) continue; try { - windowsShortcut = new() { Path = saveShortcutsForOutputResolutions.FullName, Description = saveShortcutsForOutputResolutions.Description }; - windowsShortcut.Save(saveShortcutsForOutputResolutions.FileName); + windowsShortcut = new() { Path = s.FullName, Description = s.Description }; + windowsShortcut.Save(s.FileName); windowsShortcut.Dispose(); + File.SetLastWriteTime(s.FileName, s.DateTime); } catch (Exception) { } diff --git a/Rename/Models/AppSettings.cs b/Rename/Models/AppSettings.cs index dd67091..1fc5784 100644 --- a/Rename/Models/AppSettings.cs +++ b/Rename/Models/AppSettings.cs @@ -10,15 +10,22 @@ public class AppSettings public string CopyTo { init; get; } public string ComparePathsFile { init; get; } public int MaxDegreeOfParallelism { init; get; } + public int MaxMinutesDelta { init; get; } public string WorkingDirectoryName { init; get; } [JsonConstructor] - public AppSettings(string company, string copyTo, string comparePathsFile, int maxDegreeOfParallelism, string workingDirectoryName) + public AppSettings(string company, + string copyTo, + string comparePathsFile, + int maxDegreeOfParallelism, + int maxMinutesDelta, + string workingDirectoryName) { Company = company; CopyTo = copyTo; ComparePathsFile = comparePathsFile; MaxDegreeOfParallelism = maxDegreeOfParallelism; + MaxMinutesDelta = maxMinutesDelta; WorkingDirectoryName = workingDirectoryName; } diff --git a/Rename/Models/Binder/AppSettings.cs b/Rename/Models/Binder/AppSettings.cs index 67c81c0..3a7d89c 100644 --- a/Rename/Models/Binder/AppSettings.cs +++ b/Rename/Models/Binder/AppSettings.cs @@ -12,6 +12,7 @@ public class AppSettings public string CopyTo { get; set; } public string ComparePathsFile { get; set; } public int? MaxDegreeOfParallelism { get; set; } + public int? MaxMinutesDelta { get; set; } public string WorkingDirectoryName { get; set; } #nullable restore @@ -27,11 +28,14 @@ public class AppSettings Models.AppSettings result; if (appSettings?.MaxDegreeOfParallelism is null) throw new NullReferenceException(nameof(appSettings.MaxDegreeOfParallelism)); + if (appSettings?.MaxMinutesDelta is null) + throw new NullReferenceException(nameof(appSettings.MaxMinutesDelta)); result = new( appSettings.Company, appSettings.CopyTo, appSettings.ComparePathsFile, appSettings.MaxDegreeOfParallelism.Value, + appSettings.MaxMinutesDelta.Value, appSettings.WorkingDirectoryName ); return result; diff --git a/Rename/Rename.cs b/Rename/Rename.cs index 3c31d86..dd513f1 100644 --- a/Rename/Rename.cs +++ b/Rename/Rename.cs @@ -176,7 +176,7 @@ public class Rename dateTime = Metadata.Models.Stateless.Methods.IMetadata.GetMinimumDateTime(dateTimes, year, directories); timeSpan = new TimeSpan(int.MaxValue); } - if (dateTime is not null && string.IsNullOrEmpty(_AppSettings.CopyTo) && timeSpan.TotalMinutes > 2) + if (dateTime is not null && string.IsNullOrEmpty(_AppSettings.CopyTo) && timeSpan.TotalMinutes > _AppSettings.MaxMinutesDelta) { checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered; checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks}.{fileHolder.Length}{checkFileExtension}"); diff --git a/Rename/appsettings.Development.json b/Rename/appsettings.Development.json index c9bf0bf..b48d3df 100644 --- a/Rename/appsettings.Development.json +++ b/Rename/appsettings.Development.json @@ -1,12 +1,13 @@ { - "ComparePathsFile": "C:/Users/mikep/AppData/Local/PharesApps/Drag-Drop-Explorer/2023_03/638095825580115652.json", - "CopyTo": "", + "ComparePathsFile": "C:/Users/mikep/AppData/Local/PharesApps/Drag-Drop-Explorer/2023_04/638105008748068423.json", + "CopyTo": "L", "Logging": { "LogLevel": { "Log4netProvider": "Debug" } }, "MaxDegreeOfParallelism": 6, + "MaxMinutesDelta": 2, "Serilog": { "MinimumLevel": "Debug" }, diff --git a/Rename/appsettings.json b/Rename/appsettings.json index 6c976dd..14213d0 100644 --- a/Rename/appsettings.json +++ b/Rename/appsettings.json @@ -12,6 +12,7 @@ } }, "MaxDegreeOfParallelism": 6, + "MaxMinutesDelta": 2, "Serilog": { "Using": [ "Serilog.Sinks.Console",