diff --git a/Distance/Models/_E_Distance.cs b/Distance/Models/_E_Distance.cs index 266e8fe..3c8f2de 100644 --- a/Distance/Models/_E_Distance.cs +++ b/Distance/Models/_E_Distance.cs @@ -380,18 +380,28 @@ public partial class E_Distance public static void SetFaceDistances(int maxDegreeOfParallelism, long ticks, List distinctFilteredFaces) { + List faces = new(); + foreach (Face face in distinctFilteredFaces) + { + if (face.Mapping?.MappingFromFilter is null) + throw new NotSupportedException(); + if (face.Mapping.MappingFromFilter.IsFocusPerson is not null && !face.Mapping.MappingFromFilter.IsFocusPerson.Value) + continue; + if (face.FaceEncoding is not null && face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding _) + continue; + faces.Add(face); + } int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism }; - string message = $") {distinctFilteredFaces.Count:000} Load Face Encoding - {totalSeconds} total second(s)"; + string message = $") {faces.Count:000} Load Face Encoding - {totalSeconds} total second(s)"; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; - using ProgressBar progressBar = new(distinctFilteredFaces.Count, message, options); - _ = Parallel.For(0, distinctFilteredFaces.Count, parallelOptions, (i, state) => + using ProgressBar progressBar = new(faces.Count, message, options); + _ = Parallel.For(0, faces.Count, parallelOptions, (i, state) => { - Face face = distinctFilteredFaces[i]; + Face face = faces[i]; + FaceRecognitionDotNet.FaceEncoding faceEncoding; if (face.FaceEncoding is null || face.Mapping?.MappingFromLocation is null) throw new NotSupportedException(); - if (face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding faceEncoding) - return; progressBar.Tick(); faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding); FaceDistance faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages); @@ -490,14 +500,16 @@ public partial class E_Distance continue; if (faceDistanceContainer.Face.Mapping.MappingFromLocation.AreaPermyriad < distanceLimits.FaceAreaPermyriad) continue; + if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsUsed is not null && faceDistanceContainer.Face.Mapping.MappingFromFilter.IsUsed.Value) + continue; + if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusPerson is not null && !faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusPerson.Value) + continue; if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusModel is not null && !faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusModel.Value) continue; if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusRelativePath is not null && !faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusRelativePath.Value) continue; if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsIgnoreRelativePath is not null && faceDistanceContainer.Face.Mapping.MappingFromFilter.IsIgnoreRelativePath.Value) continue; - if (mapLogic.Used(faceDistanceContainer.FaceDistance)) - continue; results.Add(faceDistanceContainer); } return results.ToArray(); diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index cf95dd3..35d3419 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -40,6 +40,7 @@ public partial class DlibDotNet private readonly Models.Configuration _Configuration; private readonly bool _ArgZeroIsConfigurationRootDirectory; private readonly Map.Models.Configuration _MapConfiguration; + private readonly List<(string, long)> _JLinkResolvedDirectories; public DlibDotNet( List args, @@ -57,6 +58,7 @@ public partial class DlibDotNet _IsEnvironment = isEnvironment; long ticks = DateTime.Now.Ticks; _Exceptions = new List(); + _JLinkResolvedDirectories = new(); if (ticks.ToString().Last() == '0') ticks += 1; _Log = Serilog.Log.ForContext(); @@ -109,7 +111,7 @@ public partial class DlibDotNet _FaceParts = new D2_FaceParts(_Configuration.PropertyConfiguration, imageCodecInfo, encoderParameters, filenameExtension, configuration.CheckDFaceAndUpWriteDates, configuration.OverrideForFaceLandmarkImages); } _MapConfiguration = Get(configuration, _Faces.FileNameExtension, _Faces.HiddenFileNameExtension, _FaceParts.FileNameExtension); - _Distance = new(configuration.DistanceMoveUnableToMatch, configuration.DistanceRenameToMatch, _Configuration.FaceConfidencePercent, configuration.RangeDistanceTolerance, configuration.RangeFaceConfidence, configuration.RectangleIntersectMinimums); + _Distance = new(configuration.DistanceMoveUnableToMatch, configuration.DistanceRenameToMatch, configuration.FaceConfidencePercent, configuration.RangeDistanceTolerance, configuration.RangeFaceConfidence, configuration.RectangleIntersectMinimums); if (_PropertyRootExistedBefore || !_ArgZeroIsConfigurationRootDirectory) personContainers = new(new List()); else @@ -124,11 +126,18 @@ public partial class DlibDotNet string? rootResultsDirectory = Path.GetDirectoryName(Path.GetDirectoryName(peopleRootDirectory)) ?? throw new Exception(); Storage storage = new(rootDirectory, rootResultsDirectory, peopleRootDirectory); _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(Path.Combine(peopleRootDirectory, propertyConfiguration.ResultSingleton)); - personContainers = new(IPersonContainer.GetPersonContainers(storage, configuration.MappingDefaultName, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), _Faces.FileNameExtension)); + string a2PeopleContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration.PropertyConfiguration, nameof(A2_People), "([])"); + personContainers = new(IPersonContainer.GetPersonContainers(storage, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), _Faces.FileNameExtension)); + if (configuration.JLinks.Length > 0) + { + string a2PeopleSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration.PropertyConfiguration, nameof(A2_People), "{}"); + _JLinkResolvedDirectories.AddRange(Map.Models.Stateless.Methods.IMapLogic.GetJLinkDirectories(configuration.JLinks, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), a2PeopleSingletonDirectory, a2PeopleContentDirectory)); + if (_JLinkResolvedDirectories.Count == 0) + throw new Exception(nameof(Map.Models.Stateless.Methods.IMapLogic.GetJLinkDirectories)); + } GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections = IGenealogicalDataCommunication.GetIndividuals(configuration.GenealogicalDataCommunicationFile, requireNickName: true); if (!string.IsNullOrEmpty(configuration.GenealogicalDataCommunicationFile) && genealogicalDataCommunicationCollections.HeaderLines.Any() && genealogicalDataCommunicationCollections.Individuals.Any() && genealogicalDataCommunicationCollections.FamilyGroupLines.Any() && genealogicalDataCommunicationCollections.FooterLines.Any()) { - string a2PeopleContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration.PropertyConfiguration, nameof(A2_People), "([])"); TimeSpan a2LastWriteTimeTimeSpan = new(ticks - new DirectoryInfo(a2PeopleContentDirectory).LastWriteTime.Ticks); if (a2LastWriteTimeTimeSpan.TotalDays > 1) { @@ -301,23 +310,28 @@ public partial class DlibDotNet { double? α; int? eyeα; + bool? isUsed; bool? eyeReview; Mapping mapping; - int faceAreaPermyriad; + bool? isFocusPerson; int confidencePercent; + int faceAreaPermyriad; bool? inSkipCollection; int wholePercentRectangle; string deterministicHashCodeKey; MappingFromFilter mappingFromFilter; MappingFromLocation? mappingFromLocation; bool? isFocusModel = GetIsFocusModel(item.Property); + bool ignoreXMatches = _JLinkResolvedDirectories.Count > 0; foreach (Shared.Models.Face face in faces) { if (item.Property?.Id is null || face.FaceEncoding is null || face.Location is null || face.OutputResolution is null) { + isUsed = null; + isFocusPerson = null; inSkipCollection = null; mappingFromLocation = null; - mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection); + mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection, isUsed); } else { @@ -333,8 +347,10 @@ public partial class DlibDotNet wholePercentRectangle = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); deterministicHashCodeKey = IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, eyeα, eyeReview, wholePercentRectangle); + isUsed = mapLogic.IsUsed(ignoreXMatches, item.Property.Id.Value, mappingFromLocation); inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation); - mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection); + isFocusPerson = mapLogic.IsFocusPerson(_JLinkResolvedDirectories, item.Property.Id.Value, mappingFromLocation); + mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection, isUsed); } mapping = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection); _ = mapLogic.UpdateMappingFromPerson(mapping); @@ -342,32 +358,39 @@ public partial class DlibDotNet } } - private Mapping GetMapping(MapLogic mapLogic, Item item, bool? isFocusRelativePath, bool? isIgnoreRelativePath, MappingFromItem mappingFromItem) + private Mapping GetMapping(MapLogic mapLogic, Item item, bool? isFocusRelativePath, bool? isIgnoreRelativePath, MappingFromItem mappingFromItem, List<(string, long)> jLinkResolvedDirectories) { Mapping result; + bool? isUsed; int? eyeα = null; + bool? isFocusPerson; bool? eyeReview = null; bool? inSkipCollection; - int wholePercentRectangle; - int faceAreaPermyriad = 0; int confidencePercent = 0; + int faceAreaPermyriad = 0; + int wholePercentRectangle; string deterministicHashCodeKey; MappingFromFilter mappingFromFilter; MappingFromLocation? mappingFromLocation; bool? isFocusModel = GetIsFocusModel(item.Property); + bool ignoreXMatches = jLinkResolvedDirectories.Count > 0; if (item.Property?.Id is null) { + isUsed = null; + isFocusPerson = null; inSkipCollection = null; mappingFromLocation = null; - mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection); + mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection, isUsed); } else { wholePercentRectangle = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(Shared.Models.Stateless.ILocation.Digits); deterministicHashCodeKey = IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, Shared.Models.Stateless.ILocation.Digits); mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, eyeα, eyeReview, wholePercentRectangle); + isUsed = mapLogic.IsUsed(ignoreXMatches, item.Property.Id.Value, mappingFromLocation); inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation); - mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection); + isFocusPerson = mapLogic.IsFocusPerson(jLinkResolvedDirectories, item.Property.Id.Value, mappingFromLocation); + mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection, isUsed); } result = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection: null); return result; @@ -540,6 +563,7 @@ public partial class DlibDotNet if (_Log is null) throw new NullReferenceException(nameof(_Log)); int result = 0; + bool ignoreXMatches = _JLinkResolvedDirectories.Count > 0; ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism }; DateTime[] containerDateTimes = Shared.Models.Stateless.Methods.IContainer.GetContainerDateTimes(filteredItems); ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; @@ -763,12 +787,12 @@ public partial class DlibDotNet long? skipOlderThan = _Configuration.SkipOlderThanDays is null ? null : new DateTime(ticks).AddDays(-_Configuration.SkipOlderThanDays.Value).Ticks; distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh); filteredFaceDistanceContainers = E_Distance.FilteredFaceDistanceContainers(mapLogic, faceDistanceContainers, skipOlderThan, distanceLimits); - if (!filteredFaceDistanceContainers.Any()) + if (filteredFaceDistanceContainers.Length == 0) _Log.Information("All images have been filtered!"); else { sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, distanceLimits, faceDistanceEncodings, filteredFaceDistanceContainers); - if (!sortingContainers.Any()) + if (sortingContainers.Length == 0) { for (useFiltersCounter = 1; useFiltersCounter < _Configuration.UseFilterTries; useFiltersCounter++) { @@ -779,7 +803,7 @@ public partial class DlibDotNet else { sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, distanceLimits, faceDistanceEncodings, filteredFaceDistanceContainers); - if (sortingContainers.Any()) + if (sortingContainers.Length == 0) break; } } @@ -817,7 +841,6 @@ public partial class DlibDotNet if (Directory.Exists(d2FacePartsContentCollectionDirectory)) Shared.Models.Stateless.Methods.IPath.MakeHiddenIfAllItemsAreHidden(d2FacePartsContentCollectionDirectory); } - Dictionary> idToWholePercentagesToMapping = Map.Models.Stateless.Methods.IMapLogic.GetIdToWholePercentagesToFace(distinctFilteredMappingCollection); if (Directory.Exists(fPhotoPrismContentDirectory)) F_PhotoPrism.WriteMatches(fPhotoPrismContentDirectory, _Configuration.MappingDefaultName, _Configuration.PersonBirthdayFormat, _Configuration.RectangleIntersectMinimums, ticks, distinctFilteredFaces, mapLogic); if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) @@ -828,6 +851,7 @@ public partial class DlibDotNet mapLogic.CopyAtLeastOneMappedFiles(_Configuration.PersonCharactersCopyCount, dFacesContentDirectory, a2PeopleSingletonDirectory, distinctFilteredMappingCollection); mapLogic.SavePersonKeyToCount(dFacesContentDirectory, a2PeopleSingletonDirectory, distinctFilteredMappingCollection); } + Dictionary> idToWholePercentagesToMapping = Map.Models.Stateless.Methods.IMapLogic.GetIdToWholePercentagesToFace(distinctFilteredMappingCollection); mapLogic.CopyManualFiles(dFacesContentDirectory, idToWholePercentagesToMapping); if (_Configuration.SaveMappedForOutputResolutions.Contains(outputResolution)) mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, personKeyToIds, distinctFilteredMappingCollection, idToWholePercentagesToMapping, totalNotMapped); @@ -1030,7 +1054,7 @@ public partial class DlibDotNet } if (!anyValidFaces) { - mapping = GetMapping(mapLogic, item, isFocusRelativePath, isIgnoreRelativePath, mappingFromItem); + mapping = GetMapping(mapLogic, item, isFocusRelativePath, isIgnoreRelativePath, mappingFromItem, _JLinkResolvedDirectories); mappingCollection.Add(mapping); } } @@ -1258,7 +1282,7 @@ public partial class DlibDotNet personKeyToIds = mapLogic.GetPersonKeyToIds(); if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) mapLogic.SaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, distinctFilteredMappingCollection); - if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions.Contains(outputResolution)) + if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.JLinks.Length > 0 && _Configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions.Contains(outputResolution)) mapLogic.SaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, personContainers, a2PeopleContentDirectory, personKeyToIds, distinctFilteredMappingCollection, totalNotMapped); (cResultsFullGroupDirectory, c2ResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution); if (_ArgZeroIsConfigurationRootDirectory diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index 6d19210..58ad2cb 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -425,11 +425,11 @@ public class MapLogic : Shared.Models.Methods.IMapLogic directory = GetDirectory(_Configuration, saveIndividually, padLeft, mapping.SegmentC, by, mapping.MappingFromItem); if (string.IsNullOrEmpty(directory)) continue; - personDirectory = Path.Combine(directory, $"Z]{ticks}"); + personDirectory = Path.Combine(directory, $"X]{ticks}"); if (saveIndividually) { directory = Path.Combine(directory, mapping.MappingFromItem.Id.ToString()); - results.Add(new(Path.Combine(directory, $"Z]{ticks}"))); + results.Add(new(Path.Combine(directory, $"X]{ticks}"))); } distinct.Add(mapping.MappingFromItem.Id); distinct.Add(mapping.SortingContainer.Sorting.Id); @@ -556,23 +556,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory); } - public bool Used(FaceDistance faceDistanceEncoding) - { - bool result = false; - if (faceDistanceEncoding.WholePercentages is null) - throw new NotSupportedException(); - List? wholePercentagesCollection; - Dictionary? wholePercentagesToPersonContainers; - if (_SkipCollection.TryGetValue(faceDistanceEncoding.Id, out wholePercentagesCollection) && wholePercentagesCollection.Contains(faceDistanceEncoding.WholePercentages.Value)) - result = true; - if (!result && _IdThenWholePercentagesToPersonContainers.TryGetValue(faceDistanceEncoding.Id, out wholePercentagesToPersonContainers)) - { - if (wholePercentagesToPersonContainers.ContainsKey(faceDistanceEncoding.WholePercentages.Value)) - result = true; - } - return result; - } - public List GetSortingCollection(int i, FaceDistance faceDistanceEncoding, List faceDistanceLengths) { if (_Configuration is null) @@ -1107,7 +1090,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic SaveContainer? saveContainer; bool saveIndividually = false; List saveContainers = new(); - Stateless.MapLogic.BeforeSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory); (int, FileHolder, int, string, string, string, string)[] collection = GetCollectionForSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory, personContainers, mappingCollection, personKeyToIds); foreach ((int id, FileHolder imageFileHolder, int approximateYears, string personKeyFormatted, string directory, string personDirectory, string checkFile) in collection) { @@ -1359,6 +1341,25 @@ public class MapLogic : Shared.Models.Methods.IMapLogic return results; } + public bool IsUsed(bool ignoreXMatches, int id, MappingFromLocation mappingFromLocation) + { + bool result; + PersonContainer[]? personContainers; + List? wholePercentagesCollection; + Dictionary? wholePercentagesToPersonContainers; + result = _SkipCollection.TryGetValue(id, out wholePercentagesCollection) && wholePercentagesCollection.Contains(mappingFromLocation.WholePercentages); + if (!result && _IdThenWholePercentagesToPersonContainers.TryGetValue(id, out wholePercentagesToPersonContainers)) + { + if (wholePercentagesToPersonContainers.TryGetValue(mappingFromLocation.WholePercentages, out personContainers)) + { + result = true; + // if (!ignoreXMatches || personContainers.All(l => l.ApproximateYears is null && l.DisplayDirectoryName.First() != 'X')) + // result = true; + } + } + return result; + } + public bool InSkipCollection(int id, MappingFromLocation mappingFromLocation) { bool result; @@ -1366,4 +1367,30 @@ public class MapLogic : Shared.Models.Methods.IMapLogic return result; } + public bool? IsFocusPerson(List<(string Directory, long PersonKey)> jLinkResolvedDirectories, int id, MappingFromLocation mappingFromLocation) + { + bool? result; + PersonContainer[]? personContainers; + Dictionary? wholePercentagesToPersonContainers; + if (jLinkResolvedDirectories.Count == 0) + result = null; + else if (!_IdThenWholePercentagesToPersonContainers.TryGetValue(id, out wholePercentagesToPersonContainers)) + result = null; + else if (!wholePercentagesToPersonContainers.TryGetValue(mappingFromLocation.WholePercentages, out personContainers)) + result = null; + else + { + result = false; + foreach (PersonContainer personContainer in personContainers) + { + if (jLinkResolvedDirectories.Any(l => personContainer.Key == l.PersonKey)) + { + result = true; + break; + } + } + } + return result; + } + } \ No newline at end of file diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index a7c17f8..12dce88 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -142,7 +142,7 @@ internal abstract class MapLogic if (files.Length != 4) continue; collection = files.Select(l => new FileInfo(l)).ToArray(); - isDefault = alphaDirectoryName.First() == 'Z' && IPersonBirthday.IsCounterPersonYear(personKeyFormatted[..4]); + isDefault = alphaDirectoryName.First() == 'X' && IPersonBirthday.IsCounterPersonYear(personKeyFormatted[..4]); if (isDefault) facesFileNames = (from l in collection where l.Extension == configuration.FacesFileNameExtension select l.FullName).ToArray(); else @@ -279,16 +279,15 @@ internal abstract class MapLogic personDisplayDirectoryNames = IPath.GetDirectoryNames(personNameDirectory); if (!personDisplayDirectoryNames.Any()) continue; - isDefault = personDisplayDirectoryNames[^1].First() == 'Z' && IPersonBirthday.IsCounterPersonYear(personKeyFormatted[..4]); + isDefault = personDisplayDirectoryNames[^1].First() == 'X' && IPersonBirthday.IsCounterPersonYear(personKeyFormatted[..4]); if (isDefault && personDisplayDirectoryNames[^1].Length == 1) { if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length || !DateTime.TryParseExact(personKeyFormatted, configuration.PersonBirthdayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) continue; - checkDirectory = Path.Combine(yearDirectory, $"Z]{dateTime.Ticks}"); + checkDirectory = Path.Combine(yearDirectory, $"X]{dateTime.Ticks}"); if (Directory.Exists(checkDirectory)) { - files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly); - RenameUnknown(files); + Directory.Delete(yearDirectory, recursive: true); continue; } Directory.Move(personNameDirectory, checkDirectory); @@ -424,7 +423,7 @@ internal abstract class MapLogic group = IPerson.GetHourGroup(personDisplayDirectoryName, personBirthday.Value.Hour); (status, sex, first) = IPerson.GetPersonHour(personDisplayDirectoryName, personBirthday.Value.Hour); personDirectory = new(matches.First(), group, status, sex, first); - personContainer = new(configuration.MappingDefaultName, configuration.PersonCharacters.ToArray(), personBirthday, personDisplayDirectoryName, personDirectory); + personContainer = new(configuration.PersonCharacters.ToArray(), personBirthday, personDisplayDirectoryName, personDirectory); personKeyFormattedToPersonContainer.Add(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, personContainer); } if (!idThenWholePercentagesToPersonContainerCollection.ContainsKey(personKeyFormattedIdThenWholePercentages.Id)) @@ -542,7 +541,7 @@ internal abstract class MapLogic if (check) continue; personBirthday = IPersonBirthday.GetPersonBirthday(personKey + (oneHour * 2)); - person = IPerson.GetPerson(configuration.MappingDefaultName, configuration.PersonCharacters.ToArray(), configuration.MappingDefaultName, personKey, personBirthday); + person = IPerson.GetPerson(configuration.PersonCharacters.ToArray(), configuration.MappingDefaultName, personKey, personBirthday); personContainer = new(approximateYears, new PersonBirthday[] { personBirthday }, personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey, person); results.Add(personContainer); if (results.Count > 99) @@ -1185,24 +1184,43 @@ internal abstract class MapLogic return results; } - private static bool TryToFind(string a2PeopleSingletonDirectory, string file, string path) + private static string? TryToFind(char[] personCharacters, string a2PeopleSingletonDirectory, List<(string Directory, string DirectoryName, string DirectoryNameSplitFirst)> a2PeopleSingletonDirectories, string file, string path) { - bool result = false; + string? result; string? pathName = Path.GetFileName(path); string? group = Path.GetDirectoryName(path); string? groupName = Path.GetFileName(group); - if (pathName is not null && group is not null && groupName is not null) + if (pathName is null || group is null || groupName is null) + result = null; + else { - WindowsShortcut windowsShortcut; - string checkDirectory = Path.Combine(a2PeopleSingletonDirectory, groupName, pathName); - if (Directory.Exists(checkDirectory)) + string[] matches; + matches = (from l in a2PeopleSingletonDirectories where l.DirectoryName == pathName select l.Directory).ToArray(); + if (matches.Length == 1) + result = matches.First(); + else + { + string pathNameSplitFirst = pathName.Split(personCharacters).First(); + matches = (from l in a2PeopleSingletonDirectories where l.DirectoryNameSplitFirst == pathNameSplitFirst select l.Directory).ToArray(); + if (matches.Length == 1) + result = matches.First(); + else + { + string checkDirectory = Path.Combine(a2PeopleSingletonDirectory, groupName, pathName); + if (!Directory.Exists(checkDirectory)) + result = null; + else + result = checkDirectory; + } + } + if (!string.IsNullOrEmpty(result)) { try { - windowsShortcut = new() { Path = checkDirectory }; + WindowsShortcut windowsShortcut; + windowsShortcut = new() { Path = result }; windowsShortcut.Save(file); windowsShortcut.Dispose(); - result = true; } catch (Exception) { } @@ -1211,29 +1229,71 @@ internal abstract class MapLogic return result; } - internal static void BeforeSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleContentDirectory) + private static List<(string, long)> GetJLinkResolvedDirectories(string personBirthdayFormat, List resolvedDirectories) { + List<(string, long)> results = new(); + DateTime dateTime; + string directoryName; + string[] directories; + foreach (string resolvedDirectory in resolvedDirectories) + { + directories = Directory.GetDirectories(resolvedDirectory, "*", SearchOption.TopDirectoryOnly); + foreach (string directory in directories) + { + directoryName = Path.GetFileName(directory); + if (directoryName.Length != personBirthdayFormat.Length || !DateTime.TryParseExact(directoryName, personBirthdayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) + continue; + results.Add((resolvedDirectory, dateTime.Ticks)); + } + } + if (results.Count != resolvedDirectories.Count) + results.Clear(); + return results; + } + + internal static List<(string, long)> GetJLinkDirectories(string[] jLinks, string personBirthdayFormat, char[] personCharacters, string a2PeopleSingletonDirectory, string a2PeopleContentDirectory) + { + List<(string, long)> results; string[] files; + string? foundPath; + int totalFiles = 0; string checkDirectory; WindowsShortcut windowsShortcut; + List resolvedDirectories = new(); + List<(string, string, string)> a2PeopleSingletonDirectories = new(); + foreach (string directory in Directory.GetDirectories(a2PeopleSingletonDirectory, "*", SearchOption.AllDirectories)) + a2PeopleSingletonDirectories.Add((directory, Path.GetFileName(directory), Path.GetFileName(directory).Split(personCharacters).First())); foreach (string directoryName in jLinks) { checkDirectory = Path.Combine(a2PeopleContentDirectory, directoryName); if (!Directory.Exists(checkDirectory)) continue; files = Directory.GetFiles(checkDirectory, "*.lnk", SearchOption.TopDirectoryOnly); + totalFiles += files.Length; foreach (string file in files) { windowsShortcut = WindowsShortcut.Load(file); if (windowsShortcut.Path is null) continue; - if (!Directory.Exists(windowsShortcut.Path)) + if (Directory.Exists(windowsShortcut.Path)) + resolvedDirectories.Add(windowsShortcut.Path); + else { - if (!TryToFind(a2PeopleContentDirectory, file, windowsShortcut.Path)) + foundPath = TryToFind(personCharacters, a2PeopleSingletonDirectory, a2PeopleSingletonDirectories, file, windowsShortcut.Path); + if (string.IsNullOrEmpty(foundPath)) continue; + resolvedDirectories.Add(foundPath); } } } + if (totalFiles == resolvedDirectories.Count) + results = GetJLinkResolvedDirectories(personBirthdayFormat, resolvedDirectories); + else + { + resolvedDirectories.Clear(); + results = new(); + } + return results; } internal static (string, bool, bool) Get(int? useFiltersCounter, bool saveIndividually, bool sortingContainersAny, string forceSingleImageHumanized, Mapping mapping) diff --git a/Map/Models/Stateless/Methods/IMapLogic.cs b/Map/Models/Stateless/Methods/IMapLogic.cs index 9aee655..c16b397 100644 --- a/Map/Models/Stateless/Methods/IMapLogic.cs +++ b/Map/Models/Stateless/Methods/IMapLogic.cs @@ -28,4 +28,9 @@ public interface IMapLogic static Dictionary> GetIdToWholePercentagesToFace(Shared.Models.Mapping[] mappingCollection) => MapLogic.GetIdToWholePercentagesToFace(mappingCollection); + List<(string, long)> TestStatic_GetJLinkDirectories(string[] jLinks, string personBirthdayFormat, char[] personCharacters, string a2PeopleSingletonDirectory, string a2PeopleContentDirectory) => + GetJLinkDirectories(jLinks, personBirthdayFormat, personCharacters, a2PeopleSingletonDirectory, a2PeopleContentDirectory); + static List<(string, long)> GetJLinkDirectories(string[] jLinks, string personBirthdayFormat, char[] personCharacters, string a2PeopleSingletonDirectory, string a2PeopleContentDirectory) => + MapLogic.GetJLinkDirectories(jLinks, personBirthdayFormat, personCharacters, a2PeopleSingletonDirectory, a2PeopleContentDirectory); + } \ No newline at end of file diff --git a/Shared/.kanbn/tasks/verify-ignore-is-working-for-one-half-of-sort-without-person.md b/Shared/.kanbn/archive/verify-ignore-is-working-for-one-half-of-sort-without-person.md similarity index 51% rename from Shared/.kanbn/tasks/verify-ignore-is-working-for-one-half-of-sort-without-person.md rename to Shared/.kanbn/archive/verify-ignore-is-working-for-one-half-of-sort-without-person.md index a66ecd4..c41a66c 100644 --- a/Shared/.kanbn/tasks/verify-ignore-is-working-for-one-half-of-sort-without-person.md +++ b/Shared/.kanbn/archive/verify-ignore-is-working-for-one-half-of-sort-without-person.md @@ -1,9 +1,13 @@ --- created: 2023-07-31T18:54:50.692Z -updated: 2023-07-31T19:09:12.889Z +updated: 2023-07-31T20:14:20.428Z assigned: "" progress: 0 tags: [] +completed: 2023-07-31T20:14:20.428Z +column: Done --- # Verify Ignore Is Working For One Half of Sort Without Person + +- [ ] Only a problem for one of the two images... diff --git a/Shared/.kanbn/index.md b/Shared/.kanbn/index.md index 351a84c..4791f1b 100644 --- a/Shared/.kanbn/index.md +++ b/Shared/.kanbn/index.md @@ -27,8 +27,6 @@ taskTemplate: '^+^_${overdue ? ''^R'' : ''''}${name}^: ${relations ? (''\n^-^/^g ## Todo -- [look-for-family-from-jlink-in-z-mapped](tasks/look-for-family-from-jlink-in-z-mapped.md) -- [verify-ignore-is-working-for-one-half-of-sort-without-person](tasks/verify-ignore-is-working-for-one-half-of-sort-without-person.md) - [use-eyes-to-find-orientation](tasks/use-eyes-to-find-orientation.md) - [find-incorrectly-mapped-faces](tasks/find-incorrectly-mapped-faces.md) - [nef-support](tasks/nef-support.md) @@ -38,6 +36,7 @@ taskTemplate: '^+^_${overdue ? ''^R'' : ''''}${name}^: ${relations ? (''\n^-^/^g - [merge-kristy-files](tasks/merge-kristy-files.md) - [set-date-taken-when-missing](tasks/set-date-taken-when-missing.md) - [genealogical-data-communication-as-golden](tasks/genealogical-data-communication-as-golden.md) +- [look-for-family-from-jlink-in-x-mapped](tasks/look-for-family-from-jlink-in-x-mapped.md) ## Done diff --git a/Shared/.kanbn/tasks/look-for-family-from-jlink-in-x-mapped.md b/Shared/.kanbn/tasks/look-for-family-from-jlink-in-x-mapped.md new file mode 100644 index 0000000..f9465e8 --- /dev/null +++ b/Shared/.kanbn/tasks/look-for-family-from-jlink-in-x-mapped.md @@ -0,0 +1,10 @@ +--- +created: 2023-07-31T19:08:57.684Z +updated: 2023-08-01T06:13:54.468Z +assigned: "" +progress: 0 +tags: [] +started: 2023-07-31T00:00:00.000Z +--- + +# Look for family from jlink in X] mapped diff --git a/Shared/.kanbn/tasks/look-for-family-from-jlink-in-z-mapped.md b/Shared/.kanbn/tasks/look-for-family-from-jlink-in-z-mapped.md deleted file mode 100644 index e408c0a..0000000 --- a/Shared/.kanbn/tasks/look-for-family-from-jlink-in-z-mapped.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -created: 2023-07-31T19:08:57.684Z -updated: 2023-07-31T19:09:07.842Z -assigned: "" -progress: 0 -tags: [] ---- - -# Look for family from jlink in Z] mapped diff --git a/Shared/Models/MappingFromFilter.cs b/Shared/Models/MappingFromFilter.cs index 2197ce6..8556817 100644 --- a/Shared/Models/MappingFromFilter.cs +++ b/Shared/Models/MappingFromFilter.cs @@ -7,17 +7,21 @@ public class MappingFromFilter : Properties.IMappingFromFilter { public bool? IsFocusModel { init; get; } + public bool? IsFocusPerson { init; get; } public bool? IsFocusRelativePath { init; get; } public bool? IsIgnoreRelativePath { init; get; } public bool? InSkipCollection { init; get; } + public bool? IsUsed { init; get; } [JsonConstructor] - public MappingFromFilter(bool? isFocusModel, bool? isFocusRelativePath, bool? isIgnoreRelativePath, bool? inSkipCollection) + public MappingFromFilter(bool? isFocusModel, bool? isFocusPerson, bool? isFocusRelativePath, bool? isIgnoreRelativePath, bool? inSkipCollection, bool? isUsed) { IsFocusModel = isFocusModel; + IsFocusPerson = isFocusPerson; IsFocusRelativePath = isFocusRelativePath; IsIgnoreRelativePath = isIgnoreRelativePath; InSkipCollection = inSkipCollection; + IsUsed = isUsed; } public override string ToString() diff --git a/Shared/Models/PersonContainer.cs b/Shared/Models/PersonContainer.cs index 8ab7a55..81df4d1 100644 --- a/Shared/Models/PersonContainer.cs +++ b/Shared/Models/PersonContainer.cs @@ -28,8 +28,8 @@ public class PersonContainer : Properties.IPersonContainer KeyIsMaxBirthday = birthdays is null || key is null ? null : key.Value == birthdays.First().Value.Ticks; } - public PersonContainer(string mappingDefaultName, char[] personCharacters, PersonBirthday birthday, string displayDirectoryName, PersonDirectory personDirectory) : - this(Stateless.Methods.IAge.GetApproximateYears(personCharacters, displayDirectoryName), new PersonBirthday[] { birthday }, Array.Empty(), displayDirectoryName, birthday.Value.Ticks, Stateless.Methods.IPerson.GetPerson(mappingDefaultName, personCharacters, displayDirectoryName, birthday.Value.Ticks, birthday), personDirectory) + public PersonContainer(char[] personCharacters, PersonBirthday birthday, string displayDirectoryName, PersonDirectory personDirectory) : + this(Stateless.Methods.IAge.GetApproximateYears(personCharacters, displayDirectoryName), new PersonBirthday[] { birthday }, Array.Empty(), displayDirectoryName, birthday.Value.Ticks, Stateless.Methods.IPerson.GetPerson(personCharacters, displayDirectoryName, birthday.Value.Ticks, birthday), personDirectory) { } public PersonContainer(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) : diff --git a/Shared/Models/Properties/IMappingFromFilter.cs b/Shared/Models/Properties/IMappingFromFilter.cs index 573b404..fbfb4f3 100644 --- a/Shared/Models/Properties/IMappingFromFilter.cs +++ b/Shared/Models/Properties/IMappingFromFilter.cs @@ -4,8 +4,10 @@ public interface IMappingFromFilter { public bool? IsFocusModel { init; get; } + public bool? IsFocusPerson { init; get; } public bool? IsFocusRelativePath { init; get; } public bool? IsIgnoreRelativePath { init; get; } public bool? InSkipCollection { init; get; } + public bool? IsUsed { init; get; } } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/IPerson.cs b/Shared/Models/Stateless/Methods/IPerson.cs index b0923e7..71d7ec8 100644 --- a/Shared/Models/Stateless/Methods/IPerson.cs +++ b/Shared/Models/Stateless/Methods/IPerson.cs @@ -45,7 +45,7 @@ public interface IPerson bool TestStatic_IsDefaultName(string mappingDefaultName, string value) => IsDefaultName(mappingDefaultName, value); static bool IsDefaultName(string mappingDefaultName, string value) => - value == mappingDefaultName || (value.Length > 1 && value[0] == 'Z' && value[1] == ']'); + value == mappingDefaultName || (value.Length > 1 && value[0] == 'X' && value[1] == ']'); bool TestStatic_IsDefaultName(string mappingDefaultName, Models.Person person) => IsDefaultName(mappingDefaultName, person); @@ -57,14 +57,14 @@ public interface IPerson static string GetFileFullName(Properties.IStorage storage, string personBirthdayFormat, Models.Person person) => IPersonBirthday.GetFileFullName(storage, personBirthdayFormat, person.Birthday); - Models.Person TestStatic_GetPerson(string mappingDefaultName, char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) => - GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, personKey, personBirthday); - static Models.Person GetPerson(string mappingDefaultName, char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) => - Person.GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, Array.Empty(), personKey, personBirthday); + Models.Person TestStatic_GetPerson(char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) => + GetPerson(personCharacters, personDisplayDirectoryName, personKey, personBirthday); + static Models.Person GetPerson(char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) => + Person.GetPerson(personCharacters, personDisplayDirectoryName, Array.Empty(), personKey, personBirthday); - Models.Person TestStatic_GetPerson(string mappingDefaultName, char[] personCharacters, string personDisplayDirectoryName, string[] personDisplayDirectoryAllFiles, long personKey) => - GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles, personKey); - static Models.Person GetPerson(string mappingDefaultName, char[] personCharacters, string personDisplayDirectoryName, string[] personDisplayDirectoryAllFiles, long personKey) => - Person.GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles, personKey, IPersonBirthday.GetPersonBirthday(personKey)); + Models.Person TestStatic_GetPerson(char[] personCharacters, string personDisplayDirectoryName, string[] personDisplayDirectoryAllFiles, long personKey) => + GetPerson(personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles, personKey); + static Models.Person GetPerson(char[] personCharacters, string personDisplayDirectoryName, string[] personDisplayDirectoryAllFiles, long personKey) => + Person.GetPerson(personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles, personKey, IPersonBirthday.GetPersonBirthday(personKey)); } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/IPersonContainer.cs b/Shared/Models/Stateless/Methods/IPersonContainer.cs index deacd2a..a342065 100644 --- a/Shared/Models/Stateless/Methods/IPersonContainer.cs +++ b/Shared/Models/Stateless/Methods/IPersonContainer.cs @@ -12,10 +12,10 @@ public interface IPersonContainer static List GetPersonKeys(IEnumerable personContainers) => PersonContainer.GetPersonKeys(personContainers); - List TestStatic_GetPersonContainers(Properties.IStorage storage, string mappingDefaultName, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) => - GetPersonContainers(storage, mappingDefaultName, personBirthdayFormat, personCharacters, facesFileNameExtension); - static List GetPersonContainers(Properties.IStorage storage, string mappingDefaultName, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) => - PersonContainer.GetPersonContainers(storage, mappingDefaultName, personBirthdayFormat, personCharacters, facesFileNameExtension); + List TestStatic_GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) => + GetPersonContainers(storage, personBirthdayFormat, personCharacters, facesFileNameExtension); + static List GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) => + PersonContainer.GetPersonContainers(storage, personBirthdayFormat, personCharacters, facesFileNameExtension); List<(long?, string)> TestStatic_GetDisplay(string personBirthdayFormat, Models.PersonContainer personContainer) => GetDisplay(personBirthdayFormat, personContainer); diff --git a/Shared/Models/Stateless/Methods/Person.cs b/Shared/Models/Stateless/Methods/Person.cs index b9c9108..a32b3e0 100644 --- a/Shared/Models/Stateless/Methods/Person.cs +++ b/Shared/Models/Stateless/Methods/Person.cs @@ -17,27 +17,25 @@ internal abstract class Person return new(personBirthday, personKeyFormatted); } - internal static Models.Person GetPerson(string mappingDefaultName, char[] personCharacters, string personDisplayDirectoryName, string[] personDisplayDirectoryAllFiles, long personKey, Models.PersonBirthday personBirthday) + internal static Models.Person GetPerson(char[] personCharacters, string personDisplayDirectoryName, string[] personDisplayDirectoryAllFiles, long personKey, Models.PersonBirthday personBirthday) { Models.Person result; string[] matches; - const int zero = 0; List urls = new(); Models.PersonId id = new(personKey); List emails = new(); List numbers = new(); List comments = new(); List addresses = new(); - string checkFileName = $"{personDisplayDirectoryName[zero]}.json"; - bool isDefaultName = IPerson.IsDefaultName(mappingDefaultName, personDisplayDirectoryName); - string nameWithoutApproximateYears = !isDefaultName ? personDisplayDirectoryName.Split(personCharacters)[zero] : personDisplayDirectoryName; + string checkFileName = $"{personDisplayDirectoryName.First()}.json"; + string nameWithoutApproximateYears = personDisplayDirectoryName.Split(personCharacters).First(); matches = (from l in personDisplayDirectoryAllFiles where Path.GetFileName(l) == checkFileName select l).ToArray(); Models.PersonName? name; if (!matches.Any()) name = PersonName.GetPersonName(nameWithoutApproximateYears); else { - string json = File.ReadAllText(matches[zero]); + string json = File.ReadAllText(matches.First()); name = JsonSerializer.Deserialize(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); name ??= PersonName.GetPersonName(nameWithoutApproximateYears); if (name.Last is null || string.IsNullOrEmpty(name.Last.Value)) diff --git a/Shared/Models/Stateless/Methods/PersonContainer.cs b/Shared/Models/Stateless/Methods/PersonContainer.cs index 58c04aa..0411791 100644 --- a/Shared/Models/Stateless/Methods/PersonContainer.cs +++ b/Shared/Models/Stateless/Methods/PersonContainer.cs @@ -5,7 +5,7 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods; internal abstract class PersonContainer { - private static List GetFiles(string personDisplayDirectory, bool isDefaultName) + private static List GetFiles(string personDisplayDirectory) { List results = new(); string[] files; @@ -38,7 +38,7 @@ internal abstract class PersonContainer throw new NotSupportedException($"Move / Delete <{file}>"); distinct.Add(file); } - else if (fileNameWithoutExtension != directoryName && !isDefaultName) + else if (fileNameWithoutExtension != directoryName) { checkFile = Path.Combine(directory, $"{fileNameWithoutExtension}{extension}"); if (!File.Exists(checkFile)) @@ -61,7 +61,7 @@ internal abstract class PersonContainer return results; } - private static List GetFiles(string facesFileNameExtension, string personDisplayDirectory, bool isDefaultName) + private static List GetFiles(string facesFileNameExtension, string personDisplayDirectory) { List results; int? id; @@ -88,11 +88,11 @@ internal abstract class PersonContainer else File.Move(file, checkFile); } - results = GetFiles(personDisplayDirectory, isDefaultName); + results = GetFiles(personDisplayDirectory); return results; } - private static List GetPersonContainersCollections(string mappingDefaultName, string facesFileNameExtension, char[] personCharacters, PersonDirectory personDirectory, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, bool isDefaultName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection) + private static List GetPersonContainersCollections(string facesFileNameExtension, char[] personCharacters, PersonDirectory personDirectory, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection) { List results = new(); long personKey; @@ -102,7 +102,7 @@ internal abstract class PersonContainer string personKeyDirectory; Models.PersonContainer personContainer; Models.PersonBirthday[] orderedPersonBirthdays; - List personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName); + List personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory); foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection) { orderedPersonBirthdays = (from l in collection where !l.PersonKeyFormatted.Contains(numberSign) orderby l.PersonBirthday.Value.Ticks descending select l.PersonBirthday).ToArray(); @@ -119,7 +119,7 @@ internal abstract class PersonContainer if (!files.Any()) continue; personDisplayDirectoryAllFiles.AddRange(files.Where(l => l.EndsWith(".rel"))); - person = IPerson.GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles.ToArray(), personKey); + person = IPerson.GetPerson(personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles.ToArray(), personKey); personContainer = new(approximateYears, orderedPersonBirthdays, personDisplayDirectoryAllFiles.ToArray(), personDisplayDirectoryName, personKey, person, personDirectory); results.Add(personContainer); } @@ -157,11 +157,10 @@ internal abstract class PersonContainer return result; } - private static (List, List) GetPersonContainersGroup(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, PersonDirectory personDirectory, string[] personDisplayDirectories) + private static (List, List) GetPersonContainersGroup(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, PersonDirectory personDirectory, string[] personDisplayDirectories) { List results = new(); string? minusOne; - bool isDefaultName; int? approximateYears; char numberSign = '#'; List changes = new(); @@ -176,7 +175,6 @@ internal abstract class PersonContainer personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory); if (string.IsNullOrEmpty(personDisplayDirectoryName)) continue; - isDefaultName = IPerson.IsDefaultName(mappingDefaultName, personDisplayDirectoryName); approximateYears = Age.GetApproximateYears(personCharacters, personDisplayDirectoryName); personKeyDirectories = Directory.GetDirectories(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly); collection = PersonBirthday.GetPersonBirthdays(personBirthdayFormat, personKeyDirectories, personDisplayDirectory, personDisplayDirectoryName); @@ -191,12 +189,12 @@ internal abstract class PersonContainer continue; if (collection.Count > 0) { - personContainers = GetPersonContainersCollections(mappingDefaultName, facesFileNameExtension, personCharacters, personDirectory, numberSign, personDisplayDirectory, personDisplayDirectoryName, isDefaultName, approximateYears, collection); + personContainers = GetPersonContainersCollections(facesFileNameExtension, personCharacters, personDirectory, numberSign, personDisplayDirectory, personDisplayDirectoryName, approximateYears, collection); results.AddRange(personContainers); } else { - personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName); + personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory); personContainer = new(approximateYears, personDisplayDirectoryAllFiles.ToArray(), personDisplayDirectoryName, personDirectory); results.Add(personContainer); } @@ -204,7 +202,7 @@ internal abstract class PersonContainer return new(changes, results); } - private static (List, List) GetPersonContainersInnerGroups(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string groupDirectory, string groupDirectoryName) + private static (List, List) GetPersonContainersInnerGroups(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string groupDirectory, string groupDirectoryName) { List results = new(); string[] segments; @@ -221,7 +219,7 @@ internal abstract class PersonContainer if (@char == exclamationPoint) { personDirectory = new(@char, "Ignore", 'U', 'U', 'U'); - (changes, collection) = GetPersonContainersGroup(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, personDirectory, innerGroupDirectories); + (changes, collection) = GetPersonContainersGroup(personBirthdayFormat, facesFileNameExtension, personCharacters, personDirectory, innerGroupDirectories); allChanges.AddRange(changes); results.AddRange(collection); } @@ -243,7 +241,7 @@ internal abstract class PersonContainer continue; personDirectory = new(@char, innerGroupDirectoryName, segments[zero][zero], segments[1][zero], segments[2][zero]); personDisplayDirectories = Directory.GetDirectories(innerGroupDirectory, "*", SearchOption.TopDirectoryOnly); - (changes, collection) = GetPersonContainersGroup(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, personDirectory, personDisplayDirectories); + (changes, collection) = GetPersonContainersGroup(personBirthdayFormat, facesFileNameExtension, personCharacters, personDirectory, personDisplayDirectories); allChanges.AddRange(changes); results.AddRange(collection); } @@ -251,7 +249,7 @@ internal abstract class PersonContainer return new(allChanges, results); } - private static List GetPersonContainersGroups(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string[] groupDirectories) + private static List GetPersonContainersGroups(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string[] groupDirectories) { List results; List changes; @@ -266,7 +264,7 @@ internal abstract class PersonContainer groupDirectoryName = Path.GetFileName(groupDirectory); if (personCharacters[i] != groupDirectoryName.First()) continue; - (changes, collection) = GetPersonContainersInnerGroups(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectory, groupDirectoryName); + (changes, collection) = GetPersonContainersInnerGroups( personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectory, groupDirectoryName); allChanges.AddRange(changes); personContainers.AddRange(collection); } @@ -277,7 +275,7 @@ internal abstract class PersonContainer return results; } - internal static List GetPersonContainers(Properties.IStorage storage, string mappingDefaultName, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) + internal static List GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) { List results; string a2PeopleSingletonDirectory = Path.Combine(storage.PeopleRootDirectory, "{}"); @@ -294,7 +292,7 @@ internal abstract class PersonContainer if (!groupDirectories.Any()) results = new(); else - results = GetPersonContainersGroups(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectories); + results = GetPersonContainersGroups(personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectories); return results; }