From 022f89106a8ccdb16be5a633e4bcb4231f6f528c Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Sun, 9 Oct 2022 17:36:23 -0700 Subject: [PATCH] Save Shortcuts Rev C --- Instance/DlibDotNet.cs | 6 +- Map/Models/MapLogic.cs | 61 ++++++++++++------- Map/Models/Stateless/MapLogic.cs | 5 +- Shared/Models/PersonContainer.cs | 24 ++++---- Shared/Models/Properties/IPersonContainer.cs | 1 + Shared/Models/Stateless/Methods/IAge.cs | 2 +- .../Stateless/Methods/PersonBirthday.cs | 8 +-- .../Stateless/Methods/PersonContainer.cs | 38 ++++++++---- 8 files changed, 91 insertions(+), 54 deletions(-) diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index ff8a9fe..293b7b4 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -872,13 +872,13 @@ public partial class DlibDotNet mapLogicSupport); Dictionary> idToNormalizedPixelPercentageToMapping = MapLogicSupport.GetIdToNormalizedPixelPercentageToFace(mappingCollection); mapLogic.CopyManualFiles(dFacesContentDirectory, idToNormalizedPixelPercentageToMapping); - int totalNotMapped = mapLogic.AddToMapping(mappingCollection); + (Dictionary personKeyToCount, int totalNotMapped) = mapLogic.AddToMapping(mappingCollection); if (_Configuration.MappingSaveMapped) - mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, totalNotMapped); + mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, personKeyToCount, totalNotMapped); if (_Configuration.MappingSaveNotMapped) mapLogic.SaveNotMappedTicks(); if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) - mapLogic.SaveShortcuts(a2PeopleSingletonDirectory, personContainers, filteredItems, mappingCollection); + mapLogic.SaveShortcuts(a2PeopleSingletonDirectory, personContainers, filteredItems, mappingCollection, personKeyToCount); if (_Configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions.Contains(outputResolution)) mapLogic.SaveResizedImagesByPersonKeyFormatted(_Configuration.JLinks, a2PeopleSingletonDirectory, personContainers, mappingCollection, totalNotMapped); MapLogicSupport.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces); diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index 71acf94..e1c6895 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -108,26 +108,28 @@ public class MapLogic return result; } - public int AddToMapping(Mapping[] mappingCollection) + public (Dictionary, int) AddToMapping(Mapping[] mappingCollection) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); int result = 0; + long personKey; const int zero = 0; string mappingSegmentB; int by = IMapLogic.Mapping; PersonBirthday personBirthday; PersonContainer[]? collection; List personContainers = new(); - Dictionary? keyValuePairs; + Dictionary personKeyToCount = new(); + Dictionary? normalizedPixelPercentageToPersonContainers; foreach (Mapping mapping in mappingCollection) { personContainers.Clear(); - if (!_IdThenNormalizedPixelPercentageToPersonContainers.TryGetValue(mapping.MappingFromItem.Id, out keyValuePairs)) + if (!_IdThenNormalizedPixelPercentageToPersonContainers.TryGetValue(mapping.MappingFromItem.Id, out normalizedPixelPercentageToPersonContainers)) result += 1; else { - if (!keyValuePairs.TryGetValue(mapping.MappingFromLocation.NormalizedPixelPercentage, out collection)) + if (!normalizedPixelPercentageToPersonContainers.TryGetValue(mapping.MappingFromLocation.NormalizedPixelPercentage, out collection)) result += 1; else personContainers.AddRange(collection); @@ -137,11 +139,15 @@ public class MapLogic if (personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any()) continue; personBirthday = personContainer.Birthdays[zero]; + personKey = personBirthday.Value.Ticks; + if (!personKeyToCount.ContainsKey(personKey)) + personKeyToCount.Add(personKey, 0); + personKeyToCount[personKey] += 1; mappingSegmentB = Stateless.MapLogic.GetMappingSegmentB(_Ticks, personBirthday, personContainer.ApproximateYears, mapping.MappingFromItem); mapping.UpdateMappingFromPerson(personContainer.ApproximateYears, by, personContainer.DisplayDirectoryName, personBirthday, mappingSegmentB); } } - return result; + return new(personKeyToCount, result); } private void SaveContainers(int totalNotMapped, int? updated, List saveContainers) @@ -307,12 +313,13 @@ public class MapLogic return result; } - private List GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, Mapping[] mappingCollection, Dictionary> idToNormalizedPixelPercentageToMapping, int? useFiltersCounter, bool saveMapped) + private List GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, Mapping[] mappingCollection, Dictionary> idToNormalizedPixelPercentageToMapping, Dictionary personKeyToCount, int? useFiltersCounter, bool saveMapped) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); List results = new(); string by; + long personKey; bool isByMapping; bool isBySorting; string checkFile; @@ -350,10 +357,16 @@ public class MapLogic throw new NotSupportedException(); if (string.IsNullOrEmpty(mapping.MappingFromPerson.DisplayDirectoryName)) throw new NotSupportedException(); + personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks; personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday); directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, mapping.MappingFromPerson.SegmentB); if (isByMapping) - personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName); + { + if (!personKeyToCount.ContainsKey(personKey)) + personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName); + else + personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName, $"{personKeyToCount[personKey]} Face(s)"); + } else if (mapping.By is not null) personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName, "lnk"); else @@ -401,18 +414,19 @@ public class MapLogic public void UpdateFromSortingContainersThenSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, Mapping[] mappingCollection, Dictionary> idToNormalizedPixelPercentageToMapping, int? useFiltersCounter, SortingContainer[] sortingContainers, int totalNotMapped) { int updated = UpdateFromSortingContainers(sortingContainers); - List saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, useFiltersCounter, saveMapped: false); + Dictionary personKeyToCount = new(); + List saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, personKeyToCount, useFiltersCounter, saveMapped: false); SaveContainers(totalNotMapped, updated, saveContainers); } - public void SaveMapped(string dFacesContentDirectory, string d2FacePartsContentDirectory, Mapping[] mappingCollection, Dictionary> idToNormalizedPixelPercentageToMapping, int totalNotMapped) + public void SaveMapped(string dFacesContentDirectory, string d2FacePartsContentDirectory, Mapping[] mappingCollection, Dictionary> idToNormalizedPixelPercentageToMapping, Dictionary personKeyToCount, int totalNotMapped) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); int? updated = null; int? useFiltersCounter = null; string mappingDirectory = Path.Combine(_EDistanceContentTicksDirectory, nameof(IMapLogic.Mapping)); - List saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, useFiltersCounter, saveMapped: true); + List saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, personKeyToCount, useFiltersCounter, saveMapped: true); SaveContainers(totalNotMapped, updated, saveContainers); if (!string.IsNullOrEmpty(_EDistanceContentTicksDirectory) && Directory.Exists(mappingDirectory)) Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory); @@ -856,28 +870,29 @@ public class MapLogic SaveContainers(totalNotMapped, null, saveContainers); } - private List<(string, string, string)> GetCollectionForSaveShortcuts(string[] jLinks, string a2PeopleSingletonDirectory, PersonContainer[] personContainers, List filteredItems, Mapping[] mappingCollection) + private List<(string, string, string, string)> GetCollectionForSaveShortcuts(string[] jLinks, string a2PeopleSingletonDirectory, PersonContainer[] personContainers, List filteredItems, Mapping[] mappingCollection, Dictionary personKeyToCount) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); + long personKey; string fileName; string directory; string? directoryName; string personDirectory; string personKeyFormatted; - List<(string, string Directory, string)> collection = new(); + List<(string, string, string, string)> collection = new(); string[] personKeyFormattedCollection = GetPersonKeyFormattedCollection(jLinks, a2PeopleSingletonDirectory, personContainers); foreach (Item item in filteredItems) { directoryName = Path.GetDirectoryName(item.RelativePath); if (directoryName is null) throw new NotSupportedException(); - if (item.ResizedFileHolder?.DirectoryName is null || !item.ResizedFileHolder.Exists) + if (item.Property?.Id is null || item.ResizedFileHolder?.DirectoryName is null || !item.ResizedFileHolder.Exists) continue; directory = Path.Combine(item.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", _PropertyConfiguration.ResultAllInOne); personDirectory = Path.Combine(directory, "No Faces"); fileName = Path.Combine(personDirectory, $"{item.ResizedFileHolder.Name}.lnk"); - collection.Add(new(item.ResizedFileHolder.FullName, personDirectory, fileName)); + collection.Add(new(item.ResizedFileHolder.FullName, personDirectory, fileName, item.Property.Id.Value.ToString())); } foreach (Mapping mapping in mappingCollection) { @@ -891,7 +906,7 @@ public class MapLogic directory = Path.Combine(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", _PropertyConfiguration.ResultAllInOne); personDirectory = Path.Combine(directory, "Unknown"); fileName = Path.Combine(personDirectory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk"); - collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, fileName)); + collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); } else { @@ -902,22 +917,26 @@ public class MapLogic personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday); if (!personKeyFormattedCollection.Contains(personKeyFormatted)) continue; + personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks; directory = Path.Combine(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", personKeyFormatted); - personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName); + if (!personKeyToCount.ContainsKey(personKey)) + personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName); + else + personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName, $"{personKeyToCount[personKey]} Face(s)"); fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk"); - collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, fileName)); + collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); } } return collection; } - public void SaveShortcuts(string a2PeopleSingletonDirectory, PersonContainer[] personContainers, List filteredItems, Mapping[] mappingCollection) + public void SaveShortcuts(string a2PeopleSingletonDirectory, PersonContainer[] personContainers, List filteredItems, Mapping[] mappingCollection, Dictionary personKeyToCount) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); WindowsShortcut windowsShortcut; string[] jLinks = new string[] { "All" }; - List<(string, string Directory, string)> collection = GetCollectionForSaveShortcuts(jLinks, a2PeopleSingletonDirectory, personContainers, filteredItems, mappingCollection); + List<(string, string Directory, string, string)> collection = GetCollectionForSaveShortcuts(jLinks, a2PeopleSingletonDirectory, personContainers, filteredItems, mappingCollection, personKeyToCount); string[] directories = (from l in collection select l.Directory).Distinct().ToArray(); foreach (string directory in directories) { @@ -926,13 +945,13 @@ public class MapLogic if (!Directory.Exists(directory)) _ = Directory.CreateDirectory(directory); } - foreach ((string fullName, string directory, string fileName) in collection) + foreach ((string fullName, string directory, string fileName, string description) in collection) { if (File.Exists(fileName)) continue; try { - windowsShortcut = new() { Path = fullName }; + windowsShortcut = new() { Path = fullName, Description = description }; windowsShortcut.Save(fileName); windowsShortcut.Dispose(); } diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index 8341449..6f45490 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -28,7 +28,7 @@ internal abstract class MapLogic personKeys.Add(personKey); personBirthday = IPersonBirthday.GetPersonBirthday(personKey); person = IPerson.GetPerson(configuration.MappingDefaultName, personKey, personBirthday); - personContainer = new(approximateYears, person, new PersonBirthday[] { personBirthday }, personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey); + personContainer = new(approximateYears, person, new PersonBirthday[] { personBirthday }, personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey, partialKeyFormatted: null); results.Add(personContainer); } return results; @@ -207,7 +207,10 @@ internal abstract class MapLogic if (string.IsNullOrEmpty(eDistanceContentDirectory)) ticksDirectories = Array.Empty(); else + { + _ = IPath.DeleteEmptyDirectories(eDistanceContentDirectory); ticksDirectories = Directory.GetDirectories(eDistanceContentDirectory, "*", SearchOption.TopDirectoryOnly); + } string message = $") {ticksDirectories.Length:000} collect from and clean ticks Director(ies) - A - {totalSeconds} total second(s)"; foreach (PersonContainer personContainer in personContainers) { diff --git a/Shared/Models/PersonContainer.cs b/Shared/Models/PersonContainer.cs index 8fd5863..ca7d673 100644 --- a/Shared/Models/PersonContainer.cs +++ b/Shared/Models/PersonContainer.cs @@ -12,28 +12,30 @@ public class PersonContainer : Properties.IPersonContainer public string[] DisplayDirectoryAllFiles { init; get; } public string DisplayDirectoryName { init; get; } public long? Key { init; get; } + public string? PartialKeyFormatted { init; get; } [JsonConstructor] - public PersonContainer(int? approximateYears, Person? person, PersonBirthday[]? personBirthdays, string[] personDisplayDirectoryAllFiles, string personDisplayDirectoryName, long? personKey) + public PersonContainer(int? approximateYears, Person? person, PersonBirthday[]? birthdays, string[] displayDirectoryAllFiles, string displayDirectoryName, long? key, string? partialKeyFormatted) { ApproximateYears = approximateYears; Person = person; - Birthdays = personBirthdays; - DisplayDirectoryAllFiles = personDisplayDirectoryAllFiles; - DisplayDirectoryName = personDisplayDirectoryName; - Key = personKey; + Birthdays = birthdays; + DisplayDirectoryAllFiles = displayDirectoryAllFiles; + DisplayDirectoryName = displayDirectoryName; + Key = key; + PartialKeyFormatted = partialKeyFormatted; } - public PersonContainer(int? approximateYears, string[] personDisplayDirectoryAllFiles, string personDisplayDirectoryName) : - this(approximateYears, null, null, personDisplayDirectoryAllFiles, personDisplayDirectoryName, null) + public PersonContainer(int? approximateYears, string[] displayDirectoryAllFiles, string displayDirectoryName) : + this(approximateYears, null, null, displayDirectoryAllFiles, displayDirectoryName, null, null) { } - public PersonContainer(int? approximateYears, PersonBirthday personBirthday, string personDisplayDirectoryName, long personKey) : - this(approximateYears, null, new PersonBirthday[] { personBirthday }, Array.Empty(), personDisplayDirectoryName, personKey) + public PersonContainer(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) : + this(approximateYears, null, new PersonBirthday[] { birthdays }, Array.Empty(), displayDirectoryName, key, null) { } - public PersonContainer(PersonBirthday personBirthday, string personDisplayDirectoryName) : - this(Stateless.Methods.IAge.GetApproximateYears(personDisplayDirectoryName), Stateless.Methods.IPerson.GetPerson(personDisplayDirectoryName, personBirthday.Value.Ticks, personBirthday), new PersonBirthday[] { personBirthday }, Array.Empty(), personDisplayDirectoryName, personBirthday.Value.Ticks) + public PersonContainer(PersonBirthday birthday, string displayDirectoryName) : + this(Stateless.Methods.IAge.GetApproximateYears(displayDirectoryName), Stateless.Methods.IPerson.GetPerson(displayDirectoryName, birthday.Value.Ticks, birthday), new PersonBirthday[] { birthday }, Array.Empty(), displayDirectoryName, birthday.Value.Ticks, null) { } public override string ToString() diff --git a/Shared/Models/Properties/IPersonContainer.cs b/Shared/Models/Properties/IPersonContainer.cs index fed6c4e..7f27f5d 100644 --- a/Shared/Models/Properties/IPersonContainer.cs +++ b/Shared/Models/Properties/IPersonContainer.cs @@ -9,5 +9,6 @@ public interface IPersonContainer public string[] DisplayDirectoryAllFiles { init; get; } public string DisplayDirectoryName { init; get; } public long? Key { init; get; } + public string? PartialKeyFormatted { init; get; } } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/IAge.cs b/Shared/Models/Stateless/Methods/IAge.cs index 2e968ba..33e59de 100644 --- a/Shared/Models/Stateless/Methods/IAge.cs +++ b/Shared/Models/Stateless/Methods/IAge.cs @@ -21,7 +21,7 @@ public interface IAge char[] TestStatic_GetChars() => GetChars(); static char[] GetChars() => - new char[] { '!', '^', '_', '~', '+', '#' }; + new char[] { '!', '#', '^', '_', '`', '~', '+' }; int? TestStatic_GetApproximateYears(string personDisplayDirectoryName, char[] chars) => GetApproximateYears(personDisplayDirectoryName, chars); diff --git a/Shared/Models/Stateless/Methods/PersonBirthday.cs b/Shared/Models/Stateless/Methods/PersonBirthday.cs index 2e2ca91..47dd7a3 100644 --- a/Shared/Models/Stateless/Methods/PersonBirthday.cs +++ b/Shared/Models/Stateless/Methods/PersonBirthday.cs @@ -107,9 +107,9 @@ internal abstract class PersonBirthday return result; } - internal static List GetPersonBirthdays(string personBirthdayFormat, string[] personKeyDirectories, string personDisplayDirectory, string personDisplayDirectoryName) + internal static List<(string, Models.PersonBirthday)> GetPersonBirthdays(string personBirthdayFormat, string[] personKeyDirectories, string personDisplayDirectory, string personDisplayDirectoryName) { - List results = new(); + List<(string, Models.PersonBirthday)> results = new(); string[] files; string personKeyFormatted; Models.PersonBirthday? personBirthday; @@ -120,11 +120,11 @@ internal abstract class PersonBirthday personBirthday = IPersonBirthday.GetPersonBirthday(personBirthdayFormat, personKeyFormatted); else (personBirthday, personKeyFormatted) = Person.Get(personBirthdayFormat, personDisplayDirectory, personKeyDirectory, birthday); - if (personBirthday is null || personKeyFormatted.Contains('#')) + if (personBirthday is null) continue; if (!IPersonBirthday.IsCounterPersonBirthday(personBirthday) && ((!personKeyDirectory.Contains('#') && (personDisplayDirectoryName.Contains('~') || personDisplayDirectoryName.Contains('#'))) || (personKeyDirectory.Contains('#') && !personDisplayDirectoryName.Contains('#')))) throw new NotSupportedException(); - results.Add(personBirthday); + results.Add(new(personKeyFormatted, personBirthday)); files = Directory.GetFiles(personKeyDirectory, "*", SearchOption.TopDirectoryOnly); if (files.Any()) continue; diff --git a/Shared/Models/Stateless/Methods/PersonContainer.cs b/Shared/Models/Stateless/Methods/PersonContainer.cs index 8cb8e3a..4218b44 100644 --- a/Shared/Models/Stateless/Methods/PersonContainer.cs +++ b/Shared/Models/Stateless/Methods/PersonContainer.cs @@ -33,23 +33,34 @@ internal abstract class PersonContainer return results; } - private static List<(long?, Models.PersonContainer)> GetPersonContainersCollections(string facesFileNameExtension, char[] chars, string personDisplayDirectory, string personDisplayDirectoryName, int? approximateYears, List personBirthdays) + private static List<(long?, Models.PersonContainer)> GetPersonContainersCollections(string facesFileNameExtension, char[] chars, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection) { List<(long?, Models.PersonContainer)> results = new(); long personKey; string[] segments; const int zero = 0; Models.Person person; + string? partialPersonKeyFormatted; Models.PersonContainer personContainer; Models.PersonBirthday[] orderedPersonBirthdays; + IEnumerable partialPersonKeyFormattedCollection; string[] personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory); - foreach (Models.PersonBirthday personBirthday in personBirthdays) + foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection) { segments = personDisplayDirectoryName.Split(chars); - orderedPersonBirthdays = personBirthdays.OrderByDescending(l => l.Value.Ticks).ToArray(); - personKey = orderedPersonBirthdays[zero].Value.Ticks; + orderedPersonBirthdays = (from l in collection where !l.PersonKeyFormatted.Contains(numberSign) orderby l.PersonBirthday.Value.Ticks descending select l.PersonBirthday).ToArray(); + if (!orderedPersonBirthdays.Any()) + personKey = collection[zero].PersonBirthday.Value.Ticks; + else + { + if (personKeyFormatted.Contains(numberSign)) + continue; + personKey = orderedPersonBirthdays[zero].Value.Ticks; + } person = IPerson.GetPerson(personKey, segments); - personContainer = new(approximateYears, person, orderedPersonBirthdays, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personKey); + partialPersonKeyFormattedCollection = (from l in collection where l.PersonKeyFormatted.Contains(numberSign) select l.PersonKeyFormatted); + partialPersonKeyFormatted = partialPersonKeyFormattedCollection.FirstOrDefault(); + personContainer = new(approximateYears, person, orderedPersonBirthdays, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personKey, partialPersonKeyFormatted); results.Add(new(personKey, personContainer)); } return results; @@ -63,17 +74,17 @@ internal abstract class PersonContainer return result; } - private static string? VerifyAge(string personDisplayDirectory, string minusOne, string personDisplayDirectoryName, int? approximateYears, List personBirthdays) + private static string? VerifyAge(char numberSign, string personDisplayDirectory, string minusOne, string personDisplayDirectoryName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection) { string? result; if (approximateYears is null) throw new NotSupportedException(); - if (!personBirthdays.Any()) + if (!collection.Any()) throw new NotSupportedException(); const int zero = 0; int? updateApproximateYears; DateTime dateTime = DateTime.Now; - Models.PersonBirthday[] orderedPersonBirthdays = personBirthdays.OrderByDescending(l => l.Value.Ticks).ToArray(); + Models.PersonBirthday[] orderedPersonBirthdays = (from l in collection where !l.PersonKeyFormatted.Contains(numberSign) orderby l.PersonBirthday.Value.Ticks descending select l.PersonBirthday).ToArray(); TimeSpan timeSpan = new(orderedPersonBirthdays[zero].Value.Ticks - dateTime.AddYears(-approximateYears.Value).Ticks); if (timeSpan.TotalDays < -356) updateApproximateYears = approximateYears.Value + 1; @@ -99,11 +110,12 @@ internal abstract class PersonContainer List<(long?, Models.PersonContainer)> results = new(); string? minusOne; int? approximateYears; + char numberSign = '#'; List changes = new(); string[] personKeyDirectories; string? personDisplayDirectoryName; Models.PersonContainer personContainer; - List personBirthdays; + List<(string, Models.PersonBirthday)> collection; foreach (string personDisplayDirectory in personDisplayDirectories) { personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory); @@ -111,18 +123,18 @@ internal abstract class PersonContainer continue; approximateYears = Age.GetApproximateYears(personDisplayDirectoryName, chars); personKeyDirectories = Directory.GetDirectories(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly); - personBirthdays = PersonBirthday.GetPersonBirthdays(personBirthdayFormat, personKeyDirectories, personDisplayDirectory, personDisplayDirectoryName); + collection = PersonBirthday.GetPersonBirthdays(personBirthdayFormat, personKeyDirectories, personDisplayDirectory, personDisplayDirectoryName); if (personDisplayDirectoryName.Contains('^')) { minusOne = Path.GetDirectoryName(personDisplayDirectory); if (minusOne is null) continue; - changes.Add(VerifyAge(personDisplayDirectory, minusOne, personDisplayDirectoryName, approximateYears, personBirthdays)); + changes.Add(VerifyAge(numberSign, personDisplayDirectory, minusOne, personDisplayDirectoryName, approximateYears, collection)); } if (changes.Any(l => l is not null)) continue; - if (personBirthdays.Any()) - results.AddRange(GetPersonContainersCollections(facesFileNameExtension, chars, personDisplayDirectory, personDisplayDirectoryName, approximateYears, personBirthdays)); + if (collection.Any()) + results.AddRange(GetPersonContainersCollections(facesFileNameExtension, chars, numberSign, personDisplayDirectory, personDisplayDirectoryName, approximateYears, collection)); else { personContainer = GetPersonContainer(facesFileNameExtension, personDisplayDirectory, personDisplayDirectoryName, approximateYears);