diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index c0c5052..66ebf62 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -130,7 +130,7 @@ public partial class DlibDotNet if (rootResultsDirectory is null) throw new Exception(); Storage storage = new(rootDirectory, rootResultsDirectory, peopleRootDirectory); - personContainers = Shared.Models.Stateless.Methods.IPersonContainer.GetPersonContainers(storage, configuration.PersonBirthdayFormat, _Faces.FileNameExtension); + personContainers = Shared.Models.Stateless.Methods.IPersonContainer.GetPersonContainers(storage, configuration.PersonBirthdayFormat, configuration.JuliePhares, _Faces.FileNameExtension); } if (!isSilent && configuration.TestDistanceResults) { @@ -268,8 +268,8 @@ public partial class DlibDotNet throw new Exception($"One or more {nameof(configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions)} are not in the ValidResolutions list!"); if ((from l in configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions where !configuration.ValidResolutions.Contains(l) select false).Any()) throw new Exception($"One or more {nameof(configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions)} are not in the ValidResolutions list!"); - if ((from l in configuration.SaveShortcutsForOutputResolutions where !configuration.ValidResolutions.Contains(l) select false).Any()) - throw new Exception($"One or more {nameof(configuration.SaveShortcutsForOutputResolutions)} are not in the ValidResolutions list!"); + if ((from l in configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions where !configuration.ValidResolutions.Contains(l) select false).Any()) + throw new Exception($"One or more {nameof(configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions)} are not in the ValidResolutions list!"); if ((from l in configuration.SaveFaceLandmarkForOutputResolutions where !configuration.ValidResolutions.Contains(l) select false).Any()) throw new Exception($"One or more {nameof(configuration.SaveFaceLandmarkForOutputResolutions)} are not in the ValidResolutions list!"); if (configuration.DistanceFactor + configuration.LocationConfidenceFactor != 10) @@ -943,8 +943,8 @@ public partial class DlibDotNet mapLogic.UpdateFromSortingContainersThenSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, useFiltersCounter, sortingContainers, totalNotMapped); if (_Configuration.MappingSaveNotMapped) mapLogic.SaveNotMappedTicks(); - if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) - mapLogic.SaveShortcuts(_Configuration.JuliePhares, mappingCollection); + if (_Configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions.Contains(outputResolution)) + mapLogic.SaveResizedImagesByPersonKeyFormatted(_Configuration.JuliePhares, mappingCollection, totalNotMapped); } private static Container? AreAllSameEndsWith(string argZero, Container[] containers) diff --git a/Instance/Models/Binder/Configuration.cs b/Instance/Models/Binder/Configuration.cs index aec6132..5042d9f 100644 --- a/Instance/Models/Binder/Configuration.cs +++ b/Instance/Models/Binder/Configuration.cs @@ -67,8 +67,8 @@ public class Configuration [Display(Name = "Reverse"), Required] public bool? Reverse { get; set; } [Display(Name = "Save Face Landmark For Output Resolutions"), Required] public string[] SaveFaceLandmarkForOutputResolutions { get; set; } [Display(Name = "Save Full Year Of Random Files"), Required] public bool? SaveFullYearOfRandomFiles { get; set; } + [Display(Name = "Save Shortcuts"), Required] public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { get; set; } [Display(Name = "Save Resized Subfiles"), Required] public bool? SaveResizedSubfiles { get; set; } - [Display(Name = "Save Shortcuts"), Required] public string[] SaveShortcutsForOutputResolutions { get; set; } [Display(Name = "Skip Search"), Required] public bool? SkipSearch { get; set; } [Display(Name = "Sorting Days Delta Tolerance"), Required] public int? SortingDaysDeltaTolerance { get; set; } [Display(Name = "SortingMaximumPerFaceShould be High"), Required] public int? SortingMaximumPerFaceShouldBeHigh { get; set; } @@ -190,10 +190,10 @@ public class Configuration throw new NullReferenceException(nameof(configuration.SaveFaceLandmarkForOutputResolutions)); if (configuration.SaveFullYearOfRandomFiles is null) throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); + if (configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions is null) + configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions = Array.Empty(); if (configuration.SaveResizedSubfiles is null) throw new NullReferenceException(nameof(configuration.SaveResizedSubfiles)); - if (configuration.SaveShortcutsForOutputResolutions is null) - configuration.SaveShortcutsForOutputResolutions = Array.Empty(); if (configuration.SkipSearch is null) throw new NullReferenceException(nameof(configuration.SkipSearch)); if (configuration.SortingDaysDeltaTolerance is null) @@ -214,8 +214,8 @@ public class Configuration configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = Array.Empty(); if (configuration.SaveFaceLandmarkForOutputResolutions is null) configuration.SaveFaceLandmarkForOutputResolutions = Array.Empty(); - if (configuration.SaveShortcutsForOutputResolutions is null) - configuration.SaveShortcutsForOutputResolutions = Array.Empty(); + if (configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions is null) + configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions = Array.Empty(); _ = DateTime.Now.AddDays(-configuration.SortingDaysDeltaTolerance.Value); result = new(configuration.PropertyConfiguration, configuration.CheckDFaceAndUpWriteDates.Value, @@ -274,8 +274,8 @@ public class Configuration configuration.Reverse.Value, configuration.SaveFaceLandmarkForOutputResolutions, configuration.SaveFullYearOfRandomFiles.Value, + configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions, configuration.SaveResizedSubfiles.Value, - configuration.SaveShortcutsForOutputResolutions, configuration.SkipSearch.Value, configuration.SortingDaysDeltaTolerance.Value, configuration.SortingMaximumPerFaceShouldBeHigh.Value, diff --git a/Instance/Models/Configuration.cs b/Instance/Models/Configuration.cs index 6977653..bfefe80 100644 --- a/Instance/Models/Configuration.cs +++ b/Instance/Models/Configuration.cs @@ -65,8 +65,8 @@ public class Configuration public bool Reverse { init; get; } public string[] SaveFaceLandmarkForOutputResolutions { init; get; } public bool SaveFullYearOfRandomFiles { init; get; } + public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { init; get; } public bool SaveResizedSubfiles { init; get; } - public string[] SaveShortcutsForOutputResolutions { init; get; } public bool SkipSearch { init; get; } public int SortingDaysDeltaTolerance { init; get; } public int SortingMaximumPerFaceShouldBeHigh { init; get; } @@ -133,8 +133,8 @@ public class Configuration bool reverse, string[] saveFaceLandmarkForOutputResolutions, bool saveFullYearOfRandomFiles, + string[] saveResizedImagesByPersonKeyFormattedForOutputResolutions, bool saveResizedSubfiles, - string[] saveShortcutsForOutputResolutions, bool skipSearch, int sortingDaysDeltaTolerance, int sortingMaximumPerFaceShouldBeHigh, @@ -200,8 +200,8 @@ public class Configuration Reverse = reverse; SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions; SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles; + SaveResizedImagesByPersonKeyFormattedForOutputResolutions = saveResizedImagesByPersonKeyFormattedForOutputResolutions; SaveResizedSubfiles = saveResizedSubfiles; - SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions; SkipSearch = skipSearch; SortingDaysDeltaTolerance = sortingDaysDeltaTolerance; SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh; diff --git a/Instance/Models/_G2_Identify.cs b/Instance/Models/_G2_Identify.cs index e1413ae..099fddf 100644 --- a/Instance/Models/_G2_Identify.cs +++ b/Instance/Models/_G2_Identify.cs @@ -93,8 +93,9 @@ public class G2_Identify : Shared.Models.Properties.IIdentify, IIdentify string rootResultsDirectory = Path.GetDirectoryName(Path.GetDirectoryName(peopleRootDirectory)); if (rootResultsDirectory is null) throw new Exception(); + string[] verifyPersonKeyFormattedCollection = Array.Empty(); Storage storage = new(rootDirectory, rootResultsDirectory, peopleRootDirectory); - PersonContainer[] personContainers = Shared.Models.Stateless.Methods.IPersonContainer.GetPersonContainers(storage, _Configuration.PersonBirthdayFormat, facesFileNameExtension); + PersonContainer[] personContainers = Shared.Models.Stateless.Methods.IPersonContainer.GetPersonContainers(storage, _Configuration.PersonBirthdayFormat, verifyPersonKeyFormattedCollection, facesFileNameExtension); string[] peopleBirthDates = (from l in personContainers select Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, l.Person.Birthday)).ToArray(); Dictionary sourceKeyValuePairs = JsonSerializer.Deserialize>(json); foreach (KeyValuePair keyValuePair in sourceKeyValuePairs) diff --git a/Instance/appsettings.Development.json b/Instance/appsettings.Development.json index a98d605..a0988d2 100644 --- a/Instance/appsettings.Development.json +++ b/Instance/appsettings.Development.json @@ -201,7 +201,7 @@ "176 x 176", "256 x 256" ], - "SaveShortcutsForOutputResolutions": [ + "SaveResizedImagesByPersonKeyFormattedForOutputResolutions": [ ], "ValidImageFormatExtensions": [ ".bmp", diff --git a/Instance/appsettings.Staging.json b/Instance/appsettings.Staging.json index bdcfde6..97c0ab0 100644 --- a/Instance/appsettings.Staging.json +++ b/Instance/appsettings.Staging.json @@ -136,7 +136,7 @@ "176 x 176", "256 x 256" ], - "SaveShortcutsForOutputResolutions": [ + "SaveResizedImagesByPersonKeyFormattedForOutputResolutions": [ "1920 x 1080" ], "ValidImageFormatExtensions": [ diff --git a/Instance/appsettings.json b/Instance/appsettings.json index 806b88d..f82653e 100644 --- a/Instance/appsettings.json +++ b/Instance/appsettings.json @@ -200,7 +200,7 @@ "176 x 176", "256 x 256" ], - "SaveShortcutsForOutputResolutions": [ + "SaveResizedImagesByPersonKeyFormattedForOutputResolutions": [ "1920 x 1080" ], "ValidImageFormatExtensions": [ diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index 0bd377c..50ddd12 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -167,9 +167,9 @@ public class MapLogic using ProgressBar progressBar = new(saveContainers.Count, message, options); foreach (SaveContainer saveContainer in saveContainers) { - progressBar.Tick(); if (string.IsNullOrEmpty(saveContainer.Directory) || string.IsNullOrEmpty(saveContainer.CheckFile) || saveContainer.FaceFileHolder is null) continue; + progressBar.Tick(); if (!saveContainer.FaceFileHolder.Exists && saveContainer.ResizedFileHolder is not null && saveContainer.ResizedFileHolder.Exists) { checkFile = saveContainer.CheckFile; @@ -200,6 +200,16 @@ public class MapLogic File.Copy(sourceFile, checkFile); } foreach (SaveContainer saveContainer in saveContainers) + { + if (string.IsNullOrEmpty(saveContainer.Directory) || string.IsNullOrEmpty(saveContainer.CheckFile) || saveContainer.ResizedFileHolder is null || !saveContainer.ResizedFileHolder.Exists) + continue; + checkFile = saveContainer.CheckFile; + sourceFile = saveContainer.ResizedFileHolder.FullName; + if (File.Exists(checkFile)) + continue; + File.Copy(sourceFile, checkFile); + } + foreach (SaveContainer saveContainer in saveContainers) { if (string.IsNullOrEmpty(saveContainer.ShortcutFile) || saveContainer.ResizedFileHolder is null || !saveContainer.ResizedFileHolder.Exists) continue; @@ -598,8 +608,8 @@ public class MapLogic int? normalizedPixelPercentage; WindowsShortcut windowsShortcut; string by = nameof(IMapLogic.ManualCopy); - Dictionary? keyValuePairs; Dictionary? normalizedPixelPercentageToMapping; + Dictionary? normalizedPixelPercentageToPeronContainerCollection; string successfull = $"_ {nameof(IMapLogic.ManualCopy).Humanize(LetterCasing.Title)} Successfull"; foreach (KeyValuePair keyValuePair in _PersonKeyToPersonContainer) { @@ -613,11 +623,6 @@ public class MapLogic (id, normalizedPixelPercentage, _) = IMapping.GetReversedDeterministicHashCodeKey(_Configuration.FacesFileNameExtension, personDisplayDirectoryAllFile); if (id is null || normalizedPixelPercentage is null) continue; - if (_IdThenNormalizedPixelPercentageToPersonContainers.TryGetValue(id.Value, out keyValuePairs)) - { - if (keyValuePairs.ContainsKey(normalizedPixelPercentage.Value)) - continue; - } fileInfo = new(personDisplayDirectoryAllFile); if (!fileInfo.Exists) continue; @@ -641,17 +646,23 @@ public class MapLogic facesDirectory = Path.Combine($"{dFacesContentDirectory}{directoryName}", mapping.MappingFromItem.ImageFileHolder.NameWithoutExtension); faceFileName = $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}"; checkFile = Path.Combine(directory, fileInfo.Name); - if (!Directory.Exists(personDirectory)) - _ = Directory.CreateDirectory(personDirectory); - if (!File.Exists(checkFile)) - File.Copy(personDisplayDirectoryAllFile, checkFile); + if (!_IdThenNormalizedPixelPercentageToPersonContainers.TryGetValue(id.Value, out normalizedPixelPercentageToPeronContainerCollection) || !normalizedPixelPercentageToPeronContainerCollection.ContainsKey(normalizedPixelPercentage.Value)) + { + if (!Directory.Exists(personDirectory)) + _ = Directory.CreateDirectory(personDirectory); + if (!File.Exists(checkFile)) + File.Copy(personDisplayDirectoryAllFile, checkFile); + } if (personDisplayDirectoryAllFile.Contains(successfull)) continue; directoryName = Path.Combine(personDisplayDirectory, successfull); if (!Directory.Exists(directoryName)) _ = Directory.CreateDirectory(directoryName); checkFile = Path.Combine(directoryName, personDisplayFileName); - File.Move(personDisplayDirectoryAllFile, checkFile); + if (File.Exists(checkFile)) + File.Delete(personDisplayDirectoryAllFile); + else + File.Move(personDisplayDirectoryAllFile, checkFile); faceFile = Path.Combine(facesDirectory, faceFileName); if (!File.Exists(faceFile)) continue; @@ -693,113 +704,59 @@ public class MapLogic SaveContainers(totalNotMapped, updated, saveContainers); } - private List<(Mapping, List<(string?, string, string?, string?, string)>)> GetCollection(Mapping[] mappingCollection) + private (FileHolder, string, string, string, string)[] GetCollection(Mapping[] mappingCollection) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); - List<(Mapping, List<(string?, string, string?, string?, string)>)> results = new(); - int years; + (FileHolder, string, string, string, string)[] results; + string checkFile; string directory; - TimeSpan? timeSpan; - string? copyFileName; - string? relativePath; - string? copyDirectory; - string isWrongYearFlag; - string shortcutFileName; - string subDirectoryName; + string? directoryName; + string personDirectory; string personKeyFormatted; - DateTime dateTime = DateTime.Now; - PersonContainer[] personContainers; - Dictionary? idToPersonContainers; - List<(string?, string, string?, string?, string)> collection; + List<(FileHolder ResizedFileHolder, string PersonKeyFormatted, string CheckFile, string Directory, string PersonDirectory)> collection = new(); foreach (Mapping mapping in mappingCollection) { - collection = new(); - copyFileName = null; - copyDirectory = null; - relativePath = Path.GetDirectoryName($"C:{mapping.MappingFromItem.RelativePath}"); - if (string.IsNullOrEmpty(relativePath) || relativePath.Length < 3) + directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath); + if (directoryName is null) + throw new NotSupportedException(); + if (mapping.By is null or IMapLogic.Sorting) continue; - if (!_IdThenNormalizedPixelPercentageToPersonContainers.TryGetValue(mapping.MappingFromItem.Id, out idToPersonContainers)) - { - directory = Path.Combine(_EDistanceContentTicksDirectory, $"Unnamed{relativePath[2..]}"); - shortcutFileName = Path.Combine(directory, $"{mapping.MappingFromItem.Id}.lnk"); - collection.Add(new(null, directory, copyDirectory, copyFileName, shortcutFileName)); - } - else - { - if (!idToPersonContainers.ContainsKey(mapping.MappingFromLocation.NormalizedPixelPercentage)) - continue; - isWrongYearFlag = IItem.GetWrongYearFlag(mapping.MappingFromItem.IsWrongYear); - subDirectoryName = $"{isWrongYearFlag}{mapping.MappingFromItem.MinimumDateTime:yyyy}"; - personContainers = idToPersonContainers[mapping.MappingFromLocation.NormalizedPixelPercentage]; - foreach (PersonContainer personContainer in personContainers) - { - if (personContainers.Length != 1) - break; - if (personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any()) - continue; - foreach (PersonBirthday personBirthday in personContainer.Birthdays) - { - timeSpan = IPersonBirthday.GetTimeSpan(mapping.MappingFromItem.MinimumDateTime, mapping.MappingFromItem.IsWrongYear, personBirthday); - if (timeSpan.HasValue) - { - if (timeSpan.Value.Ticks < 0) - subDirectoryName = "!---"; - else - { - (years, _) = IPersonBirthday.GetAge(dateTime, personBirthday); - subDirectoryName = $"^{years:000}"; - } - } - personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personBirthday); - directory = Path.Combine(_EDistanceContentTicksDirectory, "Shortcuts", personKeyFormatted, subDirectoryName); - copyDirectory = Path.Combine(_EDistanceContentTicksDirectory, "Images", personKeyFormatted, subDirectoryName); - copyFileName = Path.Combine(copyDirectory, $"{mapping.MappingFromItem.Id}{mapping.MappingFromItem.ResizedFileHolder.ExtensionLowered}"); - shortcutFileName = Path.Combine(directory, $"{mapping.MappingFromItem.Id}.lnk"); - collection.Add(new(personKeyFormatted, directory, copyDirectory, copyFileName, shortcutFileName)); - } - } - if (!collection.Any()) - { - copyFileName = null; - copyDirectory = null; - directory = Path.Combine(_EDistanceContentTicksDirectory, $"Not Supported{relativePath[2..]}", subDirectoryName); - shortcutFileName = Path.Combine(directory, $"{mapping.MappingFromItem.Id}.lnk"); - collection.Add(new(null, directory, copyDirectory, copyFileName, shortcutFileName)); - } - } - results.Add(new(mapping, collection)); + if (mapping.MappingFromPerson is null) + continue; + if (string.IsNullOrEmpty(mapping.MappingFromPerson.SegmentB)) + throw new NotSupportedException(); + if (string.IsNullOrEmpty(mapping.MappingFromPerson.DisplayDirectoryName)) + throw new NotSupportedException(); + personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday); + directory = Path.Combine(_EDistanceContentTicksDirectory, "Images", personKeyFormatted); + personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName); + checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}"); + collection.Add(new(mapping.MappingFromItem.ResizedFileHolder, personKeyFormatted, checkFile, directory, personDirectory)); } + results = (from l in collection orderby l.PersonKeyFormatted descending select l).ToArray(); return results; } - public void SaveShortcuts(string[] juliePhares, Mapping[] mappingCollection) + public void SaveResizedImagesByPersonKeyFormatted(string[] juliePhares, Mapping[] mappingCollection, int totalNotMapped) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); - List<(Mapping, List<(string?, string, string?, string?, string)>)> facesToCollection = GetCollection(mappingCollection); - foreach ((Mapping mapping, List<(string? PersonKeyFormatted, string, string?, string?, string)> collection) in facesToCollection) + List saveContainers = new(); + SaveContainer? saveContainer; + (FileHolder, string, string, string, string)[] collection = GetCollection(mappingCollection); + foreach ((FileHolder resizedFileHolder, string personKeyFormatted, string checkFile, string directory, string personDirectory) in collection) { - if (collection.Any(l => l.PersonKeyFormatted is not null and "1501-04-10_00")) + if (personKeyFormatted == "1501-04-10_00") continue; - foreach ((string? personKeyFormatted, string directory, string? copyDirectory, string? copyFileName, string _) in collection) - { - if (personKeyFormatted is null) - continue; - if (!Directory.Exists(directory)) - _ = Directory.CreateDirectory(directory); - if (string.IsNullOrEmpty(copyDirectory) || string.IsNullOrEmpty(copyFileName)) - continue; - if (!juliePhares.Contains(personKeyFormatted)) - continue; - if (!Directory.Exists(copyDirectory)) - _ = Directory.CreateDirectory(copyDirectory); - if (!File.Exists(copyFileName)) - File.Copy(mapping.MappingFromItem.ResizedFileHolder.FullName, copyFileName); - break; - } + if (!juliePhares.Contains(personKeyFormatted)) + continue; + saveContainer = new(personDirectory); + saveContainers.Add(saveContainer); + saveContainer = new(resizedFileHolder, checkFile, directory); + saveContainers.Add(saveContainer); } + SaveContainers(totalNotMapped, null, saveContainers); } } \ No newline at end of file diff --git a/Shared/Models/SaveContainer.cs b/Shared/Models/SaveContainer.cs index 8a21c76..699ec4d 100644 --- a/Shared/Models/SaveContainer.cs +++ b/Shared/Models/SaveContainer.cs @@ -30,10 +30,14 @@ public class SaveContainer this(string.Empty, directory, null, null, null, null, string.Empty) { } - public SaveContainer(string checkFile, string directory, FileHolder? faceFileHolder) : + public SaveContainer(string checkFile, string directory, FileHolder faceFileHolder) : this(checkFile, directory, faceFileHolder, null, null, null, string.Empty) { } + public SaveContainer(FileHolder resizedFileHolder, string checkFile, string directory) : + this(checkFile, directory, null, null, null, resizedFileHolder, string.Empty) + { } + public override string ToString() { string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); diff --git a/Shared/Models/Stateless/Methods/IPersonContainer.cs b/Shared/Models/Stateless/Methods/IPersonContainer.cs index 9c39bdd..c71ceae 100644 --- a/Shared/Models/Stateless/Methods/IPersonContainer.cs +++ b/Shared/Models/Stateless/Methods/IPersonContainer.cs @@ -5,10 +5,10 @@ public interface IPersonContainer // ... - Models.PersonContainer[] TestStatic_GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, string facesFileNameExtension) => - GetPersonContainers(storage, personBirthdayFormat, facesFileNameExtension); - static Models.PersonContainer[] GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, string facesFileNameExtension) => - PersonContainer.GetPersonContainers(storage, personBirthdayFormat, facesFileNameExtension); + Models.PersonContainer[] TestStatic_GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, string[] verifyPersonKeyFormattedCollection, string facesFileNameExtension) => + GetPersonContainers(storage, personBirthdayFormat, verifyPersonKeyFormattedCollection, facesFileNameExtension); + static Models.PersonContainer[] GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, string[] verifyPersonKeyFormattedCollection, string facesFileNameExtension) => + PersonContainer.GetPersonContainers(storage, personBirthdayFormat, verifyPersonKeyFormattedCollection, facesFileNameExtension); List<(long?, string)> TestStatic_GetDisplay(string personBirthdayFormat, Models.PersonContainer personContainer) => GetDisplay(personBirthdayFormat, personContainer); diff --git a/Shared/Models/Stateless/Methods/PersonContainer.cs b/Shared/Models/Stateless/Methods/PersonContainer.cs index 8cb8e3a..7134040 100644 --- a/Shared/Models/Stateless/Methods/PersonContainer.cs +++ b/Shared/Models/Stateless/Methods/PersonContainer.cs @@ -155,7 +155,28 @@ internal abstract class PersonContainer return results; } - internal static Models.PersonContainer[] GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, string facesFileNameExtension) + private static void Verify(string personBirthdayFormat, string[] verifyPersonKeyFormattedCollection, Models.PersonContainer[] results) + { + const int zero = 0; + string personKeyFormatted; + List collection = new(); + Models.PersonBirthday personBirthday; + foreach (Models.PersonContainer personContainer in results) + { + if (personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any()) + continue; + personBirthday = personContainer.Birthdays[zero]; + personKeyFormatted = IPersonBirthday.GetFormatted(personBirthdayFormat, personBirthday); + if (!verifyPersonKeyFormattedCollection.Contains(personKeyFormatted)) + continue; + if (personContainer.DisplayDirectoryAllFiles.Any(l => !l.Contains('^'))) + collection.Add(personContainer.DisplayDirectoryName); + } + if (collection.Any()) + throw new NotSupportedException($"A person in the verify collection has a approximate birthday!{Environment.NewLine}{string.Join(Environment.NewLine, collection.ToArray())}"); + } + + internal static Models.PersonContainer[] GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, string[] verifyPersonKeyFormattedCollection, string facesFileNameExtension) { Models.PersonContainer[] results; char[] chars = IAge.GetChars(); @@ -174,6 +195,7 @@ internal abstract class PersonContainer results = Array.Empty(); else results = GetPersonContainersGroups(personBirthdayFormat, facesFileNameExtension, chars, groupDirectories); + Verify(personBirthdayFormat, verifyPersonKeyFormattedCollection, results); return results; } diff --git a/Tests/Models/Binder/Configuration.cs b/Tests/Models/Binder/Configuration.cs index 6487fa5..4530927 100644 --- a/Tests/Models/Binder/Configuration.cs +++ b/Tests/Models/Binder/Configuration.cs @@ -48,8 +48,8 @@ public class Configuration [Display(Name = "Reverse"), Required] public bool? Reverse { get; set; } [Display(Name = "Save Face Landmark For Output Resolutions"), Required] public string[] SaveFaceLandmarkForOutputResolutions { get; set; } [Display(Name = "Save Full Year Of Random Files"), Required] public bool? SaveFullYearOfRandomFiles { get; set; } + [Display(Name = "Save Shortcuts"), Required] public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { get; set; } [Display(Name = "Save Resized Subfiles"), Required] public bool? SaveResizedSubfiles { get; set; } - [Display(Name = "Save Shortcuts"), Required] public string[] SaveShortcutsForOutputResolutions { get; set; } [Display(Name = "Skip Search"), Required] public bool? SkipSearch { get; set; } [Display(Name = "Test Distance Results"), Required] public bool? TestDistanceResults { get; set; } [Display(Name = "Valid Resolutions"), Required] public string[] ValidResolutions { get; set; } @@ -137,8 +137,8 @@ public class Configuration configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = Array.Empty(); if (configuration.SaveFaceLandmarkForOutputResolutions is null) configuration.SaveFaceLandmarkForOutputResolutions = Array.Empty(); - if (configuration.SaveShortcutsForOutputResolutions is null) - configuration.SaveShortcutsForOutputResolutions = Array.Empty(); + if (configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions is null) + configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions = Array.Empty(); result = new(configuration.PropertyConfiguration, configuration.CheckDFaceAndUpWriteDates.Value, configuration.CheckJsonForDistanceResults.Value, @@ -177,8 +177,8 @@ public class Configuration configuration.Reverse.Value, configuration.SaveFaceLandmarkForOutputResolutions, configuration.SaveFullYearOfRandomFiles.Value, + configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions, configuration.SaveResizedSubfiles.Value, - configuration.SaveShortcutsForOutputResolutions, configuration.SkipSearch.Value, configuration.TestDistanceResults.Value, configuration.ValidResolutions); diff --git a/Tests/Models/Configuration.cs b/Tests/Models/Configuration.cs index 11719ff..ec0bed4 100644 --- a/Tests/Models/Configuration.cs +++ b/Tests/Models/Configuration.cs @@ -46,8 +46,8 @@ public class Configuration public bool Reverse { init; get; } public string[] SaveFaceLandmarkForOutputResolutions { init; get; } public bool SaveFullYearOfRandomFiles { init; get; } + public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { init; get; } public bool SaveResizedSubfiles { init; get; } - public string[] SaveShortcutsForOutputResolutions { init; get; } public bool SkipSearch { init; get; } public bool TestDistanceResults { init; get; } public string[] ValidResolutions { init; get; } @@ -91,8 +91,8 @@ public class Configuration bool reverse, string[] saveFaceLandmarkForOutputResolutions, bool saveFullYearOfRandomFiles, + string[] saveResizedImagesByPersonKeyFormattedForOutputResolutions, bool saveResizedSubfiles, - string[] saveShortcutsForOutputResolutions, bool skipSearch, bool testDistanceResults, string[] validResolutions) @@ -135,8 +135,8 @@ public class Configuration Reverse = reverse; SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions; SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles; + SaveResizedImagesByPersonKeyFormattedForOutputResolutions = saveResizedImagesByPersonKeyFormattedForOutputResolutions; SaveResizedSubfiles = saveResizedSubfiles; - SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions; SkipSearch = skipSearch; TestDistanceResults = testDistanceResults; ValidResolutions = validResolutions; diff --git a/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs b/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs index 6ea3a76..899756d 100644 --- a/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs +++ b/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs @@ -67,8 +67,8 @@ public class Configuration [Display(Name = "Reverse"), Required] public bool? Reverse { get; set; } [Display(Name = "Save Face Landmark For Output Resolutions"), Required] public string[] SaveFaceLandmarkForOutputResolutions { get; set; } [Display(Name = "Save Full Year Of Random Files"), Required] public bool? SaveFullYearOfRandomFiles { get; set; } + [Display(Name = "Save Shortcuts"), Required] public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { get; set; } [Display(Name = "Save Resized Subfiles"), Required] public bool? SaveResizedSubfiles { get; set; } - [Display(Name = "Save Shortcuts"), Required] public string[] SaveShortcutsForOutputResolutions { get; set; } [Display(Name = "Skip Search"), Required] public bool? SkipSearch { get; set; } [Display(Name = "Sorting Days Delta Tolerance"), Required] public int? SortingDaysDeltaTolerance { get; set; } [Display(Name = "SortingMaximumPerFaceShould be High"), Required] public int? SortingMaximumPerFaceShouldBeHigh { get; set; } @@ -190,10 +190,10 @@ public class Configuration throw new NullReferenceException(nameof(configuration.SaveFaceLandmarkForOutputResolutions)); if (configuration.SaveFullYearOfRandomFiles is null) throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); + if (configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions is null) + configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions = Array.Empty(); if (configuration.SaveResizedSubfiles is null) throw new NullReferenceException(nameof(configuration.SaveResizedSubfiles)); - if (configuration.SaveShortcutsForOutputResolutions is null) - configuration.SaveShortcutsForOutputResolutions = Array.Empty(); if (configuration.SkipSearch is null) throw new NullReferenceException(nameof(configuration.SkipSearch)); if (configuration.SortingDaysDeltaTolerance is null) @@ -214,8 +214,8 @@ public class Configuration configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = Array.Empty(); if (configuration.SaveFaceLandmarkForOutputResolutions is null) configuration.SaveFaceLandmarkForOutputResolutions = Array.Empty(); - if (configuration.SaveShortcutsForOutputResolutions is null) - configuration.SaveShortcutsForOutputResolutions = Array.Empty(); + if (configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions is null) + configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions = Array.Empty(); _ = DateTime.Now.AddDays(-configuration.SortingDaysDeltaTolerance.Value); result = new(configuration.PropertyConfiguration, configuration.CheckDFaceAndUpWriteDates.Value, @@ -274,8 +274,8 @@ public class Configuration configuration.Reverse.Value, configuration.SaveFaceLandmarkForOutputResolutions, configuration.SaveFullYearOfRandomFiles.Value, + configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions, configuration.SaveResizedSubfiles.Value, - configuration.SaveShortcutsForOutputResolutions, configuration.SkipSearch.Value, configuration.SortingDaysDeltaTolerance.Value, configuration.SortingMaximumPerFaceShouldBeHigh.Value, diff --git a/TestsWithFaceRecognitionDotNet/Models/Configuration.cs b/TestsWithFaceRecognitionDotNet/Models/Configuration.cs index 5a9fc93..8649b04 100644 --- a/TestsWithFaceRecognitionDotNet/Models/Configuration.cs +++ b/TestsWithFaceRecognitionDotNet/Models/Configuration.cs @@ -65,8 +65,8 @@ public class Configuration public bool Reverse { init; get; } public string[] SaveFaceLandmarkForOutputResolutions { init; get; } public bool SaveFullYearOfRandomFiles { init; get; } + public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { init; get; } public bool SaveResizedSubfiles { init; get; } - public string[] SaveShortcutsForOutputResolutions { init; get; } public bool SkipSearch { init; get; } public int SortingDaysDeltaTolerance { init; get; } public int SortingMaximumPerFaceShouldBeHigh { init; get; } @@ -133,8 +133,8 @@ public class Configuration bool reverse, string[] saveFaceLandmarkForOutputResolutions, bool saveFullYearOfRandomFiles, + string[] saveResizedImagesByPersonKeyFormattedForOutputResolutions, bool saveResizedSubfiles, - string[] saveShortcutsForOutputResolutions, bool skipSearch, int sortingDaysDeltaTolerance, int sortingMaximumPerFaceShouldBeHigh, @@ -200,8 +200,8 @@ public class Configuration Reverse = reverse; SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions; SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles; + SaveResizedImagesByPersonKeyFormattedForOutputResolutions = saveResizedImagesByPersonKeyFormattedForOutputResolutions; SaveResizedSubfiles = saveResizedSubfiles; - SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions; SkipSearch = skipSearch; SortingDaysDeltaTolerance = sortingDaysDeltaTolerance; SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh;