IEnumerable
Filtered => ValidImage GetMappings => if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null) PreFilter skip done Removed sort Better names break out RootAmazon FilteredOriginalImage DeleteContinueFiles AppSetting PreVerify Settings Tasks
This commit is contained in:
		
							
								
								
									
										4
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @ -22,8 +22,6 @@ | ||||
|         "Hmmssfff", | ||||
|         "jfif", | ||||
|         "JOSN", | ||||
|         "Makernote", | ||||
|         "Makernotes", | ||||
|         "mmod", | ||||
|         "Nicéphore", | ||||
|         "Niépce", | ||||
| @ -33,10 +31,10 @@ | ||||
|         "permyriad", | ||||
|         "Phares", | ||||
|         "Phgtv", | ||||
|         "photoshop", | ||||
|         "RDHC", | ||||
|         "Rects", | ||||
|         "resnet", | ||||
|         "Rijndael", | ||||
|         "Serilog", | ||||
|         "Subfile", | ||||
|         "Subfiles", | ||||
|  | ||||
| @ -20,6 +20,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -36,7 +53,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -5,7 +5,6 @@ namespace View_by_Distance.Compare.Models.Binder; | ||||
| public class Configuration | ||||
| { | ||||
|  | ||||
| #nullable disable | ||||
|     public string DiffPropertyDirectory { get; set; } | ||||
|     public Property.Models.Configuration PropertyConfiguration { get; set; } | ||||
|     public string[] Rename { get; set; } | ||||
| @ -13,8 +12,6 @@ public class Configuration | ||||
|     public string[] RenameC { get; set; } | ||||
|     public string[] Spelling { get; set; } | ||||
|  | ||||
| #nullable restore | ||||
|  | ||||
|     public override string ToString() | ||||
|     { | ||||
|         string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); | ||||
|  | ||||
| @ -21,6 +21,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -56,6 +73,7 @@ public class AppSettings | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -7,13 +7,9 @@ namespace View_by_Distance.Copy.Distinct.Models.Binder; | ||||
| public class Configuration | ||||
| { | ||||
|  | ||||
| #nullable disable | ||||
|  | ||||
|     public string[] IgnoreExtensions { get; set; } | ||||
|     public Property.Models.Configuration PropertyConfiguration { get; set; } | ||||
|     public string PersonBirthdayFormat { get; set; } | ||||
|  | ||||
| #nullable restore | ||||
|     public string[]? IgnoreExtensions { get; set; } | ||||
|     public Property.Models.Configuration? PropertyConfiguration { get; set; } | ||||
|     public string? PersonBirthdayFormat { get; set; } | ||||
|  | ||||
|     public override string ToString() | ||||
|     { | ||||
| @ -21,12 +17,30 @@ public class Configuration | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, Configuration? configuration) | ||||
|     { | ||||
|         if (configuration?.IgnoreExtensions is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.Configuration Get(Configuration? configuration) | ||||
|     { | ||||
|         Models.Configuration result; | ||||
|         if (configuration is null) throw new NullReferenceException(nameof(configuration)); | ||||
|         if (configuration.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); | ||||
|         if (configuration.PersonBirthdayFormat is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); | ||||
|         if (configuration.PropertyConfiguration is null) throw new NullReferenceException(nameof(configuration.PropertyConfiguration)); | ||||
|         result = new( | ||||
|             configuration.IgnoreExtensions, | ||||
|             configuration.PersonBirthdayFormat, | ||||
| @ -39,14 +53,19 @@ public class Configuration | ||||
|         Models.Configuration result; | ||||
|         Configuration? configuration; | ||||
|         if (isEnvironment is null) | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationRoot.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         else | ||||
|         { | ||||
|             string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment); | ||||
|             string section = string.Concat(environmentName, ":", nameof(Configuration)); | ||||
|             IConfigurationSection configurationSection = configurationRoot.GetSection(section); | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationSection.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         } | ||||
|         PreVerify(configurationRoot, configuration); | ||||
|         result = Get(configuration); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -20,6 +20,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -36,7 +53,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -7,17 +7,13 @@ namespace View_by_Distance.Date.Group.Models.Binder; | ||||
| public class Configuration | ||||
| { | ||||
|  | ||||
| #nullable disable | ||||
|  | ||||
|     public bool? ByCreateDateShortcut { get; set; } | ||||
|     public bool? ByDay { get; set; } | ||||
|     public bool? ByHash { get; set; } | ||||
|     public bool? BySeason { get; set; } | ||||
|     public bool? ByWeek { get; set; } | ||||
|     public bool? KeepFullPath { get; set; } | ||||
|     public Property.Models.Configuration PropertyConfiguration { get; set; } | ||||
|  | ||||
| #nullable restore | ||||
|     public Property.Models.Configuration? PropertyConfiguration { get; set; } | ||||
|  | ||||
|     public override string ToString() | ||||
|     { | ||||
| @ -25,10 +21,28 @@ public class Configuration | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, Configuration? configuration) | ||||
|     { | ||||
|         if (configuration?.ByCreateDateShortcut is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.Configuration Get(Configuration? configuration) | ||||
|     { | ||||
|         Models.Configuration result; | ||||
|         if (configuration is null) throw new NullReferenceException(nameof(configuration)); | ||||
|         if (configuration.PropertyConfiguration is null) throw new NullReferenceException(nameof(configuration.PropertyConfiguration)); | ||||
|         if (configuration.ByCreateDateShortcut is null) throw new NullReferenceException(nameof(configuration.ByCreateDateShortcut)); | ||||
|         if (configuration.ByDay is null) throw new NullReferenceException(nameof(configuration.ByDay)); | ||||
|         if (configuration.ByHash is null) throw new NullReferenceException(nameof(configuration.ByHash)); | ||||
| @ -51,16 +65,20 @@ public class Configuration | ||||
|         Models.Configuration result; | ||||
|         Configuration? configuration; | ||||
|         if (isEnvironment is null) | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationRoot.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         else | ||||
|         { | ||||
|             string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment); | ||||
|             string section = string.Concat(environmentName, ":", nameof(Configuration)); | ||||
|             IConfigurationSection configurationSection = configurationRoot.GetSection(section); | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationSection.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         } | ||||
|         PreVerify(configurationRoot, configuration); | ||||
|         result = Get(configuration); | ||||
|         if (configuration is null) throw new NullReferenceException(nameof(configuration)); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -27,6 +27,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -58,7 +75,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -22,6 +22,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -40,7 +57,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -14,6 +14,7 @@ public class DistanceLimits : IDistanceLimits | ||||
|     public double FaceDistancePermyriad { init; get; } | ||||
|     public int SortingMaximumPerFaceShouldBeHigh { init; get; } | ||||
|     public bool RangeDaysDeltaTargetLessThenUpper { init; get; } | ||||
|     public double RangeDistanceToleranceUpperLimit { init; get; } | ||||
|  | ||||
|     public DistanceLimits(int faceAreaPermyriad, | ||||
|                           int faceConfidencePercent, | ||||
| @ -25,6 +26,7 @@ public class DistanceLimits : IDistanceLimits | ||||
|                           int sortingMaximumPerFaceShouldBeHigh, | ||||
|                           int? useFiltersCounter = null) | ||||
|     { | ||||
|         RangeDistanceToleranceUpperLimit = rangeDistanceTolerance[2]; | ||||
|         SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh; | ||||
|         RangeDaysDeltaTargetLessThenUpper = rangeDaysDeltaTolerance[1] > rangeDaysDeltaTolerance[2]; | ||||
|         if (useFiltersCounter is null) | ||||
|  | ||||
| @ -50,6 +50,7 @@ public partial class E_Distance : IDistance | ||||
|     private FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, List<Face> intersectFaces) | ||||
|     { | ||||
|         FaceDistanceContainer[] results; | ||||
|         DateTime dateTime; | ||||
|         int wholePercentages; | ||||
|         int confidencePercent; | ||||
|         FaceDistance faceDistance; | ||||
| @ -61,14 +62,15 @@ public partial class E_Distance : IDistance | ||||
|                 throw new NotSupportedException(); | ||||
|             if (face.Mapping?.MappingFromFilterPost is null) | ||||
|                 throw new NotSupportedException(); | ||||
|             dateTime = mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(); | ||||
|             confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_FaceConfidencePercent, face.Location.Confidence); | ||||
|             wholePercentages = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); | ||||
|             if (face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding faceEncoding) | ||||
|                 faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping?.MappingFromFilterPost, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages); | ||||
|                 faceDistance = new(confidencePercent, dateTime, faceEncoding, face.Mapping?.MappingFromFilterPost, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages); | ||||
|             else | ||||
|             { | ||||
|                 faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding); | ||||
|                 faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping?.MappingFromFilterPost, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages); | ||||
|                 faceDistance = new(confidencePercent, dateTime, faceEncoding, face.Mapping?.MappingFromFilterPost, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages); | ||||
|                 lock (intersectFaces) | ||||
|                     face.SetFaceDistance(faceDistance); | ||||
|             } | ||||
| @ -91,7 +93,7 @@ public partial class E_Distance : IDistance | ||||
|         return new(faceDistanceEncodings); | ||||
|     } | ||||
|  | ||||
|     private List<(Face Face, double? Length)> GetValues(MappingFromItem mappingFromItem, List<Face> intersectFaces, Shared.Models.FaceEncoding modelsFaceEncoding) | ||||
|     private List<(Face Face, double? Length)> GetValues(IDistanceLimits distanceLimits, MappingFromItem mappingFromItem, List<Face> intersectFaces, Shared.Models.FaceEncoding modelsFaceEncoding) | ||||
|     { | ||||
|         List<(Face Face, double? Length)> results = []; | ||||
|         Face face; | ||||
| @ -112,6 +114,8 @@ public partial class E_Distance : IDistance | ||||
|         { | ||||
|             face = intersectFaces[i]; | ||||
|             faceDistanceLength = faceDistanceLengths[i]; | ||||
|             if (faceDistanceLength.Length is null || faceDistanceLength.Length > distanceLimits.RangeDistanceToleranceUpperLimit) | ||||
|                 continue; | ||||
|             if (faceDistanceLength.Length is null) | ||||
|                 throw new NotSupportedException(); | ||||
|             results.Add(new(face, faceDistanceLength.Length.Value)); | ||||
| @ -119,10 +123,10 @@ public partial class E_Distance : IDistance | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     private (Face, double?)[] GetClosestFaceByDistanceIgnoringTolerance(MappingFromItem mappingFromItem, List<Face> intersectFaces, Shared.Models.FaceEncoding modelsFaceEncoding) | ||||
|     private (Face, double?)[] GetClosestFaceByDistanceIgnoringTolerance(IDistanceLimits distanceLimits, MappingFromItem mappingFromItem, List<Face> intersectFaces, Shared.Models.FaceEncoding modelsFaceEncoding) | ||||
|     { | ||||
|         (Face, double?)[] results; | ||||
|         List<(Face Face, double? Length)> collection = GetValues(mappingFromItem, intersectFaces, modelsFaceEncoding); | ||||
|         List<(Face Face, double? Length)> collection = GetValues(distanceLimits, mappingFromItem, intersectFaces, modelsFaceEncoding); | ||||
|         results = (from l in collection where l.Length < _RangeDistanceToleranceAverage orderby l.Length select l).Take(1).ToArray(); | ||||
|         if (results.Length > 0) | ||||
|         { | ||||
| @ -201,7 +205,7 @@ public partial class E_Distance : IDistance | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void LookForMatchFacesAndPossiblyRename(string facesFileNameExtension, FilePath filePath, MappingFromItem mappingFromItem, List<Face> faces, ReadOnlyCollection<LocationContainer> locationContainers) | ||||
|     public void LookForMatchFacesAndPossiblyRename(IDistanceLimits distanceLimits, string facesFileNameExtension, FilePath filePath, MappingFromItem mappingFromItem, List<Face> faces, ReadOnlyCollection<LocationContainer> locationContainers) | ||||
|     { | ||||
|         string? json; | ||||
|         string[] matches; | ||||
| @ -246,7 +250,7 @@ public partial class E_Distance : IDistance | ||||
|                 { | ||||
|                     intersectFaces = Shared.Models.Stateless.Methods.ILocation.FilterByIntersect(filteredFaces, _RectangleIntersectMinimum, locationContainer.WholePercentages); | ||||
|                     if (intersectFaces.Count > 0) | ||||
|                         checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(mappingFromItem, intersectFaces, modelsFaceEncoding)); | ||||
|                         checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(distanceLimits, mappingFromItem, intersectFaces, modelsFaceEncoding)); | ||||
|                 } | ||||
|             } | ||||
|             if (checkFaces.Count == 0) | ||||
| @ -322,10 +326,10 @@ public partial class E_Distance : IDistance | ||||
|         File.WriteAllLines(eDistanceContentFileName, results); | ||||
|     } | ||||
|  | ||||
|     public static void PreFilterSetFaceDistances(int maxDegreeOfParallelism, long ticks, ReadOnlyCollection<Face> distinctFilteredFaces) | ||||
|     public static void PreFilterSetFaceDistances(int maxDegreeOfParallelism, Map.Models.Configuration configuration, long ticks, ReadOnlyCollection<Face> distinctValidImageFaces) | ||||
|     { | ||||
|         List<Face> faces = []; | ||||
|         foreach (Face face in distinctFilteredFaces) | ||||
|         foreach (Face face in distinctValidImageFaces) | ||||
|         { | ||||
|             if (face.Mapping?.MappingFromFilterPre is null) | ||||
|                 throw new NotSupportedException(); | ||||
| @ -335,8 +339,10 @@ public partial class E_Distance : IDistance | ||||
|                 continue; | ||||
|             if (face.Mapping.MappingFromFilterPre.IsFocusRelativePath is not null && !face.Mapping.MappingFromFilterPre.IsFocusRelativePath.Value) | ||||
|                 continue; | ||||
|             if (face.FaceEncoding is not null && face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding _) | ||||
|             if (!configuration.ReMap && face.Mapping.MappingFromPerson is not null) | ||||
|                 continue; | ||||
|             if (!configuration.ReMap && face.FaceEncoding is not null && face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding _) | ||||
|                 throw new NotSupportedException($"{face.Mapping.MappingFromPerson} should not be null!"); | ||||
|             faces.Add(face); | ||||
|         } | ||||
|         int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); | ||||
| @ -352,7 +358,8 @@ public partial class E_Distance : IDistance | ||||
|                 throw new NotSupportedException(); | ||||
|             progressBar.Tick(); | ||||
|             faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding); | ||||
|             FaceDistance faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping.MappingFromFilterPost, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages); | ||||
|             DateTime dateTime = face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(); | ||||
|             FaceDistance faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, dateTime, faceEncoding, face.Mapping.MappingFromFilterPost, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages); | ||||
|             lock (face) | ||||
|                 face.SetFaceDistance(faceDistance); | ||||
|         }); | ||||
| @ -361,8 +368,8 @@ public partial class E_Distance : IDistance | ||||
|     private static List<SortingContainer> GetSortingContainers(Map.Models.Configuration mapConfiguration, IDistanceLimits distanceLimits, Face face, FaceDistance faceDistanceEncoding, List<Sorting> sortingCollection) | ||||
|     { | ||||
|         List<SortingContainer> results = []; | ||||
|         SortingContainer sortingContainer; | ||||
|         int days = 0, distance = 0; | ||||
|         SortingContainer sortingContainer; | ||||
|         Sorting[] collection = Shared.Models.Stateless.Methods.ISorting.Sort(sortingCollection); | ||||
|         foreach (Sorting sorting in collection) | ||||
|         { | ||||
| @ -389,27 +396,29 @@ public partial class E_Distance : IDistance | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     private static List<Sorting> GetSortingCollection(Map.Models.MapLogic mapLogic, ReadOnlyCollection<FaceDistance> faceDistanceEncodings, int i, Face face, FaceDistance faceDistanceEncoding) | ||||
|     private static List<Sorting> GetSortingCollection(Map.Models.MapLogic mapLogic, IDistanceLimits distanceLimits, ReadOnlyCollection<FaceDistance> faceDistanceEncodings, int i, Face face, FaceDistance faceDistanceEncoding) | ||||
|     { | ||||
|         List<Sorting> results; | ||||
|         List<FaceDistance> faceDistanceLengths = FaceRecognition.FaceDistances(faceDistanceEncodings, faceDistanceEncoding); | ||||
|         results = mapLogic.GetSortingCollection(i, face, faceDistanceEncoding, faceDistanceLengths); | ||||
|         results = mapLogic.GetSortingCollection(distanceLimits, i, face, faceDistanceEncoding, faceDistanceLengths); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     public static ReadOnlyCollection<FaceDistanceContainer> GetFaceDistanceContainers(ReadOnlyCollection<Face> distinctFilteredFaces) | ||||
|     public static ReadOnlyCollection<FaceDistanceContainer> GetFaceDistanceContainers(ReadOnlyCollection<Face> distinctValidImageFaces) | ||||
|     { | ||||
|         ReadOnlyCollection<FaceDistanceContainer> results; | ||||
|         DateTime dateTime; | ||||
|         FaceDistance faceDistance; | ||||
|         FaceDistanceContainer faceDistanceContainer; | ||||
|         List<FaceDistanceContainer> collection = []; | ||||
|         foreach (Face face in distinctFilteredFaces) | ||||
|         foreach (Face face in distinctValidImageFaces) | ||||
|         { | ||||
|             if (face.Mapping?.MappingFromLocation is null) | ||||
|                 throw new NotSupportedException(); | ||||
|             if (face.FaceDistance?.Encoding is not FaceRecognitionDotNet.FaceEncoding faceEncoding) | ||||
|                 continue; | ||||
|             faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping.MappingFromFilterPost, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages); | ||||
|             dateTime = face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(); | ||||
|             faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, dateTime, faceEncoding, face.Mapping.MappingFromFilterPost, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages); | ||||
|             faceDistanceContainer = new(face, faceDistance); | ||||
|             collection.Add(faceDistanceContainer); | ||||
|         } | ||||
| @ -459,7 +468,7 @@ public partial class E_Distance : IDistance | ||||
|             progressBar.Tick(); | ||||
|             Face face = filteredFaceDistanceContainers[i].Face; | ||||
|             FaceDistance faceDistanceEncoding = filteredFaceDistanceContainers[i].FaceDistance; | ||||
|             List<Sorting> sortingCollection = GetSortingCollection(mapLogic, faceDistanceEncodings, i, face, faceDistanceEncoding); | ||||
|             List<Sorting> sortingCollection = GetSortingCollection(mapLogic, distanceLimits, faceDistanceEncodings, i, face, faceDistanceEncoding); | ||||
|             if (sortingCollection.Count == 0) | ||||
|                 return; | ||||
|             List<SortingContainer> sortingContainers = GetSortingContainers(mapConfiguration, distanceLimits, face, faceDistanceEncoding, sortingCollection); | ||||
| @ -476,7 +485,7 @@ public partial class E_Distance : IDistance | ||||
|         return new(results); | ||||
|     } | ||||
|  | ||||
|     private static ReadOnlyCollection<RelationContainer> GetRelationCollections(int faceDistancePermyriad, int locationContainerDistanceTake, float distanceTolerance, List<Record> records) | ||||
|     private static ReadOnlyCollection<RelationContainer> GetRelationCollections(IDistanceLimits distanceLimits, int faceDistancePermyriad, int locationContainerDistanceTake, float distanceTolerance, List<Record> records) | ||||
|     { | ||||
|         List<RelationContainer> results = []; | ||||
|         string fileName; | ||||
| @ -496,6 +505,7 @@ public partial class E_Distance : IDistance | ||||
|         foreach (Record record in records) | ||||
|         { | ||||
|             mappedRelations = []; | ||||
|             FaceDistance faceDistanceLength; | ||||
|             fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(record.FilePath.FullName); | ||||
|             if (files.Count > 1) | ||||
|             { | ||||
| @ -508,10 +518,12 @@ public partial class E_Distance : IDistance | ||||
|                     fileName = Path.GetFileName(files[i]); | ||||
|                     if (fileName == fileHolder.Name) | ||||
|                         continue; | ||||
|                     FaceDistance faceDistance = faceDistanceLengths[i]; | ||||
|                     if (faceDistance.Length is null || faceDistance.Length.Value > distanceTolerance) | ||||
|                     faceDistanceLength = faceDistanceLengths[i]; | ||||
|                     if (faceDistanceLength.Length is null || faceDistanceLength.Length > distanceLimits.RangeDistanceToleranceUpperLimit) | ||||
|                         continue; | ||||
|                     distancePermyriad = (int)(faceDistance.Length.Value * faceDistancePermyriad); | ||||
|                     if (faceDistanceLength.Length is null || faceDistanceLength.Length.Value > distanceTolerance) | ||||
|                         continue; | ||||
|                     distancePermyriad = (int)(faceDistanceLength.Length.Value * faceDistancePermyriad); | ||||
|                     mappedRelations.Add(new(distancePermyriad, files[i])); | ||||
|                 } | ||||
|             } | ||||
| @ -521,7 +533,7 @@ public partial class E_Distance : IDistance | ||||
|         return new(results); | ||||
|     } | ||||
|  | ||||
|     ReadOnlyCollection<RelationContainer> IDistance.GetRelationContainers(int faceDistancePermyriad, int locationContainerDistanceTake, float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer> locationContainers) | ||||
|     ReadOnlyCollection<RelationContainer> IDistance.GetRelationContainers(IDistanceLimits distanceLimits, int faceDistancePermyriad, int locationContainerDistanceTake, float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer> locationContainers) | ||||
|     { | ||||
|         ReadOnlyCollection<RelationContainer> result; | ||||
|         string? json; | ||||
| @ -539,7 +551,7 @@ public partial class E_Distance : IDistance | ||||
|             faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding); | ||||
|             records.Add(new(locationContainer.FilePath, faceRecognitionDotNetFaceEncoding)); | ||||
|         } | ||||
|         result = GetRelationCollections(faceDistancePermyriad, locationContainerDistanceTake, locationContainerDistanceTolerance, records); | ||||
|         result = GetRelationCollections(distanceLimits, faceDistancePermyriad, locationContainerDistanceTake, locationContainerDistanceTolerance, records); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -20,6 +20,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -36,7 +53,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -16,6 +16,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -36,7 +53,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -20,6 +20,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -36,7 +53,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -7,8 +7,6 @@ namespace View_by_Distance.Drag_Drop.Models.Binder; | ||||
| public class Configuration | ||||
| { | ||||
|  | ||||
| #nullable disable | ||||
|  | ||||
|     public bool? CheckDFaceAndUpWriteDates { get; set; } | ||||
|     public bool? CheckJsonForDistanceResults { get; set; } | ||||
|     public int? CrossDirectoryMaxItemsInDistanceCollection { get; set; } | ||||
| @ -16,40 +14,38 @@ public class Configuration | ||||
|     public bool? ForceFaceLastWriteTimeToCreationTime { get; set; } | ||||
|     public bool? ForceMetadataLastWriteTimeToCreationTime { get; set; } | ||||
|     public bool? ForceResizeLastWriteTimeToCreationTime { get; set; } | ||||
|     public string[] IgnoreExtensions { get; set; } | ||||
|     public string[] JLinks { get; set; } | ||||
|     public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } | ||||
|     public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } | ||||
|     public string[] MixedYearRelativePaths { get; set; } | ||||
|     public string ModelDirectory { get; set; } | ||||
|     public string ModelName { get; set; } | ||||
|     public string[]? IgnoreExtensions { get; set; } | ||||
|     public string[]? JLinks { get; set; } | ||||
|     public string[]? LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } | ||||
|     public string[]? LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } | ||||
|     public string[]? MixedYearRelativePaths { get; set; } | ||||
|     public string? ModelDirectory { get; set; } | ||||
|     public string? ModelName { get; set; } | ||||
|     public int? NumberOfJitters { get; set; } | ||||
|     public int? NumberOfTimesToUpsample { get; set; } | ||||
|     public string OutputExtension { get; set; } | ||||
|     public string? OutputExtension { get; set; } | ||||
|     public int? OutputQuality { get; set; } | ||||
|     public string[] OutputResolutions { get; set; } | ||||
|     public string[]? OutputResolutions { get; set; } | ||||
|     public bool? OverrideForFaceImages { get; set; } | ||||
|     public bool? OverrideForFaceLandmarkImages { get; set; } | ||||
|     public bool? OverrideForResizeImages { get; set; } | ||||
|     public string PersonBirthdayFormat { get; set; } | ||||
|     public string PredictorModelName { get; set; } | ||||
|     public string? PersonBirthdayFormat { get; set; } | ||||
|     public string? PredictorModelName { get; set; } | ||||
|     public bool? PropertiesChangedForDistance { get; set; } | ||||
|     public bool? PropertiesChangedForFaces { get; set; } | ||||
|     public bool? PropertiesChangedForIndex { get; set; } | ||||
|     public bool? PropertiesChangedForMetadata { get; set; } | ||||
|     public bool? PropertiesChangedForResize { get; set; } | ||||
|     public Property.Models.Configuration PropertyConfiguration { get; set; } | ||||
|     public Property.Models.Configuration? PropertyConfiguration { get; set; } | ||||
|     public bool? Reverse { get; set; } | ||||
|     public string[] SaveFaceLandmarkForOutputResolutions { get; set; } | ||||
|     public string[]? SaveFaceLandmarkForOutputResolutions { get; set; } | ||||
|     public bool? SaveFullYearOfRandomFiles { get; set; } | ||||
|     public string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions { get; set; } | ||||
|     public string[] SaveShortcutsForOutputResolutions { get; set; } | ||||
|     public string[]? SaveFilteredOriginalImagesFromJLinksForOutputResolutions { get; set; } | ||||
|     public string[]? SaveShortcutsForOutputResolutions { get; set; } | ||||
|     public bool? SaveResizedSubfiles { get; set; } | ||||
|     public bool? SkipSearch { get; set; } | ||||
|     public bool? TestDistanceResults { get; set; } | ||||
|     public string[] ValidResolutions { get; set; } | ||||
|  | ||||
| #nullable restore | ||||
|     public string[]? ValidResolutions { get; set; } | ||||
|  | ||||
|     public override string ToString() | ||||
|     { | ||||
| @ -57,10 +53,28 @@ public class Configuration | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, Configuration? configuration) | ||||
|     { | ||||
|         if (configuration?.CheckDFaceAndUpWriteDates is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.Configuration Get(Configuration? configuration) | ||||
|     { | ||||
|         Models.Configuration result; | ||||
|         if (configuration is null) throw new NullReferenceException(nameof(configuration)); | ||||
|         if (configuration.PropertyConfiguration is null) throw new NullReferenceException(nameof(configuration.PropertyConfiguration)); | ||||
|         if (configuration.CheckDFaceAndUpWriteDates is null) throw new NullReferenceException(nameof(configuration.CheckDFaceAndUpWriteDates)); | ||||
|         if (configuration.CheckJsonForDistanceResults is null) throw new NullReferenceException(nameof(configuration.CheckJsonForDistanceResults)); | ||||
|         if (configuration.CrossDirectoryMaxItemsInDistanceCollection is null) throw new NullReferenceException(nameof(configuration.CrossDirectoryMaxItemsInDistanceCollection)); | ||||
| @ -68,18 +82,23 @@ public class Configuration | ||||
|         if (configuration.ForceFaceLastWriteTimeToCreationTime is null) throw new NullReferenceException(nameof(configuration.ForceFaceLastWriteTimeToCreationTime)); | ||||
|         if (configuration.ForceMetadataLastWriteTimeToCreationTime is null) throw new NullReferenceException(nameof(configuration.ForceMetadataLastWriteTimeToCreationTime)); | ||||
|         if (configuration.ForceResizeLastWriteTimeToCreationTime is null) throw new NullReferenceException(nameof(configuration.ForceResizeLastWriteTimeToCreationTime)); | ||||
|         if (configuration.JLinks is null) throw new NullReferenceException(nameof(configuration.JLinks)); | ||||
|         if (configuration.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); | ||||
|         configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions ??= []; | ||||
|         configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions ??= []; | ||||
|         if (configuration.MixedYearRelativePaths is null) throw new NullReferenceException(nameof(configuration.MixedYearRelativePaths)); | ||||
|         if (configuration.ModelDirectory is null) throw new NullReferenceException(nameof(configuration.ModelDirectory)); | ||||
|         if (configuration.ModelName is null) throw new NullReferenceException(nameof(configuration.ModelName)); | ||||
|         if (configuration.NumberOfJitters is null) throw new NullReferenceException(nameof(configuration.NumberOfJitters)); | ||||
|         if (configuration.NumberOfTimesToUpsample is null) throw new NullReferenceException(nameof(configuration.NumberOfTimesToUpsample)); | ||||
|         if (configuration.OutputExtension is null) throw new NullReferenceException(nameof(configuration.OutputExtension)); | ||||
|         if (configuration.OutputQuality is null) throw new NullReferenceException(nameof(configuration.OutputQuality)); | ||||
|         if (configuration.OutputResolutions is null) throw new NullReferenceException(nameof(configuration.OutputResolutions)); | ||||
|         if (configuration.OverrideForFaceImages is null) throw new NullReferenceException(nameof(configuration.OverrideForFaceImages)); | ||||
|         if (configuration.OverrideForFaceLandmarkImages is null) throw new NullReferenceException(nameof(configuration.OverrideForFaceLandmarkImages)); | ||||
|         if (configuration.OverrideForResizeImages is null) throw new NullReferenceException(nameof(configuration.OverrideForResizeImages)); | ||||
|         if (configuration.PersonBirthdayFormat is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); | ||||
|         if (configuration.PredictorModelName is null) throw new NullReferenceException(nameof(configuration.PredictorModelName)); | ||||
|         if (configuration.PropertiesChangedForDistance is null) throw new NullReferenceException(nameof(configuration.PropertiesChangedForDistance)); | ||||
|         if (configuration.PropertiesChangedForFaces is null) throw new NullReferenceException(nameof(configuration.PropertiesChangedForFaces)); | ||||
|         if (configuration.PropertiesChangedForIndex is null) throw new NullReferenceException(nameof(configuration.PropertiesChangedForIndex)); | ||||
| @ -141,14 +160,19 @@ public class Configuration | ||||
|         Models.Configuration result; | ||||
|         Configuration? configuration; | ||||
|         if (isEnvironment is null) | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationRoot.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         else | ||||
|         { | ||||
|             string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment); | ||||
|             string section = string.Concat(environmentName, ":", nameof(Configuration)); | ||||
|             IConfigurationSection configurationSection = configurationRoot.GetSection(section); | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationSection.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         } | ||||
|         PreVerify(configurationRoot, configuration); | ||||
|         result = Get(configuration); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -17,6 +17,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -36,7 +53,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -2,6 +2,7 @@ | ||||
| using Microsoft.Extensions.Logging; | ||||
| using Phares.Shared; | ||||
| using ShellProgressBar; | ||||
| using System.Collections.ObjectModel; | ||||
| using System.Text; | ||||
| using System.Text.Json; | ||||
| using View_by_Distance.Duplicate.Search.Models; | ||||
| @ -145,11 +146,11 @@ public class DuplicateSearch | ||||
|         Dictionary<int, List<MappingFromItem?>> results = []; | ||||
|         string directory; | ||||
|         const int zero = 0; | ||||
|         Item[] filteredItems; | ||||
|         FileHolder resizedFileHolder; | ||||
|         DateTime[] containerDateTimes; | ||||
|         MappingFromItem? mappingFromItem; | ||||
|         List<MappingFromItem?>? collection; | ||||
|         ReadOnlyCollection<Item> validImageItems; | ||||
|         const string duplicates = "-Duplicate(s)"; | ||||
|         if (containers.Length != 0) | ||||
|         { | ||||
| @ -162,11 +163,11 @@ public class DuplicateSearch | ||||
|                 continue; | ||||
|             if (!argZeroIsConfigurationRootDirectory && !container.SourceDirectory.StartsWith(argZero)) | ||||
|                 continue; | ||||
|             filteredItems = Shared.Models.Stateless.Methods.IContainer.GetFilterItems(configuration, container); | ||||
|             if (filteredItems.Length == 0) | ||||
|             validImageItems = Shared.Models.Stateless.Methods.IContainer.GetValidImageItems(configuration, container); | ||||
|             if (validImageItems.Count == 0) | ||||
|                 continue; | ||||
|             containerDateTimes = Shared.Models.Stateless.Methods.IContainer.GetContainerDateTimes(filteredItems); | ||||
|             foreach (Item item in filteredItems) | ||||
|             containerDateTimes = Shared.Models.Stateless.Methods.IContainer.GetContainerDateTimes(validImageItems); | ||||
|             foreach (Item item in validImageItems) | ||||
|             { | ||||
|                 if (item.Property?.Id is null) | ||||
|                 { | ||||
|  | ||||
| @ -23,6 +23,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -46,7 +63,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -265,8 +265,8 @@ public class D_Face | ||||
|         List<LocationContainer> results = []; | ||||
|         string? json; | ||||
|         Location? location; | ||||
|         Rectangle? rectangle; | ||||
|         List<int> skip = []; | ||||
|         Rectangle? rectangle; | ||||
|         OutputResolution? outputResolutionCheck = null; | ||||
|         (int outputResolutionWidth, int outputResolutionHeight, int outputResolutionOrientation) = Resize.Models.Stateless.Methods.IResize.Get(outputResolution, outputResolutionToResize); | ||||
|         foreach (Shared.Models.Face face in faces) | ||||
|  | ||||
| @ -57,10 +57,10 @@ public class D2_FaceParts | ||||
|             _FileGroups.Add(keyValuePair.Key, keyValuePair.Value); | ||||
|     } | ||||
|  | ||||
|     public void SetAngleBracketCollection(Configuration configuration, string d2ResultsFullGroupDirectory, string sourceDirectory) | ||||
|     public void SetAngleBracketCollection(IPropertyConfiguration propertyConfiguration, string d2ResultsFullGroupDirectory, string sourceDirectory) | ||||
|     { | ||||
|         _AngleBracketCollection.Clear(); | ||||
|         _AngleBracketCollection.AddRange(IResult.GetDirectoryInfoCollection(configuration, | ||||
|         _AngleBracketCollection.AddRange(IResult.GetDirectoryInfoCollection(propertyConfiguration, | ||||
|                                                                             sourceDirectory, | ||||
|                                                                             d2ResultsFullGroupDirectory, | ||||
|                                                                             contentDescription: "n gif file(s) for each face found", | ||||
| @ -69,7 +69,7 @@ public class D2_FaceParts | ||||
|                                                                             converted: true)); | ||||
|     } | ||||
|  | ||||
|     public string GetFacePartsDirectory(Configuration configuration, string dResultsFullGroupDirectory, Item item, bool includeNameWithoutExtension) | ||||
|     public string GetFacePartsDirectory(IPropertyConfiguration propertyConfiguration, string dResultsFullGroupDirectory, Item item, bool includeNameWithoutExtension) | ||||
|     { | ||||
|         string result; | ||||
|         bool angleBracketCollectionAny = _AngleBracketCollection.Count != 0; | ||||
| @ -77,7 +77,7 @@ public class D2_FaceParts | ||||
|         { | ||||
|             if (item.FilePath.DirectoryName is null) | ||||
|                 throw new NullReferenceException(nameof(item.FilePath.DirectoryName)); | ||||
|             SetAngleBracketCollection(configuration, dResultsFullGroupDirectory, item.FilePath.DirectoryName); | ||||
|             SetAngleBracketCollection(propertyConfiguration, dResultsFullGroupDirectory, item.FilePath.DirectoryName); | ||||
|         } | ||||
|         if (includeNameWithoutExtension) | ||||
|             result = Path.Combine(_AngleBracketCollection[0].Replace("<>", _PropertyConfiguration.ResultContent), item.FilePath.NameWithoutExtension); | ||||
|  | ||||
| @ -39,6 +39,7 @@ public partial class DlibDotNet | ||||
|     private readonly List<string> _Exceptions; | ||||
|     private readonly ILogger<Program>? _Logger; | ||||
|     private readonly IsEnvironment _IsEnvironment; | ||||
|     private readonly DistanceLimits _DistanceLimits; | ||||
|     private readonly bool _PropertyRootExistedBefore; | ||||
|     private readonly Models.Configuration _Configuration; | ||||
|     private readonly bool _ArgZeroIsConfigurationRootDirectory; | ||||
| @ -111,7 +112,8 @@ public partial class DlibDotNet | ||||
|             (ImageCodecInfo imageCodecInfo, EncoderParameters encoderParameters, string filenameExtension) = C_Resize.GetGifLowQuality(); | ||||
|             _FaceParts = new D2_FaceParts(_Configuration.PropertyConfiguration, imageCodecInfo, encoderParameters, filenameExtension, configuration.CheckDFaceAndUpWriteDates, configuration.OverrideForFaceLandmarkImages); | ||||
|         } | ||||
|         _MapConfiguration = Get(configuration, _Faces.FileNameExtension, _Faces.HiddenFileNameExtension, _FaceParts.FileNameExtension); | ||||
|         _DistanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaPermyriadTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh); | ||||
|         _MapConfiguration = Get(configuration, _DistanceLimits, _Faces.FileNameExtension, _Faces.HiddenFileNameExtension, _FaceParts.FileNameExtension); | ||||
|         _Distance = new(configuration.DistanceMoveUnableToMatch, configuration.DistanceRenameToMatch, configuration.FaceConfidencePercent, configuration.RangeDistanceTolerance, configuration.RectangleIntersectMinimums); | ||||
|         if (_PropertyRootExistedBefore || !_ArgZeroIsConfigurationRootDirectory) | ||||
|             personContainers = new(new List<PersonContainer>()); | ||||
| @ -232,6 +234,12 @@ public partial class DlibDotNet | ||||
|             throw new Exception("Configuration has to match interface!"); | ||||
|         if (configuration.LocationFactor != Shared.Models.Stateless.ILocation.Factor) | ||||
|             throw new Exception("Configuration has to match interface!"); | ||||
|         if (configuration.SaveSortingWithoutPerson && configuration.JLinks.Length > 0) | ||||
|             throw new Exception("Configuration has SaveSortingWithoutPerson and JLinks!"); | ||||
|         if (configuration.SaveSortingWithoutPerson && !string.IsNullOrEmpty(configuration.FocusModel)) | ||||
|             throw new Exception("Configuration has SaveSortingWithoutPerson and FocusModel!"); | ||||
|         if (configuration.SaveSortingWithoutPerson && !string.IsNullOrEmpty(configuration.FocusDirectory)) | ||||
|             throw new Exception("Configuration has SaveSortingWithoutPerson and FocusDirectory!"); | ||||
|     } | ||||
|  | ||||
|     private ReadOnlyCollection<int> GetNotNineCollection(ReadOnlyCollection<string[]> filesCollection) | ||||
| @ -255,6 +263,19 @@ public partial class DlibDotNet | ||||
|         return new(results); | ||||
|     } | ||||
|  | ||||
|     private static void DeleteContinueFiles(Property.Models.Configuration propertyConfiguration, ReadOnlyCollection<PersonContainer> personContainers) | ||||
|     { | ||||
|         foreach (PersonContainer personContainer in personContainers) | ||||
|         { | ||||
|             foreach (FilePath filePath in personContainer.DisplayDirectoryAllFilePaths) | ||||
|             { | ||||
|                 if (filePath.ExtensionLowered != ".continue") | ||||
|                     continue; | ||||
|                 File.Delete(filePath.FullName); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void Search(long ticks, ReadOnlyCollection<PersonContainer> personContainers, string argZero, string propertyRoot) | ||||
|     { | ||||
|         int t; | ||||
| @ -352,8 +373,9 @@ public partial class DlibDotNet | ||||
|         ReadOnlyCollection<Container> readOnlyContainers = new(containers); | ||||
|         SaveDistinctIds(_Configuration.PropertyConfiguration, bResultsFullGroupDirectory, readOnlyContainers); | ||||
|         mapLogic ??= new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, _Distance, personContainers, ticks, a2PeopleContentDirectory, a2PeopleSingletonDirectory, eDistanceContentDirectory); | ||||
|         DeleteContinueFiles(_Configuration.PropertyConfiguration, personContainers); | ||||
|         FullDoWork(argZero, propertyRoot, ticks, aResultsFullGroupDirectory, bResultsFullGroupDirectory, fPhotoPrismSingletonDirectory, t, readOnlyContainers, propertyLogic, mapLogic); | ||||
|         ReadOnlyCollection<Item> distinctFilteredItems = Shared.Models.Stateless.Methods.IContainer.GetItems(_Configuration.PropertyConfiguration, readOnlyContainers, distinctItems: true, filterItems: true); | ||||
|         ReadOnlyCollection<Item> distinctValidImageItems = Shared.Models.Stateless.Methods.IContainer.GetValidImageItems(_Configuration.PropertyConfiguration, readOnlyContainers, distinctItems: true, filterItems: true); | ||||
|         if (_Configuration.LookForAbandoned) | ||||
|         { | ||||
|             string dResultsFullGroupDirectory; | ||||
| @ -365,13 +387,13 @@ public partial class DlibDotNet | ||||
|             } | ||||
|         } | ||||
|         _Distance.Clear(); | ||||
|         ReadOnlyCollection<Shared.Models.Face> distinctFilteredFaces = Map.Models.Stateless.Methods.IMapLogic.GetFaces(distinctFilteredItems); | ||||
|         ReadOnlyCollection<Mapping> distinctFilteredMappingCollection = GetMappings(_Configuration.PropertyConfiguration, eDistanceContentDirectory, readOnlyContainers, mapLogic, distinctItems: true); | ||||
|         ReadOnlyCollection<Shared.Models.Face> distinctValidImageFaces = Map.Models.Stateless.Methods.IMapLogic.GetFaces(distinctValidImageItems); | ||||
|         ReadOnlyCollection<Mapping> distinctValidImageMappingCollection = GetMappings(_Configuration.PropertyConfiguration, eDistanceContentDirectory, readOnlyContainers, mapLogic, distinctItems: true); | ||||
|         if (runToDoCollectionFirst) | ||||
|         { | ||||
|             if (!Directory.Exists(eDistanceContentDirectory)) | ||||
|                 _ = Directory.CreateDirectory(eDistanceContentDirectory); | ||||
|             string json = JsonSerializer.Serialize(distinctFilteredMappingCollection); | ||||
|             string json = JsonSerializer.Serialize(distinctValidImageMappingCollection); | ||||
|             File.WriteAllText(Path.Combine(eDistanceContentDirectory, $"{ticks}.json"), json); | ||||
|         } | ||||
|         foreach (string outputResolution in _Configuration.OutputResolutions) | ||||
| @ -380,19 +402,19 @@ public partial class DlibDotNet | ||||
|                 break; | ||||
|             personKeyToIds = mapLogic.GetPersonKeyToIds(); | ||||
|             if (_Configuration.SavePropertyShortcutsForOutputResolutions.Contains(outputResolution)) | ||||
|                 SavePropertyShortcutsForOutputResolutions(eDistanceContentDirectory, distinctFilteredItems); | ||||
|                 SavePropertyShortcutsForOutputResolutions(eDistanceContentDirectory, distinctValidImageItems); | ||||
|             if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) | ||||
|                 mapLogic.SaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, distinctFilteredMappingCollection); | ||||
|                 mapLogic.SaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, distinctValidImageMappingCollection); | ||||
|             if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.JLinks.Where(l => !string.IsNullOrEmpty(l)).Any() && _Configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions.Contains(outputResolution)) | ||||
|                 mapLogic.SaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, personContainers, a2PeopleContentDirectory, personKeyToIds, distinctFilteredMappingCollection); | ||||
|                 mapLogic.SaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, personContainers, a2PeopleContentDirectory, personKeyToIds, distinctValidImageMappingCollection); | ||||
|             if (_ArgZeroIsConfigurationRootDirectory | ||||
|                 && _Configuration.SaveResizedSubfiles | ||||
|                 && outputResolution == _Configuration.OutputResolutions[0] | ||||
|                 && _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution) | ||||
|                 && _Exceptions.Count == 0) | ||||
|                 MapLogic(ticks, readOnlyContainers, fPhotoPrismContentDirectory, mapLogic, outputResolution, new(personKeyToIds), distinctFilteredFaces, distinctFilteredMappingCollection); | ||||
|             if (runToDoCollectionFirst && _Configuration.SaveRandomForOutputResolutions.Contains(outputResolution) && personKeyToIds.Count > 0 && distinctFilteredMappingCollection.Count > 0) | ||||
|                 _Random.Random(_Configuration.PropertyConfiguration, _Configuration.RadomUseBirthdayMinimum, _Configuration.ValidKeyWordsToIgnoreInRandom, personKeyToIds, notNineCollection, distinctFilteredMappingCollection); | ||||
|                 MapLogic(ticks, readOnlyContainers, fPhotoPrismContentDirectory, mapLogic, outputResolution, new(personKeyToIds), distinctValidImageFaces, distinctValidImageMappingCollection); | ||||
|             if (runToDoCollectionFirst && _Configuration.SaveRandomForOutputResolutions.Contains(outputResolution) && personKeyToIds.Count > 0 && distinctValidImageMappingCollection.Count > 0) | ||||
|                 _Random.Random(_Configuration.PropertyConfiguration, _Configuration.RadomUseBirthdayMinimum, _Configuration.ValidKeyWordsToIgnoreInRandom, personKeyToIds, notNineCollection, distinctValidImageMappingCollection); | ||||
|             if (_IsEnvironment.Development) | ||||
|                 continue; | ||||
|             if (!_IsEnvironment.Development) | ||||
| @ -516,7 +538,6 @@ public partial class DlibDotNet | ||||
|         bool exceptions; | ||||
|         int totalSeconds; | ||||
|         Container container; | ||||
|         Item[] filteredItems; | ||||
|         int totalNotMapped = 0; | ||||
|         bool outputResolutionHasNumber; | ||||
|         bool anyNullOrNoIsUniqueFileName; | ||||
| @ -524,6 +545,7 @@ public partial class DlibDotNet | ||||
|         string dResultsFullGroupDirectory; | ||||
|         string c2ResultsFullGroupDirectory; | ||||
|         string d2ResultsFullGroupDirectory; | ||||
|         ReadOnlyCollection<Item> filteredItems; | ||||
|         int containersLength = readOnlyContainers.Count; | ||||
|         List<Tuple<string, DateTime>> sourceDirectoryChanges = []; | ||||
|         int maxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism; | ||||
| @ -546,13 +568,13 @@ public partial class DlibDotNet | ||||
|                     continue; | ||||
|                 if (!_ArgZeroIsConfigurationRootDirectory && !container.SourceDirectory.StartsWith(argZero)) | ||||
|                     continue; | ||||
|                 filteredItems = Shared.Models.Stateless.Methods.IContainer.GetFilterItems(_Configuration.PropertyConfiguration, container); | ||||
|                 if (filteredItems.Length == 0) | ||||
|                 filteredItems = Shared.Models.Stateless.Methods.IContainer.GetValidImageItems(_Configuration.PropertyConfiguration, container); | ||||
|                 if (filteredItems.Count == 0) | ||||
|                     continue; | ||||
|                 sourceDirectoryChanges.Clear(); | ||||
|                 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}> - total not mapped {totalNotMapped:000000}"; | ||||
|                 message = $"{i + 1:000} [{filteredItems.Count:000}] / {containersLength:000} - {total} / {t} total - {totalSeconds} total second(s) - {outputResolution} - <{container.SourceDirectory}> - total not mapped {totalNotMapped:000000}"; | ||||
|                 propertyLogic.SetAngleBracketCollection(aResultsFullGroupDirectory, container.SourceDirectory, anyNullOrNoIsUniqueFileName); | ||||
|                 if (outputResolutionHasNumber) | ||||
|                     _Resize.SetAngleBracketCollection(cResultsFullGroupDirectory, container.SourceDirectory); | ||||
| @ -627,7 +649,7 @@ public partial class DlibDotNet | ||||
|  | ||||
|     private ReadOnlyCollection<Mapping> GetMappings(Property.Models.Configuration propertyConfiguration, string eDistanceContentDirectory, ReadOnlyCollection<Container> readOnlyContainers, MapLogic mapLogic, bool distinctItems) | ||||
|     { | ||||
|         ReadOnlyCollection<Mapping> results; | ||||
|         List<Mapping> results = []; | ||||
|         int count = 0; | ||||
|         int notMapped; | ||||
|         Mapping mapping; | ||||
| @ -636,15 +658,14 @@ public partial class DlibDotNet | ||||
|         string focusRelativePath; | ||||
|         bool? isFocusRelativePath; | ||||
|         DateTime[] containerDateTimes; | ||||
|         IEnumerable<Item> filteredItems; | ||||
|         MappingFromItem mappingFromItem; | ||||
|         List<Mapping> mappingCollection = []; | ||||
|         ReadOnlyCollection<Item> filteredItems; | ||||
|         foreach (Container container in readOnlyContainers) | ||||
|         { | ||||
|             if (container.Items.Count == 0) | ||||
|                 continue; | ||||
|             filteredItems = Shared.Models.Stateless.Methods.IContainer.GetFilterItems(propertyConfiguration, container); | ||||
|             if (!filteredItems.Any()) | ||||
|             filteredItems = Shared.Models.Stateless.Methods.IContainer.GetValidImageItems(propertyConfiguration, container); | ||||
|             if (filteredItems.Count == 0) | ||||
|                 continue; | ||||
|             containerDateTimes = Shared.Models.Stateless.Methods.IContainer.GetContainerDateTimes(filteredItems); | ||||
|             focusRelativePath = Path.GetFullPath(string.Concat(_Configuration.PropertyConfiguration.RootDirectory, _Configuration.FocusDirectory)); | ||||
| @ -665,24 +686,25 @@ public partial class DlibDotNet | ||||
|                 foreach (Shared.Models.Face face in item.Faces) | ||||
|                 { | ||||
|                     if (face.Mapping is null) | ||||
|                         throw new NotSupportedException(); | ||||
|                     if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null) | ||||
|                         continue; | ||||
|                     anyValidFaces = true; | ||||
|                     mappingCollection.Add(face.Mapping); | ||||
|                     results.Add(face.Mapping); | ||||
|                 } | ||||
|                 if (!anyValidFaces) | ||||
|                 { | ||||
|                     (mapping, notMapped) = GetMappingAndUpdateMappingFromPerson(mapLogic, item, isFocusRelativePath, mappingFromItem); | ||||
|                     mappingCollection.Add(mapping); | ||||
|                     results.Add(mapping); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         if (_Configuration.MoveToDecade && _Configuration.LocationContainerDistanceTolerance is null) | ||||
|             _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(eDistanceContentDirectory); | ||||
|         results = new((from l in mappingCollection orderby l.MappingFromItem.Id select l).ToArray()); | ||||
|         return results; | ||||
|         return new(results); | ||||
|     } | ||||
|  | ||||
|     private static void SavePropertyShortcutsForOutputResolutions(string eDistanceContentDirectory, ReadOnlyCollection<Item> distinctFilteredItems) | ||||
|     private static void SavePropertyShortcutsForOutputResolutions(string eDistanceContentDirectory, ReadOnlyCollection<Item> distinctValidImageItems) | ||||
|     { | ||||
| #if VerifyItem | ||||
|         bool found; | ||||
| @ -713,7 +735,7 @@ public partial class DlibDotNet | ||||
|         List<string> distinct = []; | ||||
|         WindowsShortcut windowsShortcut; | ||||
|         List<(string, string, string)> collection = []; | ||||
|         foreach (Item item in distinctFilteredItems) | ||||
|         foreach (Item item in distinctValidImageItems) | ||||
|         { | ||||
|             if (item.Property?.Id is null) | ||||
|                 continue; | ||||
| @ -726,7 +748,7 @@ public partial class DlibDotNet | ||||
|                 continue; | ||||
|             distinct.Add(directory); | ||||
|         } | ||||
|         foreach (Item item in distinctFilteredItems) | ||||
|         foreach (Item item in distinctValidImageItems) | ||||
|         { | ||||
|             if (item.Property?.Id is null || item.Property.DateTimeOriginal is null) | ||||
|                 continue; | ||||
| @ -771,27 +793,27 @@ public partial class DlibDotNet | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void MapLogic(long ticks, ReadOnlyCollection<Container> containers, string fPhotoPrismContentDirectory, MapLogic mapLogic, string outputResolution, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Shared.Models.Face> distinctFilteredFaces, ReadOnlyCollection<Mapping> distinctFilteredMappingCollection) | ||||
|     private void MapLogic(long ticks, ReadOnlyCollection<Container> containers, string fPhotoPrismContentDirectory, MapLogic mapLogic, string outputResolution, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Shared.Models.Face> distinctValidImageFaces, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection) | ||||
|     { | ||||
|         (_, _, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution); | ||||
|         string dFacesContentDirectory = Path.Combine(dResultsFullGroupDirectory, _Configuration.PropertyConfiguration.ResultContent); | ||||
|         string d2FacePartsContentDirectory = Path.Combine(d2ResultsFullGroupDirectory, _Configuration.PropertyConfiguration.ResultContent); | ||||
|         string d2FacePartsContentCollectionDirectory = Path.Combine(d2ResultsFullGroupDirectory, "[()]"); | ||||
|         if (distinctFilteredMappingCollection.Count > 0) | ||||
|         if (distinctValidImageMappingCollection.Count > 0) | ||||
|         { | ||||
|             Shared.Models.Stateless.Methods.IPath.ChangeDateForEmptyDirectories(d2FacePartsContentDirectory, ticks); | ||||
|             if (Directory.Exists(d2FacePartsContentCollectionDirectory)) | ||||
|                 Shared.Models.Stateless.Methods.IPath.MakeHiddenIfAllItemsAreHidden(d2FacePartsContentCollectionDirectory); | ||||
|         } | ||||
|         if (Directory.Exists(fPhotoPrismContentDirectory)) | ||||
|             F_PhotoPrism.WriteMatches(fPhotoPrismContentDirectory, _Configuration.PersonBirthdayFormat, _Configuration.RectangleIntersectMinimums, ticks, distinctFilteredFaces, mapLogic); | ||||
|             F_PhotoPrism.WriteMatches(fPhotoPrismContentDirectory, _Configuration.PersonBirthdayFormat, _Configuration.RectangleIntersectMinimums, ticks, distinctValidImageFaces, mapLogic); | ||||
|         if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) | ||||
|             mapLogic.SaveShortcutsForOutputResolutionsDuringMapLogic(containers, personKeyToIds, dFacesContentDirectory, distinctFilteredMappingCollection); | ||||
|         ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping = Map.Models.Stateless.Methods.IMapLogic.GetIdToWholePercentagesToFace(distinctFilteredMappingCollection); | ||||
|             mapLogic.SaveShortcutsForOutputResolutionsDuringMapLogic(containers, personKeyToIds, dFacesContentDirectory, distinctValidImageMappingCollection); | ||||
|         ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping = Map.Models.Stateless.Methods.IMapLogic.GetIdToWholePercentagesToFace(distinctValidImageMappingCollection); | ||||
|         if (_Configuration.SaveMappedForOutputResolutions.Contains(outputResolution)) | ||||
|             mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, personKeyToIds, distinctFilteredMappingCollection, idToWholePercentagesToMapping); | ||||
|             mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, personKeyToIds, distinctValidImageMappingCollection, idToWholePercentagesToMapping); | ||||
|         if (_Configuration.SaveFaceDistancesForOutputResolutions.Contains(outputResolution)) | ||||
|             SaveFaceDistances(ticks, mapLogic, distinctFilteredFaces, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, idToWholePercentagesToMapping); | ||||
|             SaveFaceDistances(ticks, mapLogic, distinctValidImageFaces, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, idToWholePercentagesToMapping); | ||||
|     } | ||||
|  | ||||
|     private bool? GetIsFocusModel(Shared.Models.Property? property) | ||||
| @ -880,36 +902,37 @@ public partial class DlibDotNet | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static Map.Models.Configuration Get(Models.Configuration configuration, string facesFileNameExtension, string facesHiddenFileNameExtension, string facePartsFileNameExtension) | ||||
|     private static Map.Models.Configuration Get(Models.Configuration configuration, IDistanceLimits distanceLimits, string facesFileNameExtension, string facesHiddenFileNameExtension, string facePartsFileNameExtension) | ||||
|     { | ||||
|         Map.Models.Configuration result = new( | ||||
|             configuration.DeletePossibleDuplicates, | ||||
|             configuration.DistanceMoveUnableToMatch, | ||||
|             configuration.DistanceRenameToMatch, | ||||
|             configuration.FaceConfidencePercent, | ||||
|             configuration.FaceDistancePermyriad, | ||||
|             configuration.LinkedAlpha, | ||||
|             configuration.LocationContainerDebugDirectory, | ||||
|             configuration.LocationContainerDirectoryPattern, | ||||
|             configuration.LocationContainerDistanceGroupMinimum, | ||||
|             configuration.LocationContainerDistanceTake, | ||||
|             configuration.LocationContainerDistanceTolerance, | ||||
|             configuration.LocationDigits, | ||||
|             configuration.MappingDefaultName, | ||||
|             configuration.PersonBirthdayFirstYear, | ||||
|             configuration.PersonBirthdayFormat, | ||||
|             configuration.PersonCharacters.ToArray(), | ||||
|             configuration.RangeDaysDeltaTolerance, | ||||
|             configuration.RangeDistanceTolerance, | ||||
|             configuration.ReMap, | ||||
|             configuration.SaveIndividually, | ||||
|             configuration.SaveSortingWithoutPerson, | ||||
|             configuration.SkipNotSkipDirectories, | ||||
|             configuration.SortingMaximumPerKey, | ||||
|             configuration.SortingMinimumToUseSigma, | ||||
|             facesFileNameExtension, | ||||
|             facesHiddenFileNameExtension, | ||||
|             facePartsFileNameExtension); | ||||
|         Map.Models.Configuration result = new(distanceLimits, | ||||
|                                               configuration.PropertyConfiguration, | ||||
|                                               configuration.DeletePossibleDuplicates, | ||||
|                                               configuration.DistanceMoveUnableToMatch, | ||||
|                                               configuration.DistanceRenameToMatch, | ||||
|                                               configuration.FaceConfidencePercent, | ||||
|                                               configuration.FaceDistancePermyriad, | ||||
|                                               configuration.LinkedAlpha, | ||||
|                                               configuration.LocationContainerDebugDirectory, | ||||
|                                               configuration.LocationContainerDirectoryPattern, | ||||
|                                               configuration.LocationContainerDistanceGroupMinimum, | ||||
|                                               configuration.LocationContainerDistanceTake, | ||||
|                                               configuration.LocationContainerDistanceTolerance, | ||||
|                                               configuration.LocationDigits, | ||||
|                                               configuration.MappingDefaultName, | ||||
|                                               configuration.PersonBirthdayFirstYear, | ||||
|                                               configuration.PersonBirthdayFormat, | ||||
|                                               configuration.PersonCharacters.ToArray(), | ||||
|                                               configuration.RangeDaysDeltaTolerance, | ||||
|                                               configuration.RangeDistanceTolerance, | ||||
|                                               configuration.ReMap, | ||||
|                                               configuration.SaveIndividually, | ||||
|                                               configuration.SaveSortingWithoutPerson, | ||||
|                                               configuration.SkipNotSkipDirectories, | ||||
|                                               configuration.SortingMaximumPerKey, | ||||
|                                               configuration.SortingMinimumToUseSigma, | ||||
|                                               facesFileNameExtension, | ||||
|                                               facesHiddenFileNameExtension, | ||||
|                                               facePartsFileNameExtension); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -961,8 +984,8 @@ public partial class DlibDotNet | ||||
|         List<string> parseExceptions = []; | ||||
|         string[] changesFrom = [nameof(A_Property)]; | ||||
|         List<Tuple<string, DateTime>> subFileTuples = []; | ||||
|         FileHolder resizedFileHolder = _Resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber); | ||||
|         ReadOnlyCollection<LocationContainer> locationContainers = mapLogic.GetLocationContainers(item); | ||||
|         FileHolder resizedFileHolder = _Resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber); | ||||
|         if (item.Property is null || item.Property.Id is null || !item.SourceDirectoryFileHolder.Exists || item.SourceDirectoryFileHolder.CreationTime is null || item.SourceDirectoryFileHolder.LastWriteTime is null || item.Any()) | ||||
|         { | ||||
|             LogItemPropertyIsNull(item); | ||||
| @ -1047,7 +1070,7 @@ public partial class DlibDotNet | ||||
|             if ((_Configuration.DistanceMoveUnableToMatch || _Configuration.DistanceRenameToMatch) | ||||
|                 && _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution) | ||||
|                 && locationContainers is not null && faceCollection.All(l => !l.Saved)) | ||||
|                 _Distance.LookForMatchFacesAndPossiblyRename(_Faces.FileNameExtension, item.FilePath, mappingFromItem, faces, locationContainers); | ||||
|                 _Distance.LookForMatchFacesAndPossiblyRename(_DistanceLimits, _Faces.FileNameExtension, item.FilePath, mappingFromItem, faces, locationContainers); | ||||
|             (bool review, int[] eyesCollection) = Shared.Models.Stateless.Methods.IFace.GetEyeCollection(_Configuration.EyeThreshold, faces); | ||||
|             if (review || _Configuration.SaveFaceLandmarkForOutputResolutions.Contains(outputResolution)) | ||||
|             { | ||||
| @ -1076,7 +1099,7 @@ public partial class DlibDotNet | ||||
|                                          List<Tuple<string, DateTime>> sourceDirectoryChanges, | ||||
|                                          Dictionary<int, List<MappingFromPhotoPrism>> fileNameToCollection, | ||||
|                                          Container container, | ||||
|                                          Item[] filteredItems, | ||||
|                                          ReadOnlyCollection<Item> filteredItems, | ||||
|                                          string message) | ||||
|     { | ||||
|         int result = 0; | ||||
| @ -1088,8 +1111,8 @@ public partial class DlibDotNet | ||||
|         bool? isFocusRelativePath = string.IsNullOrEmpty(_Configuration.FocusDirectory) ? null : container.SourceDirectory.StartsWith(focusRelativePath); | ||||
|         string facePartsCollectionDirectory = _Configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions.Contains(outputResolution) ? _FaceParts.GetFacePartsDirectory(_Configuration.PropertyConfiguration, d2ResultsFullGroupDirectory, item: filteredItems.First(), includeNameWithoutExtension: false) : string.Empty; | ||||
|         bool anyPropertiesChangedForX = _Configuration.PropertyConfiguration.PropertiesChangedForProperty || _Configuration.PropertiesChangedForDistance || _Configuration.PropertiesChangedForFaces || _Configuration.PropertiesChangedForIndex || _Configuration.PropertiesChangedForMetadata || _Configuration.PropertiesChangedForResize; | ||||
|         using ProgressBar progressBar = new(filteredItems.Length, message, options); | ||||
|         _ = Parallel.For(0, filteredItems.Length, parallelOptions, (i, state) => | ||||
|         using ProgressBar progressBar = new(filteredItems.Count, message, options); | ||||
|         _ = Parallel.For(0, filteredItems.Count, parallelOptions, (i, state) => | ||||
|            { | ||||
|                try | ||||
|                { | ||||
| @ -1115,7 +1138,7 @@ public partial class DlibDotNet | ||||
|                catch (Exception) | ||||
|                { | ||||
|                    exceptionsCount++; | ||||
|                    if (exceptionsCount == filteredItems.Length) | ||||
|                    if (exceptionsCount == filteredItems.Count) | ||||
|                        throw new Exception(string.Concat("All in [", container.SourceDirectory, "] failed!")); | ||||
|                } | ||||
|            }); | ||||
| @ -1218,10 +1241,10 @@ public partial class DlibDotNet | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void SaveFaceDistances(long ticks, MapLogic mapLogic, ReadOnlyCollection<Shared.Models.Face> distinctFilteredFaces, string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping) | ||||
|     private void SaveFaceDistances(long ticks, MapLogic mapLogic, ReadOnlyCollection<Shared.Models.Face> distinctValidImageFaces, string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping) | ||||
|     { | ||||
|         E_Distance.PreFilterSetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces); | ||||
|         ReadOnlyCollection<FaceDistanceContainer> faceDistanceContainers = E_Distance.GetFaceDistanceContainers(distinctFilteredFaces); | ||||
|         E_Distance.PreFilterSetFaceDistances(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, distinctValidImageFaces); | ||||
|         ReadOnlyCollection<FaceDistanceContainer> faceDistanceContainers = E_Distance.GetFaceDistanceContainers(distinctValidImageFaces); | ||||
|         if (faceDistanceContainers.Count > 0) | ||||
|         { | ||||
|             List<FaceDistance> faceDistanceEncodings = []; | ||||
|  | ||||
| @ -19,6 +19,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -42,6 +59,7 @@ public class AppSettings | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -103,7 +103,22 @@ public class Configuration | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| #pragma warning restore csharp_preserve_single_line_statements | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, Configuration? configuration) | ||||
|     { | ||||
|         if (configuration?.CheckDFaceAndUpWriteDates is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.Configuration Get(Configuration? configuration, Property.Models.Configuration propertyConfiguration) | ||||
|     { | ||||
| @ -297,14 +312,19 @@ public class Configuration | ||||
|         Models.Configuration result; | ||||
|         Configuration? configuration; | ||||
|         if (isEnvironment is null) | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationRoot.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         else | ||||
|         { | ||||
|             string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment); | ||||
|             string section = string.Concat(environmentName, ":", nameof(Configuration)); | ||||
|             IConfigurationSection configurationSection = configurationRoot.GetSection(section); | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationSection.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         } | ||||
|         PreVerify(configurationRoot, configuration); | ||||
|         result = Get(configuration, propertyConfiguration); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -24,14 +24,14 @@ internal class F_Random | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static ReadOnlyDictionary<string, List<string>> GetDayToRelativePaths(ReadOnlyCollection<Shared.Models.Mapping> mappingCollection, string dateFormat, ReadOnlyDictionary<int, List<long>> idToPersonKeys) | ||||
|     private static ReadOnlyDictionary<string, List<string>> GetDayToRelativePaths(ReadOnlyCollection<Shared.Models.Mapping> distinctValidImageMappingCollection, string dateFormat, ReadOnlyDictionary<int, List<long>> idToPersonKeys) | ||||
|     { | ||||
|         Dictionary<string, List<string>> results = []; | ||||
|         string key; | ||||
|         DateTime dateTime; | ||||
|         List<long>? personKeys; | ||||
|         List<string>? relativePaths; | ||||
|         foreach (Shared.Models.Mapping mapping in mappingCollection) | ||||
|         foreach (Shared.Models.Mapping mapping in distinctValidImageMappingCollection) | ||||
|         { | ||||
|             if (mapping.MappingFromItem.FilePath.DirectoryName is null || mapping.MappingFromPerson is null) | ||||
|                 continue; | ||||
| @ -54,7 +54,7 @@ internal class F_Random | ||||
|         return new(results); | ||||
|     } | ||||
|  | ||||
|     internal void Random(Property.Models.Configuration configuration, int radomUseBirthdayMinimum, string[] validKeyWordsToIgnoreInRandom, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<int>? notNineCollection, ReadOnlyCollection<Shared.Models.Mapping> mappingCollection) | ||||
|     internal void Random(Property.Models.Configuration configuration, int radomUseBirthdayMinimum, string[] validKeyWordsToIgnoreInRandom, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<int>? notNineCollection, ReadOnlyCollection<Shared.Models.Mapping> distinctValidImageMappingCollection) | ||||
|     { | ||||
|         string key; | ||||
|         string json; | ||||
| @ -66,12 +66,12 @@ internal class F_Random | ||||
|         List<int> distinctCollection = []; | ||||
|         DateTime dateTime = new(2024, 1, 1); //Leap year | ||||
|         ReadOnlyDictionary<int, List<long>> idToPersonKeys = Map.Models.Stateless.Methods.IMapLogic.GetIdToPersonKeys(personKeyToIds); | ||||
|         ReadOnlyDictionary<string, List<string>> dayToRelativePaths = GetDayToRelativePaths(mappingCollection, dateFormat, idToPersonKeys); | ||||
|         ReadOnlyDictionary<string, List<string>> dayToRelativePaths = GetDayToRelativePaths(distinctValidImageMappingCollection, dateFormat, idToPersonKeys); | ||||
|         string fRandomCollectionDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration, nameof(F_Random), "[]"); | ||||
|         string[] files = Directory.GetFiles(fRandomCollectionDirectory, "*", SearchOption.TopDirectoryOnly); | ||||
|         foreach (string file in files) | ||||
|             File.Delete(file); | ||||
|         foreach (Shared.Models.Mapping mapping in mappingCollection) | ||||
|         foreach (Shared.Models.Mapping mapping in distinctValidImageMappingCollection) | ||||
|         { | ||||
|             if (distinctCollection.Contains(mapping.MappingFromItem.Id)) | ||||
|                 continue; | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| namespace View_by_Distance.Map.Models; | ||||
|  | ||||
| public record Configuration(bool DeletePossibleDuplicates, | ||||
| public record Configuration(Shared.Models.Methods.IDistanceLimits DistanceLimits, | ||||
|                             Shared.Models.Properties.IPropertyConfiguration PropertyConfiguration, | ||||
|                             bool DeletePossibleDuplicates, | ||||
|                             bool DistanceMoveUnableToMatch, | ||||
|                             bool DistanceRenameToMatch, | ||||
|                             int FaceConfidencePercent, | ||||
|  | ||||
| @ -23,6 +23,14 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|                            long? Ticks, | ||||
|                            string? PersonDirectory); | ||||
|  | ||||
|     internal record FilteredOriginalImage(int Id, | ||||
|                                           FilePath FilePath, | ||||
|                                           int ApproximateYears, | ||||
|                                           string PersonKeyFormatted, | ||||
|                                           string Directory, | ||||
|                                           string PersonDirectory, | ||||
|                                           string CheckFile); | ||||
|  | ||||
|     public void SaveContainers(int? updated, List<SaveContainer> saveContainers) | ||||
|     { | ||||
|         if (_Configuration is null) | ||||
| @ -137,7 +145,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private List<SaveShortcutsForOutputResolutions> GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> mappingCollection) | ||||
|     private List<SaveShortcutsForOutputResolutions> GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection) | ||||
|     { | ||||
|         List<SaveShortcutsForOutputResolutions> results = []; | ||||
|         if (_Configuration is null) | ||||
| @ -153,7 +161,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|         string personKeyFormatted; | ||||
|         Calendar calendar = new CultureInfo("en-US").Calendar; | ||||
|         ReadOnlyDictionary<int, List<long>> idToPersonKeys = IMapLogic.GetIdToPersonKeys(personKeyToIds); | ||||
|         foreach (Mapping mapping in mappingCollection) | ||||
|         foreach (Mapping mapping in distinctValidImageMappingCollection) | ||||
|         { | ||||
|             dateTime = mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(); | ||||
|             description = mapping.MappingFromLocation is null ? mapping.MappingFromItem.Id.ToString() : mapping.MappingFromLocation.DeterministicHashCodeKey; | ||||
| @ -181,12 +189,12 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|             personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonKey); | ||||
|             directory = Path.Combine($"{eDistanceContentDirectory}---", "Person Key Shortcuts", personKeyFormatted, directoryName); | ||||
|             fileName = Path.Combine(directory, $"{mapping.MappingFromItem.FilePath.Name}.lnk"); | ||||
|             results.Add(new(mapping.MappingFromItem.FilePath.FullName, directory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, description, MakeAllHidden: false)); | ||||
|             results.Add(new(mapping.MappingFromItem.FilePath.FullName, directory, dateTime, fileName, description, MakeAllHidden: false)); | ||||
|             if (IPerson.IsDefaultName(mapping.MappingFromPerson)) | ||||
|                 continue; | ||||
|             directory = Path.Combine($"{eDistanceContentDirectory}---", "Name Shortcuts", mapping.MappingFromPerson.DisplayDirectoryName, directoryName); | ||||
|             fileName = Path.Combine(directory, $"{mapping.MappingFromItem.FilePath.Name}.lnk"); | ||||
|             results.Add(new(mapping.MappingFromItem.FilePath.FullName, directory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, description, MakeAllHidden: false)); | ||||
|             results.Add(new(mapping.MappingFromItem.FilePath.FullName, directory, dateTime, fileName, description, MakeAllHidden: false)); | ||||
|         } | ||||
|         return results; | ||||
|     } | ||||
| @ -230,7 +238,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|         ReadOnlyDictionary<long, int> readOnlyPersonKeyToCount; | ||||
|         Dictionary<int, List<(string, int)>> skipCollection = []; | ||||
|         Dictionary<int, List<(string, int)>> skipNotSkipCollection = []; | ||||
|         ReadOnlyDictionary<int, List<(string, int)>> readOnlyskipCollection; | ||||
|         ReadOnlyDictionary<int, List<(string, int)>> readOnlySkipCollection; | ||||
|         string? rootDirectoryParent = Path.GetDirectoryName(propertyConfiguration.RootDirectory); | ||||
|         string eDistanceContentTicksDirectory = Path.Combine(eDistanceContentDirectory, ticks.ToString()); | ||||
|         ReadOnlyDictionary<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> idThenWholePercentagesToPersonContainers; | ||||
| @ -297,7 +305,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|                                                                                                                       skipCollection, | ||||
|                                                                                                                       readOnlyPersonKeyFormattedToPersonContainer, | ||||
|                                                                                                                       personKeyFormattedIdThenWholePercentagesCollection); | ||||
|             readOnlyskipCollection = new(skipCollection); | ||||
|             readOnlySkipCollection = new(skipCollection); | ||||
|             notMappedPersonContainers.AddRange(Stateless.MapLogic.GetNotMappedPersonContainers(configuration, | ||||
|                                                                                                ticks, | ||||
|                                                                                                personContainers, | ||||
| @ -307,7 +315,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|                                                                                  configuration, | ||||
|                                                                                  ticks, | ||||
|                                                                                  personContainers, | ||||
|                                                                                  readOnlyskipCollection, | ||||
|                                                                                  readOnlySkipCollection, | ||||
|                                                                                  records)); | ||||
|             int lossCount = records.Count - locationContainers.Count; | ||||
|             int unableToMatchCount = records.Count - personKeyFormattedIdThenWholePercentagesCollection.Count; | ||||
| @ -532,7 +540,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|         return new(debugDirectory, directory, ticks, personDirectory); | ||||
|     } | ||||
|  | ||||
|     private List<SaveContainer> GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, ReadOnlyCollection<Mapping> mappingCollection, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping, ReadOnlyDictionary<long, List<int>> personKeyToIds, int? useFiltersCounter, bool saveMapped, bool saveIndividually, bool sortingContainersAny) | ||||
|     private List<SaveContainer> GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping, ReadOnlyDictionary<long, List<int>> personKeyToIds, int? useFiltersCounter, bool saveMapped, bool saveIndividually, bool sortingContainersAny) | ||||
|     { | ||||
|         if (_Configuration is null) | ||||
|             throw new NullReferenceException(nameof(_Configuration)); | ||||
| @ -557,7 +565,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|         ReadOnlyDictionary<int, Mapping>? wholePercentagesToMapping; | ||||
|         int padLeft = _Configuration.FaceDistancePermyriad.ToString().Length; | ||||
|         string forceSingleImageHumanized = nameof(Shared.Models.Stateless.IMapLogic.ForceSingleImage).Humanize(LetterCasing.Title); | ||||
|         foreach (Mapping mapping in mappingCollection) | ||||
|         foreach (Mapping mapping in distinctValidImageMappingCollection) | ||||
|         { | ||||
|             if (mapping.MappingFromLocation is null) | ||||
|                 continue; | ||||
| @ -651,7 +659,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     public void SaveMapped(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> mappingCollection, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping) | ||||
|     public void SaveMapped(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping) | ||||
|     { | ||||
|         if (_Configuration is null) | ||||
|             throw new NullReferenceException(nameof(_Configuration)); | ||||
| @ -659,13 +667,13 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|         bool saveMapped = true; | ||||
|         int? useFiltersCounter = null; | ||||
|         string mappingDirectory = Path.Combine(_EDistanceContentTicksDirectory, nameof(Shared.Models.Stateless.IMapLogic.Mapping)); | ||||
|         List<SaveContainer> saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToWholePercentagesToMapping, personKeyToIds, useFiltersCounter, saveMapped, sortingContainersAny: true, saveIndividually: false); | ||||
|         List<SaveContainer> saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, distinctValidImageMappingCollection, idToWholePercentagesToMapping, personKeyToIds, useFiltersCounter, saveMapped, sortingContainersAny: true, saveIndividually: false); | ||||
|         SaveContainers(updated, saveContainers); | ||||
|         if (!string.IsNullOrEmpty(_EDistanceContentTicksDirectory) && Directory.Exists(mappingDirectory)) | ||||
|             Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory); | ||||
|     } | ||||
|  | ||||
|     public List<Sorting> GetSortingCollection(int i, Face face, FaceDistance faceDistanceEncoding, List<FaceDistance> faceDistanceLengths) | ||||
|     public List<Sorting> GetSortingCollection(Shared.Models.Methods.IDistanceLimits distanceLimits, int i, Face face, FaceDistance faceDistanceEncoding, List<FaceDistance> faceDistanceLengths) | ||||
|     { | ||||
|         if (_Configuration is null) | ||||
|             throw new NullReferenceException(nameof(_Configuration)); | ||||
| @ -753,7 +761,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|                     keyToCount.Add(key, new()); | ||||
|                 _ = keyToCount.TryAdd(key, 0); | ||||
|                 keyToCount[key]++; | ||||
|                 if (!_Configuration.SaveIndividually && keyToCount[key] < _Configuration.SortingMaximumPerKey) | ||||
|                 if (!_Configuration.SaveIndividually && keyToCount[key] <= _Configuration.SortingMaximumPerKey) | ||||
|                     segmentC = null; | ||||
|                 else | ||||
|                     segmentC = sortingContainer.Sorting.DistancePermyriad.ToString(); | ||||
| @ -1029,7 +1037,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|                     collection.Add(new(personBirthday.Value.Ticks, Path.Combine(checkDirectory, personKeyFormatted, fileNameWithoutExtension, $"{ids.Count} Face(s)"))); | ||||
|                 foreach ((long personKey, string displayDirectoryName) in collection) | ||||
|                 { | ||||
|                     matches = (from l in personContainers where l.Key == personKey && l.ApproximateYears.HasValue select l).ToArray(); | ||||
|                     matches = (from l in personContainers where l.Key == personKey select l).ToArray(); | ||||
|                     if (matches.Length == 0) | ||||
|                         continue; | ||||
|                     personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personKey); | ||||
| @ -1044,11 +1052,11 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     private (int, FilePath, int, string, string, string, string)[] GetCollectionForSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleContentDirectory, ReadOnlyCollection<PersonContainer> personContainers, ReadOnlyCollection<Mapping> mappingCollection, ReadOnlyDictionary<long, List<int>> personKeyToIds) | ||||
|     private FilteredOriginalImage[] GetCollectionForSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleContentDirectory, ReadOnlyCollection<PersonContainer> personContainers, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection, ReadOnlyDictionary<long, List<int>> personKeyToIds) | ||||
|     { | ||||
|         if (_Configuration is null) | ||||
|             throw new NullReferenceException(nameof(_Configuration)); | ||||
|         (int, FilePath, int, string, string, string, string)[] results; | ||||
|         FilteredOriginalImage[] results; | ||||
|         int count = 0; | ||||
|         int group = 65; | ||||
|         string checkFile; | ||||
| @ -1058,9 +1066,9 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|         string personKeyFormatted; | ||||
|         List<int> distinctCollection = []; | ||||
|         bool usePersonKeyAndDeterministicHashCodeKey = false; | ||||
|         List<FilteredOriginalImage> filteredOriginalImages = []; | ||||
|         List<string> personKeyFormattedCollection = GetPersonKeyFormattedCollection(jLinks, a2PeopleContentDirectory, personContainers, personKeyToIds); | ||||
|         List<(int Id, FilePath FilePath, int ApproximateYears, string PersonKeyFormatted, string CheckFile, string Directory, string PersonDirectory)> collection = []; | ||||
|         foreach (Mapping mapping in mappingCollection) | ||||
|         foreach (Mapping mapping in distinctValidImageMappingCollection) | ||||
|         { | ||||
|             if (distinctCollection.Contains(mapping.MappingFromItem.Id)) | ||||
|                 continue; | ||||
| @ -1069,7 +1077,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|                 throw new NotSupportedException(); | ||||
|             if (mapping.By is null or Shared.Models.Stateless.IMapLogic.Sorting) | ||||
|                 continue; | ||||
|             if (mapping.MappingFromPerson?.ApproximateYears is null || mapping.MappingFromLocation is null) | ||||
|             if (mapping.MappingFromPerson is null || mapping.MappingFromLocation is null) | ||||
|                 continue; | ||||
|             if (string.IsNullOrEmpty(mapping.MappingFromPerson.SegmentB)) | ||||
|                 throw new NotSupportedException(); | ||||
| @ -1097,39 +1105,44 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|                 personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName); | ||||
|                 checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.ExtensionLowered}"); | ||||
|             } | ||||
|             collection.Add(new(mapping.MappingFromItem.Id, mapping.MappingFromItem.FilePath, mapping.MappingFromPerson.ApproximateYears.Value, personKeyFormatted, directory, personDirectory, checkFile)); | ||||
|             if (mapping is null) | ||||
|                 continue; | ||||
|             if (mapping.MappingFromPerson.ApproximateYears is null) | ||||
|                 filteredOriginalImages.Add(new(mapping.MappingFromItem.Id, mapping.MappingFromItem.FilePath, -1, personKeyFormatted, directory, personDirectory, checkFile)); | ||||
|             else | ||||
|                 filteredOriginalImages.Add(new(mapping.MappingFromItem.Id, mapping.MappingFromItem.FilePath, mapping.MappingFromPerson.ApproximateYears.Value, personKeyFormatted, directory, personDirectory, checkFile)); | ||||
|             distinctCollection.Add(mapping.MappingFromItem.Id); | ||||
|             count += 1; | ||||
|         } | ||||
|         results = (from l in collection orderby l.ApproximateYears descending, l.PersonKeyFormatted descending select l).ToArray(); | ||||
|         results = (from l in filteredOriginalImages orderby l.ApproximateYears descending, l.PersonKeyFormatted descending select l).ToArray(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     public void SaveFilteredOriginalImagesFromJLinks(string[] jLinks, ReadOnlyCollection<PersonContainer> personContainers, string a2PeopleContentDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> mappingCollection) | ||||
|     public void SaveFilteredOriginalImagesFromJLinks(string[] jLinks, ReadOnlyCollection<PersonContainer> personContainers, string a2PeopleContentDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection) | ||||
|     { | ||||
|         if (_Configuration is null) | ||||
|             throw new NullReferenceException(nameof(_Configuration)); | ||||
|         FileHolder fileHolder; | ||||
|         SaveContainer? saveContainer; | ||||
|         List<SaveContainer> saveContainers = []; | ||||
|         (int, FilePath, int, string, string, string, string)[] collection = GetCollectionForSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory, personContainers, mappingCollection, personKeyToIds); | ||||
|         foreach ((int id, FilePath filePath, int approximateYears, string personKeyFormatted, string directory, string personDirectory, string checkFile) in collection) | ||||
|         FilteredOriginalImage[] filteredOriginalImages = GetCollectionForSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory, personContainers, distinctValidImageMappingCollection, personKeyToIds); | ||||
|         foreach (FilteredOriginalImage filteredOriginalImage in filteredOriginalImages) | ||||
|         { | ||||
|             fileHolder = FileHolder.Get(filePath); | ||||
|             saveContainer = new(personDirectory); | ||||
|             fileHolder = FileHolder.Get(filteredOriginalImage.FilePath); | ||||
|             saveContainer = new(filteredOriginalImage.PersonDirectory); | ||||
|             saveContainers.Add(saveContainer); | ||||
|             saveContainer = new(fileHolder, checkFile, directory); | ||||
|             saveContainer = new(fileHolder, filteredOriginalImage.CheckFile, filteredOriginalImage.Directory); | ||||
|             saveContainers.Add(saveContainer); | ||||
|         } | ||||
|         SaveContainers(null, saveContainers); | ||||
|     } | ||||
|  | ||||
|     public void SaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> mappingCollection) | ||||
|     public void SaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection) | ||||
|     { | ||||
|         string hiddenFile; | ||||
|         WindowsShortcut windowsShortcut; | ||||
|         List<SaveShortcutsForOutputResolutions> collection = []; | ||||
|         collection = GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, mappingCollection); | ||||
|         collection = GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, distinctValidImageMappingCollection); | ||||
|         string[] distinctDirectories = (from l in collection select l.Directory).Distinct().ToArray(); | ||||
|         foreach (string directory in distinctDirectories) | ||||
|         { | ||||
| @ -1163,7 +1176,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private (List<(string, DateTime[])>, List<SaveShortcutsForOutputResolutions>) GetCollectionForSaveShortcutsForOutputResolutionsDuringMapLogic(ReadOnlyDictionary<long, List<int>> personKeyToIds, string dFacesContentDirectory, ReadOnlyCollection<Item> filteredItems, ReadOnlyCollection<Mapping> mappingCollection) | ||||
|     private (List<(string, DateTime[])>, List<SaveShortcutsForOutputResolutions>) GetCollectionForSaveShortcutsForOutputResolutionsDuringMapLogic(ReadOnlyDictionary<long, List<int>> personKeyToIds, string dFacesContentDirectory, ReadOnlyCollection<Item> validImageItems, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection) | ||||
|     { | ||||
|         if (_Configuration is null) | ||||
|             throw new NullReferenceException(nameof(_Configuration)); | ||||
| @ -1171,6 +1184,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|         string fileName; | ||||
|         string fullName; | ||||
|         string directory; | ||||
|         DateTime dateTime; | ||||
|         string facesDirectory; | ||||
|         string? directoryName; | ||||
|         string personDirectory; | ||||
| @ -1178,7 +1192,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|         List<string> distinct = []; | ||||
|         List<SaveShortcutsForOutputResolutions> collection = []; | ||||
|         List<(string, DateTime[])> directoriesAndDateTimes = []; | ||||
|         foreach (Item item in filteredItems) | ||||
|         foreach (Item item in validImageItems) | ||||
|         { | ||||
|             if (item.ResizedFileHolder is null) | ||||
|                 continue; | ||||
| @ -1204,13 +1218,14 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         foreach (Mapping mapping in mappingCollection) | ||||
|         foreach (Mapping mapping in distinctValidImageMappingCollection) | ||||
|         { | ||||
|             directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath); | ||||
|             if (directoryName is null) | ||||
|                 throw new NotSupportedException(); | ||||
|             if (mapping.MappingFromItem.ResizedFileHolder.DirectoryName is null || !mapping.MappingFromItem.ResizedFileHolder.Exists) | ||||
|                 continue; | ||||
|             dateTime = mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(); | ||||
|             if (mapping.By is null or Shared.Models.Stateless.IMapLogic.Sorting || mapping.MappingFromPerson?.ApproximateYears is null) | ||||
|             { | ||||
|                 if (mapping.MappingFromItem.ContainerDateTimes.Length > 0 && !distinct.Contains(mapping.MappingFromItem.ResizedFileHolder.DirectoryName)) | ||||
| @ -1221,13 +1236,13 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|                 directory = Path.Combine(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", _PropertyConfiguration.ResultAllInOne); | ||||
|                 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)); | ||||
|                 collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, dateTime, fileName, mapping.MappingFromLocation?.DeterministicHashCodeKey, MakeAllHidden: false)); | ||||
|                 facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.FilePath, mapping.MappingFromItem); | ||||
|                 if (mapping.MappingFromLocation is null) | ||||
|                     continue; | ||||
|                 fullName = Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.ExtensionLowered}{_Configuration.FacesFileNameExtension}"); | ||||
|                 fileName = Path.Combine(personDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ResizedFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}.lnk"); | ||||
|                 collection.Add(new(fullName, personDirectory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, mapping.MappingFromLocation.DeterministicHashCodeKey, MakeAllHidden: true)); | ||||
|                 collection.Add(new(fullName, personDirectory, dateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey, MakeAllHidden: true)); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
| @ -1247,21 +1262,21 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic | ||||
|                 else | ||||
|                     personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName, $"{ids.Count} Face(s)"); | ||||
|                 fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk"); | ||||
|                 collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, mapping.MappingFromLocation?.DeterministicHashCodeKey, MakeAllHidden: false)); | ||||
|                 collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, dateTime, fileName, mapping.MappingFromLocation?.DeterministicHashCodeKey, MakeAllHidden: false)); | ||||
|             } | ||||
|         } | ||||
|         return new(directoriesAndDateTimes, collection); | ||||
|     } | ||||
|  | ||||
|     public void SaveShortcutsForOutputResolutionsDuringMapLogic(ReadOnlyCollection<Container> containers, ReadOnlyDictionary<long, List<int>> personKeyToIds, string dFacesContentDirectory, ReadOnlyCollection<Mapping> mappingCollection) | ||||
|     public void SaveShortcutsForOutputResolutionsDuringMapLogic(ReadOnlyCollection<Container> containers, ReadOnlyDictionary<long, List<int>> personKeyToIds, string dFacesContentDirectory, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection) | ||||
|     { | ||||
|         if (_Configuration is null) | ||||
|             throw new NullReferenceException(nameof(_Configuration)); | ||||
|         WindowsShortcut windowsShortcut; | ||||
|         List<(string, DateTime[])> directoriesAndDateTimes; | ||||
|         List<SaveShortcutsForOutputResolutions> collection; | ||||
|         ReadOnlyCollection<Item> filteredItems = IContainer.GetItems(_PropertyConfiguration, containers, distinctItems: true, filterItems: true); | ||||
|         (directoriesAndDateTimes, collection) = GetCollectionForSaveShortcutsForOutputResolutionsDuringMapLogic(personKeyToIds, dFacesContentDirectory, filteredItems, mappingCollection); | ||||
|         ReadOnlyCollection<Item> validImageItems = IContainer.GetValidImageItems(_PropertyConfiguration, containers, distinctItems: true, filterItems: true); | ||||
|         (directoriesAndDateTimes, collection) = GetCollectionForSaveShortcutsForOutputResolutionsDuringMapLogic(personKeyToIds, dFacesContentDirectory, validImageItems, distinctValidImageMappingCollection); | ||||
|         string[] directories = (from l in collection select l.Directory).Distinct().ToArray(); | ||||
|         foreach (string directory in directories) | ||||
|         { | ||||
|  | ||||
| @ -250,14 +250,27 @@ internal abstract class DistanceLogic | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     private static void RenameUnknown(string[] files) | ||||
|     private static string[] RenameBirth(string[] files) | ||||
|     { | ||||
|         List<string> results = []; | ||||
|         string checkFile; | ||||
|         foreach (string file in files) | ||||
|         { | ||||
|             if (file.EndsWith(".unk")) | ||||
|             if (file.EndsWith(".brt")) | ||||
|             { | ||||
|                 results.Add(file); | ||||
|                 continue; | ||||
|             File.Move(file, $"{file}.unk"); | ||||
|             } | ||||
|             checkFile = $"{file}.brt"; | ||||
|             if (File.Exists(checkFile)) | ||||
|             { | ||||
|                 results.Add(file); | ||||
|                 continue; | ||||
|             } | ||||
|             File.Move(file, checkFile); | ||||
|             results.Add(checkFile); | ||||
|         } | ||||
|         return results.ToArray(); | ||||
|     } | ||||
|  | ||||
|     private static void MovedToNewestPersonKeyFormatted(string personKeyFormatted, string newestPersonKeyFormatted, TicksDirectory ticksDirectory, string personKeyDirectory) | ||||
| @ -422,7 +435,7 @@ internal abstract class DistanceLogic | ||||
|                             if (!isDefault.Value) | ||||
|                             { | ||||
|                                 if (personKeyFormattedToNewestPersonKeyFormatted.Count > 0 && newestPersonKeyFormatted is null) | ||||
|                                     RenameUnknown(files); | ||||
|                                     files = RenameBirth(files); | ||||
|                                 else if (newestPersonKeyFormatted is not null && personKeyFormatted != newestPersonKeyFormatted) | ||||
|                                 { | ||||
|                                     if (!check) | ||||
|  | ||||
| @ -106,8 +106,9 @@ internal abstract class MapLogic | ||||
|     internal static string GetMappingSegmentB(long ticks, long personKey, int? approximateYears, MappingFromItem mappingFromItem) | ||||
|     { | ||||
|         string result; | ||||
|         DateTime dateTime = mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(); | ||||
|         PersonBirthday personBirthday = IPersonBirthday.GetPersonBirthday(personKey); | ||||
|         result = GetMappingSegmentB(ticks, personBirthday, approximateYears, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), mappingFromItem.IsWrongYear); | ||||
|         result = GetMappingSegmentB(ticks, personBirthday, approximateYears, dateTime, mappingFromItem.IsWrongYear); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -178,7 +179,9 @@ internal abstract class MapLogic | ||||
|  | ||||
|     internal static string GetMappingSegmentB(long ticks, PersonBirthday personBirthday, int? approximateYears, MappingFromItem mappingFromItem) | ||||
|     { | ||||
|         string result = GetMappingSegmentB(ticks, personBirthday, approximateYears, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), mappingFromItem.IsWrongYear); | ||||
|         string result; | ||||
|         DateTime dateTime = mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(); | ||||
|         result = GetMappingSegmentB(ticks, personBirthday, approximateYears, dateTime, mappingFromItem.IsWrongYear); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -464,7 +467,7 @@ internal abstract class MapLogic | ||||
|                 results.RemoveAt(i); | ||||
|                 continue; | ||||
|             } | ||||
|             if (!filePath.Name.EndsWith(".dup") && !filePath.Name.EndsWith(".unk") && !filePath.Name.EndsWith(".abd")) | ||||
|             if (!filePath.Name.EndsWith(".abd") && !filePath.Name.EndsWith(".brt") && !filePath.Name.EndsWith(".dup") && !filePath.Name.EndsWith(".unk")) | ||||
|                 continue; | ||||
|             if (!File.Exists(filePath.FullName)) | ||||
|                 continue; | ||||
| @ -1095,11 +1098,11 @@ internal abstract class MapLogic | ||||
|         return new(results); | ||||
|     } | ||||
|  | ||||
|     internal static ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> GetIdToWholePercentagesToFace(ReadOnlyCollection<Mapping> mappingCollection) | ||||
|     internal static ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> GetIdToWholePercentagesToFace(ReadOnlyCollection<Mapping> distinctValidImageMappingCollection) | ||||
|     { | ||||
|         Dictionary<int, Dictionary<int, Mapping>> results = []; | ||||
|         Dictionary<int, Mapping>? keyValuePairs; | ||||
|         foreach (Mapping mapping in mappingCollection) | ||||
|         foreach (Mapping mapping in distinctValidImageMappingCollection) | ||||
|         { | ||||
|             if (mapping.MappingFromLocation is null) | ||||
|                 continue; | ||||
|  | ||||
| @ -25,10 +25,10 @@ public interface IMapLogic | ||||
|     static Shared.Models.Mapping[] GetSelectedMappingCollection(ReadOnlyCollection<Shared.Models.Face> faces) => | ||||
|         MapLogic.GetSelectedMappingCollection(faces); | ||||
|  | ||||
|     ReadOnlyDictionary<int, ReadOnlyDictionary<int, Shared.Models.Mapping>> TestStatic_GetIdToWholePercentagesToFace(ReadOnlyCollection<Shared.Models.Mapping> mappingCollection) => | ||||
|         GetIdToWholePercentagesToFace(mappingCollection); | ||||
|     static ReadOnlyDictionary<int, ReadOnlyDictionary<int, Shared.Models.Mapping>> GetIdToWholePercentagesToFace(ReadOnlyCollection<Shared.Models.Mapping> mappingCollection) => | ||||
|         MapLogic.GetIdToWholePercentagesToFace(mappingCollection); | ||||
|     ReadOnlyDictionary<int, ReadOnlyDictionary<int, Shared.Models.Mapping>> TestStatic_GetIdToWholePercentagesToFace(ReadOnlyCollection<Shared.Models.Mapping> distinctValidImageMappingCollection) => | ||||
|         GetIdToWholePercentagesToFace(distinctValidImageMappingCollection); | ||||
|     static ReadOnlyDictionary<int, ReadOnlyDictionary<int, Shared.Models.Mapping>> GetIdToWholePercentagesToFace(ReadOnlyCollection<Shared.Models.Mapping> distinctValidImageMappingCollection) => | ||||
|         MapLogic.GetIdToWholePercentagesToFace(distinctValidImageMappingCollection); | ||||
|  | ||||
|     List<(string, long)> TestStatic_GetJLinkDirectories(string genealogicalDataCommunicationFile, string[] jLinks, string personBirthdayFormat, char[] personCharacters, string a2PeopleSingletonDirectory, string a2PeopleContentDirectory) => | ||||
|          GetJLinkDirectories(genealogicalDataCommunicationFile, jLinks, personBirthdayFormat, personCharacters, a2PeopleSingletonDirectory, a2PeopleContentDirectory); | ||||
|  | ||||
| @ -422,7 +422,7 @@ internal abstract class RelationLogic | ||||
|             if (!Directory.Exists(directory)) | ||||
|                 _ = Directory.CreateDirectory(directory); | ||||
|             WriteVsCodeFiles(eDistanceContentDirectory, displayDirectoryName, directory); | ||||
|             relationContainers = distance.GetRelationContainers(configuration.FaceDistancePermyriad, configuration.LocationContainerDistanceTake, configuration.LocationContainerDistanceTolerance.Value, group.RelationContainersCollection); | ||||
|             relationContainers = distance.GetRelationContainers(configuration.DistanceLimits, configuration.FaceDistancePermyriad, configuration.LocationContainerDistanceTake, configuration.LocationContainerDistanceTolerance.Value, group.RelationContainersCollection); | ||||
|             movedFiles = GetMoveFiles(configuration, group.Key, take, isCounterPersonYear, displayDirectoryName, relationContainers); | ||||
|             WriteFile(take, group.PersonKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName, directory, ticks, uri, relationContainers, movedFiles); | ||||
|         } | ||||
|  | ||||
| @ -16,6 +16,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -36,7 +53,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -7,13 +7,9 @@ namespace View_by_Distance.Metadata.Query.Models.Binder; | ||||
| public class Configuration | ||||
| { | ||||
|  | ||||
| #nullable disable | ||||
|  | ||||
|     public string[] IgnoreExtensions { get; set; } | ||||
|     public Property.Models.Configuration PropertyConfiguration { get; set; } | ||||
|     public string PersonBirthdayFormat { get; set; } | ||||
|  | ||||
| #nullable restore | ||||
|     public string[]? IgnoreExtensions { get; set; } | ||||
|     public Property.Models.Configuration? PropertyConfiguration { get; set; } | ||||
|     public string? PersonBirthdayFormat { get; set; } | ||||
|  | ||||
|     public override string ToString() | ||||
|     { | ||||
| @ -21,12 +17,30 @@ public class Configuration | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, Configuration? configuration) | ||||
|     { | ||||
|         if (configuration?.IgnoreExtensions is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.Configuration Get(Configuration? configuration) | ||||
|     { | ||||
|         Models.Configuration result; | ||||
|         if (configuration is null) throw new NullReferenceException(nameof(configuration)); | ||||
|         if (configuration.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); | ||||
|         if (configuration.PersonBirthdayFormat is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); | ||||
|         if (configuration.PropertyConfiguration is null) throw new NullReferenceException(nameof(configuration.PropertyConfiguration)); | ||||
|         result = new( | ||||
|             configuration.IgnoreExtensions, | ||||
|             configuration.PersonBirthdayFormat, | ||||
| @ -39,14 +53,19 @@ public class Configuration | ||||
|         Models.Configuration result; | ||||
|         Configuration? configuration; | ||||
|         if (isEnvironment is null) | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationRoot.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         else | ||||
|         { | ||||
|             string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment); | ||||
|             string section = string.Concat(environmentName, ":", nameof(Configuration)); | ||||
|             IConfigurationSection configurationSection = configurationRoot.GetSection(section); | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationSection.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         } | ||||
|         PreVerify(configurationRoot, configuration); | ||||
|         result = Get(configuration); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -17,6 +17,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -40,7 +57,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -7,13 +7,9 @@ namespace View_by_Distance.Mirror.Length.Models.Binder; | ||||
| public class Configuration | ||||
| { | ||||
|  | ||||
| #nullable disable | ||||
|  | ||||
|     public string[] IgnoreExtensions { get; set; } | ||||
|     public Property.Models.Configuration PropertyConfiguration { get; set; } | ||||
|     public string PersonBirthdayFormat { get; set; } | ||||
|  | ||||
| #nullable restore | ||||
|     public string[]? IgnoreExtensions { get; set; } | ||||
|     public Property.Models.Configuration? PropertyConfiguration { get; set; } | ||||
|     public string? PersonBirthdayFormat { get; set; } | ||||
|  | ||||
|     public override string ToString() | ||||
|     { | ||||
| @ -21,12 +17,30 @@ public class Configuration | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, Configuration? configuration) | ||||
|     { | ||||
|         if (configuration?.IgnoreExtensions is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.Configuration Get(Configuration? configuration) | ||||
|     { | ||||
|         Models.Configuration result; | ||||
|         if (configuration is null) throw new NullReferenceException(nameof(configuration)); | ||||
|         if (configuration.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); | ||||
|         if (configuration.PersonBirthdayFormat is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); | ||||
|         if (configuration.PropertyConfiguration is null) throw new NullReferenceException(nameof(configuration.PropertyConfiguration)); | ||||
|         result = new( | ||||
|             configuration.IgnoreExtensions, | ||||
|             configuration.PersonBirthdayFormat, | ||||
| @ -39,14 +53,19 @@ public class Configuration | ||||
|         Models.Configuration result; | ||||
|         Configuration? configuration; | ||||
|         if (isEnvironment is null) | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationRoot.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         else | ||||
|         { | ||||
|             string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment); | ||||
|             string section = string.Concat(environmentName, ":", nameof(Configuration)); | ||||
|             IConfigurationSection configurationSection = configurationRoot.GetSection(section); | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationSection.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         } | ||||
|         PreVerify(configurationRoot, configuration); | ||||
|         result = Get(configuration); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -23,6 +23,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -44,7 +61,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -7,13 +7,9 @@ namespace View_by_Distance.Move.By.Id.Models.Binder; | ||||
| public class Configuration | ||||
| { | ||||
|  | ||||
| #nullable disable | ||||
|  | ||||
|     public string[] IgnoreExtensions { get; set; } | ||||
|     public Property.Models.Configuration PropertyConfiguration { get; set; } | ||||
|     public string PersonBirthdayFormat { get; set; } | ||||
|  | ||||
| #nullable restore | ||||
|     public string[]? IgnoreExtensions { get; set; } | ||||
|     public Property.Models.Configuration? PropertyConfiguration { get; set; } | ||||
|     public string? PersonBirthdayFormat { get; set; } | ||||
|  | ||||
|     public override string ToString() | ||||
|     { | ||||
| @ -21,12 +17,30 @@ public class Configuration | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, Configuration? configuration) | ||||
|     { | ||||
|         if (configuration?.IgnoreExtensions is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.Configuration Get(Configuration? configuration) | ||||
|     { | ||||
|         Models.Configuration result; | ||||
|         if (configuration is null) throw new NullReferenceException(nameof(configuration)); | ||||
|         if (configuration.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); | ||||
|         if (configuration.PersonBirthdayFormat is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); | ||||
|         if (configuration.PropertyConfiguration is null) throw new NullReferenceException(nameof(configuration.PropertyConfiguration)); | ||||
|         result = new( | ||||
|             configuration.IgnoreExtensions, | ||||
|             configuration.PersonBirthdayFormat, | ||||
| @ -39,14 +53,19 @@ public class Configuration | ||||
|         Models.Configuration result; | ||||
|         Configuration? configuration; | ||||
|         if (isEnvironment is null) | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationRoot.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         else | ||||
|         { | ||||
|             string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment); | ||||
|             string section = string.Concat(environmentName, ":", nameof(Configuration)); | ||||
|             IConfigurationSection configurationSection = configurationRoot.GetSection(section); | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationSection.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         } | ||||
|         PreVerify(configurationRoot, configuration); | ||||
|         result = Get(configuration); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -16,6 +16,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -36,7 +53,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -7,13 +7,9 @@ namespace View_by_Distance.Offset.Date.Time.Original.Models.Binder; | ||||
| public class Configuration | ||||
| { | ||||
|  | ||||
| #nullable disable | ||||
|  | ||||
|     public string[] IgnoreExtensions { get; set; } | ||||
|     public Property.Models.Configuration PropertyConfiguration { get; set; } | ||||
|     public string PersonBirthdayFormat { get; set; } | ||||
|  | ||||
| #nullable restore | ||||
|     public string[]? IgnoreExtensions { get; set; } | ||||
|     public Property.Models.Configuration? PropertyConfiguration { get; set; } | ||||
|     public string? PersonBirthdayFormat { get; set; } | ||||
|  | ||||
|     public override string ToString() | ||||
|     { | ||||
| @ -21,12 +17,30 @@ public class Configuration | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, Configuration? configuration) | ||||
|     { | ||||
|         if (configuration?.IgnoreExtensions is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.Configuration Get(Configuration? configuration) | ||||
|     { | ||||
|         Models.Configuration result; | ||||
|         if (configuration is null) throw new NullReferenceException(nameof(configuration)); | ||||
|         if (configuration.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); | ||||
|         if (configuration.PersonBirthdayFormat is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); | ||||
|         if (configuration.PropertyConfiguration is null) throw new NullReferenceException(nameof(configuration.PropertyConfiguration)); | ||||
|         result = new( | ||||
|             configuration.IgnoreExtensions, | ||||
|             configuration.PersonBirthdayFormat, | ||||
| @ -39,14 +53,19 @@ public class Configuration | ||||
|         Models.Configuration result; | ||||
|         Configuration? configuration; | ||||
|         if (isEnvironment is null) | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationRoot.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         else | ||||
|         { | ||||
|             string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment); | ||||
|             string section = string.Concat(environmentName, ":", nameof(Configuration)); | ||||
|             IConfigurationSection configurationSection = configurationRoot.GetSection(section); | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationSection.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         } | ||||
|         PreVerify(configurationRoot, configuration); | ||||
|         result = Get(configuration); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -169,7 +169,7 @@ public class F_PhotoPrism | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void WriteMatches(string fPhotoPrismContentDirectory, string personBirthdayFormat, float[] rectangleIntersectMinimums, long ticks, ReadOnlyCollection<Face> distinctFilteredFaces, Shared.Models.Methods.IMapLogic mapLogic) | ||||
|     public static void WriteMatches(string fPhotoPrismContentDirectory, string personBirthdayFormat, float[] rectangleIntersectMinimums, long ticks, ReadOnlyCollection<Face> distinctValidImageFaces, Shared.Models.Methods.IMapLogic mapLogic) | ||||
|     { | ||||
|         string file; | ||||
|         string text; | ||||
| @ -189,7 +189,7 @@ public class F_PhotoPrism | ||||
|         ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers; | ||||
|         (MappingFromPhotoPrism MappingFromPhotoPrism, Shared.Models.Marker Marker, float Percent)[] sortedCollection; | ||||
|         List<(MappingFromPhotoPrism MappingFromPhotoPrism, Shared.Models.Marker Marker, float Percent)> collection = []; | ||||
|         foreach (Face face in distinctFilteredFaces) | ||||
|         foreach (Face face in distinctValidImageFaces) | ||||
|         { | ||||
|             collection.Clear(); | ||||
|             wholePercentages = face.Mapping?.MappingFromLocation?.WholePercentages; | ||||
|  | ||||
| @ -20,6 +20,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -36,7 +53,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -5,12 +5,8 @@ namespace View_by_Distance.PrepareForOld.Models.Binder; | ||||
| public class Configuration | ||||
| { | ||||
|  | ||||
| #nullable disable | ||||
|  | ||||
|     public Property.Models.Configuration PropertyConfiguration { get; set; } | ||||
|     public string[] Spelling { get; set; } | ||||
|  | ||||
| #nullable restore | ||||
|     public Property.Models.Configuration? PropertyConfiguration { get; set; } | ||||
|     public string[]? Spelling { get; set; } | ||||
|  | ||||
|     public override string ToString() | ||||
|     { | ||||
|  | ||||
| @ -209,7 +209,7 @@ public class A_Property | ||||
|         SetAngleBracketCollection(aResultsFullGroupDirectory, sourceDirectory, anyNullOrNoIsUniqueFileName); | ||||
|     } | ||||
|  | ||||
|     private void SavePropertyParallelWork(int maxDegreeOfParallelism, Shared.Models.Methods.IMetadata<MetadataExtractor.Directory> metadata, List<Exception> exceptions, List<Tuple<string, DateTime>> sourceDirectoryChanges, Container container, List<Item> items, string message) | ||||
|     private void SavePropertyParallelWork(int maxDegreeOfParallelism, Shared.Models.Methods.IMetadata<MetadataExtractor.Directory> metadata, List<Exception> exceptions, List<Tuple<string, DateTime>> sourceDirectoryChanges, Container container, ReadOnlyCollection<Item> items, string message) | ||||
|     { | ||||
|         List<Tuple<string, DateTime>> sourceDirectoryFileTuples = []; | ||||
|         ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism }; | ||||
|  | ||||
| @ -39,6 +39,23 @@ public class Configuration | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, Configuration? configuration) | ||||
|     { | ||||
|         if (configuration?.DateGroup is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.Configuration Get(Configuration? configuration) | ||||
|     { | ||||
|         Models.Configuration result; | ||||
| @ -101,15 +118,19 @@ public class Configuration | ||||
|         Models.Configuration result; | ||||
|         Configuration? configuration; | ||||
|         if (isEnvironment is null) | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationRoot.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         else | ||||
|         { | ||||
|             string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment); | ||||
|             string section = string.Concat(environmentName, ":", nameof(Configuration)); | ||||
|             IConfigurationSection configurationSection = configurationRoot.GetSection(section); | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationSection.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         } | ||||
|         if (configuration is null) throw new NullReferenceException(nameof(configuration)); | ||||
|         PreVerify(configurationRoot, configuration); | ||||
|         result = Get(configuration); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -21,6 +21,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -49,6 +66,7 @@ public class AppSettings | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -18,6 +18,23 @@ public class Configuration | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, Configuration? configuration) | ||||
|     { | ||||
|         if (configuration?.ForceMetadataLastWriteTimeToCreationTime is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.Configuration Get(Configuration? configuration, Property.Models.Configuration propertyConfiguration) | ||||
|     { | ||||
|         Models.Configuration result; | ||||
| @ -39,14 +56,19 @@ public class Configuration | ||||
|         Models.Configuration result; | ||||
|         Configuration? configuration; | ||||
|         if (isEnvironment is null) | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationRoot.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         else | ||||
|         { | ||||
|             string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment); | ||||
|             string section = string.Concat(environmentName, ":", nameof(Configuration)); | ||||
|             IConfigurationSection configurationSection = configurationRoot.GetSection(section); | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationSection.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         } | ||||
|         PreVerify(configurationRoot, configuration); | ||||
|         result = Get(configuration, propertyConfiguration); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -21,6 +21,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -38,7 +55,10 @@ public class AppSettings | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -7,13 +7,9 @@ namespace View_by_Distance.Set.Created.Date.Models.Binder; | ||||
| public class Configuration | ||||
| { | ||||
|  | ||||
| #nullable disable | ||||
|  | ||||
|     public string[] IgnoreExtensions { get; set; } | ||||
|     public Property.Models.Configuration PropertyConfiguration { get; set; } | ||||
|     public string PersonBirthdayFormat { get; set; } | ||||
|  | ||||
| #nullable restore | ||||
|     public string[]? IgnoreExtensions { get; set; } | ||||
|     public Property.Models.Configuration? PropertyConfiguration { get; set; } | ||||
|     public string? PersonBirthdayFormat { get; set; } | ||||
|  | ||||
|     public override string ToString() | ||||
|     { | ||||
| @ -21,12 +17,30 @@ public class Configuration | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, Configuration? configuration) | ||||
|     { | ||||
|         if (configuration?.IgnoreExtensions is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.Configuration Get(Configuration? configuration) | ||||
|     { | ||||
|         Models.Configuration result; | ||||
|         if (configuration is null) throw new NullReferenceException(nameof(configuration)); | ||||
|         if (configuration.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); | ||||
|         if (configuration.PersonBirthdayFormat is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); | ||||
|         if (configuration.PropertyConfiguration is null) throw new NullReferenceException(nameof(configuration.PropertyConfiguration)); | ||||
|         result = new( | ||||
|             configuration.IgnoreExtensions, | ||||
|             configuration.PersonBirthdayFormat, | ||||
| @ -39,14 +53,19 @@ public class Configuration | ||||
|         Models.Configuration result; | ||||
|         Configuration? configuration; | ||||
|         if (isEnvironment is null) | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationRoot.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         else | ||||
|         { | ||||
|             string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment); | ||||
|             string section = string.Concat(environmentName, ":", nameof(Configuration)); | ||||
|             IConfigurationSection configurationSection = configurationRoot.GetSection(section); | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationSection.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         } | ||||
|         PreVerify(configurationRoot, configuration); | ||||
|         result = Get(configuration); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
							
								
								
									
										19
									
								
								Shared/Models/Aggregations.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								Shared/Models/Aggregations.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record Aggregations( | ||||
|     [property: JsonPropertyName("allPeople")] IReadOnlyList<AllPerson> AllPeople, | ||||
|     [property: JsonPropertyName("clusterId")] IReadOnlyList<ClusterId> ClusterId, | ||||
|     [property: JsonPropertyName("location")] IReadOnlyList<LocationAmazon> Location, | ||||
|     [property: JsonPropertyName("people")] IReadOnlyList<PersonAmazon> People, | ||||
|     [property: JsonPropertyName("things")] IReadOnlyList<Thing> Things, | ||||
|     [property: JsonPropertyName("time")] IReadOnlyList<Time> Time, | ||||
|     [property: JsonPropertyName("type")] IReadOnlyList<Type> Type | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(Aggregations))] | ||||
| public partial class AggregationsGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
							
								
								
									
										15
									
								
								Shared/Models/AllPerson.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Shared/Models/AllPerson.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record AllPerson( | ||||
|     [property: JsonPropertyName("count")] int Count, | ||||
|     [property: JsonPropertyName("match")] string Match, | ||||
|     [property: JsonPropertyName("searchData")] SearchData SearchData | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(AllPerson))] | ||||
| public partial class AllPersonGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
							
								
								
									
										15
									
								
								Shared/Models/ClusterId.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Shared/Models/ClusterId.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record ClusterId( | ||||
|     [property: JsonPropertyName("count")] int Count, | ||||
|     [property: JsonPropertyName("match")] string Match, | ||||
|     [property: JsonPropertyName("searchData")] SearchData SearchData | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(ClusterId))] | ||||
| public partial class ClusterIdGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
| @ -1,8 +1,9 @@ | ||||
| using System.Collections.ObjectModel; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record Container(string SourceDirectory, List<Item> Items) | ||||
| public record Container(string SourceDirectory, ReadOnlyCollection<Item> Items) | ||||
| { | ||||
|  | ||||
|     public override string ToString() | ||||
|  | ||||
							
								
								
									
										20
									
								
								Shared/Models/ContentProperties.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Shared/Models/ContentProperties.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record ContentProperties( | ||||
|     [property: JsonPropertyName("contentDate")] DateTime ContentDate, | ||||
|     [property: JsonPropertyName("contentSignatures")] IReadOnlyList<ContentSignature> ContentSignatures, | ||||
|     [property: JsonPropertyName("contentType")] string ContentType, | ||||
|     [property: JsonPropertyName("extension")] string Extension, | ||||
|     [property: JsonPropertyName("image")] ImageAmazon Image, | ||||
|     [property: JsonPropertyName("md5")] string Md5, | ||||
|     [property: JsonPropertyName("size")] int Size, | ||||
|     [property: JsonPropertyName("version")] int Version | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(ContentProperties))] | ||||
| public partial class ContentPropertiesGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
							
								
								
									
										14
									
								
								Shared/Models/ContentSignature.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								Shared/Models/ContentSignature.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record ContentSignature( | ||||
|     [property: JsonPropertyName("contentSignature")] string Value, | ||||
|     [property: JsonPropertyName("contentSignatureType")] string ContentSignatureType | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(ContentSignature))] | ||||
| public partial class ContentSignatureGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
							
								
								
									
										45
									
								
								Shared/Models/Datum.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								Shared/Models/Datum.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,45 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record Datum( | ||||
|     [property: JsonPropertyName("accessRuleIds")] IReadOnlyList<object> AccessRuleIds, | ||||
|     [property: JsonPropertyName("childAssetTypeInfo")] IReadOnlyList<object> ChildAssetTypeInfo, | ||||
|     [property: JsonPropertyName("contentProperties")] ContentProperties ContentProperties, | ||||
|     [property: JsonPropertyName("createdBy")] string CreatedBy, | ||||
|     [property: JsonPropertyName("createdDate")] DateTime CreatedDate, | ||||
|     [property: JsonPropertyName("eTagResponse")] string ETagResponse, | ||||
|     [property: JsonPropertyName("groupPermissions")] IReadOnlyList<object> GroupPermissions, | ||||
|     [property: JsonPropertyName("id")] string Id, | ||||
|     [property: JsonPropertyName("isRoot")] bool IsRoot, | ||||
|     [property: JsonPropertyName("isShared")] bool IsShared, | ||||
|     [property: JsonPropertyName("keywords")] IReadOnlyList<object> Keywords, | ||||
|     [property: JsonPropertyName("kind")] string Kind, | ||||
|     [property: JsonPropertyName("labels")] IReadOnlyList<object> Labels, | ||||
|     [property: JsonPropertyName("modifiedDate")] DateTime ModifiedDate, | ||||
|     [property: JsonPropertyName("name")] string Name, | ||||
|     [property: JsonPropertyName("ownerId")] string OwnerId, | ||||
|     [property: JsonPropertyName("parentMap")] ParentMap ParentMap, | ||||
|     [property: JsonPropertyName("parents")] IReadOnlyList<string> Parents, | ||||
|     [property: JsonPropertyName("protectedFolder")] bool ProtectedFolder, | ||||
|     [property: JsonPropertyName("restricted")] bool Restricted, | ||||
|     [property: JsonPropertyName("status")] string Status, | ||||
|     [property: JsonPropertyName("subKinds")] IReadOnlyList<object> SubKinds, | ||||
|     [property: JsonPropertyName("transforms")] IReadOnlyList<string> Transforms, | ||||
|     [property: JsonPropertyName("version")] int Version, | ||||
|     [property: JsonPropertyName("xAccntParentMap")] XAccntParentMap XAccntParentMap, | ||||
|     [property: JsonPropertyName("xAccntParents")] IReadOnlyList<object> XAccntParents, | ||||
|     [property: JsonPropertyName("match")] bool? Match | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(Datum))] | ||||
| public partial class DatumGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(Dictionary<string, Datum>))] | ||||
| public partial class DictionaryDatumGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
							
								
								
									
										36
									
								
								Shared/Models/ImageAmazon.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								Shared/Models/ImageAmazon.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record ImageAmazon( | ||||
|     [property: JsonPropertyName("colorSpace")] string ColorSpace, | ||||
|     [property: JsonPropertyName("dateTime")] DateTime DateTime, | ||||
|     [property: JsonPropertyName("dateTimeDigitized")] DateTime DateTimeDigitized, | ||||
|     [property: JsonPropertyName("dateTimeOriginal")] DateTime DateTimeOriginal, | ||||
|     [property: JsonPropertyName("exposureMode")] string ExposureMode, | ||||
|     [property: JsonPropertyName("exposureProgram")] string ExposureProgram, | ||||
|     [property: JsonPropertyName("exposureTime")] string ExposureTime, | ||||
|     [property: JsonPropertyName("flash")] string Flash, | ||||
|     [property: JsonPropertyName("focalLength")] string FocalLength, | ||||
|     [property: JsonPropertyName("height")] int Height, | ||||
|     [property: JsonPropertyName("make")] string Make, | ||||
|     [property: JsonPropertyName("meteringMode")] string MeteringMode, | ||||
|     [property: JsonPropertyName("model")] string Model, | ||||
|     [property: JsonPropertyName("orientation")] string Orientation, | ||||
|     [property: JsonPropertyName("resolutionUnit")] string ResolutionUnit, | ||||
|     [property: JsonPropertyName("sensingMethod")] string SensingMethod, | ||||
|     [property: JsonPropertyName("sharpness")] string Sharpness, | ||||
|     [property: JsonPropertyName("software")] string Software, | ||||
|     [property: JsonPropertyName("subSecTime")] string SubSecTime, | ||||
|     [property: JsonPropertyName("subSecTimeDigitized")] string SubSecTimeDigitized, | ||||
|     [property: JsonPropertyName("subSecTimeOriginal")] string SubSecTimeOriginal, | ||||
|     [property: JsonPropertyName("whiteBalance")] string WhiteBalance, | ||||
|     [property: JsonPropertyName("width")] int Width, | ||||
|     [property: JsonPropertyName("apertureValue")] string ApertureValue | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(ImageAmazon))] | ||||
| public partial class ImageAmazonGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
							
								
								
									
										15
									
								
								Shared/Models/LocationAmazon.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Shared/Models/LocationAmazon.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record LocationAmazon( | ||||
|     [property: JsonPropertyName("count")] int Count, | ||||
|     [property: JsonPropertyName("match")] string Match, | ||||
|     [property: JsonPropertyName("searchData")] SearchData SearchData | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(LocationAmazon))] | ||||
| public partial class LocationAmazonGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
							
								
								
									
										17
									
								
								Shared/Models/LocationInfo.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								Shared/Models/LocationInfo.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record LocationInfo( | ||||
|     [property: JsonPropertyName("city")] string City, | ||||
|     [property: JsonPropertyName("country")] string Country, | ||||
|     [property: JsonPropertyName("countryIso3Code")] string CountryIso3Code, | ||||
|     [property: JsonPropertyName("state")] string State, | ||||
|     [property: JsonPropertyName("stateCode")] string StateCode | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(LocationInfo))] | ||||
| public partial class LocationInfoGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
| @ -5,6 +5,6 @@ namespace View_by_Distance.Shared.Models.Methods; | ||||
| public interface IDistance | ||||
| { | ||||
|  | ||||
|     ReadOnlyCollection<RelationContainer> GetRelationContainers(int faceDistancePermyriad, int locationContainerDistanceTake, float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer> locationContainers); | ||||
|     ReadOnlyCollection<RelationContainer> GetRelationContainers(IDistanceLimits distanceLimits, int faceDistancePermyriad, int locationContainerDistanceTake, float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer> locationContainers); | ||||
|  | ||||
| } | ||||
| @ -9,6 +9,7 @@ public interface IDistanceLimits | ||||
|     public double FaceDistancePermyriad { init; get; } | ||||
|     public int SortingMaximumPerFaceShouldBeHigh { init; get; } | ||||
|     public bool RangeDaysDeltaTargetLessThenUpper { init; get; } | ||||
|     public double RangeDistanceToleranceUpperLimit { init; get; } | ||||
|  | ||||
|     string GetCounts(); | ||||
|     void AddCounts(int days, int distance); | ||||
|  | ||||
							
								
								
									
										13
									
								
								Shared/Models/ParentMap.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Shared/Models/ParentMap.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record ParentMap( | ||||
|     [property: JsonPropertyName("FOLDER")] IReadOnlyList<string> FOLDER | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(ParentMap))] | ||||
| public partial class ParentMapGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
							
								
								
									
										15
									
								
								Shared/Models/PersonAmazon.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Shared/Models/PersonAmazon.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record PersonAmazon( | ||||
|     [property: JsonPropertyName("count")] int Count, | ||||
|     [property: JsonPropertyName("match")] string Match, | ||||
|     [property: JsonPropertyName("searchData")] SearchData SearchData | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(PersonAmazon))] | ||||
| public partial class PersonAmazonGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
							
								
								
									
										15
									
								
								Shared/Models/RootAmazon.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Shared/Models/RootAmazon.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record RootAmazon( | ||||
|     [property: JsonPropertyName("aggregations")] Aggregations Aggregations, | ||||
|     [property: JsonPropertyName("count")] int Count, | ||||
|     [property: JsonPropertyName("data")] IReadOnlyList<Datum> Data | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(RootAmazon))] | ||||
| public partial class RootAmazonGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
							
								
								
									
										16
									
								
								Shared/Models/SearchData.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								Shared/Models/SearchData.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record SearchData( | ||||
|     [property: JsonPropertyName("clusterName")] string ClusterName, | ||||
|     [property: JsonPropertyName("locationId")] string LocationId, | ||||
|     [property: JsonPropertyName("locationInfo")] LocationInfo LocationInfo, | ||||
|     [property: JsonPropertyName("thingId")] string ThingId | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(SearchData))] | ||||
| public partial class SearchDataGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
| @ -8,7 +8,7 @@ internal abstract class Container | ||||
|  | ||||
|     private record FilePair(bool IsUnique, List<string> Collection, FilePath FilePath, Models.Item Item) { } | ||||
|  | ||||
|     internal static DateTime[] GetContainerDateTimes(IEnumerable<Models.Item> items) | ||||
|     internal static DateTime[] GetContainerDateTimes(ReadOnlyCollection<Models.Item> items) | ||||
|     { | ||||
|         DateTime[] results; | ||||
|         long containerMinimumTicks = (from l in items select l.FilePath.LastWriteTicks).Min(); | ||||
| @ -17,16 +17,16 @@ internal abstract class Container | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     internal static Models.Item[] GetFilterItems(Properties.IPropertyConfiguration propertyConfiguration, Models.Container container) | ||||
|     internal static ReadOnlyCollection<Models.Item> GetValidImageItems(Properties.IPropertyConfiguration propertyConfiguration, Models.Container container) | ||||
|     { | ||||
|         List<Models.Item> results = []; | ||||
|         foreach (Models.Item item in container.Items) | ||||
|         { | ||||
|             if (item.IsValidImageFormatExtension | ||||
|                 && !propertyConfiguration.IgnoreExtensions.Contains(item.FilePath.ExtensionLowered)) | ||||
|                 results.Add(item); | ||||
|             if (!item.IsValidImageFormatExtension || propertyConfiguration.IgnoreExtensions.Contains(item.FilePath.ExtensionLowered)) | ||||
|                 continue; | ||||
|             results.Add(item); | ||||
|         } | ||||
|         return results.ToArray(); | ||||
|         return container.Items.Count == results.Count ? container.Items : new(results); | ||||
|     } | ||||
|  | ||||
|     internal static List<Models.FilePair> GetFilePairs(Properties.IPropertyConfiguration propertyConfiguration, string directorySearchFilter, string extension, string aPropertySingletonDirectory, ReadOnlyCollection<string[]> filesCollection) | ||||
| @ -74,8 +74,8 @@ internal abstract class Container | ||||
|         bool abandoned = false; | ||||
|         Models.FileHolder sourceDirectoryFileHolder; | ||||
|         Models.Property? property = GetProperty(filePair); | ||||
|         Models.FileHolder imageFileInfo = IFileHolder.Get(filePair.Path); | ||||
|         FilePath filePath = FilePath.Get(propertyConfiguration, imageFileInfo, index: null); | ||||
|         Models.FileHolder imageFileHolder = IFileHolder.Get(filePair.Path); | ||||
|         FilePath filePath = FilePath.Get(propertyConfiguration, imageFileHolder, index: null); | ||||
|         bool? fileSizeChanged = property is not null ? property.FileSize != filePath.Length : null; | ||||
|         bool isValidImageFormatExtension = propertyConfiguration.ValidImageFormatExtensions.Contains(filePath.ExtensionLowered); | ||||
|         if (property is not null && property.Keywords is not null) | ||||
| @ -85,8 +85,9 @@ internal abstract class Container | ||||
|             bool shouldIgnore = propertyConfiguration.IgnoreRulesKeyWords.Any(l => property.Keywords.Contains(l)); | ||||
|             if (shouldIgnore) | ||||
|             { | ||||
|                 if (shouldIgnore) | ||||
|                 { } | ||||
|                 FileInfo fileInfo = new(filePath.FullName); | ||||
|                 if (!fileInfo.Attributes.HasFlag(FileAttributes.Hidden)) | ||||
|                     File.SetAttributes(imageFileHolder.FullName, FileAttributes.Hidden); | ||||
|             } | ||||
|             if (filePath.IsIgnore.Value != shouldIgnore) | ||||
|             { | ||||
| @ -169,7 +170,7 @@ internal abstract class Container | ||||
|         { | ||||
|             if (keyValuePair.Value.Count == 0) | ||||
|                 continue; | ||||
|             container = new(keyValuePair.Key, keyValuePair.Value); | ||||
|             container = new(keyValuePair.Key, new(keyValuePair.Value)); | ||||
|             results.Add(container); | ||||
|         } | ||||
|         return (filePairs.Count, results.ToArray()); | ||||
| @ -199,13 +200,13 @@ internal abstract class Container | ||||
|     internal static List<int> GetFilteredDistinctIds(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<Models.Container> readOnlyContainers) | ||||
|     { | ||||
|         List<int> results = []; | ||||
|         Models.Item[] filteredItems; | ||||
|         ReadOnlyCollection<Models.Item> filteredItems; | ||||
|         foreach (Models.Container container in readOnlyContainers) | ||||
|         { | ||||
|             if (container.Items.Count == 0) | ||||
|                 continue; | ||||
|             filteredItems = GetFilterItems(propertyConfiguration, container); | ||||
|             if (filteredItems.Length == 0) | ||||
|             filteredItems = GetValidImageItems(propertyConfiguration, container); | ||||
|             if (filteredItems.Count == 0) | ||||
|                 continue; | ||||
|             foreach (Models.Item item in filteredItems) | ||||
|             { | ||||
| @ -219,11 +220,11 @@ internal abstract class Container | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     internal static ReadOnlyCollection<Models.Item> GetItems(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<Models.Container> containers, bool distinctItems, bool filterItems) | ||||
|     internal static ReadOnlyCollection<Models.Item> GetValidImageItems(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<Models.Container> containers, bool distinctItems, bool filterItems) | ||||
|     { | ||||
|         List<Models.Item> results = []; | ||||
|         List<int> distinct = []; | ||||
|         IEnumerable<Models.Item> filteredItems; | ||||
|         ReadOnlyCollection<Models.Item> filteredItems; | ||||
|         foreach (Models.Container container in containers) | ||||
|         { | ||||
|             if (container.Items.Count == 0) | ||||
| @ -232,8 +233,8 @@ internal abstract class Container | ||||
|                 filteredItems = container.Items; | ||||
|             else | ||||
|             { | ||||
|                 filteredItems = GetFilterItems(propertyConfiguration, container); | ||||
|                 if (!filteredItems.Any()) | ||||
|                 filteredItems = GetValidImageItems(propertyConfiguration, container); | ||||
|                 if (filteredItems.Count == 0) | ||||
|                     continue; | ||||
|             } | ||||
|             foreach (Models.Item item in filteredItems) | ||||
|  | ||||
| @ -5,15 +5,15 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods; | ||||
| public interface IContainer | ||||
| { | ||||
|  | ||||
|     DateTime[] TestStatic_GetContainerDateTimes(IEnumerable<Models.Item> items) => | ||||
|     DateTime[] TestStatic_GetContainerDateTimes(ReadOnlyCollection<Models.Item> items) => | ||||
|         GetContainerDateTimes(items); | ||||
|     static DateTime[] GetContainerDateTimes(IEnumerable<Models.Item> items) => | ||||
|     static DateTime[] GetContainerDateTimes(ReadOnlyCollection<Models.Item> items) => | ||||
|         Container.GetContainerDateTimes(items); | ||||
|  | ||||
|     Models.Item[] TestStatic_GetFilterItems(Properties.IPropertyConfiguration propertyConfiguration, Models.Container container) => | ||||
|         GetFilterItems(propertyConfiguration, container); | ||||
|     static Models.Item[] GetFilterItems(Properties.IPropertyConfiguration propertyConfiguration, Models.Container container) => | ||||
|        Container.GetFilterItems(propertyConfiguration, container); | ||||
|     ReadOnlyCollection<Models.Item> TestStatic_GetValidImageItems(Properties.IPropertyConfiguration propertyConfiguration, Models.Container container) => | ||||
|         GetValidImageItems(propertyConfiguration, container); | ||||
|     static ReadOnlyCollection<Models.Item> GetValidImageItems(Properties.IPropertyConfiguration propertyConfiguration, Models.Container container) => | ||||
|        Container.GetValidImageItems(propertyConfiguration, container); | ||||
|  | ||||
|     (int, Models.Container[]) TestStatic_GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory) => | ||||
|             GetContainers(propertyConfiguration, aPropertySingletonDirectory); | ||||
| @ -30,9 +30,9 @@ public interface IContainer | ||||
|     static List<int> GetFilteredDistinctIds(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<Models.Container> readOnlyContainers) => | ||||
|         Container.GetFilteredDistinctIds(propertyConfiguration, readOnlyContainers); | ||||
|  | ||||
|     ReadOnlyCollection<Models.Item> TestStatic_GetItems(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<Models.Container> containers, bool distinctItems, bool filterItems) => | ||||
|         GetItems(propertyConfiguration, containers, distinctItems, filterItems); | ||||
|     static ReadOnlyCollection<Models.Item> GetItems(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<Models.Container> containers, bool distinctItems, bool filterItems) => | ||||
|         Container.GetItems(propertyConfiguration, containers, distinctItems, filterItems); | ||||
|     ReadOnlyCollection<Models.Item> TestStatic_GetValidImageItems(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<Models.Container> containers, bool distinctItems, bool filterItems) => | ||||
|         GetValidImageItems(propertyConfiguration, containers, distinctItems, filterItems); | ||||
|     static ReadOnlyCollection<Models.Item> GetValidImageItems(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<Models.Container> containers, bool distinctItems, bool filterItems) => | ||||
|         Container.GetValidImageItems(propertyConfiguration, containers, distinctItems, filterItems); | ||||
|  | ||||
| } | ||||
| @ -1,3 +1,5 @@ | ||||
| using System.Collections.ObjectModel; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models.Stateless.Methods; | ||||
|  | ||||
| public interface IPersonContainer | ||||
| @ -5,9 +7,9 @@ public interface IPersonContainer | ||||
|  | ||||
|     // ... | ||||
|  | ||||
|     List<long> TestStatic_GetPersonKeys(IEnumerable<Models.PersonContainer> personContainers) => | ||||
|     List<long> TestStatic_GetPersonKeys(ReadOnlyCollection<Models.PersonContainer> personContainers) => | ||||
|       GetPersonKeys(personContainers); | ||||
|     static List<long> GetPersonKeys(IEnumerable<Models.PersonContainer> personContainers) => | ||||
|     static List<long> GetPersonKeys(ReadOnlyCollection<Models.PersonContainer> personContainers) => | ||||
|       PersonContainer.GetPersonKeys(personContainers); | ||||
|  | ||||
|     List<Models.PersonContainer> TestStatic_GetPersonContainers(string a2PeopleSingletonDirectory, string personBirthdayFormat, char[] personCharacters, Properties.IPropertyConfiguration propertyConfiguration, string facesFileNameExtension) => | ||||
|  | ||||
| @ -43,9 +43,9 @@ public interface IProperty | ||||
|     static List<DateTime> GetDateTimes(Models.Property property) => | ||||
|         Property.GetDateTimes(property.CreationTime, property.LastWriteTime, property.DateTime, property.DateTimeDigitized, property.DateTimeFromName, property.DateTimeOriginal, property.GPSDateStamp); | ||||
|  | ||||
|     double TestStatic_GetStandardDeviation(IEnumerable<long> values, double average) => | ||||
|     double TestStatic_GetStandardDeviation(List<long> values, double average) => | ||||
|         GetStandardDeviation(values, average); | ||||
|     static double GetStandardDeviation(IEnumerable<long> values, double average) => | ||||
|     static double GetStandardDeviation(List<long> values, double average) => | ||||
|         Property.GetStandardDeviation(values, average); | ||||
|  | ||||
|     TimeSpan TestStatic_GetThreeStandardDeviationHigh(int minimum, Models.Container container) => | ||||
|  | ||||
| @ -1,3 +1,5 @@ | ||||
| using System.Collections.ObjectModel; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models.Stateless.Methods; | ||||
|  | ||||
| internal abstract class PersonContainer | ||||
| @ -313,7 +315,7 @@ internal abstract class PersonContainer | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     internal static List<long> GetPersonKeys(IEnumerable<Models.PersonContainer> personContainers) | ||||
|     internal static List<long> GetPersonKeys(ReadOnlyCollection<Models.PersonContainer> personContainers) | ||||
|     { | ||||
|         List<long> results = []; | ||||
|         long personKey; | ||||
|  | ||||
| @ -166,13 +166,13 @@ internal abstract class Property | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     internal static double GetStandardDeviation(IEnumerable<long> values, double average) | ||||
|     internal static double GetStandardDeviation(List<long> values, double average) | ||||
|     { | ||||
|         double result = 0; | ||||
|         if (!values.Any()) | ||||
|         if (values.Count == 0) | ||||
|             throw new Exception("Collection must have at least one value!"); | ||||
|         double sum = values.Sum(l => (l - average) * (l - average)); | ||||
|         result = Math.Sqrt(sum / values.Count()); | ||||
|         result = Math.Sqrt(sum / values.Count); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|  | ||||
							
								
								
									
										15
									
								
								Shared/Models/Thing.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Shared/Models/Thing.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record Thing( | ||||
|     [property: JsonPropertyName("count")] int Count, | ||||
|     [property: JsonPropertyName("match")] string Match, | ||||
|     [property: JsonPropertyName("searchData")] SearchData SearchData | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(Thing))] | ||||
| public partial class ThingGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
							
								
								
									
										15
									
								
								Shared/Models/Time.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Shared/Models/Time.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record Time( | ||||
|     [property: JsonPropertyName("count")] int Count, | ||||
|     [property: JsonPropertyName("match")] string Match, | ||||
|     [property: JsonPropertyName("searchData")] SearchData SearchData | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(Time))] | ||||
| public partial class TimeGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
							
								
								
									
										15
									
								
								Shared/Models/Type.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Shared/Models/Type.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record Type( | ||||
|     [property: JsonPropertyName("count")] int Count, | ||||
|     [property: JsonPropertyName("match")] string Match, | ||||
|     [property: JsonPropertyName("searchData")] SearchData SearchData | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(Type))] | ||||
| public partial class TypeGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
							
								
								
									
										13
									
								
								Shared/Models/XAccntParentMap.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Shared/Models/XAccntParentMap.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace View_by_Distance.Shared.Models; | ||||
|  | ||||
| public record XAccntParentMap( | ||||
|  | ||||
| ); | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| [JsonSerializable(typeof(XAccntParentMap))] | ||||
| public partial class XAccntParentMapGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
| @ -17,6 +17,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -37,6 +54,7 @@ public class AppSettings | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -98,7 +98,22 @@ public class Configuration | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| #pragma warning restore csharp_preserve_single_line_statements | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, Configuration? configuration) | ||||
|     { | ||||
|         if (configuration?.CheckDFaceAndUpWriteDates is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.Configuration Get(Configuration? configuration, Property.Models.Configuration propertyConfiguration) | ||||
|     { | ||||
| @ -278,14 +293,19 @@ public class Configuration | ||||
|         Models.Configuration result; | ||||
|         Configuration? configuration; | ||||
|         if (isEnvironment is null) | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationRoot.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         else | ||||
|         { | ||||
|             string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment); | ||||
|             string section = string.Concat(environmentName, ":", nameof(Configuration)); | ||||
|             IConfigurationSection configurationSection = configurationRoot.GetSection(section); | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationSection.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         } | ||||
|         PreVerify(configurationRoot, configuration); | ||||
|         result = Get(configuration, propertyConfiguration); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -301,7 +301,7 @@ public partial class UnitTestHardCoded | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void TestMethodRenameForUnkown() | ||||
|     public void TestMethodRenameForUnknown() | ||||
|     { | ||||
|         string directory = "D:/1-Images-A/Images-7007a9df-Results/E)Distance/7007a9df/(RectInt-2023-06-19-less-0.99)"; | ||||
|         if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) | ||||
|  | ||||
| @ -17,6 +17,23 @@ public class AppSettings | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) | ||||
|     { | ||||
|         if (appSettings?.Company is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
| @ -37,6 +54,7 @@ public class AppSettings | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         PreVerify(configurationRoot, appSettings); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -98,7 +98,22 @@ public class Configuration | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| #pragma warning restore csharp_preserve_single_line_statements | ||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, Configuration? configuration) | ||||
|     { | ||||
|         if (configuration?.CheckDFaceAndUpWriteDates is null) | ||||
|         { | ||||
|             List<string> paths = []; | ||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||
|             { | ||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||
|                     continue; | ||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||
|                     continue; | ||||
|                 paths.Add(physicalFileProvider.Root); | ||||
|             } | ||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static Models.Configuration Get(Configuration? configuration, Property.Models.Configuration propertyConfiguration) | ||||
|     { | ||||
| @ -278,14 +293,19 @@ public class Configuration | ||||
|         Models.Configuration result; | ||||
|         Configuration? configuration; | ||||
|         if (isEnvironment is null) | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationRoot.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         else | ||||
|         { | ||||
|             string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment); | ||||
|             string section = string.Concat(environmentName, ":", nameof(Configuration)); | ||||
|             IConfigurationSection configurationSection = configurationRoot.GetSection(section); | ||||
| #pragma warning disable IL3050, IL2026 | ||||
|             configuration = configurationSection.Get<Configuration>(); | ||||
| #pragma warning restore IL3050, IL2026 | ||||
|         } | ||||
|         PreVerify(configurationRoot, configuration); | ||||
|         result = Get(configuration, propertyConfiguration); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user