LookForMatchFacesAndPossiblyRename for A2 People

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

View File

@ -282,7 +282,7 @@ public partial class DlibDotNet
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)
throw new NullReferenceException(nameof(_Log));
@ -368,7 +368,7 @@ public partial class DlibDotNet
int outputResolutionHeight = outputResolutionCollection[1];
int outputResolutionOrientation = outputResolutionCollection[2];
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))
mappingFromPhotoPrismCollection = null;
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,
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 bResultsFullGroupDirectory,
string cResultsFullGroupDirectory,
@ -657,7 +657,7 @@ public partial class DlibDotNet
int maxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism;
List<Shared.Models.Property?> nullablePropertyCollection = 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));
foreach (string outputResolution in _Configuration.OutputResolutions)
{
@ -1005,48 +1005,69 @@ public partial class DlibDotNet
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);
if (id is null || normalizedRectangle is null || !results.TryGetValue(id.Value, out List<(string, int, IReadOnlyList<MetadataExtractor.Directory>?)>? collection))
const string lnk = ".lnk";
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;
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)
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();
int? id;
int? normalizedRectangle;
List<(string, string[], string)> collection = Map.Models.Stateless.Methods.IMapLogic.DeleteEmptyDirectoriesAndGetMappedFaceFiles(_MapConfiguration, _PersonContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory);
foreach ((string personKeyFormatted, string[] personDisplayDirectoryNames, string mappedFaceFile) in collection)
{
(id, normalizedRectangle) = Shared.Models.Stateless.Methods.IMapping.GetConverted(_Faces.FileNameExtension, mappedFaceFile);
if (id is null || normalizedRectangle is null)
continue;
if (!results.ContainsKey(id.Value))
results.Add(id.Value, new());
if (!_Configuration.DistanceMoveUnableToMatch && !_Configuration.DistanceRenameToMatch)
results[id.Value].Add(new(mappedFaceFile, normalizedRectangle.Value, null));
}
if (results.Any() && (_Configuration.DistanceMoveUnableToMatch || _Configuration.DistanceRenameToMatch))
List<string> files = new();
List<(bool, string, int, int, IReadOnlyList<MetadataExtractor.Directory>?)> results = new();
files.AddRange(Map.Models.Stateless.Methods.IMapLogic.GetDisplayDirectoryAllFiles(_PersonContainers));
files.AddRange(Map.Models.Stateless.Methods.IMapLogic.DeleteEmptyDirectoriesAndGetMappedFaceFiles(_MapConfiguration, _PersonContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory));
// foreach (string file in files)
// {
// if (!file.EndsWith(".dup"))
// continue;
// if (!File.Exists(file))
// continue;
// File.Move(file, file[..^4]);
// }
if (files.Any() && (_Configuration.DistanceMoveUnableToMatch || _Configuration.DistanceRenameToMatch))
{
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
string message = $") Building Mapped Face Files Collection - {totalSeconds} total second(s)";
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism };
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
using ProgressBar progressBar = new(collection.Count, message, options);
_ = Parallel.For(0, collection.Count, parallelOptions, (i, state) =>
using ProgressBar progressBar = new(files.Count, message, options);
_ = Parallel.For(0, files.Count, parallelOptions, (i, state) =>
{
ParallelForAdd(results, collection[i]);
progressBar.Tick();
ParallelFor(eDistanceContentDirectory, results, files[i]);
});
}
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)
{
int j;