From 34a02fd8bd8e5bf7d44449f6bbaacbf68610ed66 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Wed, 28 Jun 2023 18:35:36 -0700 Subject: [PATCH] New directory structure for Face and FaceParts --- Copy-Distinct/CopyDistinct.cs | 63 +++++++++++++++++++------------ Face/Models/_D_Face.cs | 52 +++++++------------------ FaceParts/Models/_D2_FaceParts.cs | 33 ++++++++++++---- Instance/DlibDotNet.cs | 58 ++++++++++++---------------- Map/Models/MapLogic.cs | 60 +++++++++++------------------ Map/Models/Stateless/MapLogic.cs | 39 +++++++------------ 6 files changed, 139 insertions(+), 166 deletions(-) diff --git a/Copy-Distinct/CopyDistinct.cs b/Copy-Distinct/CopyDistinct.cs index 61531ff..447a79d 100644 --- a/Copy-Distinct/CopyDistinct.cs +++ b/Copy-Distinct/CopyDistinct.cs @@ -80,62 +80,64 @@ public class CopyDistinct return (directories, results); } - private List<(FileHolder, string)> GetToDoCollection(ProgressBar progressBar, List files) + private List<(FileHolder, string, string)> GetToDoCollection(ProgressBar progressBar, FileHolder[] fileHolders) { - List<(FileHolder, string)> results = new(); + List<(FileHolder, string, string)> results = new(); string checkFile; string directory; FileInfo fileInfo; int directoryIndex; - FileHolder fileHolder; + string directoryName; + bool wrapped = false; List distinct = new(); - bool nameWithoutExtensionIsIdFormat; - foreach (string file in files) + foreach (FileHolder fileHolder in fileHolders) { progressBar.Tick(); - fileHolder = new(file); if (fileHolder.ExtensionLowered == ".id" || fileHolder.ExtensionLowered == ".lsv" || fileHolder.DirectoryName is null) continue; - if (files.Contains($"{fileHolder.FullName}.id")) - continue; - nameWithoutExtensionIsIdFormat = Shared.Models.Stateless.Methods.IProperty.NameWithoutExtensionIsIdFormat(fileHolder); - if (!nameWithoutExtensionIsIdFormat) - { - nameWithoutExtensionIsIdFormat = Shared.Models.Stateless.Methods.IProperty.NameWithoutExtensionIsIdFormat(_PropertyConfiguration.ValidImageFormatExtensions, fileHolder); - if (!nameWithoutExtensionIsIdFormat) - continue; - } (_, directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, fileHolder.NameWithoutExtension); - directory = _FileGroups[_PropertyConfiguration.ResultContent][directoryIndex]; + directoryName = Path.GetFileName(fileHolder.DirectoryName); + if (!fileHolder.Name.StartsWith(directoryName)) + { + if (wrapped) + continue; + directory = _FileGroups[_PropertyConfiguration.ResultContent][directoryIndex]; + } + else + { + if (!wrapped) + wrapped = true; + directory = Path.Combine(_FileGroups[_PropertyConfiguration.ResultContent][directoryIndex], directoryName); + } checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}{fileHolder.ExtensionLowered}"); if (distinct.Contains(checkFile)) { for (int i = 1; i < int.MaxValue; i++) { fileInfo = new(checkFile); - if (fileHolder.Length != fileInfo.Length || fileHolder.LastWriteTime != fileInfo.LastWriteTime) - checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}.{i}why{fileHolder.ExtensionLowered}"); - else + if (!fileInfo.Exists || fileHolder.Length == fileInfo.Length && fileHolder.LastWriteTime == fileInfo.LastWriteTime) checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}.{i}dup{fileHolder.ExtensionLowered}"); + else + checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}.{i}why{fileHolder.ExtensionLowered}"); if (distinct.Contains(checkFile)) continue; distinct.Add(checkFile); - results.Add(new(fileHolder, checkFile)); + results.Add(new(fileHolder, directory, checkFile)); break; } continue; } distinct.Add(checkFile); - results.Add(new(fileHolder, checkFile)); + results.Add(new(fileHolder, directory, checkFile)); } return results; } - private static List Copy(ProgressBar progressBar, List<(FileHolder, string)> toDoCollection) + private static List Copy(ProgressBar progressBar, List<(FileHolder, string, string)> toDoCollection) { List results = new(); FileInfo fileInfo; - foreach ((FileHolder fileHolder, string to) in toDoCollection) + foreach ((FileHolder fileHolder, string _, string to) in toDoCollection) { progressBar.Tick(); fileInfo = new(to); @@ -161,12 +163,25 @@ public class CopyDistinct const string fileSearchFilter = "*"; string message = nameof(CopyDistinct); const string directorySearchFilter = "*"; + List distinctDirectories = new(); List filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter); (_, List allFiles) = Get(filesCollection); ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; progressBar = new(allFiles.Count, message, options); - List<(FileHolder, string)> toDoCollection = GetToDoCollection(progressBar, allFiles); + FileHolder[] fileHolders = (from l in allFiles select new FileHolder(l)).OrderBy(l => l.LastWriteTime).ToArray(); + List<(FileHolder, string, string)> toDoCollection = GetToDoCollection(progressBar, fileHolders); progressBar.Dispose(); + foreach ((FileHolder fileHolder, string directory, string to) in toDoCollection) + { + if (distinctDirectories.Contains(directory)) + continue; + distinctDirectories.Add(directory); + } + foreach (string distinctDirectory in distinctDirectories) + { + if (!Directory.Exists(distinctDirectory)) + _ = Directory.CreateDirectory(distinctDirectory); + } log.Information($"Ready to Copy {toDoCollection.Count} file(s)?"); for (int y = 0; y < int.MaxValue; y++) { diff --git a/Face/Models/_D_Face.cs b/Face/Models/_D_Face.cs index e8ac915..2f8f0dd 100644 --- a/Face/Models/_D_Face.cs +++ b/Face/Models/_D_Face.cs @@ -22,8 +22,6 @@ namespace View_by_Distance.Face.Models; public class D_Face { - public List AngleBracketCollection { get; } - protected readonly string _FileNameExtension; public string FileNameExtension => _FileNameExtension; @@ -77,7 +75,6 @@ public class D_Face _EncoderParameters = encoderParameters; _FileNameExtension = filenameExtension; _Log = Serilog.Log.ForContext(); - AngleBracketCollection = new List(); _HiddenImageCodecInfo = hiddenImageCodecInfo; _OverrideForFaceImages = overrideForFaceImages; _PropertyConfiguration = propertyConfiguration; @@ -107,7 +104,7 @@ public class D_Face public void Update(string dResultsFullGroupDirectory) { _FileGroups.Clear(); - Dictionary keyValuePairs = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_PropertyConfiguration, dResultsFullGroupDirectory, new string[] { _PropertyConfiguration.ResultCollection }); + Dictionary keyValuePairs = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_PropertyConfiguration, dResultsFullGroupDirectory, new string[] { _PropertyConfiguration.ResultCollection, _PropertyConfiguration.ResultContent }); foreach (KeyValuePair keyValuePair in keyValuePairs) _FileGroups.Add(keyValuePair.Key, keyValuePair.Value); } @@ -279,34 +276,6 @@ public class D_Face return results; } - public void SetAngleBracketCollection(string dResultsFullGroupDirectory, string sourceDirectory) - { - AngleBracketCollection.Clear(); - AngleBracketCollection.AddRange(IResult.GetDirectoryInfoCollection(_PropertyConfiguration, - sourceDirectory, - dResultsFullGroupDirectory, - contentDescription: "n png file(s) for each face found", - singletonDescription: string.Empty, - collectionDescription: "For each image a json file with all faces found", - converted: true)); - } - - public string GetFacesDirectory(string dResultsFullGroupDirectory, Item item) - { - string result; - bool angleBracketCollectionAny = AngleBracketCollection.Any(); - if (!angleBracketCollectionAny) - { - if (item.ImageFileHolder.DirectoryName is null) - throw new NullReferenceException(nameof(item.ImageFileHolder.DirectoryName)); - SetAngleBracketCollection(dResultsFullGroupDirectory, item.ImageFileHolder.DirectoryName); - } - result = Path.Combine(AngleBracketCollection[0].Replace("<>", _PropertyConfiguration.ResultContent), item.ImageFileHolder.NameWithoutExtension); - if (!angleBracketCollectionAny) - AngleBracketCollection.Clear(); - return result; - } - #pragma warning restore CA1416 private static List> GetLocationContainers(string outputResolution, List> locationContainers, Dictionary outputResolutionToResize, List faces) @@ -433,7 +402,7 @@ public class D_Face return results; } - public List<(Shared.Models.Face, FileInfo?, string, bool)> SaveFaces(string f, string dResultsFullGroupDirectory, List> subFileTuples, List parseExceptions, MappingFromItem mappingFromItem, string facesDirectory, List faces) + public List<(Shared.Models.Face, FileInfo?, string, bool)> SaveFaces(string f, string dResultsFullGroupDirectory, List> subFileTuples, List parseExceptions, MappingFromItem mappingFromItem, List faces) { List<(Shared.Models.Face, FileInfo?, string, bool Save)> results = new(); bool save; @@ -441,8 +410,9 @@ public class D_Face string deterministicHashCodeKey; string[] changesFrom = new string[] { nameof(A_Property), nameof(B_Metadata), nameof(C_Resize) }; List dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList(); - if (!Directory.Exists(facesDirectory)) - _ = Directory.CreateDirectory(facesDirectory); + (_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, mappingFromItem.ImageFileHolder.Name); + string directory = Path.Combine(_FileGroups[_PropertyConfiguration.ResultContent][directoryIndex], mappingFromItem.ImageFileHolder.NameWithoutExtension); + bool directoryExists = Directory.Exists(directory); foreach (Shared.Models.Face face in faces) { save = false; @@ -452,17 +422,23 @@ public class D_Face continue; } deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(mappingFromItem.Id, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); - fileInfo = new FileInfo(Path.Combine(facesDirectory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{_FileNameExtension}")); - if (_OverrideForFaceImages) + fileInfo = new FileInfo(Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{_FileNameExtension}")); + if (!directoryExists) + save = true; + else if (_OverrideForFaceImages) save = true; else if (!fileInfo.Exists) save = true; else if (_CheckDFaceAndUpWriteDates && dateTimes.Any() && dateTimes.Max() > fileInfo.LastWriteTime) save = true; - results.Add(new(face, fileInfo, Path.Combine(facesDirectory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{_HiddenFileNameExtension}"), save)); + results.Add(new(face, fileInfo, Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{_HiddenFileNameExtension}"), save)); } if (results.Any(l => l.Save)) + { + if (!directoryExists) + _ = Directory.CreateDirectory(directory); SaveFaces(mappingFromItem.ResizedFileHolder, results); + } return results; } diff --git a/FaceParts/Models/_D2_FaceParts.cs b/FaceParts/Models/_D2_FaceParts.cs index 3e25801..8c9c556 100644 --- a/FaceParts/Models/_D2_FaceParts.cs +++ b/FaceParts/Models/_D2_FaceParts.cs @@ -28,14 +28,18 @@ public class D2_FaceParts private readonly bool _OverrideForFaceLandmarkImages; private readonly EncoderParameters _EncoderParameters; private readonly List _AngleBracketCollection; + private readonly Dictionary _FileGroups; + private readonly IPropertyConfiguration _PropertyConfiguration; - public D2_FaceParts(ImageCodecInfo imageCodecInfo, EncoderParameters encoderParameters, string filenameExtension, bool checkDFaceAndUpWriteDates, bool overrideForFaceLandmarkImages) + public D2_FaceParts(IPropertyConfiguration propertyConfiguration, ImageCodecInfo imageCodecInfo, EncoderParameters encoderParameters, string filenameExtension, bool checkDFaceAndUpWriteDates, bool overrideForFaceLandmarkImages) { + _FileGroups = new(); _ImageCodecInfo = imageCodecInfo; _EncoderParameters = encoderParameters; _FileNameExtension = filenameExtension; _AngleBracketCollection = new List(); _Log = Serilog.Log.ForContext(); + _PropertyConfiguration = propertyConfiguration; _CheckDFaceAndUpWriteDates = checkDFaceAndUpWriteDates; _OverrideForFaceLandmarkImages = overrideForFaceLandmarkImages; } @@ -46,6 +50,14 @@ public class D2_FaceParts return result; } + public void Update(string dResultsFullGroupDirectory) + { + _FileGroups.Clear(); + Dictionary keyValuePairs = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_PropertyConfiguration, dResultsFullGroupDirectory, new string[] { _PropertyConfiguration.ResultContent }); + foreach (KeyValuePair keyValuePair in keyValuePairs) + _FileGroups.Add(keyValuePair.Key, keyValuePair.Value); + } + public void SetAngleBracketCollection(Configuration configuration, string d2ResultsFullGroupDirectory, string sourceDirectory) { _AngleBracketCollection.Clear(); @@ -69,10 +81,10 @@ public class D2_FaceParts SetAngleBracketCollection(configuration, dResultsFullGroupDirectory, item.ImageFileHolder.DirectoryName); } if (includeNameWithoutExtension) - result = Path.Combine(_AngleBracketCollection[0].Replace("<>", "()"), item.ImageFileHolder.NameWithoutExtension); + result = Path.Combine(_AngleBracketCollection[0].Replace("<>", _PropertyConfiguration.ResultContent), item.ImageFileHolder.NameWithoutExtension); else { - result = _AngleBracketCollection[0].Replace("<>", "[()]"); + result = _AngleBracketCollection[0].Replace("<>", $"[{_PropertyConfiguration.ResultContent}]"); if (!Directory.Exists(result)) _ = Directory.CreateDirectory(result); } @@ -234,7 +246,7 @@ public class D2_FaceParts #pragma warning restore CA1416 - public void SaveFaceLandmarkImages(Configuration configuration, string facePartsDirectory, List> subFileTuples, List parseExceptions, MappingFromItem mappingFromItem, List faces, bool saveRotated) + public void SaveFaceLandmarkImages(Configuration configuration, List> subFileTuples, List parseExceptions, MappingFromItem mappingFromItem, List faces, bool saveRotated) { FileInfo fileInfo; bool check = false; @@ -247,8 +259,9 @@ public class D2_FaceParts List<(Shared.Models.Face, string, string)> collection = new(); string[] changesFrom = new string[] { nameof(A_Property), nameof(B_Metadata), nameof(C_Resize), nameof(D_Face) }; List dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList(); - if (!Directory.Exists(facePartsDirectory)) - _ = Directory.CreateDirectory(facePartsDirectory); + (_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, mappingFromItem.ImageFileHolder.Name); + string directory = Path.Combine(_FileGroups[_PropertyConfiguration.ResultContent][directoryIndex], mappingFromItem.ImageFileHolder.NameWithoutExtension); + bool directoryExists = Directory.Exists(directory); foreach (Shared.Models.Face face in faces) { if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null) @@ -257,13 +270,15 @@ public class D2_FaceParts continue; } deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(mappingFromItem.Id, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); - fileInfo = new FileInfo(Path.Combine(facePartsDirectory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{_FileNameExtension}")); + fileInfo = new FileInfo(Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{_FileNameExtension}")); if (string.IsNullOrEmpty(fileInfo.DirectoryName)) continue; rotatedFileInfo = new FileInfo(Path.Combine(fileInfo.DirectoryName, $"{deterministicHashCodeKey} - R{mappingFromItem.ImageFileHolder.ExtensionLowered}{_FileNameExtension}")); collection.Add(new(face, fileInfo.FullName, rotatedFileInfo.FullName)); if (check) continue; + else if (!directoryExists) + check = true; else if (_OverrideForFaceLandmarkImages) check = true; else if (!fileInfo.Exists) @@ -279,7 +294,11 @@ public class D2_FaceParts } } if (check) + { + if (!directoryExists) + _ = Directory.CreateDirectory(directory); SaveFaceParts(pointSize, mappingFromItem.ResizedFileHolder, saveRotated, collection); + } } #pragma warning disable CA1416 diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index cd866ef..c93fc48 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -105,7 +105,7 @@ public partial class DlibDotNet } { (ImageCodecInfo imageCodecInfo, EncoderParameters encoderParameters, string filenameExtension) = C_Resize.GetGifLowQuality(); - _FaceParts = new D2_FaceParts(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); _Distance = new(configuration.DistanceMoveUnableToMatch, configuration.DistanceRenameToMatch, _Configuration.FaceConfidencePercent, configuration.RangeDistanceTolerance, configuration.RangeFaceConfidence, configuration.RectangleIntersectMinimums); @@ -450,8 +450,6 @@ public partial class DlibDotNet if (property is null || item.Property is null) throw new NullReferenceException(nameof(property)); item.SetResizedFileHolder(_Resize.FileNameExtension, resizedFileHolder); - string? facesDirectory = !_Configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions.Contains(outputResolution) ? null : _Faces.GetFacesDirectory(dResultsFullGroupDirectory, item); - string? facePartsDirectory = !_Configuration.SaveFaceLandmarkForOutputResolutions.Contains(outputResolution) ? null : _FaceParts.GetFacePartsDirectory(_Configuration.PropertyConfiguration, dResultsFullGroupDirectory, item, includeNameWithoutExtension: true); MappingFromItem mappingFromItem = Shared.Models.Stateless.Methods.IMappingFromItem.GetMappingFromItem(containerDateTimes, item, resizedFileHolder); (int metadataGroups, metadataCollection) = metadata.GetMetadataCollection(subFileTuples, parseExceptions, mappingFromItem); if (_AppSettings.MaxDegreeOfParallelism < 2) @@ -465,7 +463,7 @@ public partial class DlibDotNet if (_AppSettings.MaxDegreeOfParallelism < 2) ticks = LogDelta(ticks, nameof(C_Resize.SaveResizedSubfile)); } - if (facesDirectory is null) + if (!_Configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions.Contains(outputResolution)) faces = new(); else if (!mappingFromItem.ResizedFileHolder.Exists && !File.Exists(mappingFromItem.ResizedFileHolder.FullName)) faces = new(); @@ -483,7 +481,7 @@ public partial class DlibDotNet if (_AppSettings.MaxDegreeOfParallelism < 2) ticks = LogDelta(ticks, nameof(D_Face.GetFaces)); SetMapping(mapLogic, item, isFocusRelativePath, isIgnoreRelativePath, mappingFromItem, mappingFromPhotoPrismCollection, faces); - List<(Shared.Models.Face, FileInfo?, string, bool Saved)> faceCollection = _Faces.SaveFaces(_FaceParts.FileNameExtension, dResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem, facesDirectory, faces); + List<(Shared.Models.Face, FileInfo?, string, bool Saved)> faceCollection = _Faces.SaveFaces(_FaceParts.FileNameExtension, dResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem, faces); if (_Configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions.Contains(outputResolution)) _FaceParts.CopyFacesAndSaveFaceLandmarkImage(facePartsCollectionDirectory, mappingFromItem, faceCollection); if (_AppSettings.MaxDegreeOfParallelism < 2) @@ -496,11 +494,8 @@ public partial class DlibDotNet if (review || _Configuration.SaveFaceLandmarkForOutputResolutions.Contains(outputResolution)) { bool saveRotated = false; - if (!_Configuration.SaveFaceLandmarkForOutputResolutions.Contains(outputResolution)) - _FaceParts.SetAngleBracketCollection(_Configuration.PropertyConfiguration, d2ResultsFullGroupDirectory, container.SourceDirectory); string sourceDirectorySegment = Property.Models.Stateless.IResult.GetRelativePath(_Configuration.PropertyConfiguration, container.SourceDirectory); - facePartsDirectory ??= _FaceParts.GetFacePartsDirectory(_Configuration.PropertyConfiguration, dResultsFullGroupDirectory, item, includeNameWithoutExtension: true); - _FaceParts.SaveFaceLandmarkImages(_Configuration.PropertyConfiguration, facePartsDirectory, subFileTuples, parseExceptions, mappingFromItem, faces, saveRotated); + _FaceParts.SaveFaceLandmarkImages(_Configuration.PropertyConfiguration, subFileTuples, parseExceptions, mappingFromItem, faces, saveRotated); if (_AppSettings.MaxDegreeOfParallelism < 2) ticks = LogDelta(ticks, nameof(D2_FaceParts.SaveFaceLandmarkImages)); } @@ -685,6 +680,7 @@ public partial class DlibDotNet (cResultsFullGroupDirectory, c2ResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution); _Faces.Update(dResultsFullGroupDirectory); _Resize.Update(cResultsFullGroupDirectory); + _FaceParts.Update(d2ResultsFullGroupDirectory); _BlurHasher = new BlurHash.Models.C2_BlurHasher(_Configuration.PropertyConfiguration, c2ResultsFullGroupDirectory); for (int i = 0; i < containers.Length; i++) { @@ -700,10 +696,6 @@ public partial class DlibDotNet anyNullOrNoIsUniqueFileName = filteredItems.Any(l => !l.IsUniqueFileName); totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); message = $"{i + 1:000} [{filteredItems.Length:000}] / {containersLength:000} - {total} / {t} total - {totalSeconds} total second(s) - {outputResolution} - {container.SourceDirectory}"; - if (_Configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions.Contains(outputResolution)) - _Faces.SetAngleBracketCollection(dResultsFullGroupDirectory, container.SourceDirectory); - if (_Configuration.SaveFaceLandmarkForOutputResolutions.Contains(outputResolution)) - _FaceParts.SetAngleBracketCollection(_Configuration.PropertyConfiguration, d2ResultsFullGroupDirectory, container.SourceDirectory); propertyLogic.SetAngleBracketCollection(aResultsFullGroupDirectory, container.SourceDirectory, anyNullOrNoIsUniqueFileName); _Resize.SetAngleBracketCollection(cResultsFullGroupDirectory, container.SourceDirectory); exceptionCount = FullParallelWork(maxDegreeOfParallelism, @@ -1018,26 +1010,26 @@ public partial class DlibDotNet private void VerifyPersonContainersDisplayDirectoryAllFiles() { - WindowsShortcut windowsShortcut; - foreach (PersonContainer personContainer in _PersonContainers) - { - foreach (string file in personContainer.DisplayDirectoryAllFiles) - { - if (!file.EndsWith(".lnk")) - continue; - try - { - windowsShortcut = WindowsShortcut.Load(file); - if (windowsShortcut.Path is null) - continue; - if (!File.Exists(windowsShortcut.Path)) - File.Delete(file); - windowsShortcut.Dispose(); - } - catch (Exception) - { } - } - } + // WindowsShortcut windowsShortcut; + // foreach (PersonContainer personContainer in _PersonContainers) + // { + // foreach (string file in personContainer.DisplayDirectoryAllFiles) + // { + // if (!file.EndsWith(".lnk")) + // continue; + // try + // { + // windowsShortcut = WindowsShortcut.Load(file); + // if (windowsShortcut.Path is null) + // continue; + // if (!File.Exists(windowsShortcut.Path)) + // File.Delete(file); + // windowsShortcut.Dispose(); + // } + // catch (Exception) + // { } + // } + // } } private static void Verify(string eDistanceContentDirectory, List distinctFilteredItems) diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index 3061d1d..d830aee 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -322,28 +322,18 @@ public class MapLogic : Shared.Models.Methods.IMapLogic else { string checkFile; - string? facesDirectory = Stateless.MapLogic.GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem); - if (facesDirectory is null) + string facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.MappingFromItem); + FileHolder faceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}")); + if (!faceFileHolder.Exists) result = null; else { - FileHolder faceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}")); - if (!faceFileHolder.Exists) - result = null; - else - { - string shortcutFile = string.Empty; - string? facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(d2FacePartsContentDirectory, mapping.MappingFromItem); - if (facePartsDirectory is null) - result = null; - else - { - checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}"); - FileHolder hiddenFaceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}")); - FileHolder facePartsFileHolder = new(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}")); - result = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, mapping.MappingFromItem.ResizedFileHolder, shortcutFile); - } - } + string shortcutFile = string.Empty; + string facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.MappingFromItem); + checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}"); + FileHolder hiddenFaceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}")); + FileHolder facePartsFileHolder = new(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}")); + result = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, mapping.MappingFromItem.ResizedFileHolder, shortcutFile); } } return result; @@ -393,13 +383,13 @@ public class MapLogic : Shared.Models.Methods.IMapLogic string directory; string shortcutFile; Mapping? keyMapping; + string facesDirectory; string? directoryName; string personDirectory; - string? facesDirectory; + string facePartsDirectory; FileHolder faceFileHolder; string personKeyFormatted; List distinct = new(); - string? facePartsDirectory; SaveContainer? saveContainer; FileHolder facePartsFileHolder; FileHolder hiddenFaceFileHolder; @@ -489,9 +479,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic if (saveIndividually && keyMapping.MappingFromLocation.WholePercentages == mapping.MappingFromLocation.WholePercentages) results.Add(new(Path.Combine(directory, "Maybe"))); } - facesDirectory = Stateless.MapLogic.GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem); - if (facesDirectory is null) - continue; + facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.MappingFromItem); faceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}")); if (!faceFileHolder.Exists) continue; @@ -512,9 +500,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic } else { - facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(d2FacePartsContentDirectory, mapping.MappingFromItem); - if (facePartsDirectory is null) - continue; + facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.MappingFromItem); shortcutFile = Path.Combine(personDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.lnk"); checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}"); hiddenFaceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}")); @@ -535,7 +521,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic saveContainer = Stateless.MapLogic.GetDebugSaveContainer(directory, mapping.MappingFromPerson, mapping.SortingContainer, keyMapping); else { - (saveContainer, SaveContainer? extraSaveContainer) = Stateless.MapLogic.GetContainers(_Configuration.FacesFileNameExtension, _Configuration.FacePartsFileNameExtension, dFacesContentDirectory, d2FacePartsContentCollectionDirectory, directory, mapping.SortingContainer, keyMapping); + (saveContainer, SaveContainer? extraSaveContainer) = Stateless.MapLogic.GetContainers(_Configuration.FacesFileNameExtension, _Configuration.FacePartsFileNameExtension, _PropertyConfiguration, dFacesContentDirectory, d2FacePartsContentCollectionDirectory, directory, mapping.SortingContainer, keyMapping); if (saveContainer is null || extraSaveContainer is null) continue; results.Add(extraSaveContainer); @@ -727,11 +713,11 @@ public class MapLogic : Shared.Models.Methods.IMapLogic const int zero = 0; string faceFileName; string shortcutFile; + string facesDirectory; int? wholePercentages; string? directoryName; string mappingSegmentB; string personDirectory; - string? facesDirectory; string personKeyFormatted; string personDisplayFileName; PersonBirthday personBirthday; @@ -775,9 +761,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic if (string.IsNullOrEmpty(directoryName)) throw new NotSupportedException(); shortcutFile = Path.Combine(personDisplayDirectory, $"{personDisplayFileName}.lnk"); - facesDirectory = Stateless.MapLogic.GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem); - if (facesDirectory is null) - continue; + facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.MappingFromItem); faceFileName = $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}"; checkFile = Path.Combine(directory, fileInfo.Name); if (!_IdThenWholePercentagesToPersonContainers.TryGetValue(id.Value, out wholePercentagesToPeronContainerCollection) || !wholePercentagesToPeronContainerCollection.ContainsKey(wholePercentages.Value)) @@ -898,8 +882,8 @@ public class MapLogic : Shared.Models.Methods.IMapLogic string faceFile; string directory; string faceFileName; + string facesDirectory; string? directoryName; - string? facesDirectory; PersonContainer? personContainer; Dictionary personKeyToCount = new(); bool usePersonCharactersCopyCount = personCharactersCopyCount != int.MaxValue; @@ -919,9 +903,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic throw new NotSupportedException(); if (string.IsNullOrEmpty(mapping.MappingFromPerson.DisplayDirectoryName)) throw new NotSupportedException(); - facesDirectory = Stateless.MapLogic.GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem); - if (facesDirectory is null) - continue; + facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.MappingFromItem); faceFileName = $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}"; faceFile = Path.Combine(facesDirectory, faceFileName); personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks; @@ -1241,9 +1223,9 @@ public class MapLogic : Shared.Models.Methods.IMapLogic string fileName; string fullName; string directory; + string facesDirectory; string? directoryName; string personDirectory; - string? facesDirectory; string personKeyFormatted; List distinct = new(); List collection = new(); @@ -1292,8 +1274,8 @@ public class MapLogic : Shared.Models.Methods.IMapLogic personDirectory = Path.Combine(directory, "Unknown"); fileName = Path.Combine(personDirectory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk"); collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, mapping.MappingFromLocation?.DeterministicHashCodeKey, MakeAllHidden: false)); - facesDirectory = Stateless.MapLogic.GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem); - if (facesDirectory is null || mapping.MappingFromLocation is null) + facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.MappingFromItem); + if (mapping.MappingFromLocation is null) continue; fullName = Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}"); fileName = Path.Combine(personDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ResizedFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}.lnk"); diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index 4550d59..0f362eb 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -809,25 +809,19 @@ internal abstract class MapLogic return result; } - internal static string? GetFacesDirectory(string dFacesContentDirectory, MappingFromItem mappingFromItem) + internal static string GetFacesDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string dFacesContentDirectory, MappingFromItem mappingFromItem) { - string? result; - string? directoryName = Path.GetDirectoryName(mappingFromItem.RelativePath); - if (directoryName is null) - result = null; - else - result = Path.Combine($"{dFacesContentDirectory}{directoryName}", mappingFromItem.ImageFileHolder.NameWithoutExtension); + string result; + (string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration.ResultAllInOneSubdirectoryLength, mappingFromItem.ImageFileHolder.NameWithoutExtension); + result = Path.Combine(dFacesContentDirectory, propertyConfiguration.ResultAllInOne, directoryName, mappingFromItem.ImageFileHolder.NameWithoutExtension); return result; } - internal static string? GetFacePartsDirectory(string d2FacePartsContentDirectory, MappingFromItem mappingFromItem) + internal static string GetFacePartsDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string d2FacePartsContentDirectory, MappingFromItem mappingFromItem) { - string? result; - string? directoryName = Path.GetDirectoryName(mappingFromItem.RelativePath); - if (directoryName is null) - result = null; - else - result = Path.Combine($"{d2FacePartsContentDirectory}{directoryName}", mappingFromItem.ImageFileHolder.NameWithoutExtension); + string result; + (string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration.ResultAllInOneSubdirectoryLength, mappingFromItem.ImageFileHolder.NameWithoutExtension); + result = Path.Combine(d2FacePartsContentDirectory, propertyConfiguration.ResultAllInOne, directoryName, mappingFromItem.ImageFileHolder.NameWithoutExtension); return result; } @@ -846,7 +840,7 @@ internal abstract class MapLogic return result; } - internal static (SaveContainer?, SaveContainer?) GetContainers(string facesFileNameExtension, string facePartsFileNameExtension, string dFacesContentDirectory, string d2FacePartsContentCollectionDirectory, string directory, SortingContainer sortingContainer, Mapping mapping) + internal static (SaveContainer?, SaveContainer?) GetContainers(string facesFileNameExtension, string facePartsFileNameExtension, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string dFacesContentDirectory, string d2FacePartsContentCollectionDirectory, string directory, SortingContainer sortingContainer, Mapping mapping) { SaveContainer? result; SaveContainer? saveContainer; @@ -864,19 +858,14 @@ internal abstract class MapLogic string checkFile = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}{facePartsFileNameExtension}"); result = new(checkFile, directory, new(facePartsContentCollectionFile)); } - string? facesDirectory = GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem); - if (facesDirectory is null) + string facesDirectory = GetFacesDirectory(propertyConfiguration, dFacesContentDirectory, mapping.MappingFromItem); + FileHolder faceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}")); + if (!faceFileHolder.Exists) saveContainer = null; else { - FileHolder faceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}")); - if (!faceFileHolder.Exists) - saveContainer = null; - else - { - string checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}"); - saveContainer = new(checkFile, directory, faceFileHolder); - } + string checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}"); + saveContainer = new(checkFile, directory, faceFileHolder); } } return (result, saveContainer);