LookForMatchFacesAndPossiblyRename for A2 People

This commit is contained in:
Mike Phares 2022-12-28 01:51:05 -07:00
parent facafec0e6
commit 3278256315
7 changed files with 142 additions and 93 deletions

View File

@ -38,11 +38,11 @@ public partial class E_Distance
_DistanceMoveUnableToMatch = distanceMoveUnableToMatch; _DistanceMoveUnableToMatch = distanceMoveUnableToMatch;
} }
private void MoveUnableToMatch(string eDistanceContentDirectory, string mappedFaceFile, string mappedFaceFileName) private void MoveUnableToMatch(string eDistanceContentDirectory, string file, string fileName)
{ {
bool check; bool check;
string? directoryName = Path.GetDirectoryName(mappedFaceFile); string? directoryName = Path.GetDirectoryName(file);
if (mappedFaceFileName is null || directoryName is null) if (fileName is null || directoryName is null)
check = false; check = false;
else else
{ {
@ -66,7 +66,7 @@ public partial class E_Distance
if (string.IsNullOrEmpty(checkDirectoryName) || !directoryNames.Any() || !long.TryParse(directoryNames[^1][1..^1], out long directoryTicks)) if (string.IsNullOrEmpty(checkDirectoryName) || !directoryNames.Any() || !long.TryParse(directoryNames[^1][1..^1], out long directoryTicks))
{ {
check = false; check = false;
File.Delete(mappedFaceFile); File.Delete(file);
} }
else else
{ {
@ -75,13 +75,13 @@ public partial class E_Distance
checkDirectoryName = Path.Combine(checkDirectoryName, directoryNames[i]); checkDirectoryName = Path.Combine(checkDirectoryName, directoryNames[i]);
if (!Directory.Exists(checkDirectoryName)) if (!Directory.Exists(checkDirectoryName))
_ = Directory.CreateDirectory(checkDirectoryName); _ = Directory.CreateDirectory(checkDirectoryName);
File.Move(mappedFaceFile, Path.Combine(checkDirectoryName, mappedFaceFileName)); File.Move(file, Path.Combine(checkDirectoryName, fileName));
check = true; check = true;
} }
} }
} }
if (check) if (check)
_Moved.Add(mappedFaceFile); _Moved.Add(file);
} }
private FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, List<Face> filteredFaces) private FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, List<Face> filteredFaces)
@ -189,7 +189,7 @@ public partial class E_Distance
return results; return results;
} }
private static FileInfo? CheckFileThenGetFileInfo(string facesFileNameExtension, MappingFromItem mappingFromItem, string mappedFaceFile, List<(Face, double?)> checkFaces) private static FileInfo? CheckFileThenGetFileInfo(string facesFileNameExtension, MappingFromItem mappingFromItem, string file, List<(Face, double?)> checkFaces)
{ {
FileInfo? result = null; FileInfo? result = null;
string checkFile; string checkFile;
@ -201,27 +201,27 @@ public partial class E_Distance
break; break;
if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null) if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
throw new NotSupportedException(); throw new NotSupportedException();
mappedFaceDirectory = Path.GetDirectoryName(mappedFaceFile); mappedFaceDirectory = Path.GetDirectoryName(file);
if (mappedFaceDirectory is null) if (mappedFaceDirectory is null)
throw new NotSupportedException(); throw new NotSupportedException();
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(mappingFromItem.Id, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(mappingFromItem.Id, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
checkFile = Path.Combine(mappedFaceDirectory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}"); checkFile = Path.Combine(mappedFaceDirectory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}");
if (checkFile == mappedFaceFile) if (checkFile == file)
continue; continue;
result = new FileInfo(checkFile); result = new FileInfo(checkFile);
} }
return result; return result;
} }
private void AppendMatchingDuplicates(string mappedFaceFile, string[] matches) private void AppendMatchingDuplicates(string file, string[] matches)
{ {
string checkFile; string checkFile;
FileInfo fileInfo = new(mappedFaceFile); FileInfo fileInfo = new(file);
List<(long Length, string FullName)> collection = new(); List<(long Length, string FullName)> collection = new();
if (fileInfo.Exists) if (fileInfo.Exists)
collection.Add(new(fileInfo.Length, fileInfo.FullName)); collection.Add(new(fileInfo.Length, fileInfo.FullName));
lock (_DuplicateMappedFaceFiles) lock (_DuplicateMappedFaceFiles)
_DuplicateMappedFaceFiles.Add(mappedFaceFile); _DuplicateMappedFaceFiles.Add(file);
foreach (string match in matches) foreach (string match in matches)
{ {
fileInfo = new(match); fileInfo = new(match);
@ -269,34 +269,38 @@ public partial class E_Distance
return results; return results;
} }
public void LookForMatchFacesAndPossiblyRename(string facesFileNameExtension, string eDistanceContentDirectory, MappingFromItem mappingFromItem, List<Face> faces, List<(string MappedFaceFile, int NormalizedRectangle, IReadOnlyList<MetadataExtractor.Directory>? Directories)> collection) public void LookForMatchFacesAndPossiblyRename(string facesFileNameExtension, string eDistanceContentDirectory, MappingFromItem mappingFromItem, List<Face> faces, List<(bool c, string File, int NormalizedRectangle, IReadOnlyList<MetadataExtractor.Directory>? Directories)> collection)
{ {
string? json; string? json;
string fileName;
string[] matches; string[] matches;
FileInfo? fileInfo; FileInfo? fileInfo;
string mappedFaceFileName;
List<(Face, double?)> checkFaces = new(); List<(Face, double?)> checkFaces = new();
Shared.Models.FaceEncoding? modelsFaceEncoding; Shared.Models.FaceEncoding? modelsFaceEncoding;
Face[] filteredFaces = (from l in faces where l.FaceEncoding is not null && l.Location is not null && l.OutputResolution is not null select l).ToArray(); Face[] filteredFaces = (from l in faces where l.FaceEncoding is not null && l.Location is not null && l.OutputResolution is not null select l).ToArray();
if (filteredFaces.Length != faces.Count) if (filteredFaces.Length != faces.Count)
checkFaces.Clear(); checkFaces.Clear();
foreach ((string mappedFaceFile, int normalizedRectangle, IReadOnlyList<MetadataExtractor.Directory>? directories) in collection) foreach ((bool fromDistanceContent, string file, int normalizedRectangle, IReadOnlyList<MetadataExtractor.Directory>? directories) in collection)
{ {
if (!filteredFaces.Any()) if (!filteredFaces.Any())
break; break;
if (_Renamed.Contains(mappedFaceFile)) if (_Renamed.Contains(file))
continue; continue;
mappedFaceFileName = Path.GetFileName(mappedFaceFile); fileName = Path.GetFileName(file);
if (_DuplicateMappedFaceFiles.Contains(mappedFaceFileName)) if (fromDistanceContent && _DuplicateMappedFaceFiles.Contains(fileName))
continue; continue;
checkFaces.Clear(); checkFaces.Clear();
if (directories is null) if (directories is null)
{
if (fromDistanceContent)
throw new NullReferenceException(nameof(directories)); throw new NullReferenceException(nameof(directories));
continue;
}
json = Metadata.Models.Stateless.IMetadata.GetFaceEncoding(directories); json = Metadata.Models.Stateless.IMetadata.GetFaceEncoding(directories);
if (json is null) if (json is null)
{ {
if (_DistanceMoveUnableToMatch) if (_DistanceMoveUnableToMatch)
MoveUnableToMatch(eDistanceContentDirectory, mappedFaceFile, mappedFaceFileName); MoveUnableToMatch(eDistanceContentDirectory, file, fileName);
continue; continue;
} }
checkFaces.AddRange(GetMatchingFacesByFaceEncoding(filteredFaces, json)); checkFaces.AddRange(GetMatchingFacesByFaceEncoding(filteredFaces, json));
@ -313,38 +317,41 @@ public partial class E_Distance
if (!checkFaces.Any()) if (!checkFaces.Any())
{ {
if (_DistanceMoveUnableToMatch) if (_DistanceMoveUnableToMatch)
MoveUnableToMatch(eDistanceContentDirectory, mappedFaceFile, mappedFaceFileName); MoveUnableToMatch(eDistanceContentDirectory, file, fileName);
continue; continue;
} }
if (checkFaces.Count != 1) if (checkFaces.Count != 1)
{ {
if (_DistanceMoveUnableToMatch) if (_DistanceMoveUnableToMatch)
MoveUnableToMatch(eDistanceContentDirectory, mappedFaceFile, mappedFaceFileName); MoveUnableToMatch(eDistanceContentDirectory, file, fileName);
continue; continue;
} }
fileInfo = CheckFileThenGetFileInfo(facesFileNameExtension, mappingFromItem, mappedFaceFile, checkFaces); fileInfo = CheckFileThenGetFileInfo(facesFileNameExtension, mappingFromItem, file, checkFaces);
if (fileInfo is not null) if (fileInfo is not null)
{ {
if (_DistanceRenameToMatch && fileInfo is not null) if (_DistanceRenameToMatch && fileInfo is not null)
{ {
if (fileInfo.Exists) if (fileInfo.Exists)
File.Delete(fileInfo.FullName); File.Delete(file);
File.Move(mappedFaceFile, fileInfo.FullName); else
_Renamed.Add(mappedFaceFile); File.Move(file, fileInfo.FullName);
_Renamed.Add(file);
} }
continue; continue;
} }
if (_AllMappedFaceFileNames.Contains(mappedFaceFileName)) if (_AllMappedFaceFileNames.Contains(fileName))
{ {
lock (_AllMappedFaceFiles) lock (_AllMappedFaceFiles)
matches = (from l in _AllMappedFaceFiles where l != mappedFaceFile && Path.GetFileName(l) == mappedFaceFileName select l).ToArray(); matches = (from l in _AllMappedFaceFiles where l != file && Path.GetFileName(l) == fileName select l).ToArray();
if (matches.Any()) if (fromDistanceContent && matches.Any())
AppendMatchingDuplicates(mappedFaceFile, matches); AppendMatchingDuplicates(file, matches);
} }
if (!fromDistanceContent)
continue;
lock (_AllMappedFaceFiles) lock (_AllMappedFaceFiles)
_AllMappedFaceFiles.Add(mappedFaceFile); _AllMappedFaceFiles.Add(file);
lock (_AllMappedFaceFileNames) lock (_AllMappedFaceFileNames)
_AllMappedFaceFileNames.Add(mappedFaceFileName); _AllMappedFaceFileNames.Add(fileName);
} }
} }

View File

@ -282,7 +282,7 @@ public partial class DlibDotNet
return result; return result;
} }
private void FullParallelForWork(A_Property propertyLogic, Dictionary<int, List<(string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> idToMappedFaceFilesWithCollection, string outputResolution, string bResultsFullGroupDirectory, string cResultsFullGroupDirectory, string dResultsDateGroupDirectory, string dResultsFullGroupDirectory, string eDistanceContentDirectory, List<Tuple<string, DateTime>> sourceDirectoryChanges, List<FileHolder?> propertyFileHolderCollection, List<Shared.Models.Property?> propertyCollection, List<List<KeyValuePair<string, string>>> metadataCollections, List<Dictionary<string, int[]>> resizeKeyValuePairs, List<List<Shared.Models.Face>> imageFaceCollections, Container container, int index, Item item, DateTime[] containerDateTimes) private void FullParallelForWork(A_Property propertyLogic, Dictionary<int, List<(bool, string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> idToMappedFaceFilesWithCollection, string outputResolution, string bResultsFullGroupDirectory, string cResultsFullGroupDirectory, string dResultsDateGroupDirectory, string dResultsFullGroupDirectory, string eDistanceContentDirectory, List<Tuple<string, DateTime>> sourceDirectoryChanges, List<FileHolder?> propertyFileHolderCollection, List<Shared.Models.Property?> propertyCollection, List<List<KeyValuePair<string, string>>> metadataCollections, List<Dictionary<string, int[]>> resizeKeyValuePairs, List<List<Shared.Models.Face>> imageFaceCollections, Container container, int index, Item item, DateTime[] containerDateTimes)
{ {
if (_Log is null) if (_Log is null)
throw new NullReferenceException(nameof(_Log)); throw new NullReferenceException(nameof(_Log));
@ -368,7 +368,7 @@ public partial class DlibDotNet
int outputResolutionHeight = outputResolutionCollection[1]; int outputResolutionHeight = outputResolutionCollection[1];
int outputResolutionOrientation = outputResolutionCollection[2]; int outputResolutionOrientation = outputResolutionCollection[2];
List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection; List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection;
List<(string, int, IReadOnlyList<MetadataExtractor.Directory>?)>? collection; List<(bool, string, int, IReadOnlyList<MetadataExtractor.Directory>?)>? collection;
if (!_FileNameToCollection.TryGetValue(mappingFromItem.RelativePath[1..], out mappingFromPhotoPrismCollection)) if (!_FileNameToCollection.TryGetValue(mappingFromItem.RelativePath[1..], out mappingFromPhotoPrismCollection))
mappingFromPhotoPrismCollection = null; mappingFromPhotoPrismCollection = null;
faces = _Faces.GetFaces(dResultsFullGroupDirectory, subFileTuples, parseExceptions, property, mappingFromItem, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, mappingFromPhotoPrismCollection); faces = _Faces.GetFaces(dResultsFullGroupDirectory, subFileTuples, parseExceptions, property, mappingFromItem, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, mappingFromPhotoPrismCollection);
@ -404,7 +404,7 @@ public partial class DlibDotNet
private int FullParallelWork(int maxDegreeOfParallelism, private int FullParallelWork(int maxDegreeOfParallelism,
A_Property propertyLogic, A_Property propertyLogic,
Dictionary<int, List<(string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> idToMappedFaceFilesWithCollection, Dictionary<int, List<(bool, string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> idToMappedFaceFilesWithCollection,
string outputResolution, string outputResolution,
string bResultsFullGroupDirectory, string bResultsFullGroupDirectory,
string cResultsFullGroupDirectory, string cResultsFullGroupDirectory,
@ -657,7 +657,7 @@ public partial class DlibDotNet
int maxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism; int maxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism;
List<Shared.Models.Property?> nullablePropertyCollection = new(); List<Shared.Models.Property?> nullablePropertyCollection = new();
List<List<KeyValuePair<string, string>>> metadataCollection = new(); List<List<KeyValuePair<string, string>>> metadataCollection = new();
Dictionary<int, List<(string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> idToMappedFaceFilesWithCollection = GetCollection(ticks, a2PeopleContentDirectory, eDistanceContentDirectory); Dictionary<int, List<(bool, string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> idToMappedFaceFilesWithCollection = GetDictionary(ticks, a2PeopleContentDirectory, eDistanceContentDirectory);
string dResultsDateGroupDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(D_Face)); string dResultsDateGroupDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(D_Face));
foreach (string outputResolution in _Configuration.OutputResolutions) foreach (string outputResolution in _Configuration.OutputResolutions)
{ {
@ -1005,48 +1005,69 @@ public partial class DlibDotNet
return results; return results;
} }
private void ParallelForAdd(Dictionary<int, List<(string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> results, (string PersonKeyFormatted, string[] PersonDisplayDirectoryNames, string MappedFaceFile) value) private void ParallelFor(string eDistanceContentDirectory, List<(bool, string, int, int, IReadOnlyList<MetadataExtractor.Directory>?)> collection, string file)
{ {
(int? id, int? normalizedRectangle) = Shared.Models.Stateless.Methods.IMapping.GetConverted(_Faces.FileNameExtension, value.MappedFaceFile); const string lnk = ".lnk";
if (id is null || normalizedRectangle is null || !results.TryGetValue(id.Value, out List<(string, int, IReadOnlyList<MetadataExtractor.Directory>?)>? collection)) int? id, normalizedRectangle;
IReadOnlyList<MetadataExtractor.Directory>? directories;
bool fromDistanceContent = !file.EndsWith(lnk) && file.Contains(eDistanceContentDirectory);
if (!file.EndsWith(lnk))
(id, normalizedRectangle) = Shared.Models.Stateless.Methods.IMapping.GetConverted(_MapConfiguration.FacesFileNameExtension, file);
else
(id, normalizedRectangle) = Shared.Models.Stateless.Methods.IMapping.GetConverted(_MapConfiguration.FacesFileNameExtension, file[..^4]);
if (id is null || normalizedRectangle is null)
return; return;
IReadOnlyList<MetadataExtractor.Directory> directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(value.MappedFaceFile); if (file.EndsWith(lnk) || (!_Configuration.DistanceMoveUnableToMatch && !_Configuration.DistanceRenameToMatch))
directories = null;
else
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
lock (collection) lock (collection)
collection.Add(new(value.MappedFaceFile, normalizedRectangle.Value, directories)); collection.Add(new(fromDistanceContent, file, id.Value, normalizedRectangle.Value, directories));
} }
private Dictionary<int, List<(string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> GetCollection(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) private List<(bool, string, int, int, IReadOnlyList<MetadataExtractor.Directory>?)> GetCollection(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory)
{ {
Dictionary<int, List<(string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> results = new(); List<string> files = new();
int? id; List<(bool, string, int, int, IReadOnlyList<MetadataExtractor.Directory>?)> results = new();
int? normalizedRectangle; files.AddRange(Map.Models.Stateless.Methods.IMapLogic.GetDisplayDirectoryAllFiles(_PersonContainers));
List<(string, string[], string)> collection = Map.Models.Stateless.Methods.IMapLogic.DeleteEmptyDirectoriesAndGetMappedFaceFiles(_MapConfiguration, _PersonContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory); files.AddRange(Map.Models.Stateless.Methods.IMapLogic.DeleteEmptyDirectoriesAndGetMappedFaceFiles(_MapConfiguration, _PersonContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory));
foreach ((string personKeyFormatted, string[] personDisplayDirectoryNames, string mappedFaceFile) in collection) // foreach (string file in files)
{ // {
(id, normalizedRectangle) = Shared.Models.Stateless.Methods.IMapping.GetConverted(_Faces.FileNameExtension, mappedFaceFile); // if (!file.EndsWith(".dup"))
if (id is null || normalizedRectangle is null) // continue;
continue; // if (!File.Exists(file))
if (!results.ContainsKey(id.Value)) // continue;
results.Add(id.Value, new()); // File.Move(file, file[..^4]);
if (!_Configuration.DistanceMoveUnableToMatch && !_Configuration.DistanceRenameToMatch) // }
results[id.Value].Add(new(mappedFaceFile, normalizedRectangle.Value, null)); if (files.Any() && (_Configuration.DistanceMoveUnableToMatch || _Configuration.DistanceRenameToMatch))
}
if (results.Any() && (_Configuration.DistanceMoveUnableToMatch || _Configuration.DistanceRenameToMatch))
{ {
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
string message = $") Building Mapped Face Files Collection - {totalSeconds} total second(s)"; string message = $") Building Mapped Face Files Collection - {totalSeconds} total second(s)";
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism }; ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism };
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
using ProgressBar progressBar = new(collection.Count, message, options); using ProgressBar progressBar = new(files.Count, message, options);
_ = Parallel.For(0, collection.Count, parallelOptions, (i, state) => _ = Parallel.For(0, files.Count, parallelOptions, (i, state) =>
{ {
ParallelForAdd(results, collection[i]);
progressBar.Tick(); progressBar.Tick();
ParallelFor(eDistanceContentDirectory, results, files[i]);
}); });
} }
return results; return results;
} }
private Dictionary<int, List<(bool, string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> GetDictionary(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory)
{
Dictionary<int, List<(bool, string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> results = new();
List<(bool, string, int, int, IReadOnlyList<MetadataExtractor.Directory>?)> collection = GetCollection(ticks, a2PeopleContentDirectory, eDistanceContentDirectory);
foreach ((bool fromDistanceContent, string file, int id, int normalizedRectangle, IReadOnlyList<MetadataExtractor.Directory>? directories) in collection)
{
if (!results.ContainsKey(id))
results.Add(id, new());
results[id].Add(new(fromDistanceContent, file, normalizedRectangle, directories));
}
return results;
}
private void Search(long ticks, string argZero, string propertyRoot) private void Search(long ticks, string argZero, string propertyRoot)
{ {
int j; int j;

View File

@ -29,7 +29,7 @@ internal abstract class MapLogic
continue; continue;
personBirthday = IPersonBirthday.GetPersonBirthday(personKey); personBirthday = IPersonBirthday.GetPersonBirthday(personKey);
person = IPerson.GetPerson(configuration.MappingDefaultName, personKey, personBirthday); person = IPerson.GetPerson(configuration.MappingDefaultName, personKey, personBirthday);
personContainer = new(approximateYears, person, new PersonBirthday[] { personBirthday }, personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey, partialKeyFormatted: null); personContainer = new(approximateYears, person, new PersonBirthday[] { personBirthday }, personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey);
results.Add(personContainer); results.Add(personContainer);
} }
return results; return results;
@ -82,12 +82,12 @@ internal abstract class MapLogic
string[] files; string[] files;
const int zero = 0; const int zero = 0;
string[] yearDirectories; string[] yearDirectories;
int? normalizedRectangle;
string personKeyFormatted; string personKeyFormatted;
string ticksDirectoryName; string ticksDirectoryName;
string? personFirstInitial; string? personFirstInitial;
DirectoryInfo directoryInfo; DirectoryInfo directoryInfo;
string[] personKeyDirectories; string[] personKeyDirectories;
int? normalizedRectangle;
string[] personNameDirectories; string[] personNameDirectories;
string[] personNameLinkDirectories; string[] personNameLinkDirectories;
string? personFirstInitialDirectory; string? personFirstInitialDirectory;
@ -189,13 +189,29 @@ internal abstract class MapLogic
return results; return results;
} }
internal static List<(string, string[], string)> DeleteEmptyDirectoriesAndGetMappedFaceFiles(Configuration configuration, PersonContainer[] personContainers, long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) private static List<string> GetPersonKeyFormattedCollection(Configuration configuration, PersonContainer[] personContainers, List<(long? PersonKey, string Line)> lines)
{ {
List<(string, string[], string)> results; List<string> results = new();
string personKeyFormatted; string personKeyFormatted;
List<string> personKeyFormattedCollection = new(); foreach (PersonContainer personContainer in personContainers)
{
lines.AddRange(IPersonContainer.GetDisplay(configuration.PersonBirthdayFormat, personContainer));
if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
continue;
foreach (PersonBirthday personBirthday in personContainer.Birthdays)
{
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personBirthday);
results.Add(personKeyFormatted);
}
}
return results;
}
internal static List<string> DeleteEmptyDirectoriesAndGetMappedFaceFiles(Configuration configuration, PersonContainer[] personContainers, long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory)
{
List<string> results = new();
List<(long? PersonKey, string Line)> lines = new(); List<(long? PersonKey, string Line)> lines = new();
_ = GetDistinctCollection(configuration, personContainers.ToList(), new()); _ = GetDistinctCollection(configuration, personContainers, new());
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
string[] ticksDirectories; string[] ticksDirectories;
if (string.IsNullOrEmpty(eDistanceContentDirectory)) if (string.IsNullOrEmpty(eDistanceContentDirectory))
@ -213,20 +229,12 @@ internal abstract class MapLogic
ticksDirectories = Directory.GetDirectories(eDistanceContentDirectory, "*", SearchOption.TopDirectoryOnly); ticksDirectories = Directory.GetDirectories(eDistanceContentDirectory, "*", SearchOption.TopDirectoryOnly);
} }
string message = $") {ticksDirectories.Length:000} collect from and clean ticks Director(ies) - A - {totalSeconds} total second(s)"; string message = $") {ticksDirectories.Length:000} collect from and clean ticks Director(ies) - A - {totalSeconds} total second(s)";
foreach (PersonContainer personContainer in personContainers) List<string> personKeyFormattedCollection = GetPersonKeyFormattedCollection(configuration, personContainers, lines);
{
lines.AddRange(IPersonContainer.GetDisplay(configuration.PersonBirthdayFormat, personContainer));
if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
continue;
foreach (PersonBirthday personBirthday in personContainer.Birthdays)
{
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personBirthday);
personKeyFormattedCollection.Add(personKeyFormatted);
}
}
if (!string.IsNullOrEmpty(a2PeopleContentDirectory)) if (!string.IsNullOrEmpty(a2PeopleContentDirectory))
File.WriteAllLines(Path.Combine(a2PeopleContentDirectory, "People - C.tsv"), from l in lines select l.Line); File.WriteAllLines(Path.Combine(a2PeopleContentDirectory, "People - C.tsv"), from l in lines select l.Line);
results = DeleteEmptyDirectoriesAndGetCollection(configuration, personKeyFormattedCollection, ticksDirectories, message); List<(string, string[], string)> collection = DeleteEmptyDirectoriesAndGetCollection(configuration, personKeyFormattedCollection, ticksDirectories, message);
foreach ((string personKeyFormatted, string[] personDisplayDirectoryNames, string mappedFaceFile) in collection)
results.Add(mappedFaceFile);
return results; return results;
} }
@ -322,7 +330,7 @@ internal abstract class MapLogic
} }
} }
private static List<(long, PersonContainer)> GetDistinctCollection(Configuration configuration, List<PersonContainer> personContainers, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer) private static List<(long, PersonContainer)> GetDistinctCollection(Configuration configuration, IEnumerable<PersonContainer> personContainers, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer)
{ {
List<(long, PersonContainer)> results = new(); List<(long, PersonContainer)> results = new();
const int zero = 0; const int zero = 0;
@ -722,4 +730,19 @@ internal abstract class MapLogic
} }
} }
internal static List<string> GetDisplayDirectoryAllFiles(PersonContainer[] personContainers)
{
List<string> results = new();
foreach (PersonContainer personContainer in personContainers)
{
foreach (string displayDirectoryAllFile in personContainer.DisplayDirectoryAllFiles)
{
if (displayDirectoryAllFile.EndsWith(".json"))
continue;
results.Add(displayDirectoryAllFile);
}
}
return results;
}
} }

View File

@ -3,9 +3,14 @@ namespace View_by_Distance.Map.Models.Stateless.Methods;
public interface IMapLogic public interface IMapLogic
{ // ... { // ...
List<(string, string[], string)> TestStatic_DeleteEmptyDirectoriesAndGetMappedFaceFiles(Configuration configuration, Shared.Models.PersonContainer[] personContainers, long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) => List<string> TestStatic_GetDisplayDirectoryAllFiles(Shared.Models.PersonContainer[] personContainers) =>
GetDisplayDirectoryAllFiles(personContainers);
static List<string> GetDisplayDirectoryAllFiles(Shared.Models.PersonContainer[] personContainers) =>
MapLogic.GetDisplayDirectoryAllFiles(personContainers);
List<string> TestStatic_DeleteEmptyDirectoriesAndGetMappedFaceFiles(Configuration configuration, Shared.Models.PersonContainer[] personContainers, long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) =>
DeleteEmptyDirectoriesAndGetMappedFaceFiles(configuration, personContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory); DeleteEmptyDirectoriesAndGetMappedFaceFiles(configuration, personContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory);
static List<(string, string[], string)> DeleteEmptyDirectoriesAndGetMappedFaceFiles(Configuration configuration, Shared.Models.PersonContainer[] personContainers, long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) => static List<string> DeleteEmptyDirectoriesAndGetMappedFaceFiles(Configuration configuration, Shared.Models.PersonContainer[] personContainers, long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) =>
MapLogic.DeleteEmptyDirectoriesAndGetMappedFaceFiles(configuration, personContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory); MapLogic.DeleteEmptyDirectoriesAndGetMappedFaceFiles(configuration, personContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory);
} }

View File

@ -12,10 +12,9 @@ public class PersonContainer : Properties.IPersonContainer
public string[] DisplayDirectoryAllFiles { init; get; } public string[] DisplayDirectoryAllFiles { init; get; }
public string DisplayDirectoryName { init; get; } public string DisplayDirectoryName { init; get; }
public long? Key { init; get; } public long? Key { init; get; }
public string? PartialKeyFormatted { init; get; }
[JsonConstructor] [JsonConstructor]
public PersonContainer(int? approximateYears, Person? person, PersonBirthday[]? birthdays, string[] displayDirectoryAllFiles, string displayDirectoryName, long? key, string? partialKeyFormatted) public PersonContainer(int? approximateYears, Person? person, PersonBirthday[]? birthdays, string[] displayDirectoryAllFiles, string displayDirectoryName, long? key)
{ {
ApproximateYears = approximateYears; ApproximateYears = approximateYears;
Person = person; Person = person;
@ -23,19 +22,18 @@ public class PersonContainer : Properties.IPersonContainer
DisplayDirectoryAllFiles = displayDirectoryAllFiles; DisplayDirectoryAllFiles = displayDirectoryAllFiles;
DisplayDirectoryName = displayDirectoryName; DisplayDirectoryName = displayDirectoryName;
Key = key; Key = key;
PartialKeyFormatted = partialKeyFormatted;
} }
public PersonContainer(int? approximateYears, string[] displayDirectoryAllFiles, string displayDirectoryName) : public PersonContainer(int? approximateYears, string[] displayDirectoryAllFiles, string displayDirectoryName) :
this(approximateYears, null, null, displayDirectoryAllFiles, displayDirectoryName, null, null) this(approximateYears, null, null, displayDirectoryAllFiles, displayDirectoryName, null)
{ } { }
public PersonContainer(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) : public PersonContainer(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) :
this(approximateYears, null, new PersonBirthday[] { birthdays }, Array.Empty<string>(), displayDirectoryName, key, null) this(approximateYears, null, new PersonBirthday[] { birthdays }, Array.Empty<string>(), displayDirectoryName, key)
{ } { }
public PersonContainer(PersonBirthday birthday, string displayDirectoryName) : public PersonContainer(PersonBirthday birthday, string displayDirectoryName) :
this(Stateless.Methods.IAge.GetApproximateYears(displayDirectoryName), Stateless.Methods.IPerson.GetPerson(displayDirectoryName, birthday.Value.Ticks, birthday), new PersonBirthday[] { birthday }, Array.Empty<string>(), displayDirectoryName, birthday.Value.Ticks, null) this(Stateless.Methods.IAge.GetApproximateYears(displayDirectoryName), Stateless.Methods.IPerson.GetPerson(displayDirectoryName, birthday.Value.Ticks, birthday), new PersonBirthday[] { birthday }, Array.Empty<string>(), displayDirectoryName, birthday.Value.Ticks)
{ } { }
public override string ToString() public override string ToString()

View File

@ -9,6 +9,5 @@ public interface IPersonContainer
public string[] DisplayDirectoryAllFiles { init; get; } public string[] DisplayDirectoryAllFiles { init; get; }
public string DisplayDirectoryName { init; get; } public string DisplayDirectoryName { init; get; }
public long? Key { init; get; } public long? Key { init; get; }
public string? PartialKeyFormatted { init; get; }
} }

View File

@ -40,10 +40,8 @@ internal abstract class PersonContainer
string[] segments; string[] segments;
const int zero = 0; const int zero = 0;
Models.Person person; Models.Person person;
string? partialPersonKeyFormatted;
Models.PersonContainer personContainer; Models.PersonContainer personContainer;
Models.PersonBirthday[] orderedPersonBirthdays; Models.PersonBirthday[] orderedPersonBirthdays;
IEnumerable<string> partialPersonKeyFormattedCollection;
string[] personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory); string[] personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory);
foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection) foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection)
{ {
@ -58,9 +56,7 @@ internal abstract class PersonContainer
personKey = orderedPersonBirthdays[zero].Value.Ticks; personKey = orderedPersonBirthdays[zero].Value.Ticks;
} }
person = IPerson.GetPerson(personKey, segments); person = IPerson.GetPerson(personKey, segments);
partialPersonKeyFormattedCollection = (from l in collection where l.PersonKeyFormatted.Contains(numberSign) select l.PersonKeyFormatted); personContainer = new(approximateYears, person, orderedPersonBirthdays, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personKey);
partialPersonKeyFormatted = partialPersonKeyFormattedCollection.FirstOrDefault();
personContainer = new(approximateYears, person, orderedPersonBirthdays, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personKey, partialPersonKeyFormatted);
results.Add(new(personKey, personContainer)); results.Add(new(personKey, personContainer));
} }
return results; return results;