diff --git a/FaceParts/Models/_D2_FaceParts.cs b/FaceParts/Models/_D2_FaceParts.cs index 5ba882e..1fc982c 100644 --- a/FaceParts/Models/_D2_FaceParts.cs +++ b/FaceParts/Models/_D2_FaceParts.cs @@ -340,6 +340,11 @@ public class D2_FaceParts if (File.Exists(checkFile)) File.Delete(checkFile); } + else if (face.Mapping?.MappingFromFilter.InSkipCollection is not null && face.Mapping.MappingFromFilter.InSkipCollection.Value) + { + if (File.Exists(checkFile)) + File.Delete(checkFile); + } else { if (!hasNotMapped) diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index 533c1d2..7b98f0d 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -268,6 +268,7 @@ public partial class DlibDotNet bool? isFocusModel; int faceAreaPermyriad; int confidencePercent; + bool? inSkipCollection; int normalizedRectangle; string deterministicHashCodeKey; MappingFromFilter mappingFromFilter; @@ -292,11 +293,14 @@ public partial class DlibDotNet isFocusModel = true; } } - mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath); 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) + { + inSkipCollection = null; mappingFromLocation = null; + mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection); + } else { confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_Configuration.FaceConfidencePercent, _Configuration.RangeFaceConfidence, face.Location.Confidence); @@ -304,6 +308,8 @@ public partial class DlibDotNet normalizedRectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, normalizedRectangle); + inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation); + mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection); } mapping = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection); _ = mapLogic.UpdateMappingFromPerson(mapping); @@ -770,7 +776,9 @@ public partial class DlibDotNet { string dFacesContentDirectory = Path.Combine(dResultsFullGroupDirectory, "()"); string d2FacePartsContentDirectory = Path.Combine(d2ResultsFullGroupDirectory, "()"); + string d2FacePartsContentCollectionDirectory = Path.Combine(d2ResultsFullGroupDirectory, "[()]"); Shared.Models.Stateless.Methods.IPath.ChangeDateForEmptyDirectories(d2FacePartsContentDirectory, ticks); + Shared.Models.Stateless.Methods.IPath.MakeHiddenIfAllItemsAreHidden(d2FacePartsContentCollectionDirectory); string dFacesCollectionDirectory = Path.Combine(dResultsFullGroupDirectory, "[]", _Configuration.PropertyConfiguration.ResultAllInOne); Dictionary> idToNormalizedRectangleToMapping = Map.Models.Stateless.Methods.IMapLogic.GetIdToNormalizedRectangleToFace(mappingCollection); if (Directory.Exists(fPhotoPrismContentDirectory)) diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index f83554a..d026f76 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -180,7 +180,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic const int zero = 0; string mappingSegmentB; PersonBirthday personBirthday; - List? normalizedRectangles; PersonContainer[]? personContainers; Dictionary? normalizedRectangleToPersonContainers; for (int i = 1; i < 2; i++) @@ -189,14 +188,14 @@ public class MapLogic : Shared.Models.Methods.IMapLogic continue; if (!_IdThenNormalizedRectangleToPersonContainers.TryGetValue(mapping.MappingFromItem.Id, out normalizedRectangleToPersonContainers)) { - if (_SkipCollection.TryGetValue(mapping.MappingFromItem.Id, out normalizedRectangles) && normalizedRectangles.Contains(mapping.MappingFromLocation.NormalizedRectangle)) + if (mapping.MappingFromFilter.InSkipCollection is not null && mapping.MappingFromFilter.InSkipCollection.Value) continue; result += 1; continue; } if (!normalizedRectangleToPersonContainers.TryGetValue(mapping.MappingFromLocation.NormalizedRectangle, out personContainers)) { - if (_SkipCollection.TryGetValue(mapping.MappingFromItem.Id, out normalizedRectangles) && normalizedRectangles.Contains(mapping.MappingFromLocation.NormalizedRectangle)) + if (mapping.MappingFromFilter.InSkipCollection is not null && mapping.MappingFromFilter.InSkipCollection.Value) continue; result += 1; continue; @@ -455,9 +454,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic SaveContainer? saveContainer; FileHolder facePartsFileHolder; FileHolder hiddenFaceFileHolder; - List? normalizedRectangles; Dictionary? normalizedRectangleToMapping; - bool skipNotSkipDirectoriesAny = _Configuration.SkipNotSkipDirectories.Any(); string forceSingleImageHumanized = nameof(Shared.Models.Stateless.IMapLogic.ForceSingleImage).Humanize(LetterCasing.Title); foreach (Mapping mapping in mappingCollection) { @@ -466,9 +463,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath); if (directoryName is null) throw new NotSupportedException(); - if (_SkipCollection.TryGetValue(mapping.MappingFromItem.Id, out normalizedRectangles) && normalizedRectangles.Contains(mapping.MappingFromLocation.NormalizedRectangle)) - continue; - if (mapping.By is null && skipNotSkipDirectoriesAny) + if (mapping.MappingFromFilter.InSkipCollection is not null && mapping.MappingFromFilter.InSkipCollection.Value) continue; (by, isByMapping, isBySorting) = Get(useFiltersCounter, sortingContainersAny, forceSingleImageHumanized, mapping); if (isByMapping && !saveMapped) @@ -1350,4 +1345,11 @@ public class MapLogic : Shared.Models.Methods.IMapLogic return results; } + public bool InSkipCollection(int id, MappingFromLocation mappingFromLocation) + { + bool result; + result = _SkipCollection.TryGetValue(id, out List? normalizedRectangles) && normalizedRectangles.Contains(mappingFromLocation.NormalizedRectangle); + return result; + } + } \ No newline at end of file diff --git a/Shared/Models/Mapping.cs b/Shared/Models/Mapping.cs index 42400cb..8a04b18 100644 --- a/Shared/Models/Mapping.cs +++ b/Shared/Models/Mapping.cs @@ -80,13 +80,15 @@ public class MappingFromFilter : Properties.IMappingFromFilter public bool? IsFocusModel { init; get; } public bool? IsFocusRelativePath { init; get; } public bool? IsIgnoreRelativePath { init; get; } + public bool? InSkipCollection { init; get; } [JsonConstructor] - public MappingFromFilter(bool? isFocusModel, bool? isFocusRelativePath, bool? isIgnoreRelativePath) + public MappingFromFilter(bool? isFocusModel, bool? isFocusRelativePath, bool? isIgnoreRelativePath, bool? inSkipCollection) { IsFocusModel = isFocusModel; IsFocusRelativePath = isFocusRelativePath; IsIgnoreRelativePath = isIgnoreRelativePath; + InSkipCollection = inSkipCollection; } public override string ToString() diff --git a/Shared/Models/Properties/IMapping.cs b/Shared/Models/Properties/IMapping.cs index b6fd62f..2308339 100644 --- a/Shared/Models/Properties/IMapping.cs +++ b/Shared/Models/Properties/IMapping.cs @@ -19,6 +19,7 @@ public interface IMappingFromFilter public bool? IsFocusModel { init; get; } public bool? IsFocusRelativePath { init; get; } public bool? IsIgnoreRelativePath { init; get; } + public bool? InSkipCollection { init; get; } } diff --git a/Shared/Models/Stateless/Methods/IPath.cs b/Shared/Models/Stateless/Methods/IPath.cs index d62d322..47c6a36 100644 --- a/Shared/Models/Stateless/Methods/IPath.cs +++ b/Shared/Models/Stateless/Methods/IPath.cs @@ -18,6 +18,11 @@ public interface IPath static void ChangeDateForEmptyDirectories(string rootDirectory, long ticks) => XPath.ChangeDateForEmptyDirectories(rootDirectory, ticks); + void TestStatic_MakeHiddenIfAllItemsAreHidden(string rootDirectory) => + MakeHiddenIfAllItemsAreHidden(rootDirectory); + static void MakeHiddenIfAllItemsAreHidden(string rootDirectory) => + XPath.MakeHiddenIfAllItemsAreHidden(rootDirectory); + void TestStatic_DeleteEmptyDirectories(string rootDirectory, List deletedDirectories) => DeleteEmptyDirectories(rootDirectory, deletedDirectories); static void DeleteEmptyDirectories(string rootDirectory, List deletedDirectories) => diff --git a/Shared/Models/Stateless/Methods/XPath.cs b/Shared/Models/Stateless/Methods/XPath.cs index 1b6815a..8a41e6b 100644 --- a/Shared/Models/Stateless/Methods/XPath.cs +++ b/Shared/Models/Stateless/Methods/XPath.cs @@ -190,4 +190,46 @@ internal abstract class XPath } } + internal static void MakeHiddenIfAllItemsAreHidden(string rootDirectory) + { + bool check; + FileInfo fileInfo; + IEnumerable files; + DirectoryInfo directoryInfo; + IEnumerable subDirectories; + string[] directories = Directory.GetDirectories(rootDirectory, "*", SearchOption.AllDirectories); + foreach (string directory in directories) + { + directoryInfo = new(directory); + if (directoryInfo.Attributes.HasFlag(FileAttributes.Hidden)) + continue; + check = true; + subDirectories = Directory.EnumerateDirectories(directory, "*", SearchOption.TopDirectoryOnly); + foreach (string subDirectory in subDirectories) + { + directoryInfo = new(subDirectory); + if (!directoryInfo.Attributes.HasFlag(FileAttributes.Hidden)) + { + check = false; + break; + } + } + if (!check) + continue; + files = Directory.EnumerateFiles(directory, "*", SearchOption.TopDirectoryOnly); + foreach (string file in files) + { + fileInfo = new(file); + if (!fileInfo.Attributes.HasFlag(FileAttributes.Hidden)) + { + check = false; + break; + } + } + if (!check) + continue; + directoryInfo.Attributes |= FileAttributes.Hidden; + } + } + } \ No newline at end of file