diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index 15f2cdb..fa9deb8 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -271,6 +271,7 @@ public partial class DlibDotNet configuration.LocationDigits, configuration.LocationFactor, configuration.MapLogicSigma, + configuration.MappingDefaultName, configuration.MappingMoveUnableToMatch, configuration.MappingSaveFaceEncoding, configuration.MappingSaveNotMapped, @@ -750,9 +751,9 @@ public partial class DlibDotNet E_Distance.SaveFaceDistances(_Configuration.PropertyConfiguration, eResultsFullGroupDirectory, sortingContainers); int totalNotMapped = mapLogic.AddToMapping(distinctFilteredFaces); if (totalNotMapped > 0) - mapLogic.ForceSingleImageThenSaveMapping(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, distinctFilteredFaces, sortingContainers, totalNotMapped); + mapLogic.ForceSingleImageThenSaveMapping(_MapConfiguration, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, distinctFilteredFaces, sortingContainers, totalNotMapped); if (_MapConfiguration.MappingSaveNotMapped) - mapLogic.SaveNotMappedTicks(_Configuration.PropertyConfiguration); + mapLogic.SaveNotMappedTicks(_MapConfiguration); if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) mapLogic.SaveShortcuts(_Configuration.JuliePhares, distinctFilteredFaces); } diff --git a/Instance/Models/Binder/Configuration.cs b/Instance/Models/Binder/Configuration.cs index 70f49dc..a4366a4 100644 --- a/Instance/Models/Binder/Configuration.cs +++ b/Instance/Models/Binder/Configuration.cs @@ -32,6 +32,7 @@ public class Configuration [Display(Name = "Location Factor"), Required] public int? LocationFactor { get; set; } [Display(Name = "Map Logic Sigma"), Required] public int? MapLogicSigma { get; set; } [Display(Name = "Mapped Max Index"), Required] public int? MappedMaxIndex { get; set; } + [Display(Name = "Mapping Default Name"), Required] public string MappingDefaultName { get; set; } [Display(Name = "Mapping Move Unable to Match by 1 Tick"), Required] public bool? MappingMoveUnableToMatch { get; set; } [Display(Name = "Mapping Save Face Encoding"), Required] public bool? MappingSaveFaceEncoding { get; set; } [Display(Name = "Mapping Save Mapped"), Required] public bool? MappingSaveMapped { get; set; } @@ -127,6 +128,8 @@ public class Configuration throw new NullReferenceException(nameof(configuration.LocationFactor)); if (configuration.MapLogicSigma is null) throw new NullReferenceException(nameof(configuration.MapLogicSigma)); + if (configuration.MappingDefaultName is null) + throw new NullReferenceException(nameof(configuration.MappingDefaultName)); if (configuration.MappingMoveUnableToMatch is null) throw new NullReferenceException(nameof(configuration.MappingMoveUnableToMatch)); if (configuration.MappingSaveFaceEncoding is null) @@ -236,6 +239,7 @@ public class Configuration configuration.LocationFactor.Value, configuration.MapLogicSigma.Value, configuration.MappedMaxIndex, + configuration.MappingDefaultName, configuration.MappingMoveUnableToMatch.Value, configuration.MappingSaveFaceEncoding.Value, configuration.MappingSaveNotMapped.Value, diff --git a/Instance/Models/Configuration.cs b/Instance/Models/Configuration.cs index 2c5324c..9be57ae 100644 --- a/Instance/Models/Configuration.cs +++ b/Instance/Models/Configuration.cs @@ -31,6 +31,7 @@ public class Configuration public int LocationFactor { init; get; } public int MapLogicSigma { init; get; } public int? MappedMaxIndex { init; get; } + public string MappingDefaultName { init; get; } public bool MappingMoveUnableToMatch { init; get; } public bool MappingSaveFaceEncoding { init; get; } public bool MappingSaveNotMapped { init; get; } @@ -98,6 +99,7 @@ public class Configuration int locationFactor, int mapLogicSigma, int? mappedMaxIndex, + string mappingDefaultName, bool mappingMoveUnableToMatch, bool mappingSaveFaceEncoding, bool mappingSaveNotMapped, @@ -164,6 +166,7 @@ public class Configuration LocationFactor = locationFactor; MapLogicSigma = mapLogicSigma; MappedMaxIndex = mappedMaxIndex; + MappingDefaultName = mappingDefaultName; MappingMoveUnableToMatch = mappingMoveUnableToMatch; MappingSaveFaceEncoding = mappingSaveFaceEncoding; MappingSaveNotMapped = mappingSaveNotMapped; diff --git a/Instance/Models/_A2_People.cs b/Instance/Models/_A2_People.cs index d72a995..c04b187 100644 --- a/Instance/Models/_A2_People.cs +++ b/Instance/Models/_A2_People.cs @@ -19,7 +19,7 @@ internal class A2_People string directoryFullName; Dictionary> keyValuePairs = new(); JsonSerializerOptions writeIndentedJsonSerializerOptions = new() { WriteIndented = true }; - string hPeopleCollectionDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration, nameof(A2_People), "[]"); + string a2PeopleCollectionDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration, nameof(A2_People), "[]"); string aPropertySingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration, nameof(Property.Models.A_Property), "{}"); foreach (G2_Identify identified in identifiedCollection) { @@ -34,7 +34,7 @@ internal class A2_People foreach (KeyValuePair> keyValuePair in keyValuePairs) { segments = keyValuePair.Key.Split('|'); - directoryFullName = Path.Combine(hPeopleCollectionDirectory, segments[0]); + directoryFullName = Path.Combine(a2PeopleCollectionDirectory, segments[0]); if (!Directory.Exists(directoryFullName)) _ = Directory.CreateDirectory(directoryFullName); jsonFile = Path.Combine(directoryFullName, $"{segments[1]}.json"); diff --git a/Instance/Models/_E_Distance.cs b/Instance/Models/_E_Distance.cs index ea00219..ab3e8b5 100644 --- a/Instance/Models/_E_Distance.cs +++ b/Instance/Models/_E_Distance.cs @@ -1,7 +1,9 @@ using ShellProgressBar; +using System.Text.Json; using View_by_Distance.FaceRecognitionDotNet; using View_by_Distance.Map.Models; using View_by_Distance.Shared.Models; +using View_by_Distance.Shared.Models.Properties; namespace View_by_Distance.Instance.Models; @@ -151,7 +153,7 @@ internal class E_Distance : Shared.Models.Methods.IFaceDistance FaceDistance faceDistanceLength; string json = File.ReadAllText(checkFile); List<(Face Face, double Length)> collection = new(); - Shared.Models.FaceEncoding? modelsFaceEncoding = System.Text.Json.JsonSerializer.Deserialize(json); + Shared.Models.FaceEncoding? modelsFaceEncoding = JsonSerializer.Deserialize(json); if (modelsFaceEncoding is null) throw new NotSupportedException(); FaceRecognitionDotNet.FaceEncoding faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding); @@ -184,4 +186,56 @@ internal class E_Distance : Shared.Models.Methods.IFaceDistance return results; } + void Shared.Models.Methods.IFaceDistance.SavePossiblyNewPersonContainers(IPropertyConfiguration propertyConfiguration, string personBirthdayFormat, string resizeFilenameExtension, Dictionary personKeyToPersonContainer, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer) + { + char @char; + string json; + string[] files; + string checkFile; + string[] segments; + const int zero = 0; + string checkPersonKeyFormattedDirectory; + string personKeyFormatted; + string personDisplayDirectory; + PersonBirthday personBirthday; + string personDisplayDirectoryName; + string checkPersonDisplayDirectory; + char[] chars = Shared.Models.Stateless.Methods.IAge.GetChars(); + JsonSerializerOptions jsonSerializerOptions = new() { WriteIndented = true }; + string a2PeopleSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(propertyConfiguration, nameof(A2_People), "{}"); + foreach ((string[] personDisplayDirectoryNames, PersonContainer personContainer) in possiblyNewPersonDisplayDirectoryNamesAndPersonContainer) + { + if (personContainer.PersonKey is null || personContainer.PersonBirthdays is null || !personContainer.PersonBirthdays.Any()) + continue; + personBirthday = personContainer.PersonBirthdays[zero]; + personDisplayDirectoryName = personDisplayDirectoryNames[^1]; + personDisplayDirectory = Path.Combine(personDisplayDirectoryNames); + personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthdayFormat, personBirthday); + segments = personDisplayDirectoryName.Split(chars); + if (segments.Length != 2) + @char = '_'; + else + @char = personDisplayDirectoryName[segments[zero].Length]; + checkPersonDisplayDirectory = Path.Combine(a2PeopleSingletonDirectory, @char.ToString(), personDisplayDirectoryName); + checkPersonKeyFormattedDirectory = Path.Combine(checkPersonDisplayDirectory, personKeyFormatted); + if (Directory.Exists(checkPersonKeyFormattedDirectory)) + continue; + _ = Directory.CreateDirectory(checkPersonKeyFormattedDirectory); + checkFile = Path.Combine(checkPersonKeyFormattedDirectory, $"{personKeyFormatted}.json"); + json = JsonSerializer.Serialize(personContainer.Person, jsonSerializerOptions); + _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(checkFile, json, updateDateWhenMatches: false, compareBeforeWrite: true); + if (!Directory.Exists(personDisplayDirectory)) + continue; + files = Directory.GetFiles(personDisplayDirectory, $"*{resizeFilenameExtension}", SearchOption.TopDirectoryOnly); + foreach (string file in files) + { + checkFile = Path.Combine(checkPersonDisplayDirectory, Path.GetFileName(file)); + if (File.Exists(checkFile)) + continue; + File.Copy(files[0], checkFile); + break; + } + } + } + } \ No newline at end of file diff --git a/Instance/appsettings.Development.json b/Instance/appsettings.Development.json index 2185d5b..eef913e 100644 --- a/Instance/appsettings.Development.json +++ b/Instance/appsettings.Development.json @@ -70,6 +70,7 @@ "LocationFactor": 1000000, "MapLogicSigma": 3, "MappedMaxIndex": 1034720, + "MappingDefaultName": "John Doe~25", "MappingMoveUnableToMatch": false, "MappingSaveFaceEncoding": false, "MappingSaveMapped": false, diff --git a/Instance/appsettings.Staging.json b/Instance/appsettings.Staging.json index 268eb7f..e3f778f 100644 --- a/Instance/appsettings.Staging.json +++ b/Instance/appsettings.Staging.json @@ -70,6 +70,7 @@ "LocationFactor": 1000000, "MapLogicSigma": 3, "MappedMaxIndex": 1034720, + "MappingDefaultName": "John Doe~25", "MappingMoveUnableToMatch": false, "MappingSaveFaceEncoding": false, "MappingSaveMapped": false, diff --git a/Instance/appsettings.json b/Instance/appsettings.json index 71b2ed6..5825b7d 100644 --- a/Instance/appsettings.json +++ b/Instance/appsettings.json @@ -70,6 +70,7 @@ "LocationFactor": 1000000, "MapLogicSigma": 3, "MappedMaxIndex": 1034720, + "MappingDefaultName": "John Doe~25", "MappingMoveUnableToMatch": false, "MappingSaveFaceEncoding": false, "MappingSaveMapped": false, diff --git a/Map/Map.csproj b/Map/Map.csproj index a6274de..047d693 100644 --- a/Map/Map.csproj +++ b/Map/Map.csproj @@ -35,13 +35,13 @@ - - - + + + + - \ No newline at end of file diff --git a/Map/Models/Configuration.cs b/Map/Models/Configuration.cs index b57bf4f..2a74388 100644 --- a/Map/Models/Configuration.cs +++ b/Map/Models/Configuration.cs @@ -13,6 +13,7 @@ public class Configuration public int LocationDigits { init; get; } public int LocationFactor { init; get; } public int MapLogicSigma { init; get; } + public string MappingDefaultName { init; get; } public bool MappingMoveUnableToMatch { init; get; } public bool MappingSaveFaceEncoding { init; get; } public bool MappingSaveNotMapped { init; get; } @@ -37,6 +38,7 @@ public class Configuration int locationDigits, int locationFactor, int mapLogicSigma, + string mappingDefaultName, bool mappingMoveUnableToMatch, bool mappingSaveFaceEncoding, bool mappingSaveNotMapped, @@ -60,6 +62,7 @@ public class Configuration LocationDigits = locationDigits; LocationFactor = locationFactor; MapLogicSigma = mapLogicSigma; + MappingDefaultName = mappingDefaultName; MappingMoveUnableToMatch = mappingMoveUnableToMatch; MappingSaveFaceEncoding = mappingSaveFaceEncoding; MappingSaveNotMapped = mappingSaveNotMapped; diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index 574d149..3af8e98 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -9,8 +9,8 @@ namespace View_by_Distance.Map.Models; public class MapLogic { - protected readonly List _NotMappedPersonKeys; protected readonly Dictionary> _SkipCollection; + protected readonly List _NotMappedPersonContainers; protected readonly Dictionary _PersonKeyToPersonContainer; protected readonly Dictionary _PersonKeyToRanges; protected readonly Dictionary> _IdThenNormalizedPixelPercentageToPersonContainers; @@ -30,7 +30,7 @@ public class MapLogic private readonly string _FacesHiddenFilenameExtension; private readonly string _EDistanceContentTicksDirectory; - public MapLogic(int maxDegreeOfParallelism, Property.Models.Configuration propertyConfiguration, Configuration? configuration, string resizeFilenameExtension, string facesFilenameExtension, string facesHiddenFilenameExtension, string facePartsFilenameExtension, long ticks, List personContainers, string eResultsFullGroupDirectory, List distinctFilteredFaces, Shared.Models.Methods.IFaceDistance? distance) + public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, string resizeFilenameExtension, string facesFilenameExtension, string facesHiddenFilenameExtension, string facePartsFilenameExtension, long ticks, List personContainers, string eResultsFullGroupDirectory, List distinctFilteredFaces, Shared.Models.Methods.IFaceDistance? faceDistance) { _Ticks = ticks; _Configuration = configuration; @@ -47,9 +47,9 @@ public class MapLogic { } string json; string fullPath; - List notMappedPersonKeys = new(); List>? collection; Dictionary> skipCollection = new(); + List notMappedPersonContainers = new(); Dictionary personKeyToPersonContainer = new(); string eDistanceContentDirectory = Path.Combine(eResultsFullGroupDirectory, "()"); string? rootDirectoryParent = Path.GetDirectoryName(propertyConfiguration.RootDirectory); @@ -65,8 +65,8 @@ public class MapLogic _ = Directory.CreateDirectory(eDistanceContentDirectory); if (!Directory.Exists(eDistanceContentTicksDirectory)) _ = Directory.CreateDirectory(eDistanceContentTicksDirectory); - if (configuration is not null) - Stateless.MapLogic.Set(propertyConfiguration, configuration, resizeFilenameExtension, ticks, personContainers, eDistanceContentDirectory, distinctFilteredFaces, distance, personKeyToPersonContainer, personKeyToRanges, notMappedPersonKeys, skipCollection, idThenNormalizedPixelPercentageToPersonContainers); + if (configuration is not null && faceDistance is not null) + Stateless.MapLogic.Set(propertyConfiguration, configuration, resizeFilenameExtension, ticks, personContainers, eDistanceContentDirectory, distinctFilteredFaces, faceDistance, personKeyToPersonContainer, personKeyToRanges, notMappedPersonContainers, skipCollection, idThenNormalizedPixelPercentageToPersonContainers); foreach (string propertyContentCollectionFile in propertyConfiguration.PropertyContentCollectionFiles) { fullPath = Path.GetFullPath(string.Concat(rootDirectoryParent, propertyContentCollectionFile)); @@ -81,13 +81,13 @@ public class MapLogic } _SkipCollection = skipCollection; _PersonKeyToRanges = personKeyToRanges; - _NotMappedPersonKeys = notMappedPersonKeys; + _NotMappedPersonContainers = notMappedPersonContainers; _PersonKeyToPersonContainer = personKeyToPersonContainer; _EDistanceContentTicksDirectory = eDistanceContentTicksDirectory; _IdThenNormalizedPixelPercentageToPersonContainers = idThenNormalizedPixelPercentageToPersonContainers; } - public MapLogic(int maxDegreeOfParallelism, Property.Models.Configuration propertyConfiguration, Configuration? configuration, string outputExtension, long ticks, List personContainers, string eResultsFullGroupDirectory) : + public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, string outputExtension, long ticks, List personContainers, string eResultsFullGroupDirectory) : this(maxDegreeOfParallelism, propertyConfiguration, configuration, outputExtension, outputExtension, outputExtension, outputExtension, ticks, personContainers, eResultsFullGroupDirectory, new(), null) { } @@ -255,7 +255,6 @@ public class MapLogic int by = _Mapping; const int zero = 0; string mappingSegmentB; - string personKeyFormatted; PersonBirthday personBirthday; List personContainers = new(); Dictionary keyValuePairs; @@ -279,7 +278,6 @@ public class MapLogic if (personContainer.PersonKey is null || personContainer.PersonBirthdays is null || !personContainer.PersonBirthdays.Any()) continue; personBirthday = personContainer.PersonBirthdays[zero]; - personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personBirthday); mappingSegmentB = GetMappingSegmentB(_Ticks, personBirthday, personContainer.ApproximateYears, face.Mapping.MappingFromItem); face.Mapping.UpdateMappingFromPerson(personContainer.ApproximateYears, by, personContainer.PersonDisplayDirectoryName, personBirthday, mappingSegmentB); } @@ -343,21 +341,24 @@ public class MapLogic } } - public void SaveNotMappedTicks(Property.Models.Configuration propertyConfiguration) + public void SaveNotMappedTicks(Configuration configuration) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); string directory; + const int zero = 0; string personKeyFormatted; SaveContainer saveContainer; PersonBirthday personBirthday; List saveContainers = new(); const string facePopulatedKey = nameof(_Sorting); - foreach (long personKey in _NotMappedPersonKeys) + foreach (PersonContainer personContainer in _NotMappedPersonContainers) { - personBirthday = IPersonBirthday.GetPersonBirthday(personKey); + if (personContainer.PersonKey is null || personContainer.PersonBirthdays is null || !personContainer.PersonBirthdays.Any()) + continue; + personBirthday = personContainer.PersonBirthdays[zero]; personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personBirthday); - directory = Path.Combine(_EDistanceContentTicksDirectory, $"{facePopulatedKey}NotMapped", personKeyFormatted, propertyConfiguration.ResultAllInOne); + directory = Path.Combine(_EDistanceContentTicksDirectory, $"{facePopulatedKey}NotMapped", personKeyFormatted, configuration.MappingDefaultName); saveContainer = new(directory); saveContainers.Add(saveContainer); } @@ -403,7 +404,7 @@ public class MapLogic { keyValuePairs = _IdThenNormalizedPixelPercentageToPersonContainers[face.Mapping.MappingFromItem.Id]; if (!keyValuePairs.ContainsKey(face.Mapping.MappingFromLocation.NormalizedPixelPercentage)) - throw new NotSupportedException(); + continue; personKey = null; isWrongYearFlag = IItem.GetWrongYearFlag(face.Mapping.MappingFromItem.IsWrongYear); subDirectoryName = $"{isWrongYearFlag}{face.Mapping.MappingFromItem.MinimumDateTime:yyyy}"; @@ -510,16 +511,14 @@ public class MapLogic return result; } - internal void ForceSingleImage(Property.Models.Configuration propertyConfiguration, IEnumerable distinctFilteredFaces) + internal void ForceSingleImage(Configuration configuration, IEnumerable distinctFilteredFaces) { - long? personKey; const int zero = 0; string mappingSegmentB; int by = _ForceSingleImage; - int? approximateYears = null; PersonBirthday personBirthday; List normalizedPixelPercentages; - string displayDirectoryName = propertyConfiguration.ResultAllInOne; + string displayDirectoryName = configuration.MappingDefaultName; Face[] orderedDistinctFilteredFaces = (from l in distinctFilteredFaces orderby l.Mapping is not null, l.Mapping?.MappingFromLocation.Confidence descending select l).ToArray(); foreach (Face face in orderedDistinctFilteredFaces) { @@ -533,10 +532,15 @@ public class MapLogic if (normalizedPixelPercentages.Contains(face.Mapping.MappingFromLocation.NormalizedPixelPercentage)) continue; } - personKey = _NotMappedPersonKeys[zero]; - personBirthday = IPersonBirthday.GetPersonBirthday(personKey.Value); - mappingSegmentB = GetMappingSegmentB(_Ticks, personBirthday, approximateYears, face.Mapping.MappingFromItem); - face.Mapping.UpdateMappingFromPerson(approximateYears, by, displayDirectoryName, personBirthday, mappingSegmentB); + foreach (PersonContainer personContainer in _NotMappedPersonContainers) + { + if (personContainer.PersonKey is null || personContainer.PersonBirthdays is null || !personContainer.PersonBirthdays.Any()) + continue; + personBirthday = personContainer.PersonBirthdays[zero]; + mappingSegmentB = GetMappingSegmentB(_Ticks, personBirthday, personContainer.ApproximateYears, face.Mapping.MappingFromItem); + face.Mapping.UpdateMappingFromPerson(personContainer.ApproximateYears, by, personContainer.PersonDisplayDirectoryName, personBirthday, mappingSegmentB); + break; + } break; } } @@ -611,11 +615,11 @@ public class MapLogic shortcutFile = Path.Combine(personDirectory, $"{face.Mapping.MappingFromLocation.DeterministicHashCodeKey}{face.Mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.lnk"); saveContainer = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, string.Empty, facePartsFileHolder, face.Mapping.MappingFromItem.ResizedFileHolder, shortcutFile); results.Add(saveContainer); - if (!string.IsNullOrEmpty(checkFile) && _Configuration.MappingSaveFaceEncoding) + if (_Configuration.MappingSaveFaceEncoding) { - checkFile = Path.Combine(directory, $"{face.Mapping.MappingFromLocation.DeterministicHashCodeKey}{face.Mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.json"); + checkFile = Path.Combine(personDirectory, $"{face.Mapping.MappingFromLocation.DeterministicHashCodeKey}{face.Mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.json"); json = JsonSerializer.Serialize(face.FaceEncoding); - saveContainer = new(checkFile, directory, json); + saveContainer = new(checkFile, personDirectory, json); results.Add(saveContainer); } results.Add(saveContainer); @@ -623,19 +627,19 @@ public class MapLogic return results; } - public void ForceSingleImageThenSaveMapping(int maxDegreeOfParallelism, Property.Models.Configuration propertyConfiguration, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, List distinctFilteredFaces, SortingContainer[] sortingContainers, int totalNotMapped) + public void ForceSingleImageThenSaveMapping(Configuration configuration, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, List distinctFilteredFaces, SortingContainer[] sortingContainers, int totalNotMapped) { List saveContainers; if (!sortingContainers.Any()) { - ForceSingleImage(propertyConfiguration, distinctFilteredFaces); + ForceSingleImage(configuration, distinctFilteredFaces); saveContainers = GetMappingSaveContainers(dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, distinctFilteredFaces); } else { int updated = UpdateFromSortingContainers(sortingContainers); if (totalNotMapped - updated > 0) - ForceSingleImage(propertyConfiguration, distinctFilteredFaces); + ForceSingleImage(configuration, distinctFilteredFaces); saveContainers = GetMappingSaveContainers(dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, distinctFilteredFaces); } SaveContainers(saveContainers); diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index e7e1ae9..7b4be25 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -8,7 +8,7 @@ namespace View_by_Distance.Map.Models.Stateless; internal abstract class MapLogic { - private static List AddToPersonKeysThenGetNonSpecificPeopleCollection(Property.Models.Configuration propertyConfiguration, Configuration configuration, List personKeys) + private static List AddToPersonKeysThenGetNonSpecificPeopleCollection(Configuration configuration, List personKeys) { List results = new(); Person person; @@ -26,14 +26,14 @@ internal abstract class MapLogic continue; personKeys.Add(personKey); personBirthday = IPersonBirthday.GetPersonBirthday(personKey); - person = IPerson.GetPerson(propertyConfiguration.ResultAllInOne, personKey, personBirthday); - personContainer = new(approximateYears, person, new PersonBirthday[] { personBirthday }, personDisplayDirectoryAllFiles, propertyConfiguration.ResultAllInOne, personKey); + person = IPerson.GetPerson(configuration.MappingDefaultName, personKey, personBirthday); + personContainer = new(approximateYears, person, new PersonBirthday[] { personBirthday }, personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey); results.Add(personContainer); } return results; } - private static void SetPersonCollections(Configuration configuration, string resizeFilenameExtension, List personContainers, List personKeys, Dictionary personKeyFormattedToNewestPersonKeyFormatted, Dictionary> skipCollection) + private static void SetPersonCollections(Configuration configuration, string resizeFilenameExtension, List personContainers, List personKeys, Dictionary personKeyFormattedToNewestPersonKeyFormatted, List personKeyFormattedCollection, Dictionary> skipCollection) { int? id; long personKey; @@ -60,22 +60,22 @@ internal abstract class MapLogic personKey = personBirthday.Value.Ticks; personKeys.Add(personKey); } - if (personContainer.PersonBirthdays.Length > 1) + foreach (PersonBirthday personBirthday in personContainer.PersonBirthdays) { - foreach (PersonBirthday personBirthday in personContainer.PersonBirthdays) - { - personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personBirthday); - newestPersonKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personContainer.PersonKey.Value); - if (!personKeyFormattedToNewestPersonKeyFormatted.ContainsKey(personKeyFormatted)) - personKeyFormattedToNewestPersonKeyFormatted.Add(personKeyFormatted, newestPersonKeyFormatted); - } + personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personBirthday); + personKeyFormattedCollection.Add(personKeyFormatted); + if (personContainer.PersonBirthdays.Length < 1) + continue; + newestPersonKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personContainer.PersonKey.Value); + if (!personKeyFormattedToNewestPersonKeyFormatted.ContainsKey(personKeyFormatted)) + personKeyFormattedToNewestPersonKeyFormatted.Add(personKeyFormatted, newestPersonKeyFormatted); } } } - internal static List<(string, char, string, int?, int?, List?)> DeleteEmptyDirectoriesAndGetCollection(Configuration configuration, long ticks, string eDistanceContentDirectory, Dictionary> keyValuePairs) + internal static List<(string, string[], string, int?, int?, List?)> DeleteEmptyDirectoriesAndGetCollection(Configuration configuration, long ticks, string eDistanceContentDirectory, List personKeyFormattedCollection, Dictionary> keyValuePairs) { - List<(string, char, string, int?, int?, List?)> results = new(); + List<(string, string[], string, int?, int?, List?)> results = new(); int? id; bool check; string[] files; @@ -92,6 +92,7 @@ internal abstract class MapLogic string[] personNameDirectories; string[] personNameLinkDirectories; string? personFirstInitialDirectory; + string[] personDisplayDirectoryNames; bool keyValuePairsAny = keyValuePairs.Any(); int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); string[] ticksDirectories = Directory.GetDirectories(eDistanceContentDirectory, "*", SearchOption.TopDirectoryOnly); @@ -129,12 +130,18 @@ internal abstract class MapLogic File.Delete(file); foreach (string personNameDirectory in personNameDirectories) { - personFirstInitial = Path.GetFileName(personNameDirectory)[..1]; - if (personFirstInitial is null) + personDisplayDirectoryNames = IPath.GetDirectoryNames(personNameDirectory); + if (!personDisplayDirectoryNames.Any()) continue; - personFirstInitialDirectory = Path.Combine(yearDirectory, personFirstInitial.ToString()); - if (personNameDirectory != personFirstInitialDirectory) - Directory.Move(personNameDirectory, personFirstInitialDirectory); + if (personDisplayDirectoryNames[^1].Length == 1 || personDisplayDirectoryNames[^1] == configuration.MappingDefaultName || !personKeyFormattedCollection.Contains(personKeyFormatted)) + personFirstInitialDirectory = personNameDirectory; + else + { + personFirstInitial = personDisplayDirectoryNames[^1][..1]; + personFirstInitialDirectory = Path.Combine(yearDirectory, personFirstInitial.ToString()); + if (personNameDirectory != personFirstInitialDirectory) + Directory.Move(personNameDirectory, personFirstInitialDirectory); + } files = Directory.GetFiles(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly); if (personKeyFormatted == nameof(Models.MapLogic.ForceSingleImage) && files.Any()) throw new Exception($"Move personKey directories up one from {nameof(Models.MapLogic.ForceSingleImage)} and delete {nameof(Models.MapLogic.ForceSingleImage)} directory!"); @@ -168,7 +175,7 @@ internal abstract class MapLogic checks.Add(normalizedPixelPercentage.Value); } } - results.Add(new(personKeyFormatted, personFirstInitial[0], file, id, normalizedPixelPercentage, faces)); + results.Add(new(personKeyFormatted, personDisplayDirectoryNames, file, id, normalizedPixelPercentage, faces)); } personNameLinkDirectories = Directory.GetDirectories(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string personNameLinkDirectory in personNameLinkDirectories) @@ -207,7 +214,7 @@ internal abstract class MapLogic return results.ToArray(); } - private static void SetKeyValuePairs(Configuration configuration, long ticks, List personContainers, List distinctFilteredFaces, List<(string, int, int)> personKeyFormattedIdThenNormalizedPixelPercentageCollection, List<(string, int, int)> incorrectPersonKeyFormattedIdThenNormalizedPixelPercentageCollection, Dictionary personKeyToPersonContainer, Dictionary> idThenNormalizedPixelPercentageToPersonContainers, Dictionary> incorrectIdThenNormalizedPixelPercentageToPersonContainers, Dictionary personKeyToRanges) + private static void SetKeyValuePairs(Configuration configuration, long ticks, List personContainers, List distinctFilteredFaces, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedPixelPercentageCollection, List<(string, int, int)> incorrectPersonKeyFormattedIdThenNormalizedPixelPercentageCollection, Dictionary personKeyToPersonContainer, Dictionary> idThenNormalizedPixelPercentageToPersonContainers, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer, Dictionary> incorrectIdThenNormalizedPixelPercentageToPersonContainers, Dictionary personKeyToRanges) { string check; string rightPadded; @@ -228,32 +235,46 @@ internal abstract class MapLogic if (!personKeyFormattedToPersonContainer.ContainsKey(newestPersonKeyFormatted)) personKeyFormattedToPersonContainer.Add(newestPersonKeyFormatted, personContainer); } - foreach ((string personKeyFormatted, int id, int normalizedPixelPercentage) in personKeyFormattedIdThenNormalizedPixelPercentageCollection) + if (personKeyFormattedIdThenNormalizedPixelPercentageCollection.Any()) { - personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormatted); - if (personBirthday is null) - continue; - if (!idThenNormalizedPixelPercentageToPersonContainerCollection.ContainsKey(id)) - idThenNormalizedPixelPercentageToPersonContainerCollection.Add(id, new()); - check = normalizedPixelPercentage.ToString(); - if (check.Length == configuration.LocationDigits) + string personDisplayDirectory; + PersonContainer personContainer; + string personDisplayDirectoryName; + Dictionary personDisplayDirectoryTo = new(); + foreach ((string personKeyFormatted, string[] personDisplayDirectoryNames, int id, int normalizedPixelPercentage) in personKeyFormattedIdThenNormalizedPixelPercentageCollection) { - if (!idThenNormalizedPixelPercentageToPersonContainerCollection[id].ContainsKey(normalizedPixelPercentage)) - idThenNormalizedPixelPercentageToPersonContainerCollection[id].Add(normalizedPixelPercentage, new()); + personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormatted); + if (personBirthday is null) + continue; + personDisplayDirectoryName = personDisplayDirectoryNames[^1]; + personDisplayDirectory = Path.Combine(personDisplayDirectoryNames); if (!personKeyFormattedToPersonContainer.ContainsKey(personKeyFormatted)) - throw new NotSupportedException(); - idThenNormalizedPixelPercentageToPersonContainerCollection[id][normalizedPixelPercentage].Add(personKeyFormattedToPersonContainer[personKeyFormatted]); - } - else - { - rightPadded = ILocation.GetRightPadded(configuration.LocationDigits, check); - normalizedPixelPercentageInDecimalForm = int.Parse(rightPadded); - if (!idThenNormalizedPixelPercentageToPersonContainerCollection[id].ContainsKey(normalizedPixelPercentageInDecimalForm)) - idThenNormalizedPixelPercentageToPersonContainerCollection[id].Add(normalizedPixelPercentageInDecimalForm, new()); - if (!personKeyFormattedToPersonContainer.ContainsKey(personKeyFormatted)) - throw new NotSupportedException(); - idThenNormalizedPixelPercentageToPersonContainerCollection[id][normalizedPixelPercentage].Add(personKeyFormattedToPersonContainer[personKeyFormatted]); + { + personContainer = new(personBirthday, personDisplayDirectoryName); + personKeyFormattedToPersonContainer.Add(personKeyFormatted, personContainer); + } + if (personDisplayDirectoryName.Length != 1 && personDisplayDirectoryName != configuration.MappingDefaultName && !personDisplayDirectoryTo.ContainsKey(personDisplayDirectory)) + personDisplayDirectoryTo.Add(personDisplayDirectory, new(personDisplayDirectoryNames, personKeyFormattedToPersonContainer[personKeyFormatted])); + if (!idThenNormalizedPixelPercentageToPersonContainerCollection.ContainsKey(id)) + idThenNormalizedPixelPercentageToPersonContainerCollection.Add(id, new()); + check = normalizedPixelPercentage.ToString(); + if (check.Length == configuration.LocationDigits) + { + if (!idThenNormalizedPixelPercentageToPersonContainerCollection[id].ContainsKey(normalizedPixelPercentage)) + idThenNormalizedPixelPercentageToPersonContainerCollection[id].Add(normalizedPixelPercentage, new()); + idThenNormalizedPixelPercentageToPersonContainerCollection[id][normalizedPixelPercentage].Add(personKeyFormattedToPersonContainer[personKeyFormatted]); + } + else + { + rightPadded = ILocation.GetRightPadded(configuration.LocationDigits, check); + normalizedPixelPercentageInDecimalForm = int.Parse(rightPadded); + if (!idThenNormalizedPixelPercentageToPersonContainerCollection[id].ContainsKey(normalizedPixelPercentageInDecimalForm)) + idThenNormalizedPixelPercentageToPersonContainerCollection[id].Add(normalizedPixelPercentageInDecimalForm, new()); + idThenNormalizedPixelPercentageToPersonContainerCollection[id][normalizedPixelPercentage].Add(personKeyFormattedToPersonContainer[personKeyFormatted]); + } } + foreach (KeyValuePair keyValuePair in personDisplayDirectoryTo) + possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Add(keyValuePair.Value); } foreach (KeyValuePair>> keyValuePair in idThenNormalizedPixelPercentageToPersonContainerCollection) { @@ -265,31 +286,37 @@ internal abstract class MapLogic } }; SetPersonTicks(ticks, distinctFilteredFaces, personKeyToRanges, idThenNormalizedPixelPercentageToPersonContainers); - foreach ((string personKeyFormatted, int id, int normalizedPixelPercentage) in incorrectPersonKeyFormattedIdThenNormalizedPixelPercentageCollection) + if (incorrectPersonKeyFormattedIdThenNormalizedPixelPercentageCollection.Any()) { - personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormatted); - if (personBirthday is null) - continue; - if (!incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection.ContainsKey(id)) - incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection.Add(id, new()); - check = normalizedPixelPercentage.ToString(); - if (check.Length == configuration.LocationDigits) + PersonContainer personContainer; + foreach ((string personKeyFormatted, int id, int normalizedPixelPercentage) in incorrectPersonKeyFormattedIdThenNormalizedPixelPercentageCollection) { - if (!incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection[id].ContainsKey(normalizedPixelPercentage)) - incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection[id].Add(normalizedPixelPercentage, new()); + personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormatted); + if (personBirthday is null) + continue; + if (!incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection.ContainsKey(id)) + incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection.Add(id, new()); + check = normalizedPixelPercentage.ToString(); if (!personKeyFormattedToPersonContainer.ContainsKey(personKeyFormatted)) - throw new NotSupportedException(); - incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection[id][normalizedPixelPercentage].Add(personKeyFormattedToPersonContainer[personKeyFormatted]); - } - else - { - rightPadded = ILocation.GetRightPadded(configuration.LocationDigits, check); - normalizedPixelPercentageInDecimalForm = int.Parse(rightPadded); - if (!incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection[id].ContainsKey(normalizedPixelPercentageInDecimalForm)) - incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection[id].Add(normalizedPixelPercentageInDecimalForm, new()); - if (!personKeyFormattedToPersonContainer.ContainsKey(personKeyFormatted)) - throw new NotSupportedException(); - incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection[id][normalizedPixelPercentage].Add(personKeyFormattedToPersonContainer[personKeyFormatted]); + { + personContainer = new(personBirthday, configuration.MappingDefaultName); + personKeyFormattedToPersonContainer.Add(personKeyFormatted, personContainer); + } + if (check.Length == configuration.LocationDigits) + { + if (!incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection[id].ContainsKey(normalizedPixelPercentage)) + incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection[id].Add(normalizedPixelPercentage, new()); + incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection[id][normalizedPixelPercentage].Add(personKeyFormattedToPersonContainer[personKeyFormatted]); + } + else + { + rightPadded = ILocation.GetRightPadded(configuration.LocationDigits, check); + normalizedPixelPercentageInDecimalForm = int.Parse(rightPadded); + if (!incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection[id].ContainsKey(normalizedPixelPercentageInDecimalForm)) + incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection[id].Add(normalizedPixelPercentageInDecimalForm, new()); + incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection[id][normalizedPixelPercentage].Add(personKeyFormattedToPersonContainer[personKeyFormatted]); + } + } } foreach (KeyValuePair>> keyValuePair in incorrectIdThenNormalizedPixelPercentageToPersonContainerCollection) @@ -399,17 +426,18 @@ internal abstract class MapLogic { } } - private static int SetCollectionsAndGetUnableToMatchCount(Configuration configuration, long ticks, string eDistanceContentDirectory, Shared.Models.Methods.IFaceDistance? distance, Dictionary personKeyFormattedToNewestPersonKeyFormatted, List<(string, int, int)> personKeyFormattedIdThenNormalizedPixelPercentageCollection, List<(string, int, int)> incorrectPersonKeyFormattedIdThenNormalizedPixelPercentageCollection, List<(string, char, string, int?, int?, List?)> collection) + private static int SetCollectionsAndGetUnableToMatchCount(Configuration configuration, long ticks, string eDistanceContentDirectory, Shared.Models.Methods.IFaceDistance? distance, Dictionary personKeyFormattedToNewestPersonKeyFormatted, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedPixelPercentageCollection, List<(string, int, int)> incorrectPersonKeyFormattedIdThenNormalizedPixelPercentageCollection, List<(string, string[], string, int?, int?, List?)> collection) { int result = 0; string? checkFile; List checkFaces = new(); string newestPersonKeyFormatted; + string personDisplayDirectoryName; int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); string message = $") {collection.Count:000} join from ticks Director(ies) - B - {totalSeconds} total second(s)"; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; using ProgressBar progressBar = new(collection.Count, message, options); - foreach ((string personKeyFormatted, char personFirstInitial, string file, int? id, int? normalizedPixelPercentage, List? faces) in collection) + foreach ((string personKeyFormatted, string[] personDisplayDirectoryNames, string file, int? id, int? normalizedPixelPercentage, List? faces) in collection) { progressBar.Tick(); if (id is null || normalizedPixelPercentage is null) @@ -464,8 +492,9 @@ internal abstract class MapLogic newestPersonKeyFormatted = personKeyFormatted; else newestPersonKeyFormatted = personKeyFormattedToNewestPersonKeyFormatted[personKeyFormatted]; - if (personFirstInitial != '!') - personKeyFormattedIdThenNormalizedPixelPercentageCollection.Add(new(newestPersonKeyFormatted, id.Value, normalizedPixelPercentage.Value)); + personDisplayDirectoryName = personDisplayDirectoryNames[^1]; + if (!string.IsNullOrEmpty(personDisplayDirectoryName) && personDisplayDirectoryName[0] != '!') + personKeyFormattedIdThenNormalizedPixelPercentageCollection.Add(new(newestPersonKeyFormatted, personDisplayDirectoryNames, id.Value, normalizedPixelPercentage.Value)); else incorrectPersonKeyFormattedIdThenNormalizedPixelPercentageCollection.Add(new(newestPersonKeyFormatted, id.Value, normalizedPixelPercentage.Value)); } @@ -548,26 +577,24 @@ internal abstract class MapLogic SetPersonKeysRanges(ticks, personTicks, personKeyToRanges); } - private static List GetNotMappedPersonKeys(Property.Models.Configuration propertyConfiguration, List personContainers, long[] personKeyCollection) + private static List GetNotMappedPersonContainers(Configuration configuration, List personContainers, long[] personKeyCollection) { - List results = new(); - List notMappedAndNotNamedPersonKeys = new(); - List notMappedAndWithNamedPersonKeys = new(); + List results = new(); + List notMappedAndNotNamedPersonKeys = new(); + List notMappedAndWithNamedPersonKeys = new(); foreach (PersonContainer personContainer in personContainers) { if (personContainer.Person is null || personContainer.PersonKey is null || personContainer.PersonBirthdays is null || !personContainer.PersonBirthdays.Any()) continue; if (personKeyCollection.Contains(personContainer.PersonKey.Value)) continue; - else if (string.IsNullOrEmpty(personContainer.PersonDisplayDirectoryName) || personContainer.PersonDisplayDirectoryName == propertyConfiguration.ResultAllInOne) - notMappedAndNotNamedPersonKeys.Add(personContainer.PersonKey.Value); + else if (string.IsNullOrEmpty(personContainer.PersonDisplayDirectoryName) || personContainer.PersonDisplayDirectoryName == configuration.MappingDefaultName) + notMappedAndNotNamedPersonKeys.Add(personContainer); else - notMappedAndWithNamedPersonKeys.Add(personContainer.PersonKey.Value); + notMappedAndWithNamedPersonKeys.Add(personContainer); } - notMappedAndNotNamedPersonKeys.Sort(); - notMappedAndWithNamedPersonKeys.Sort(); - results.AddRange(notMappedAndNotNamedPersonKeys); - results.AddRange(notMappedAndWithNamedPersonKeys); + results.AddRange(from l in notMappedAndNotNamedPersonKeys orderby l.PersonKey is not null, l.PersonKey select l); + results.AddRange(from l in notMappedAndWithNamedPersonKeys orderby l.PersonKey is not null, l.PersonKey select l); return results; } @@ -586,15 +613,19 @@ internal abstract class MapLogic } } - private static void SetPersonKeyToPersonContainer(Property.Models.Configuration propertyConfiguration, List personContainers, long[] personKeyCollection, Dictionary personKeyToPersonContainer) + private static void SetPersonKeyToPersonContainer(Configuration configuration, List personContainers, long[] personKeyCollection, Dictionary personKeyToPersonContainer) { + string personDisplayDirectoryName; foreach (PersonContainer personContainer in personContainers) { if (personContainer.PersonKey is null || !personKeyCollection.Contains(personContainer.PersonKey.Value)) continue; if (personKeyToPersonContainer.ContainsKey(personContainer.PersonKey.Value)) { - if (personKeyToPersonContainer[personContainer.PersonKey.Value].PersonDisplayDirectoryName == personContainer.PersonDisplayDirectoryName) + personDisplayDirectoryName = personKeyToPersonContainer[personContainer.PersonKey.Value].PersonDisplayDirectoryName; + if (string.IsNullOrEmpty(personDisplayDirectoryName)) + throw new NotSupportedException(); + if (personDisplayDirectoryName == personContainer.PersonDisplayDirectoryName || (personDisplayDirectoryName[0] == personContainer.PersonDisplayDirectoryName[0] && (personDisplayDirectoryName.Length == 1 || personContainer.PersonDisplayDirectoryName.Length == 1))) continue; throw new NotImplementedException(); } @@ -605,7 +636,7 @@ internal abstract class MapLogic int? approximateYears = null; PersonBirthday? personBirthday; PersonContainer personContainer; - string displayDirectoryName = propertyConfiguration.ResultAllInOne; + string displayDirectoryName = configuration.MappingDefaultName; foreach (long personKey in personKeyCollection) { if (personKeyToPersonContainer.ContainsKey(personKey)) @@ -617,19 +648,21 @@ internal abstract class MapLogic } } - internal static void Set(Property.Models.Configuration propertyConfiguration, Configuration? configuration, string resizeFilenameExtension, long ticks, List personContainers, string eDistanceContentDirectory, List distinctFilteredFaces, Shared.Models.Methods.IFaceDistance? distance, Dictionary personKeyToPersonContainer, Dictionary personKeyToRanges, List notMappedPersonKeys, Dictionary> skipCollection, Dictionary> idThenNormalizedPixelPercentageToPersonContainers) + internal static void Set(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, string resizeFilenameExtension, long ticks, List personContainers, string eDistanceContentDirectory, List distinctFilteredFaces, Shared.Models.Methods.IFaceDistance faceDistance, Dictionary personKeyToPersonContainer, Dictionary personKeyToRanges, List notMappedPersonContainers, Dictionary> skipCollection, Dictionary> idThenNormalizedPixelPercentageToPersonContainers) { if (configuration is null) throw new NullReferenceException(nameof(configuration)); List personKeys = new(); List nullablePersonKeyCollection = new(); + List personKeyFormattedCollection = new(); Dictionary> keyValuePairs = new(); Dictionary personKeyFormattedToNewestPersonKeyFormatted = new(); - List<(string, int, int)> personKeyFormattedIdThenNormalizedPixelPercentageCollection = new(); + List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer = new(); + List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedPixelPercentageCollection = new(); List<(string, int, int)> incorrectPersonKeyFormattedIdThenNormalizedPixelPercentageCollection = new(); Dictionary> incorrectIdThenNormalizedPixelPercentageToPersonContainers = new(); - SetPersonCollections(configuration, resizeFilenameExtension, personContainers, personKeys, personKeyFormattedToNewestPersonKeyFormatted, skipCollection); - personContainers.AddRange(AddToPersonKeysThenGetNonSpecificPeopleCollection(propertyConfiguration, configuration, personKeys)); + SetPersonCollections(configuration, resizeFilenameExtension, personContainers, personKeys, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection, skipCollection); + personContainers.AddRange(AddToPersonKeysThenGetNonSpecificPeopleCollection(configuration, personKeys)); foreach (Face face in distinctFilteredFaces) { if (face.FaceEncoding is null || face.Location?.NormalizedPixelPercentage is null) @@ -640,9 +673,9 @@ internal abstract class MapLogic keyValuePairs.Add(face.Mapping.MappingFromItem.Id, new()); keyValuePairs[face.Mapping.MappingFromItem.Id].Add(face); } - List<(string, char, string, int?, int?, List?)> collection = DeleteEmptyDirectoriesAndGetCollection(configuration, ticks, eDistanceContentDirectory, keyValuePairs); - int unableToMatchCount = SetCollectionsAndGetUnableToMatchCount(configuration, ticks, eDistanceContentDirectory, distance, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedIdThenNormalizedPixelPercentageCollection, incorrectPersonKeyFormattedIdThenNormalizedPixelPercentageCollection, collection); - SetKeyValuePairs(configuration, ticks, personContainers, distinctFilteredFaces, personKeyFormattedIdThenNormalizedPixelPercentageCollection, incorrectPersonKeyFormattedIdThenNormalizedPixelPercentageCollection, personKeyToPersonContainer, idThenNormalizedPixelPercentageToPersonContainers, incorrectIdThenNormalizedPixelPercentageToPersonContainers, personKeyToRanges); + List<(string, string[], string, int?, int?, List?)> collection = DeleteEmptyDirectoriesAndGetCollection(configuration, ticks, eDistanceContentDirectory, personKeyFormattedCollection, keyValuePairs); + int unableToMatchCount = SetCollectionsAndGetUnableToMatchCount(configuration, ticks, eDistanceContentDirectory, faceDistance, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedIdThenNormalizedPixelPercentageCollection, incorrectPersonKeyFormattedIdThenNormalizedPixelPercentageCollection, collection); + SetKeyValuePairs(configuration, ticks, personContainers, distinctFilteredFaces, personKeyFormattedIdThenNormalizedPixelPercentageCollection, incorrectPersonKeyFormattedIdThenNormalizedPixelPercentageCollection, personKeyToPersonContainer, idThenNormalizedPixelPercentageToPersonContainers, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer, incorrectIdThenNormalizedPixelPercentageToPersonContainers, personKeyToRanges); int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); string message = $") {collection.Count:000} message from ticks Director(ies) - C - {unableToMatchCount} Unable To Match Count / {collection.Count} Collection - {totalSeconds} total second(s)"; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; @@ -656,9 +689,11 @@ internal abstract class MapLogic } } long[] personKeyCollection = (from l in nullablePersonKeyCollection where l is not null select l.Value).Distinct().ToArray(); - notMappedPersonKeys.AddRange(GetNotMappedPersonKeys(propertyConfiguration, personContainers, personKeyCollection)); - SetPersonKeyToPersonContainer(propertyConfiguration, personContainers, personKeyCollection, personKeyToPersonContainer); + SetPersonKeyToPersonContainer(configuration, personContainers, personKeyCollection, personKeyToPersonContainer); + notMappedPersonContainers.AddRange(GetNotMappedPersonContainers(configuration, personContainers, personKeyCollection)); AppendToSkipCollection(skipCollection, idThenNormalizedPixelPercentageToPersonContainers, incorrectIdThenNormalizedPixelPercentageToPersonContainers); + if (possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Any()) + faceDistance.SavePossiblyNewPersonContainers(propertyConfiguration, configuration.PersonBirthdayFormat, resizeFilenameExtension, personKeyToPersonContainer, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer); } } \ No newline at end of file diff --git a/Not-Copy-Copy/Not-Copy-Copy.cs b/Not-Copy-Copy/Not-Copy-Copy.cs index c8b4169..4b4e67f 100644 --- a/Not-Copy-Copy/Not-Copy-Copy.cs +++ b/Not-Copy-Copy/Not-Copy-Copy.cs @@ -118,9 +118,9 @@ public class NotCopyCopy throw new NullReferenceException(nameof(_Configuration.PropertyConfiguration)); string key; string fileName; - Shared.Models.Property? property; + string[] directoryNames; string destinationDirectory; - List directoryNames; + Shared.Models.Property? property; List destinationCollection; string filteredSourceDirectoryFile; Dictionary keyValuePairs = new(); diff --git a/Property/Models/Configuration.cs b/Property/Models/Configuration.cs index 58ae958..c0638d7 100644 --- a/Property/Models/Configuration.cs +++ b/Property/Models/Configuration.cs @@ -3,7 +3,7 @@ using System.Text.Json.Serialization; namespace View_by_Distance.Property.Models; -public class Configuration +public class Configuration : Shared.Models.Properties.IPropertyConfiguration { protected string _RootDirectory; diff --git a/Property/Models/Stateless/IResult.cs b/Property/Models/Stateless/IResult.cs index 1353f6a..e3fa7cb 100644 --- a/Property/Models/Stateless/IResult.cs +++ b/Property/Models/Stateless/IResult.cs @@ -5,36 +5,36 @@ namespace View_by_Distance.Property.Models.Stateless; public interface IResult { - string TestStatic_GetRelativePath(Configuration configuration, string path); - static string GetRelativePath(Configuration configuration, string path) - => Result.GetRelativePath(configuration, path); + string TestStatic_GetRelativePath(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string path); + static string GetRelativePath(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string path) + => Result.GetRelativePath(propertyConfiguration, path); - string TestStatic_GetResultsGroupDirectory(Configuration configuration, string description, bool create); - static string GetResultsGroupDirectory(Configuration configuration, string description, bool create) - => Result.GetResultsGroupDirectory(configuration, description, create); + string TestStatic_GetResultsGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string description, bool create); + static string GetResultsGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string description, bool create) + => Result.GetResultsGroupDirectory(propertyConfiguration, description, create); - string TestStatic_GetResultsGroupDirectory(Configuration configuration, string description); - static string GetResultsGroupDirectory(Configuration configuration, string description) - => Result.GetResultsGroupDirectory(configuration, description, create: true); + string TestStatic_GetResultsGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string description); + static string GetResultsGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string description) + => Result.GetResultsGroupDirectory(propertyConfiguration, description, create: true); - string TestStatic_GetResultsDateGroupDirectory(Configuration configuration, string description); - static string GetResultsDateGroupDirectory(Configuration configuration, string description) - => Result.GetResultsDateGroupDirectory(configuration, description); + string TestStatic_GetResultsDateGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string description); + static string GetResultsDateGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string description) + => Result.GetResultsDateGroupDirectory(propertyConfiguration, description); - string TestStatic_GetResultsDateGroupDirectory(Configuration configuration, string description, string jsonGroup); - static string GetResultsDateGroupDirectory(Configuration configuration, string description, string jsonGroup) - => Result.GetResultsDateGroupDirectory(configuration, description, jsonGroup); + string TestStatic_GetResultsDateGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string description, string jsonGroup); + static string GetResultsDateGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string description, string jsonGroup) + => Result.GetResultsDateGroupDirectory(propertyConfiguration, description, jsonGroup); - List TestStatic_GetDirectoryInfoCollection(Configuration configuration, string sourceDirectory, string dateGroupDirectory, string contentDescription, string singletonDescription, string collectionDescription); - static List GetDirectoryInfoCollection(Configuration configuration, string sourceDirectory, string dateGroupDirectory, string contentDescription, string singletonDescription, string collectionDescription, bool converted) - => Result.GetDirectoryInfoCollection(configuration, sourceDirectory, dateGroupDirectory, contentDescription, singletonDescription, collectionDescription, converted); + List TestStatic_GetDirectoryInfoCollection(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string sourceDirectory, string dateGroupDirectory, string contentDescription, string singletonDescription, string collectionDescription); + static List GetDirectoryInfoCollection(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string sourceDirectory, string dateGroupDirectory, string contentDescription, string singletonDescription, string collectionDescription, bool converted) + => Result.GetDirectoryInfoCollection(propertyConfiguration, sourceDirectory, dateGroupDirectory, contentDescription, singletonDescription, collectionDescription, converted); - string TestStatic_GetResultsFullGroupDirectory(Configuration configuration, Model? model, PredictorModel? predictorModel, string description, string outputResolution, bool includeResizeGroup, bool includeModel, bool includePredictorModel); - static string GetResultsFullGroupDirectory(Configuration configuration, Model? model, PredictorModel? predictorModel, string description, string outputResolution, bool includeResizeGroup, bool includeModel, bool includePredictorModel) - => Result.GetResultsFullGroupDirectory(configuration, model, predictorModel, description, outputResolution, includeResizeGroup, includeModel, includePredictorModel); + string TestStatic_GetResultsFullGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Model? model, PredictorModel? predictorModel, string description, string outputResolution, bool includeResizeGroup, bool includeModel, bool includePredictorModel); + static string GetResultsFullGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Model? model, PredictorModel? predictorModel, string description, string outputResolution, bool includeResizeGroup, bool includeModel, bool includePredictorModel) + => Result.GetResultsFullGroupDirectory(propertyConfiguration, model, predictorModel, description, outputResolution, includeResizeGroup, includeModel, includePredictorModel); - List TestStatic_GetDirectoryInfoCollection(Configuration configuration, Model? model, PredictorModel? predictorModel, string sourceDirectory, string description, string outputResolution, bool includeResizeGroup, bool includeModel, bool includePredictorModel, string contentDescription, string singletonDescription, string collectionDescription); - static List GetDirectoryInfoCollection(Configuration configuration, Model? model, PredictorModel? predictorModel, string sourceDirectory, string description, string outputResolution, bool includeResizeGroup, bool includeModel, bool includePredictorModel, string contentDescription, string singletonDescription, string collectionDescription) - => Result.GetDirectoryInfoCollection(configuration, model, predictorModel, sourceDirectory, description, outputResolution, includeResizeGroup, includeModel, includePredictorModel, contentDescription, singletonDescription, collectionDescription); + List TestStatic_GetDirectoryInfoCollection(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Model? model, PredictorModel? predictorModel, string sourceDirectory, string description, string outputResolution, bool includeResizeGroup, bool includeModel, bool includePredictorModel, string contentDescription, string singletonDescription, string collectionDescription); + static List GetDirectoryInfoCollection(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Model? model, PredictorModel? predictorModel, string sourceDirectory, string description, string outputResolution, bool includeResizeGroup, bool includeModel, bool includePredictorModel, string contentDescription, string singletonDescription, string collectionDescription) + => Result.GetDirectoryInfoCollection(propertyConfiguration, model, predictorModel, sourceDirectory, description, outputResolution, includeResizeGroup, includeModel, includePredictorModel, contentDescription, singletonDescription, collectionDescription); } \ No newline at end of file diff --git a/Property/Models/Stateless/Result.cs b/Property/Models/Stateless/Result.cs index b12cee1..378715e 100644 --- a/Property/Models/Stateless/Result.cs +++ b/Property/Models/Stateless/Result.cs @@ -5,39 +5,39 @@ namespace View_by_Distance.Property.Models.Stateless; internal class Result { - internal static string GetRelativePath(Configuration configuration, string path) + internal static string GetRelativePath(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string path) { - string result = Shared.Models.Stateless.Methods.IPath.GetRelativePath(path, configuration.RootDirectory.Length); + string result = Shared.Models.Stateless.Methods.IPath.GetRelativePath(path, propertyConfiguration.RootDirectory.Length); return result; } - internal static string GetResultsGroupDirectory(Configuration configuration, string description, bool create) + internal static string GetResultsGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string description, bool create) { - string result = Path.Combine($"{configuration.RootDirectory} - Results", description.Replace("_", ") ")); + string result = Path.Combine($"{propertyConfiguration.RootDirectory} - Results", description.Replace("_", ") ")); if (create && !Directory.Exists(result)) _ = Directory.CreateDirectory(result); return result; } - internal static string GetResultsDateGroupDirectory(Configuration configuration, string description) + internal static string GetResultsDateGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string description) { - string result = Path.Combine(GetResultsGroupDirectory(configuration, description, create: true), configuration.DateGroup); + string result = Path.Combine(GetResultsGroupDirectory(propertyConfiguration, description, create: true), propertyConfiguration.DateGroup); if (!Directory.Exists(result)) _ = Directory.CreateDirectory(result); return result; } - internal static string GetResultsDateGroupDirectory(Configuration configuration, string description, string jsonGroup) + internal static string GetResultsDateGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string description, string jsonGroup) { - string result = Path.Combine(GetResultsDateGroupDirectory(configuration, description), jsonGroup); + string result = Path.Combine(GetResultsDateGroupDirectory(propertyConfiguration, description), jsonGroup); if (!Directory.Exists(result)) _ = Directory.CreateDirectory(result); return result; } - internal static string GetResultsFullGroupDirectory(Configuration configuration, Model? model, PredictorModel? predictorModel, string description, string outputResolution, bool includeResizeGroup, bool includeModel, bool includePredictorModel) + internal static string GetResultsFullGroupDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Model? model, PredictorModel? predictorModel, string description, string outputResolution, bool includeResizeGroup, bool includeModel, bool includePredictorModel) { - string result = GetResultsDateGroupDirectory(configuration, description); + string result = GetResultsDateGroupDirectory(propertyConfiguration, description); if (includeResizeGroup) result = Path.Combine(result, outputResolution); if (includeModel && includePredictorModel) @@ -64,13 +64,13 @@ internal class Result return result; } - private static void CheckContent(Configuration configuration, string dateGroupDirectory, string contentDescription, string result) + private static void CheckContent(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string dateGroupDirectory, string contentDescription, string result) { string checkDirectory; - checkDirectory = Path.Combine(dateGroupDirectory, configuration.ResultContent, configuration.ResultAllInOne); + checkDirectory = Path.Combine(dateGroupDirectory, propertyConfiguration.ResultContent, propertyConfiguration.ResultAllInOne); if (!Directory.Exists(checkDirectory)) _ = Directory.CreateDirectory(checkDirectory); - string contentDirectory = new(result.Replace("<>", configuration.ResultContent)); + string contentDirectory = new(result.Replace("<>", propertyConfiguration.ResultContent)); if (!Directory.Exists(contentDirectory)) _ = Directory.CreateDirectory(contentDirectory); checkDirectory = Path.Combine(dateGroupDirectory, string.Concat("() - ", contentDescription)); @@ -78,15 +78,15 @@ internal class Result _ = Directory.CreateDirectory(checkDirectory); } - private static void CheckSingleton(Configuration configuration, string dateGroupDirectory, string singletonDescription, bool converted, string result) + private static void CheckSingleton(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string dateGroupDirectory, string singletonDescription, bool converted, string result) { string checkDirectory; - checkDirectory = Path.Combine(dateGroupDirectory, configuration.ResultSingleton, configuration.ResultAllInOne); + checkDirectory = Path.Combine(dateGroupDirectory, propertyConfiguration.ResultSingleton, propertyConfiguration.ResultAllInOne); if (!Directory.Exists(checkDirectory)) _ = Directory.CreateDirectory(checkDirectory); if (!converted) { - string singletonDirectory = new(result.Replace("<>", configuration.ResultSingleton)); + string singletonDirectory = new(result.Replace("<>", propertyConfiguration.ResultSingleton)); if (!Directory.Exists(singletonDirectory)) _ = Directory.CreateDirectory(singletonDirectory); } @@ -95,14 +95,14 @@ internal class Result _ = Directory.CreateDirectory(checkDirectory); } - private static void CheckCollection(Configuration configuration, string dateGroupDirectory, string collectionDescription, bool converted, string result) + private static void CheckCollection(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string dateGroupDirectory, string collectionDescription, bool converted, string result) { - string checkDirectory = Path.Combine(dateGroupDirectory, configuration.ResultCollection, configuration.ResultAllInOne); + string checkDirectory = Path.Combine(dateGroupDirectory, propertyConfiguration.ResultCollection, propertyConfiguration.ResultAllInOne); if (!Directory.Exists(checkDirectory)) _ = Directory.CreateDirectory(checkDirectory); if (!converted) { - string collectionDirectory = new(result.Replace("<>", configuration.ResultCollection)); + string collectionDirectory = new(result.Replace("<>", propertyConfiguration.ResultCollection)); if (!Directory.Exists(collectionDirectory)) _ = Directory.CreateDirectory(collectionDirectory); } @@ -111,27 +111,27 @@ internal class Result _ = Directory.CreateDirectory(checkDirectory); } - internal static List GetDirectoryInfoCollection(Configuration configuration, string sourceDirectory, string dateGroupDirectory, string contentDescription, string singletonDescription, string collectionDescription, bool converted) + internal static List GetDirectoryInfoCollection(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string sourceDirectory, string dateGroupDirectory, string contentDescription, string singletonDescription, string collectionDescription, bool converted) { List results = new(); - string sourceDirectorySegment = GetRelativePath(configuration, sourceDirectory); + string sourceDirectorySegment = GetRelativePath(propertyConfiguration, sourceDirectory); string result = string.Concat(Path.Combine(dateGroupDirectory, "<>"), sourceDirectorySegment); if (!string.IsNullOrEmpty(contentDescription)) - CheckContent(configuration, dateGroupDirectory, contentDescription, result); + CheckContent(propertyConfiguration, dateGroupDirectory, contentDescription, result); if (!string.IsNullOrEmpty(singletonDescription)) - CheckSingleton(configuration, dateGroupDirectory, singletonDescription, converted, result); + CheckSingleton(propertyConfiguration, dateGroupDirectory, singletonDescription, converted, result); if (!string.IsNullOrEmpty(collectionDescription)) - CheckCollection(configuration, dateGroupDirectory, collectionDescription, converted, result); + CheckCollection(propertyConfiguration, dateGroupDirectory, collectionDescription, converted, result); results.Add(result); return results; } - internal static List GetDirectoryInfoCollection(Configuration configuration, Model? model, PredictorModel? predictorModel, string sourceDirectory, string description, string outputResolution, bool includeResizeGroup, bool includeModel, bool includePredictorModel, string contentDescription, string singletonDescription, string collectionDescription) + internal static List GetDirectoryInfoCollection(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Model? model, PredictorModel? predictorModel, string sourceDirectory, string description, string outputResolution, bool includeResizeGroup, bool includeModel, bool includePredictorModel, string contentDescription, string singletonDescription, string collectionDescription) { List results; bool converted = false; - string dateGroupDirectory = GetResultsFullGroupDirectory(configuration, model, predictorModel, description, outputResolution, includeResizeGroup, includeModel, includePredictorModel); - results = GetDirectoryInfoCollection(configuration, sourceDirectory, dateGroupDirectory, contentDescription, singletonDescription, collectionDescription, converted); + string dateGroupDirectory = GetResultsFullGroupDirectory(propertyConfiguration, model, predictorModel, description, outputResolution, includeResizeGroup, includeModel, includePredictorModel); + results = GetDirectoryInfoCollection(propertyConfiguration, sourceDirectory, dateGroupDirectory, contentDescription, singletonDescription, collectionDescription, converted); return results; } diff --git a/Shared/Models/Methods/IFaceDistance.cs b/Shared/Models/Methods/IFaceDistance.cs index f9fea77..13686d6 100644 --- a/Shared/Models/Methods/IFaceDistance.cs +++ b/Shared/Models/Methods/IFaceDistance.cs @@ -4,5 +4,6 @@ public interface IFaceDistance { List GetMatchingFaces(double faceDistanceTolerance, string checkFile, List faces); + void SavePossiblyNewPersonContainers(Properties.IPropertyConfiguration propertyConfiguration, string personBirthdayFormat, string resizeFilenameExtension, Dictionary personKeyToPersonContainer, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer); } \ No newline at end of file diff --git a/Shared/Models/PersonContainer.cs b/Shared/Models/PersonContainer.cs index d439d95..db89ea0 100644 --- a/Shared/Models/PersonContainer.cs +++ b/Shared/Models/PersonContainer.cs @@ -32,6 +32,10 @@ public class PersonContainer : Properties.IPersonContainer this(approximateYears, null, new PersonBirthday[] { personBirthday }, Array.Empty(), personDisplayDirectoryName, personKey) { } + 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 override string ToString() { string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); diff --git a/Shared/Models/Properties/IPropertyConfiguration.cs b/Shared/Models/Properties/IPropertyConfiguration.cs new file mode 100644 index 0000000..4b37f76 --- /dev/null +++ b/Shared/Models/Properties/IPropertyConfiguration.cs @@ -0,0 +1,15 @@ +namespace View_by_Distance.Shared.Models.Properties; + +public interface IPropertyConfiguration +{ + + public string DateGroup { init; get; } + public string[] PropertyContentCollectionFiles { init; get; } + public string ResultAllInOne { init; get; } + public string ResultCollection { init; get; } + public string ResultContent { init; get; } + public string ResultSingleton { init; get; } + public string RootDirectory { get; } + public string[] VerifyToSeason { 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 4892486..e3a7ec8 100644 --- a/Shared/Models/Stateless/Methods/IAge.cs +++ b/Shared/Models/Stateless/Methods/IAge.cs @@ -3,13 +3,34 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods; public interface IAge { // ... - (int, TimeSpan) TestStatic_GetAge(long minuendTicks, long subtrahendTicks); - static (int, TimeSpan) GetAge(long minuendTicks, long subtrahendTicks) => Age.GetAge(minuendTicks, subtrahendTicks); + (int, TimeSpan) TestStatic_GetAge(long minuendTicks, long subtrahendTicks) => + GetAge(minuendTicks, subtrahendTicks); + static (int, TimeSpan) GetAge(long minuendTicks, long subtrahendTicks) => + Age.GetAge(minuendTicks, subtrahendTicks); - (int, TimeSpan) TestStatic_GetAge(long minuendTicks, DateTime subtrahend); - static (int, TimeSpan) GetAge(long minuendTicks, DateTime subtrahend) => Age.GetAge(minuendTicks, subtrahend); + (int, TimeSpan) TestStatic_GetAge(long minuendTicks, DateTime subtrahend) => + GetAge(minuendTicks, subtrahend); + static (int, TimeSpan) GetAge(long minuendTicks, DateTime subtrahend) => + Age.GetAge(minuendTicks, subtrahend); - (int, TimeSpan) TestStatic_GetAge(DateTime minuend, DateTime subtrahend); - static (int, TimeSpan) GetAge(DateTime minuend, DateTime subtrahend) => Age.GetAge(minuend, subtrahend); + (int, TimeSpan) TestStatic_GetAge(DateTime minuend, DateTime subtrahend) => + GetAge(minuend, subtrahend); + static (int, TimeSpan) GetAge(DateTime minuend, DateTime subtrahend) => + Age.GetAge(minuend, subtrahend); + + char[] TestStatic_GetChars() => + GetChars(); + static char[] GetChars() => + new char[] { '!', '^', '_', '~' }; + + int? TestStatic_GetApproximateYears(string personDisplayDirectoryName, char[] chars) => + GetApproximateYears(personDisplayDirectoryName, chars); + static int? GetApproximateYears(string personDisplayDirectoryName, char[] chars) => + Age.GetApproximateYears(personDisplayDirectoryName, chars); + + int? TestStatic_GetApproximateYears(string personDisplayDirectoryName) => + GetApproximateYears(personDisplayDirectoryName); + static int? GetApproximateYears(string personDisplayDirectoryName) => + GetApproximateYears(personDisplayDirectoryName, GetChars()); } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/IPath.cs b/Shared/Models/Stateless/Methods/IPath.cs index 49a7f8d..c79f8d3 100644 --- a/Shared/Models/Stateless/Methods/IPath.cs +++ b/Shared/Models/Stateless/Methods/IPath.cs @@ -3,32 +3,39 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods; public interface IPath { // ... - string TestStatic_GetRelativePath(string path, int length); - static string GetRelativePath(string path, int length) - => XPath.GetRelativePath(path, length, forceExtensionToLower: false); + string TestStatic_GetRelativePath(string path, int length) => + GetRelativePath(path, length); + static string GetRelativePath(string path, int length) => + XPath.GetRelativePath(path, length, forceExtensionToLower: false); - bool TestStatic_DeleteEmptyDirectories(string rootDirectory); - static bool DeleteEmptyDirectories(string rootDirectory) - => XPath.DeleteEmptyDirectories(rootDirectory); + bool TestStatic_DeleteEmptyDirectories(string rootDirectory) => + DeleteEmptyDirectories(rootDirectory); + static bool DeleteEmptyDirectories(string rootDirectory) => + XPath.DeleteEmptyDirectories(rootDirectory); - List TestStatic_GetDirectoryNames(string directory); - static List GetDirectoryNames(string directory) - => XPath.GetDirectoryNames(directory); + string[] TestStatic_GetDirectoryNames(string directory) => + GetDirectoryNames(directory); + static string[] GetDirectoryNames(string directory) => + XPath.GetDirectoryNames(directory).ToArray(); - string TestStatic_GetRelativePath(string path, int length, bool forceExtensionToLower); - static string GetRelativePath(string path, int length, bool forceExtensionToLower) - => XPath.GetRelativePath(path, length, forceExtensionToLower); + string TestStatic_GetRelativePath(string path, int length, bool forceExtensionToLower) => + GetRelativePath(path, length, forceExtensionToLower); + static string GetRelativePath(string path, int length, bool forceExtensionToLower) => + XPath.GetRelativePath(path, length, forceExtensionToLower); - bool TestStatic_WriteAllText(string path, string contents, bool updateDateWhenMatches, bool compareBeforeWrite); - static bool WriteAllText(string path, string contents, bool updateDateWhenMatches, bool compareBeforeWrite, DateTime? updateToWhenMatches = null) - => XPath.WriteAllText(path, contents, updateDateWhenMatches, compareBeforeWrite, updateToWhenMatches); + bool TestStatic_WriteAllText(string path, string contents, bool updateDateWhenMatches, bool compareBeforeWrite, DateTime? updateToWhenMatches = null) => + WriteAllText(path, contents, updateDateWhenMatches, compareBeforeWrite, updateToWhenMatches); + static bool WriteAllText(string path, string contents, bool updateDateWhenMatches, bool compareBeforeWrite, DateTime? updateToWhenMatches = null) => + XPath.WriteAllText(path, contents, updateDateWhenMatches, compareBeforeWrite, updateToWhenMatches); - (int level, List directories) TestStatic_Get(string rootDirectory, string sourceDirectory); - static (int level, List directories) Get(string rootDirectory, string sourceDirectory) - => XPath.Get(rootDirectory, sourceDirectory); + (int level, List directories) TestStatic_Get(string rootDirectory, string sourceDirectory) => + Get(rootDirectory, sourceDirectory); + static (int level, List directories) Get(string rootDirectory, string sourceDirectory) => + XPath.Get(rootDirectory, sourceDirectory); - string TestStatic_GetDirectory(string sourceDirectory, int level, string directoryName); - static string GetDirectory(string sourceDirectory, int level, string directoryName) - => XPath.GetDirectory(sourceDirectory, level, directoryName); + string TestStatic_GetDirectory(string sourceDirectory, int level, string directoryName) => + GetDirectory(sourceDirectory, level, directoryName); + static string GetDirectory(string sourceDirectory, int level, string directoryName) => + XPath.GetDirectory(sourceDirectory, level, directoryName); } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/IPerson.cs b/Shared/Models/Stateless/Methods/IPerson.cs index 3e18c00..be58ff7 100644 --- a/Shared/Models/Stateless/Methods/IPerson.cs +++ b/Shared/Models/Stateless/Methods/IPerson.cs @@ -10,10 +10,10 @@ public interface IPerson static string GetFileFullName(Properties.IStorage storage, string personBirthdayFormat, Models.Person person) => PersonBirthday.GetFileFullName(storage, personBirthdayFormat, person.Birthday); - Models.Person TestStatic_GetPerson(string resultAllInOne, long personKey, Models.PersonBirthday personBirthday) => - GetPerson(resultAllInOne, personKey, personBirthday); - static Models.Person GetPerson(string resultAllInOne, long personKey, Models.PersonBirthday personBirthday) => - Person.GetPerson(personKey, personBirthday, new string[] { resultAllInOne }); + Models.Person TestStatic_GetPerson(string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) => + GetPerson(personDisplayDirectoryName, personKey, personBirthday); + static Models.Person GetPerson(string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) => + Person.GetPerson(personKey, personBirthday, personDisplayDirectoryName.Split(IAge.GetChars())); Models.Person TestStatic_GetPerson(long personKey, string[] segments) => GetPerson(personKey, segments); diff --git a/Shared/Models/Stateless/Methods/PersonContainer.cs b/Shared/Models/Stateless/Methods/PersonContainer.cs index 2c9d2c0..6e992fb 100644 --- a/Shared/Models/Stateless/Methods/PersonContainer.cs +++ b/Shared/Models/Stateless/Methods/PersonContainer.cs @@ -83,7 +83,7 @@ internal abstract class PersonContainer internal static List GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat) { List results; - char[] chars = new char[] { '!', '^', '_', '~' }; + char[] chars = IAge.GetChars(); string a2PeopleSingletonDirectory = Path.Combine(storage.PeopleRootDirectory, "{}"); if (!Directory.Exists(a2PeopleSingletonDirectory)) _ = Directory.CreateDirectory(a2PeopleSingletonDirectory); diff --git a/Shared/Models/Stateless/Methods/XPath.cs b/Shared/Models/Stateless/Methods/XPath.cs index 0c6c6be..986454a 100644 --- a/Shared/Models/Stateless/Methods/XPath.cs +++ b/Shared/Models/Stateless/Methods/XPath.cs @@ -104,21 +104,33 @@ internal abstract class XPath internal static List GetDirectoryNames(string directory) { List results = new(); + string? fileName; string? checkDirectory = directory; string? pathRoot = Path.GetPathRoot(directory); string extension = Path.GetExtension(directory); if (string.IsNullOrEmpty(pathRoot)) throw new NullReferenceException(nameof(pathRoot)); if (Directory.Exists(directory)) - results.Add(Path.GetFileName(directory)); + { + fileName = Path.GetFileName(directory); + if (!string.IsNullOrEmpty(fileName)) + results.Add(fileName); + } else if ((string.IsNullOrEmpty(extension) || extension.Length > 3) && !File.Exists(directory)) - results.Add(Path.GetFileName(directory)); + { + fileName = Path.GetFileName(directory); + if (!string.IsNullOrEmpty(fileName)) + results.Add(fileName); + } for (int i = 0; i < int.MaxValue; i++) { checkDirectory = Path.GetDirectoryName(checkDirectory); if (string.IsNullOrEmpty(checkDirectory) || checkDirectory == pathRoot) break; - results.Add(Path.GetFileName(checkDirectory)); + fileName = Path.GetFileName(checkDirectory); + if (string.IsNullOrEmpty(fileName)) + continue; + results.Add(fileName); } results.Add(pathRoot); results.Reverse(); diff --git a/Tests/UnitTestCalculations.cs b/Tests/UnitTestCalculations.cs index 38a5ede..e6c679a 100644 --- a/Tests/UnitTestCalculations.cs +++ b/Tests/UnitTestCalculations.cs @@ -122,4 +122,35 @@ public class UnitTestCalculations Assert.IsTrue($"({l}{d.ToString("0.00")[1..]})" == "(637967784888423594.45)"); } + [TestMethod] + public void TestMethodDirectory() + { + string[] names; + names = IPath.GetDirectoryNames(@"C:\Tmp\phares"); + Assert.IsTrue(names.Length == 3); + names = IPath.GetDirectoryNames(@"C:\Tmp\phares\"); + Assert.IsTrue(names.Length == 3); + names = IPath.GetDirectoryNames(@"C:\Tmp\phares\Pictures - Results\E) Distance\2022-09-15\7680 x 4320\7680x4320 - Hog - Large\()\(637991752537712052)\1976-03-08_00\#2019\K\-735727008.520765.jpg"); + Assert.IsTrue(names.Length == 13); + // Length = 13 + // [0] [string]: + // "C:\\" + // [1] [string]: + // "Tmp" + // [2] [string]: + // "phares" + // [3] [string]: + // "Pictures - Results" + // [4] [string]: + // "E) Distance" + // [5] [string]: + // "2022-09-15" + // [6] [string]: + // "7680 x 4320" + // [7] [string]: + // "7680x4320 - Hog - Large" + // [8] [string]: + // "()" + } + } \ No newline at end of file diff --git a/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs b/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs index 43797f0..80988a7 100644 --- a/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs +++ b/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs @@ -32,6 +32,7 @@ public class Configuration [Display(Name = "Location Factor"), Required] public int? LocationFactor { get; set; } [Display(Name = "Map Logic Sigma"), Required] public int? MapLogicSigma { get; set; } [Display(Name = "Mapped Max Index"), Required] public int? MappedMaxIndex { get; set; } + [Display(Name = "Mapping Default Name"), Required] public string MappingDefaultName { get; set; } [Display(Name = "Mapping Move Unable to Match by 1 Tick"), Required] public bool? MappingMoveUnableToMatch { get; set; } [Display(Name = "Mapping Save Face Encoding"), Required] public bool? MappingSaveFaceEncoding { get; set; } [Display(Name = "Mapping Save Mapped"), Required] public bool? MappingSaveMapped { get; set; } @@ -127,6 +128,8 @@ public class Configuration throw new NullReferenceException(nameof(configuration.LocationFactor)); if (configuration.MapLogicSigma is null) throw new NullReferenceException(nameof(configuration.MapLogicSigma)); + if (configuration.MappingDefaultName is null) + throw new NullReferenceException(nameof(configuration.MappingDefaultName)); if (configuration.MappingMoveUnableToMatch is null) throw new NullReferenceException(nameof(configuration.MappingMoveUnableToMatch)); if (configuration.MappingSaveFaceEncoding is null) @@ -236,6 +239,7 @@ public class Configuration configuration.LocationFactor.Value, configuration.MapLogicSigma.Value, configuration.MappedMaxIndex, + configuration.MappingDefaultName, configuration.MappingMoveUnableToMatch.Value, configuration.MappingSaveFaceEncoding.Value, configuration.MappingSaveNotMapped.Value, diff --git a/TestsWithFaceRecognitionDotNet/Models/Configuration.cs b/TestsWithFaceRecognitionDotNet/Models/Configuration.cs index effdec2..145e94c 100644 --- a/TestsWithFaceRecognitionDotNet/Models/Configuration.cs +++ b/TestsWithFaceRecognitionDotNet/Models/Configuration.cs @@ -31,6 +31,7 @@ public class Configuration public int LocationFactor { init; get; } public int MapLogicSigma { init; get; } public int? MappedMaxIndex { init; get; } + public string MappingDefaultName { init; get; } public bool MappingMoveUnableToMatch { init; get; } public bool MappingSaveFaceEncoding { init; get; } public bool MappingSaveNotMapped { init; get; } @@ -98,6 +99,7 @@ public class Configuration int locationFactor, int mapLogicSigma, int? mappedMaxIndex, + string mappingDefaultName, bool mappingMoveUnableToMatch, bool mappingSaveFaceEncoding, bool mappingSaveNotMapped, @@ -164,6 +166,7 @@ public class Configuration LocationFactor = locationFactor; MapLogicSigma = mapLogicSigma; MappedMaxIndex = mappedMaxIndex; + MappingDefaultName = mappingDefaultName; MappingMoveUnableToMatch = mappingMoveUnableToMatch; MappingSaveFaceEncoding = mappingSaveFaceEncoding; MappingSaveNotMapped = mappingSaveNotMapped;