GetJLinkDirectories, IsFocusPerson and start of

ignoreXMatches
This commit is contained in:
Mike Phares 2023-08-01 00:42:53 -07:00
parent f62825d9aa
commit a95639153e
16 changed files with 250 additions and 116 deletions

View File

@ -380,18 +380,28 @@ public partial class E_Distance
public static void SetFaceDistances(int maxDegreeOfParallelism, long ticks, List<Face> distinctFilteredFaces) public static void SetFaceDistances(int maxDegreeOfParallelism, long ticks, List<Face> distinctFilteredFaces)
{ {
List<Face> 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); int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism }; 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 }; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
using ProgressBar progressBar = new(distinctFilteredFaces.Count, message, options); using ProgressBar progressBar = new(faces.Count, message, options);
_ = Parallel.For(0, distinctFilteredFaces.Count, parallelOptions, (i, state) => _ = 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) if (face.FaceEncoding is null || face.Mapping?.MappingFromLocation is null)
throw new NotSupportedException(); throw new NotSupportedException();
if (face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding faceEncoding)
return;
progressBar.Tick(); progressBar.Tick();
faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding); 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); 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; continue;
if (faceDistanceContainer.Face.Mapping.MappingFromLocation.AreaPermyriad < distanceLimits.FaceAreaPermyriad) if (faceDistanceContainer.Face.Mapping.MappingFromLocation.AreaPermyriad < distanceLimits.FaceAreaPermyriad)
continue; 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) if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusModel is not null && !faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusModel.Value)
continue; continue;
if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusRelativePath is not null && !faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusRelativePath.Value) if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusRelativePath is not null && !faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusRelativePath.Value)
continue; continue;
if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsIgnoreRelativePath is not null && faceDistanceContainer.Face.Mapping.MappingFromFilter.IsIgnoreRelativePath.Value) if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsIgnoreRelativePath is not null && faceDistanceContainer.Face.Mapping.MappingFromFilter.IsIgnoreRelativePath.Value)
continue; continue;
if (mapLogic.Used(faceDistanceContainer.FaceDistance))
continue;
results.Add(faceDistanceContainer); results.Add(faceDistanceContainer);
} }
return results.ToArray(); return results.ToArray();

View File

@ -40,6 +40,7 @@ public partial class DlibDotNet
private readonly Models.Configuration _Configuration; private readonly Models.Configuration _Configuration;
private readonly bool _ArgZeroIsConfigurationRootDirectory; private readonly bool _ArgZeroIsConfigurationRootDirectory;
private readonly Map.Models.Configuration _MapConfiguration; private readonly Map.Models.Configuration _MapConfiguration;
private readonly List<(string, long)> _JLinkResolvedDirectories;
public DlibDotNet( public DlibDotNet(
List<string> args, List<string> args,
@ -57,6 +58,7 @@ public partial class DlibDotNet
_IsEnvironment = isEnvironment; _IsEnvironment = isEnvironment;
long ticks = DateTime.Now.Ticks; long ticks = DateTime.Now.Ticks;
_Exceptions = new List<string>(); _Exceptions = new List<string>();
_JLinkResolvedDirectories = new();
if (ticks.ToString().Last() == '0') if (ticks.ToString().Last() == '0')
ticks += 1; ticks += 1;
_Log = Serilog.Log.ForContext<DlibDotNet>(); _Log = Serilog.Log.ForContext<DlibDotNet>();
@ -109,7 +111,7 @@ public partial class DlibDotNet
_FaceParts = new D2_FaceParts(_Configuration.PropertyConfiguration, imageCodecInfo, encoderParameters, filenameExtension, configuration.CheckDFaceAndUpWriteDates, configuration.OverrideForFaceLandmarkImages); _FaceParts = new D2_FaceParts(_Configuration.PropertyConfiguration, imageCodecInfo, encoderParameters, filenameExtension, configuration.CheckDFaceAndUpWriteDates, configuration.OverrideForFaceLandmarkImages);
} }
_MapConfiguration = Get(configuration, _Faces.FileNameExtension, _Faces.HiddenFileNameExtension, _FaceParts.FileNameExtension); _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) if (_PropertyRootExistedBefore || !_ArgZeroIsConfigurationRootDirectory)
personContainers = new(new List<PersonContainer>()); personContainers = new(new List<PersonContainer>());
else else
@ -124,11 +126,18 @@ public partial class DlibDotNet
string? rootResultsDirectory = Path.GetDirectoryName(Path.GetDirectoryName(peopleRootDirectory)) ?? throw new Exception(); string? rootResultsDirectory = Path.GetDirectoryName(Path.GetDirectoryName(peopleRootDirectory)) ?? throw new Exception();
Storage storage = new(rootDirectory, rootResultsDirectory, peopleRootDirectory); Storage storage = new(rootDirectory, rootResultsDirectory, peopleRootDirectory);
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(Path.Combine(peopleRootDirectory, propertyConfiguration.ResultSingleton)); _ = 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); 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()) 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); TimeSpan a2LastWriteTimeTimeSpan = new(ticks - new DirectoryInfo(a2PeopleContentDirectory).LastWriteTime.Ticks);
if (a2LastWriteTimeTimeSpan.TotalDays > 1) if (a2LastWriteTimeTimeSpan.TotalDays > 1)
{ {
@ -301,23 +310,28 @@ public partial class DlibDotNet
{ {
double? α; double? α;
int? eyeα; int? eyeα;
bool? isUsed;
bool? eyeReview; bool? eyeReview;
Mapping mapping; Mapping mapping;
int faceAreaPermyriad; bool? isFocusPerson;
int confidencePercent; int confidencePercent;
int faceAreaPermyriad;
bool? inSkipCollection; bool? inSkipCollection;
int wholePercentRectangle; int wholePercentRectangle;
string deterministicHashCodeKey; string deterministicHashCodeKey;
MappingFromFilter mappingFromFilter; MappingFromFilter mappingFromFilter;
MappingFromLocation? mappingFromLocation; MappingFromLocation? mappingFromLocation;
bool? isFocusModel = GetIsFocusModel(item.Property); bool? isFocusModel = GetIsFocusModel(item.Property);
bool ignoreXMatches = _JLinkResolvedDirectories.Count > 0;
foreach (Shared.Models.Face face in faces) 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) if (item.Property?.Id is null || face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
{ {
isUsed = null;
isFocusPerson = null;
inSkipCollection = null; inSkipCollection = null;
mappingFromLocation = null; mappingFromLocation = null;
mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection); mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection, isUsed);
} }
else 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); 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); deterministicHashCodeKey = IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, eyeα, eyeReview, wholePercentRectangle); 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); 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); mapping = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection);
_ = mapLogic.UpdateMappingFromPerson(mapping); _ = 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; Mapping result;
bool? isUsed;
int? eyeα = null; int? eyeα = null;
bool? isFocusPerson;
bool? eyeReview = null; bool? eyeReview = null;
bool? inSkipCollection; bool? inSkipCollection;
int wholePercentRectangle;
int faceAreaPermyriad = 0;
int confidencePercent = 0; int confidencePercent = 0;
int faceAreaPermyriad = 0;
int wholePercentRectangle;
string deterministicHashCodeKey; string deterministicHashCodeKey;
MappingFromFilter mappingFromFilter; MappingFromFilter mappingFromFilter;
MappingFromLocation? mappingFromLocation; MappingFromLocation? mappingFromLocation;
bool? isFocusModel = GetIsFocusModel(item.Property); bool? isFocusModel = GetIsFocusModel(item.Property);
bool ignoreXMatches = jLinkResolvedDirectories.Count > 0;
if (item.Property?.Id is null) if (item.Property?.Id is null)
{ {
isUsed = null;
isFocusPerson = null;
inSkipCollection = null; inSkipCollection = null;
mappingFromLocation = null; mappingFromLocation = null;
mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection); mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection, isUsed);
} }
else else
{ {
wholePercentRectangle = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(Shared.Models.Stateless.ILocation.Digits); wholePercentRectangle = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(Shared.Models.Stateless.ILocation.Digits);
deterministicHashCodeKey = IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, 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); 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); 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); result = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection: null);
return result; return result;
@ -540,6 +563,7 @@ public partial class DlibDotNet
if (_Log is null) if (_Log is null)
throw new NullReferenceException(nameof(_Log)); throw new NullReferenceException(nameof(_Log));
int result = 0; int result = 0;
bool ignoreXMatches = _JLinkResolvedDirectories.Count > 0;
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism }; ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
DateTime[] containerDateTimes = Shared.Models.Stateless.Methods.IContainer.GetContainerDateTimes(filteredItems); DateTime[] containerDateTimes = Shared.Models.Stateless.Methods.IContainer.GetContainerDateTimes(filteredItems);
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; 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; 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); 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); filteredFaceDistanceContainers = E_Distance.FilteredFaceDistanceContainers(mapLogic, faceDistanceContainers, skipOlderThan, distanceLimits);
if (!filteredFaceDistanceContainers.Any()) if (filteredFaceDistanceContainers.Length == 0)
_Log.Information("All images have been filtered!"); _Log.Information("All images have been filtered!");
else else
{ {
sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, distanceLimits, faceDistanceEncodings, filteredFaceDistanceContainers); 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++) for (useFiltersCounter = 1; useFiltersCounter < _Configuration.UseFilterTries; useFiltersCounter++)
{ {
@ -779,7 +803,7 @@ public partial class DlibDotNet
else else
{ {
sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, distanceLimits, faceDistanceEncodings, filteredFaceDistanceContainers); sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, distanceLimits, faceDistanceEncodings, filteredFaceDistanceContainers);
if (sortingContainers.Any()) if (sortingContainers.Length == 0)
break; break;
} }
} }
@ -817,7 +841,6 @@ public partial class DlibDotNet
if (Directory.Exists(d2FacePartsContentCollectionDirectory)) if (Directory.Exists(d2FacePartsContentCollectionDirectory))
Shared.Models.Stateless.Methods.IPath.MakeHiddenIfAllItemsAreHidden(d2FacePartsContentCollectionDirectory); Shared.Models.Stateless.Methods.IPath.MakeHiddenIfAllItemsAreHidden(d2FacePartsContentCollectionDirectory);
} }
Dictionary<int, Dictionary<int, Mapping>> idToWholePercentagesToMapping = Map.Models.Stateless.Methods.IMapLogic.GetIdToWholePercentagesToFace(distinctFilteredMappingCollection);
if (Directory.Exists(fPhotoPrismContentDirectory)) if (Directory.Exists(fPhotoPrismContentDirectory))
F_PhotoPrism.WriteMatches(fPhotoPrismContentDirectory, _Configuration.MappingDefaultName, _Configuration.PersonBirthdayFormat, _Configuration.RectangleIntersectMinimums, ticks, distinctFilteredFaces, mapLogic); F_PhotoPrism.WriteMatches(fPhotoPrismContentDirectory, _Configuration.MappingDefaultName, _Configuration.PersonBirthdayFormat, _Configuration.RectangleIntersectMinimums, ticks, distinctFilteredFaces, mapLogic);
if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution))
@ -828,6 +851,7 @@ public partial class DlibDotNet
mapLogic.CopyAtLeastOneMappedFiles(_Configuration.PersonCharactersCopyCount, dFacesContentDirectory, a2PeopleSingletonDirectory, distinctFilteredMappingCollection); mapLogic.CopyAtLeastOneMappedFiles(_Configuration.PersonCharactersCopyCount, dFacesContentDirectory, a2PeopleSingletonDirectory, distinctFilteredMappingCollection);
mapLogic.SavePersonKeyToCount(dFacesContentDirectory, a2PeopleSingletonDirectory, distinctFilteredMappingCollection); mapLogic.SavePersonKeyToCount(dFacesContentDirectory, a2PeopleSingletonDirectory, distinctFilteredMappingCollection);
} }
Dictionary<int, Dictionary<int, Mapping>> idToWholePercentagesToMapping = Map.Models.Stateless.Methods.IMapLogic.GetIdToWholePercentagesToFace(distinctFilteredMappingCollection);
mapLogic.CopyManualFiles(dFacesContentDirectory, idToWholePercentagesToMapping); mapLogic.CopyManualFiles(dFacesContentDirectory, idToWholePercentagesToMapping);
if (_Configuration.SaveMappedForOutputResolutions.Contains(outputResolution)) if (_Configuration.SaveMappedForOutputResolutions.Contains(outputResolution))
mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, personKeyToIds, distinctFilteredMappingCollection, idToWholePercentagesToMapping, totalNotMapped); mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, personKeyToIds, distinctFilteredMappingCollection, idToWholePercentagesToMapping, totalNotMapped);
@ -1030,7 +1054,7 @@ public partial class DlibDotNet
} }
if (!anyValidFaces) if (!anyValidFaces)
{ {
mapping = GetMapping(mapLogic, item, isFocusRelativePath, isIgnoreRelativePath, mappingFromItem); mapping = GetMapping(mapLogic, item, isFocusRelativePath, isIgnoreRelativePath, mappingFromItem, _JLinkResolvedDirectories);
mappingCollection.Add(mapping); mappingCollection.Add(mapping);
} }
} }
@ -1258,7 +1282,7 @@ public partial class DlibDotNet
personKeyToIds = mapLogic.GetPersonKeyToIds(); personKeyToIds = mapLogic.GetPersonKeyToIds();
if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution))
mapLogic.SaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, distinctFilteredMappingCollection); 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); mapLogic.SaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, personContainers, a2PeopleContentDirectory, personKeyToIds, distinctFilteredMappingCollection, totalNotMapped);
(cResultsFullGroupDirectory, c2ResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution); (cResultsFullGroupDirectory, c2ResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution);
if (_ArgZeroIsConfigurationRootDirectory if (_ArgZeroIsConfigurationRootDirectory

View File

@ -425,11 +425,11 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
directory = GetDirectory(_Configuration, saveIndividually, padLeft, mapping.SegmentC, by, mapping.MappingFromItem); directory = GetDirectory(_Configuration, saveIndividually, padLeft, mapping.SegmentC, by, mapping.MappingFromItem);
if (string.IsNullOrEmpty(directory)) if (string.IsNullOrEmpty(directory))
continue; continue;
personDirectory = Path.Combine(directory, $"Z]{ticks}"); personDirectory = Path.Combine(directory, $"X]{ticks}");
if (saveIndividually) if (saveIndividually)
{ {
directory = Path.Combine(directory, mapping.MappingFromItem.Id.ToString()); 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.MappingFromItem.Id);
distinct.Add(mapping.SortingContainer.Sorting.Id); distinct.Add(mapping.SortingContainer.Sorting.Id);
@ -556,23 +556,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory); Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory);
} }
public bool Used(FaceDistance faceDistanceEncoding)
{
bool result = false;
if (faceDistanceEncoding.WholePercentages is null)
throw new NotSupportedException();
List<int>? wholePercentagesCollection;
Dictionary<int, PersonContainer[]>? 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<Sorting> GetSortingCollection(int i, FaceDistance faceDistanceEncoding, List<FaceDistance> faceDistanceLengths) public List<Sorting> GetSortingCollection(int i, FaceDistance faceDistanceEncoding, List<FaceDistance> faceDistanceLengths)
{ {
if (_Configuration is null) if (_Configuration is null)
@ -1107,7 +1090,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
SaveContainer? saveContainer; SaveContainer? saveContainer;
bool saveIndividually = false; bool saveIndividually = false;
List<SaveContainer> saveContainers = new(); List<SaveContainer> saveContainers = new();
Stateless.MapLogic.BeforeSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory);
(int, FileHolder, int, string, string, string, string)[] collection = GetCollectionForSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory, personContainers, mappingCollection, personKeyToIds); (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) 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; return results;
} }
public bool IsUsed(bool ignoreXMatches, int id, MappingFromLocation mappingFromLocation)
{
bool result;
PersonContainer[]? personContainers;
List<int>? wholePercentagesCollection;
Dictionary<int, PersonContainer[]>? 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) public bool InSkipCollection(int id, MappingFromLocation mappingFromLocation)
{ {
bool result; bool result;
@ -1366,4 +1367,30 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return result; return result;
} }
public bool? IsFocusPerson(List<(string Directory, long PersonKey)> jLinkResolvedDirectories, int id, MappingFromLocation mappingFromLocation)
{
bool? result;
PersonContainer[]? personContainers;
Dictionary<int, PersonContainer[]>? 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;
}
} }

View File

@ -142,7 +142,7 @@ internal abstract class MapLogic
if (files.Length != 4) if (files.Length != 4)
continue; continue;
collection = files.Select(l => new FileInfo(l)).ToArray(); 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) if (isDefault)
facesFileNames = (from l in collection where l.Extension == configuration.FacesFileNameExtension select l.FullName).ToArray(); facesFileNames = (from l in collection where l.Extension == configuration.FacesFileNameExtension select l.FullName).ToArray();
else else
@ -279,16 +279,15 @@ internal abstract class MapLogic
personDisplayDirectoryNames = IPath.GetDirectoryNames(personNameDirectory); personDisplayDirectoryNames = IPath.GetDirectoryNames(personNameDirectory);
if (!personDisplayDirectoryNames.Any()) if (!personDisplayDirectoryNames.Any())
continue; 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 (isDefault && personDisplayDirectoryNames[^1].Length == 1)
{ {
if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length || !DateTime.TryParseExact(personKeyFormatted, configuration.PersonBirthdayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length || !DateTime.TryParseExact(personKeyFormatted, configuration.PersonBirthdayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime))
continue; continue;
checkDirectory = Path.Combine(yearDirectory, $"Z]{dateTime.Ticks}"); checkDirectory = Path.Combine(yearDirectory, $"X]{dateTime.Ticks}");
if (Directory.Exists(checkDirectory)) if (Directory.Exists(checkDirectory))
{ {
files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly); Directory.Delete(yearDirectory, recursive: true);
RenameUnknown(files);
continue; continue;
} }
Directory.Move(personNameDirectory, checkDirectory); Directory.Move(personNameDirectory, checkDirectory);
@ -424,7 +423,7 @@ internal abstract class MapLogic
group = IPerson.GetHourGroup(personDisplayDirectoryName, personBirthday.Value.Hour); group = IPerson.GetHourGroup(personDisplayDirectoryName, personBirthday.Value.Hour);
(status, sex, first) = IPerson.GetPersonHour(personDisplayDirectoryName, personBirthday.Value.Hour); (status, sex, first) = IPerson.GetPersonHour(personDisplayDirectoryName, personBirthday.Value.Hour);
personDirectory = new(matches.First(), group, status, sex, first); 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); personKeyFormattedToPersonContainer.Add(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, personContainer);
} }
if (!idThenWholePercentagesToPersonContainerCollection.ContainsKey(personKeyFormattedIdThenWholePercentages.Id)) if (!idThenWholePercentagesToPersonContainerCollection.ContainsKey(personKeyFormattedIdThenWholePercentages.Id))
@ -542,7 +541,7 @@ internal abstract class MapLogic
if (check) if (check)
continue; continue;
personBirthday = IPersonBirthday.GetPersonBirthday(personKey + (oneHour * 2)); 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); personContainer = new(approximateYears, new PersonBirthday[] { personBirthday }, personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey, person);
results.Add(personContainer); results.Add(personContainer);
if (results.Count > 99) if (results.Count > 99)
@ -1185,24 +1184,43 @@ internal abstract class MapLogic
return results; 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? pathName = Path.GetFileName(path);
string? group = Path.GetDirectoryName(path); string? group = Path.GetDirectoryName(path);
string? groupName = Path.GetFileName(group); 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
{
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
{ {
WindowsShortcut windowsShortcut;
string checkDirectory = Path.Combine(a2PeopleSingletonDirectory, groupName, pathName); string checkDirectory = Path.Combine(a2PeopleSingletonDirectory, groupName, pathName);
if (Directory.Exists(checkDirectory)) if (!Directory.Exists(checkDirectory))
result = null;
else
result = checkDirectory;
}
}
if (!string.IsNullOrEmpty(result))
{ {
try try
{ {
windowsShortcut = new() { Path = checkDirectory }; WindowsShortcut windowsShortcut;
windowsShortcut = new() { Path = result };
windowsShortcut.Save(file); windowsShortcut.Save(file);
windowsShortcut.Dispose(); windowsShortcut.Dispose();
result = true;
} }
catch (Exception) catch (Exception)
{ } { }
@ -1211,29 +1229,71 @@ internal abstract class MapLogic
return result; return result;
} }
internal static void BeforeSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleContentDirectory) private static List<(string, long)> GetJLinkResolvedDirectories(string personBirthdayFormat, List<string> 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[] files;
string? foundPath;
int totalFiles = 0;
string checkDirectory; string checkDirectory;
WindowsShortcut windowsShortcut; WindowsShortcut windowsShortcut;
List<string> 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) foreach (string directoryName in jLinks)
{ {
checkDirectory = Path.Combine(a2PeopleContentDirectory, directoryName); checkDirectory = Path.Combine(a2PeopleContentDirectory, directoryName);
if (!Directory.Exists(checkDirectory)) if (!Directory.Exists(checkDirectory))
continue; continue;
files = Directory.GetFiles(checkDirectory, "*.lnk", SearchOption.TopDirectoryOnly); files = Directory.GetFiles(checkDirectory, "*.lnk", SearchOption.TopDirectoryOnly);
totalFiles += files.Length;
foreach (string file in files) foreach (string file in files)
{ {
windowsShortcut = WindowsShortcut.Load(file); windowsShortcut = WindowsShortcut.Load(file);
if (windowsShortcut.Path is null) if (windowsShortcut.Path is null)
continue; 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; 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) internal static (string, bool, bool) Get(int? useFiltersCounter, bool saveIndividually, bool sortingContainersAny, string forceSingleImageHumanized, Mapping mapping)

View File

@ -28,4 +28,9 @@ public interface IMapLogic
static Dictionary<int, Dictionary<int, Shared.Models.Mapping>> GetIdToWholePercentagesToFace(Shared.Models.Mapping[] mappingCollection) => static Dictionary<int, Dictionary<int, Shared.Models.Mapping>> GetIdToWholePercentagesToFace(Shared.Models.Mapping[] mappingCollection) =>
MapLogic.GetIdToWholePercentagesToFace(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);
} }

View File

@ -1,9 +1,13 @@
--- ---
created: 2023-07-31T18:54:50.692Z created: 2023-07-31T18:54:50.692Z
updated: 2023-07-31T19:09:12.889Z updated: 2023-07-31T20:14:20.428Z
assigned: "" assigned: ""
progress: 0 progress: 0
tags: [] tags: []
completed: 2023-07-31T20:14:20.428Z
column: Done
--- ---
# Verify Ignore Is Working For One Half of Sort Without Person # Verify Ignore Is Working For One Half of Sort Without Person
- [ ] Only a problem for one of the two images...

View File

@ -27,8 +27,6 @@ taskTemplate: '^+^_${overdue ? ''^R'' : ''''}${name}^: ${relations ? (''\n^-^/^g
## Todo ## 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) - [use-eyes-to-find-orientation](tasks/use-eyes-to-find-orientation.md)
- [find-incorrectly-mapped-faces](tasks/find-incorrectly-mapped-faces.md) - [find-incorrectly-mapped-faces](tasks/find-incorrectly-mapped-faces.md)
- [nef-support](tasks/nef-support.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) - [merge-kristy-files](tasks/merge-kristy-files.md)
- [set-date-taken-when-missing](tasks/set-date-taken-when-missing.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) - [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 ## Done

View File

@ -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

View File

@ -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

View File

@ -7,17 +7,21 @@ public class MappingFromFilter : Properties.IMappingFromFilter
{ {
public bool? IsFocusModel { init; get; } public bool? IsFocusModel { init; get; }
public bool? IsFocusPerson { init; get; }
public bool? IsFocusRelativePath { init; get; } public bool? IsFocusRelativePath { init; get; }
public bool? IsIgnoreRelativePath { init; get; } public bool? IsIgnoreRelativePath { init; get; }
public bool? InSkipCollection { init; get; } public bool? InSkipCollection { init; get; }
public bool? IsUsed { init; get; }
[JsonConstructor] [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; IsFocusModel = isFocusModel;
IsFocusPerson = isFocusPerson;
IsFocusRelativePath = isFocusRelativePath; IsFocusRelativePath = isFocusRelativePath;
IsIgnoreRelativePath = isIgnoreRelativePath; IsIgnoreRelativePath = isIgnoreRelativePath;
InSkipCollection = inSkipCollection; InSkipCollection = inSkipCollection;
IsUsed = isUsed;
} }
public override string ToString() public override string ToString()

View File

@ -28,8 +28,8 @@ public class PersonContainer : Properties.IPersonContainer
KeyIsMaxBirthday = birthdays is null || key is null ? null : key.Value == birthdays.First().Value.Ticks; 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) : public PersonContainer(char[] personCharacters, PersonBirthday birthday, string displayDirectoryName, PersonDirectory personDirectory) :
this(Stateless.Methods.IAge.GetApproximateYears(personCharacters, displayDirectoryName), new PersonBirthday[] { birthday }, Array.Empty<string>(), displayDirectoryName, birthday.Value.Ticks, Stateless.Methods.IPerson.GetPerson(mappingDefaultName, personCharacters, displayDirectoryName, birthday.Value.Ticks, birthday), personDirectory) this(Stateless.Methods.IAge.GetApproximateYears(personCharacters, displayDirectoryName), new PersonBirthday[] { birthday }, Array.Empty<string>(), 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) : public PersonContainer(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) :

View File

@ -4,8 +4,10 @@ public interface IMappingFromFilter
{ {
public bool? IsFocusModel { init; get; } public bool? IsFocusModel { init; get; }
public bool? IsFocusPerson { init; get; }
public bool? IsFocusRelativePath { init; get; } public bool? IsFocusRelativePath { init; get; }
public bool? IsIgnoreRelativePath { init; get; } public bool? IsIgnoreRelativePath { init; get; }
public bool? InSkipCollection { init; get; } public bool? InSkipCollection { init; get; }
public bool? IsUsed { init; get; }
} }

View File

@ -45,7 +45,7 @@ public interface IPerson
bool TestStatic_IsDefaultName(string mappingDefaultName, string value) => bool TestStatic_IsDefaultName(string mappingDefaultName, string value) =>
IsDefaultName(mappingDefaultName, value); IsDefaultName(mappingDefaultName, value);
static bool IsDefaultName(string mappingDefaultName, string 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) => bool TestStatic_IsDefaultName(string mappingDefaultName, Models.Person person) =>
IsDefaultName(mappingDefaultName, person); IsDefaultName(mappingDefaultName, person);
@ -57,14 +57,14 @@ public interface IPerson
static string GetFileFullName(Properties.IStorage storage, string personBirthdayFormat, Models.Person person) => static string GetFileFullName(Properties.IStorage storage, string personBirthdayFormat, Models.Person person) =>
IPersonBirthday.GetFileFullName(storage, personBirthdayFormat, person.Birthday); IPersonBirthday.GetFileFullName(storage, personBirthdayFormat, person.Birthday);
Models.Person TestStatic_GetPerson(string mappingDefaultName, char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) => Models.Person TestStatic_GetPerson(char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) =>
GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, personKey, personBirthday); GetPerson(personCharacters, personDisplayDirectoryName, personKey, personBirthday);
static Models.Person GetPerson(string mappingDefaultName, char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) => static Models.Person GetPerson(char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) =>
Person.GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, Array.Empty<string>(), personKey, personBirthday); Person.GetPerson(personCharacters, personDisplayDirectoryName, Array.Empty<string>(), personKey, personBirthday);
Models.Person TestStatic_GetPerson(string mappingDefaultName, char[] personCharacters, string personDisplayDirectoryName, string[] personDisplayDirectoryAllFiles, long personKey) => Models.Person TestStatic_GetPerson(char[] personCharacters, string personDisplayDirectoryName, string[] personDisplayDirectoryAllFiles, long personKey) =>
GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles, personKey); GetPerson(personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles, personKey);
static Models.Person GetPerson(string mappingDefaultName, char[] personCharacters, string personDisplayDirectoryName, string[] personDisplayDirectoryAllFiles, long personKey) => static Models.Person GetPerson(char[] personCharacters, string personDisplayDirectoryName, string[] personDisplayDirectoryAllFiles, long personKey) =>
Person.GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles, personKey, IPersonBirthday.GetPersonBirthday(personKey)); Person.GetPerson(personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles, personKey, IPersonBirthday.GetPersonBirthday(personKey));
} }

View File

@ -12,10 +12,10 @@ public interface IPersonContainer
static List<long> GetPersonKeys(IEnumerable<Models.PersonContainer> personContainers) => static List<long> GetPersonKeys(IEnumerable<Models.PersonContainer> personContainers) =>
PersonContainer.GetPersonKeys(personContainers); PersonContainer.GetPersonKeys(personContainers);
List<Models.PersonContainer> TestStatic_GetPersonContainers(Properties.IStorage storage, string mappingDefaultName, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) => List<Models.PersonContainer> TestStatic_GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) =>
GetPersonContainers(storage, mappingDefaultName, personBirthdayFormat, personCharacters, facesFileNameExtension); GetPersonContainers(storage, personBirthdayFormat, personCharacters, facesFileNameExtension);
static List<Models.PersonContainer> GetPersonContainers(Properties.IStorage storage, string mappingDefaultName, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) => static List<Models.PersonContainer> GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) =>
PersonContainer.GetPersonContainers(storage, mappingDefaultName, personBirthdayFormat, personCharacters, facesFileNameExtension); PersonContainer.GetPersonContainers(storage, personBirthdayFormat, personCharacters, facesFileNameExtension);
List<(long?, string)> TestStatic_GetDisplay(string personBirthdayFormat, Models.PersonContainer personContainer) => List<(long?, string)> TestStatic_GetDisplay(string personBirthdayFormat, Models.PersonContainer personContainer) =>
GetDisplay(personBirthdayFormat, personContainer); GetDisplay(personBirthdayFormat, personContainer);

View File

@ -17,27 +17,25 @@ internal abstract class Person
return new(personBirthday, personKeyFormatted); 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; Models.Person result;
string[] matches; string[] matches;
const int zero = 0;
List<Models.PersonURL> urls = new(); List<Models.PersonURL> urls = new();
Models.PersonId id = new(personKey); Models.PersonId id = new(personKey);
List<Models.PersonEmail> emails = new(); List<Models.PersonEmail> emails = new();
List<Models.PersonNumber> numbers = new(); List<Models.PersonNumber> numbers = new();
List<Models.PersonComment> comments = new(); List<Models.PersonComment> comments = new();
List<Models.PersonAddress> addresses = new(); List<Models.PersonAddress> addresses = new();
string checkFileName = $"{personDisplayDirectoryName[zero]}.json"; string checkFileName = $"{personDisplayDirectoryName.First()}.json";
bool isDefaultName = IPerson.IsDefaultName(mappingDefaultName, personDisplayDirectoryName); string nameWithoutApproximateYears = personDisplayDirectoryName.Split(personCharacters).First();
string nameWithoutApproximateYears = !isDefaultName ? personDisplayDirectoryName.Split(personCharacters)[zero] : personDisplayDirectoryName;
matches = (from l in personDisplayDirectoryAllFiles where Path.GetFileName(l) == checkFileName select l).ToArray(); matches = (from l in personDisplayDirectoryAllFiles where Path.GetFileName(l) == checkFileName select l).ToArray();
Models.PersonName? name; Models.PersonName? name;
if (!matches.Any()) if (!matches.Any())
name = PersonName.GetPersonName(nameWithoutApproximateYears); name = PersonName.GetPersonName(nameWithoutApproximateYears);
else else
{ {
string json = File.ReadAllText(matches[zero]); string json = File.ReadAllText(matches.First());
name = JsonSerializer.Deserialize<Models.PersonName>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); name = JsonSerializer.Deserialize<Models.PersonName>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
name ??= PersonName.GetPersonName(nameWithoutApproximateYears); name ??= PersonName.GetPersonName(nameWithoutApproximateYears);
if (name.Last is null || string.IsNullOrEmpty(name.Last.Value)) if (name.Last is null || string.IsNullOrEmpty(name.Last.Value))

View File

@ -5,7 +5,7 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
internal abstract class PersonContainer internal abstract class PersonContainer
{ {
private static List<string> GetFiles(string personDisplayDirectory, bool isDefaultName) private static List<string> GetFiles(string personDisplayDirectory)
{ {
List<string> results = new(); List<string> results = new();
string[] files; string[] files;
@ -38,7 +38,7 @@ internal abstract class PersonContainer
throw new NotSupportedException($"Move / Delete <{file}>"); throw new NotSupportedException($"Move / Delete <{file}>");
distinct.Add(file); distinct.Add(file);
} }
else if (fileNameWithoutExtension != directoryName && !isDefaultName) else if (fileNameWithoutExtension != directoryName)
{ {
checkFile = Path.Combine(directory, $"{fileNameWithoutExtension}{extension}"); checkFile = Path.Combine(directory, $"{fileNameWithoutExtension}{extension}");
if (!File.Exists(checkFile)) if (!File.Exists(checkFile))
@ -61,7 +61,7 @@ internal abstract class PersonContainer
return results; return results;
} }
private static List<string> GetFiles(string facesFileNameExtension, string personDisplayDirectory, bool isDefaultName) private static List<string> GetFiles(string facesFileNameExtension, string personDisplayDirectory)
{ {
List<string> results; List<string> results;
int? id; int? id;
@ -88,11 +88,11 @@ internal abstract class PersonContainer
else else
File.Move(file, checkFile); File.Move(file, checkFile);
} }
results = GetFiles(personDisplayDirectory, isDefaultName); results = GetFiles(personDisplayDirectory);
return results; return results;
} }
private static List<Models.PersonContainer> 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<Models.PersonContainer> GetPersonContainersCollections(string facesFileNameExtension, char[] personCharacters, PersonDirectory personDirectory, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection)
{ {
List<Models.PersonContainer> results = new(); List<Models.PersonContainer> results = new();
long personKey; long personKey;
@ -102,7 +102,7 @@ internal abstract class PersonContainer
string personKeyDirectory; string personKeyDirectory;
Models.PersonContainer personContainer; Models.PersonContainer personContainer;
Models.PersonBirthday[] orderedPersonBirthdays; Models.PersonBirthday[] orderedPersonBirthdays;
List<string> personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName); List<string> personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory);
foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection) 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(); 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()) if (!files.Any())
continue; continue;
personDisplayDirectoryAllFiles.AddRange(files.Where(l => l.EndsWith(".rel"))); 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); personContainer = new(approximateYears, orderedPersonBirthdays, personDisplayDirectoryAllFiles.ToArray(), personDisplayDirectoryName, personKey, person, personDirectory);
results.Add(personContainer); results.Add(personContainer);
} }
@ -157,11 +157,10 @@ internal abstract class PersonContainer
return result; return result;
} }
private static (List<string?>, List<Models.PersonContainer>) GetPersonContainersGroup(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, PersonDirectory personDirectory, string[] personDisplayDirectories) private static (List<string?>, List<Models.PersonContainer>) GetPersonContainersGroup(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, PersonDirectory personDirectory, string[] personDisplayDirectories)
{ {
List<Models.PersonContainer> results = new(); List<Models.PersonContainer> results = new();
string? minusOne; string? minusOne;
bool isDefaultName;
int? approximateYears; int? approximateYears;
char numberSign = '#'; char numberSign = '#';
List<string?> changes = new(); List<string?> changes = new();
@ -176,7 +175,6 @@ internal abstract class PersonContainer
personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory); personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory);
if (string.IsNullOrEmpty(personDisplayDirectoryName)) if (string.IsNullOrEmpty(personDisplayDirectoryName))
continue; continue;
isDefaultName = IPerson.IsDefaultName(mappingDefaultName, personDisplayDirectoryName);
approximateYears = Age.GetApproximateYears(personCharacters, personDisplayDirectoryName); approximateYears = Age.GetApproximateYears(personCharacters, personDisplayDirectoryName);
personKeyDirectories = Directory.GetDirectories(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly); personKeyDirectories = Directory.GetDirectories(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly);
collection = PersonBirthday.GetPersonBirthdays(personBirthdayFormat, personKeyDirectories, personDisplayDirectory, personDisplayDirectoryName); collection = PersonBirthday.GetPersonBirthdays(personBirthdayFormat, personKeyDirectories, personDisplayDirectory, personDisplayDirectoryName);
@ -191,12 +189,12 @@ internal abstract class PersonContainer
continue; continue;
if (collection.Count > 0) 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); results.AddRange(personContainers);
} }
else else
{ {
personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName); personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory);
personContainer = new(approximateYears, personDisplayDirectoryAllFiles.ToArray(), personDisplayDirectoryName, personDirectory); personContainer = new(approximateYears, personDisplayDirectoryAllFiles.ToArray(), personDisplayDirectoryName, personDirectory);
results.Add(personContainer); results.Add(personContainer);
} }
@ -204,7 +202,7 @@ internal abstract class PersonContainer
return new(changes, results); return new(changes, results);
} }
private static (List<string?>, List<Models.PersonContainer>) GetPersonContainersInnerGroups(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string groupDirectory, string groupDirectoryName) private static (List<string?>, List<Models.PersonContainer>) GetPersonContainersInnerGroups(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string groupDirectory, string groupDirectoryName)
{ {
List<Models.PersonContainer> results = new(); List<Models.PersonContainer> results = new();
string[] segments; string[] segments;
@ -221,7 +219,7 @@ internal abstract class PersonContainer
if (@char == exclamationPoint) if (@char == exclamationPoint)
{ {
personDirectory = new(@char, "Ignore", 'U', 'U', 'U'); 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); allChanges.AddRange(changes);
results.AddRange(collection); results.AddRange(collection);
} }
@ -243,7 +241,7 @@ internal abstract class PersonContainer
continue; continue;
personDirectory = new(@char, innerGroupDirectoryName, segments[zero][zero], segments[1][zero], segments[2][zero]); personDirectory = new(@char, innerGroupDirectoryName, segments[zero][zero], segments[1][zero], segments[2][zero]);
personDisplayDirectories = Directory.GetDirectories(innerGroupDirectory, "*", SearchOption.TopDirectoryOnly); 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); allChanges.AddRange(changes);
results.AddRange(collection); results.AddRange(collection);
} }
@ -251,7 +249,7 @@ internal abstract class PersonContainer
return new(allChanges, results); return new(allChanges, results);
} }
private static List<Models.PersonContainer> GetPersonContainersGroups(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string[] groupDirectories) private static List<Models.PersonContainer> GetPersonContainersGroups(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string[] groupDirectories)
{ {
List<Models.PersonContainer> results; List<Models.PersonContainer> results;
List<string?> changes; List<string?> changes;
@ -266,7 +264,7 @@ internal abstract class PersonContainer
groupDirectoryName = Path.GetFileName(groupDirectory); groupDirectoryName = Path.GetFileName(groupDirectory);
if (personCharacters[i] != groupDirectoryName.First()) if (personCharacters[i] != groupDirectoryName.First())
continue; continue;
(changes, collection) = GetPersonContainersInnerGroups(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectory, groupDirectoryName); (changes, collection) = GetPersonContainersInnerGroups( personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectory, groupDirectoryName);
allChanges.AddRange(changes); allChanges.AddRange(changes);
personContainers.AddRange(collection); personContainers.AddRange(collection);
} }
@ -277,7 +275,7 @@ internal abstract class PersonContainer
return results; return results;
} }
internal static List<Models.PersonContainer> GetPersonContainers(Properties.IStorage storage, string mappingDefaultName, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) internal static List<Models.PersonContainer> GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension)
{ {
List<Models.PersonContainer> results; List<Models.PersonContainer> results;
string a2PeopleSingletonDirectory = Path.Combine(storage.PeopleRootDirectory, "{}"); string a2PeopleSingletonDirectory = Path.Combine(storage.PeopleRootDirectory, "{}");
@ -294,7 +292,7 @@ internal abstract class PersonContainer
if (!groupDirectories.Any()) if (!groupDirectories.Any())
results = new(); results = new();
else else
results = GetPersonContainersGroups(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectories); results = GetPersonContainersGroups(personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectories);
return results; return results;
} }