diff --git a/Compare/Models/Configuration.cs b/Compare/Models/Configuration.cs index b231958..4b7b61e 100644 --- a/Compare/Models/Configuration.cs +++ b/Compare/Models/Configuration.cs @@ -36,10 +36,4 @@ public class Configuration return result; } - public void SetAndUpdate(Property.Models.Configuration configuration, int? numberOfJitters, int? numberOfTimesToUpsample, string? modelName, string? predictorModelName) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(numberOfJitters, numberOfTimesToUpsample, modelName, predictorModelName); - } - } \ No newline at end of file diff --git a/Compare/Models/Stateless/Configuration.cs b/Compare/Models/Stateless/Configuration.cs index fef7e4c..fd93569 100644 --- a/Compare/Models/Stateless/Configuration.cs +++ b/Compare/Models/Stateless/Configuration.cs @@ -19,7 +19,6 @@ public abstract class Configuration if (result is null) throw new Exception(json); string jsonThis = result.ToString(); - result.SetAndUpdate(propertyConfiguration, null, null, null, null); if (jsonThis != json) { int? check = null; diff --git a/Copy-Distinct/CopyDistinct.cs b/Copy-Distinct/CopyDistinct.cs index e720c03..d4edf6c 100644 --- a/Copy-Distinct/CopyDistinct.cs +++ b/Copy-Distinct/CopyDistinct.cs @@ -34,7 +34,6 @@ public class CopyDistinct Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration); _PropertyConfiguration = propertyConfiguration; _Configuration = configuration; - propertyConfiguration.Update(); log.Information(propertyConfiguration.RootDirectory); (bool move, List filesCollection, bool anyLenFiles, bool moveBack) = Verify(); _FileGroups = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(propertyConfiguration, appSettings.CopyTo, new string[] { appSettings.ResultDirectoryKey }); diff --git a/Copy-Distinct/Models/Binder/Configuration.cs b/Copy-Distinct/Models/Binder/Configuration.cs index 92e158e..32d35fe 100644 --- a/Copy-Distinct/Models/Binder/Configuration.cs +++ b/Copy-Distinct/Models/Binder/Configuration.cs @@ -52,7 +52,6 @@ public class Configuration configuration = configurationSection.Get(); } result = Get(configuration); - result.SetAndUpdate(propertyConfiguration); return result; } diff --git a/Copy-Distinct/Models/Configuration.cs b/Copy-Distinct/Models/Configuration.cs index bdfe904..4ca5eb9 100644 --- a/Copy-Distinct/Models/Configuration.cs +++ b/Copy-Distinct/Models/Configuration.cs @@ -29,10 +29,4 @@ public class Configuration return result; } - public void SetAndUpdate(Property.Models.Configuration configuration) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(); - } - } \ No newline at end of file diff --git a/Date-Group/Models/Binder/Configuration.cs b/Date-Group/Models/Binder/Configuration.cs index 13d701f..1c2ca9f 100644 --- a/Date-Group/Models/Binder/Configuration.cs +++ b/Date-Group/Models/Binder/Configuration.cs @@ -70,7 +70,6 @@ public class Configuration result = Get(configuration); if (configuration is null) throw new NullReferenceException(nameof(configuration)); - result.SetAndUpdate(propertyConfiguration); return result; } diff --git a/Date-Group/Models/Configuration.cs b/Date-Group/Models/Configuration.cs index f51ed57..baa92ee 100644 --- a/Date-Group/Models/Configuration.cs +++ b/Date-Group/Models/Configuration.cs @@ -34,10 +34,4 @@ public class Configuration return result; } - public void SetAndUpdate(Property.Models.Configuration configuration) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(); - } - } \ No newline at end of file diff --git a/Delete-By-Distinct/DeleteByDistinct.cs b/Delete-By-Distinct/DeleteByDistinct.cs index 9f2ed4d..8919d95 100644 --- a/Delete-By-Distinct/DeleteByDistinct.cs +++ b/Delete-By-Distinct/DeleteByDistinct.cs @@ -22,7 +22,6 @@ public class DeleteByDistinct Dictionary> keyValuePairs = new(); Configuration configuration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; - configuration.Update(); log.Information(configuration.RootDirectory); if (!appSettings.TicksForLong && !appSettings.SizeForLong) throw new Exception("Check appSettings file!"); diff --git a/Delete-By-Relative/DeleteByRelative.cs b/Delete-By-Relative/DeleteByRelative.cs index 168d27d..91d4baf 100644 --- a/Delete-By-Relative/DeleteByRelative.cs +++ b/Delete-By-Relative/DeleteByRelative.cs @@ -22,7 +22,6 @@ public class DeleteByRelative long ticks = DateTime.Now.Ticks; ILogger? log = Log.ForContext(); Configuration configuration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); - configuration.Update(); log.Information(configuration.RootDirectory); int length = configuration.RootDirectory.Length; if (string.IsNullOrEmpty(appSettings.CompareRootDirectory) || Path.GetFullPath(appSettings.CompareRootDirectory) == Path.GetFullPath(configuration.RootDirectory)) diff --git a/Drag-Drop-Search/Models/Binder/Configuration.cs b/Drag-Drop-Search/Models/Binder/Configuration.cs index 89b741d..d9ecf18 100644 --- a/Drag-Drop-Search/Models/Binder/Configuration.cs +++ b/Drag-Drop-Search/Models/Binder/Configuration.cs @@ -180,7 +180,6 @@ public class Configuration configuration = configurationSection.Get(); } result = Get(configuration); - result.SetAndUpdate(propertyConfiguration); return result; } diff --git a/Drag-Drop-Search/Models/Configuration.cs b/Drag-Drop-Search/Models/Configuration.cs index a48b0f3..7ae013d 100644 --- a/Drag-Drop-Search/Models/Configuration.cs +++ b/Drag-Drop-Search/Models/Configuration.cs @@ -136,10 +136,4 @@ public class Configuration return result; } - public void SetAndUpdate(Property.Models.Configuration configuration) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(); - } - } \ No newline at end of file diff --git a/Drag-Drop-Set-Property-Item/Drag-Drop-Set-Property-Item.csproj b/Drag-Drop-Set-Property-Item/Drag-Drop-Set-Property-Item.csproj index f8b27be..7185e03 100644 --- a/Drag-Drop-Set-Property-Item/Drag-Drop-Set-Property-Item.csproj +++ b/Drag-Drop-Set-Property-Item/Drag-Drop-Set-Property-Item.csproj @@ -41,12 +41,4 @@ - - - Always - - - Always - - \ No newline at end of file diff --git a/Drag-Drop-Set-Property-Item/DragDropSetPropertyItem.cs b/Drag-Drop-Set-Property-Item/DragDropSetPropertyItem.cs index 4e15c64..13f97f6 100644 --- a/Drag-Drop-Set-Property-Item/DragDropSetPropertyItem.cs +++ b/Drag-Drop-Set-Property-Item/DragDropSetPropertyItem.cs @@ -48,8 +48,6 @@ public partial class DragDropSetPropertyItem : Form isEnvironment = new(processesCount: null, nullASPNetCoreEnvironmentIsDevelopment: debuggerWasAttachedAtLineZero, nullASPNetCoreEnvironmentIsProduction: !debuggerWasAttachedAtLineZero); IConfigurationBuilder configurationBuilder = new ConfigurationBuilder() .AddEnvironmentVariables() - .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) - .AddJsonFile(isEnvironment.AppSettingsFileName, optional: false, reloadOnChange: true) .AddUserSecrets(); configurationRoot = configurationBuilder.Build(); appSettings = Models.Binder.AppSettings.Get(configurationRoot); @@ -62,7 +60,6 @@ public partial class DragDropSetPropertyItem : Form logger = Log.ForContext(); Property.Models.Configuration propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); _PropertyConfiguration = propertyConfiguration; - propertyConfiguration.Update(); logger.Information("Complete"); _Logger = logger; _AppSettings = appSettings; diff --git a/Drag-Drop-Set-Property-Item/appsettings.Development.json b/Drag-Drop-Set-Property-Item/appsettings.Development.json deleted file mode 100644 index be482be..0000000 --- a/Drag-Drop-Set-Property-Item/appsettings.Development.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Log4netProvider": "Debug" - } - }, - "MaxDegreeOfParallelism": 6, - "Serilog": { - "MinimumLevel": "Debug" - } -} \ No newline at end of file diff --git a/Drag-Drop-Set-Property-Item/appsettings.json b/Drag-Drop-Set-Property-Item/appsettings.json deleted file mode 100644 index e64fd3b..0000000 --- a/Drag-Drop-Set-Property-Item/appsettings.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "Company": "Mike Phares", - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Log4netProvider": "Debug", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "IgnoreRulesKeyWords": [], - "MaxDegreeOfParallelism": 6, - "Serilog": { - "Using": [ - "Serilog.Sinks.Console", - "Serilog.Sinks.File" - ], - "MinimumLevel": "Information", - "WriteTo": [ - { - "Name": "Debug", - "Args": { - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}" - } - }, - { - "Name": "Console", - "Args": { - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "%workingDirectory% - Log/log-.txt", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}", - "rollingInterval": "Hour" - } - } - ], - "Enrich": [ - "FromLogContext", - "WithMachineName", - "WithThreadId" - ], - "Properties": { - "Application": "Sample" - } - }, - "ValidKeyWords": [ - "Review" - ], - "WorkingDirectoryName": "PharesApps", - "Windows": { - "Configuration": { - "DateGroup": "dd514b88", - "DiffPropertyDirectory": "", - "FileNameDirectorySeparator": ".Z.", - "ForcePropertyLastWriteTimeToCreationTime": false, - "MaxImagesInDirectoryForTopLevelFirstPass": 10, - "OutputExtension": ".jpg", - "Pattern": "[^ABCDEFGHIJKLMNOPQRSTUVWXYZbcdfghjklmnpqrstvwxyz0-9]", - "PopulatePropertyId": true, - "PropertiesChangedForProperty": false, - "ResultAllInOne": "_ _ _", - "ResultAllInOneSubdirectoryLength": 2, - "ResultCollection": "[]", - "ResultContent": "()", - "ResultSingleton": "{}", - "RootDirectory": "C:/Tmp/Phares/Compare/Images-dd514b88", - "IgnoreExtensions": [ - ".gif", - ".GIF", - ".nef", - ".NEF", - ".pdf", - ".PDF" - ], - "ValidImageFormatExtensions": [ - ".bmp", - ".BMP", - ".gif", - ".GIF", - ".jpeg", - ".JPEG", - ".jpg", - ".JPG", - ".png", - ".PNG", - ".tiff", - ".TIFF", - ".tif", - ".TIF" - ] - } - } -} \ No newline at end of file diff --git a/Duplicate-Search/DuplicateSearch.cs b/Duplicate-Search/DuplicateSearch.cs index 420c75d..df4452b 100644 --- a/Duplicate-Search/DuplicateSearch.cs +++ b/Duplicate-Search/DuplicateSearch.cs @@ -24,7 +24,6 @@ public class DuplicateSearch long ticks = DateTime.Now.Ticks; ILogger? log = Log.ForContext(); Configuration configuration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); - configuration.Update(); log.Information(configuration.RootDirectory); if (appSettings.IndexOnly) WriteIndexData(ticks, configuration, searchPattern); diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index 13d7bf0..6d9159a 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -195,6 +195,15 @@ public partial class DlibDotNet private static void Verify(Models.Configuration configuration) { + if (configuration.RangeDaysDeltaTolerance.Length != 3) + throw new NullReferenceException(nameof(configuration.RangeDaysDeltaTolerance)); + if (configuration.RangeDistanceTolerance.Length != 3) + throw new NullReferenceException(nameof(configuration.RangeDistanceTolerance)); + if (configuration.RangeFaceAreaPermyriadTolerance.Length != 3) + throw new NullReferenceException(nameof(configuration.RangeFaceAreaPermyriadTolerance)); + if (configuration.RangeFaceConfidence.Length != 3) + throw new NullReferenceException(nameof(configuration.RangeFaceConfidence)); + _ = DateTime.Now.AddDays(-configuration.RangeDaysDeltaTolerance[1]); if (configuration.OutputResolutions.Length == 0 || string.IsNullOrEmpty(configuration.OutputResolutions[0]) || !configuration.ValidResolutions.Contains(configuration.OutputResolutions[0])) throw new NullReferenceException($"{nameof(configuration.OutputResolutions)} must be fileNameToCollection valid outputResolution!"); if ((from l in configuration.OutputResolutions where !configuration.ValidResolutions.Contains(l) select false).Any()) @@ -783,7 +792,7 @@ public partial class DlibDotNet SortingContainer[] sortingContainers; FaceDistanceContainer[] filteredFaceDistanceContainers; long? skipOlderThan = _Configuration.SkipOlderThanDays is null ? null : new DateTime(ticks).AddDays(-_Configuration.SkipOlderThanDays.Value).Ticks; - distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh); + distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaPermyriadTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh); filteredFaceDistanceContainers = E_Distance.FilteredFaceDistanceContainers(mapLogic, faceDistanceContainers, skipOlderThan, distanceLimits); if (filteredFaceDistanceContainers.Length == 0) _Log.Information("All images have been filtered!"); @@ -794,7 +803,7 @@ public partial class DlibDotNet { for (useFiltersCounter = 1; useFiltersCounter < _Configuration.UseFilterTries; useFiltersCounter++) { - distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh, useFiltersCounter); + distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaPermyriadTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh, useFiltersCounter); filteredFaceDistanceContainers = E_Distance.FilteredFaceDistanceContainers(mapLogic, faceDistanceContainers, skipOlderThan, distanceLimits); if (filteredFaceDistanceContainers.Length == 0) _Log.Information("All images have been filtered!"); @@ -1238,7 +1247,7 @@ public partial class DlibDotNet && _Exceptions.Count == 0) MapLogic(ticks, new(containers), fPhotoPrismContentDirectory, mapLogic, outputResolution, new(personKeyToIds), distinctFilteredFaces, distinctFilteredMappingCollection); if (_Configuration.SaveRandomForOutputResolutions.Contains(outputResolution) && personKeyToIds.Count > 0 && distinctFilteredMappingCollection.Count > 0) - _Random.Random(_Configuration.PropertyConfiguration, _Configuration.ValidKeyWordsToIgnoreInRandom, outputResolution, personKeyToIds, distinctFilteredMappingCollection); + _Random.Random(_Configuration.PropertyConfiguration, _Configuration.RadomUseBirthdayMinimum, _Configuration.ValidKeyWordsToIgnoreInRandom, outputResolution, personKeyToIds, distinctFilteredMappingCollection); if (_IsEnvironment.Development) continue; if (!_IsEnvironment.Development) diff --git a/Instance/Models/Binder/.editorconfig b/Instance/Models/Binder/.editorconfig new file mode 100644 index 0000000..1c444cd --- /dev/null +++ b/Instance/Models/Binder/.editorconfig @@ -0,0 +1,2 @@ +[*.cs] +csharp_preserve_single_line_statements = true \ No newline at end of file diff --git a/Instance/Models/Binder/AppSettings.cs b/Instance/Models/Binder/AppSettings.cs index 7b1c3dd..b418c20 100644 --- a/Instance/Models/Binder/AppSettings.cs +++ b/Instance/Models/Binder/AppSettings.cs @@ -7,13 +7,9 @@ namespace View_by_Distance.Instance.Models.Binder; public class AppSettings { -#nullable disable - - public string Company { get; set; } + public string? Company { get; set; } public int? MaxDegreeOfParallelism { get; set; } - public string WorkingDirectoryName { get; set; } - -#nullable restore + public string? WorkingDirectoryName { get; set; } public override string ToString() { @@ -24,8 +20,9 @@ public class AppSettings private static Models.AppSettings Get(AppSettings? appSettings) { Models.AppSettings result; - if (appSettings?.MaxDegreeOfParallelism is null) - throw new NullReferenceException(nameof(appSettings.MaxDegreeOfParallelism)); + if (appSettings?.Company is null) throw new NullReferenceException(nameof(appSettings.Company)); + if (appSettings?.MaxDegreeOfParallelism is null) throw new NullReferenceException(nameof(appSettings.MaxDegreeOfParallelism)); + if (appSettings?.WorkingDirectoryName is null) throw new NullReferenceException(nameof(appSettings.WorkingDirectoryName)); result = new( appSettings.Company, appSettings.MaxDegreeOfParallelism.Value, diff --git a/Instance/Models/Binder/Configuration.cs b/Instance/Models/Binder/Configuration.cs index a412abd..24a9b78 100644 --- a/Instance/Models/Binder/Configuration.cs +++ b/Instance/Models/Binder/Configuration.cs @@ -1,6 +1,5 @@ using Microsoft.Extensions.Configuration; using Phares.Shared; -using System.ComponentModel.DataAnnotations; using System.Text.Json; namespace View_by_Distance.Instance.Models.Binder; @@ -8,94 +7,90 @@ namespace View_by_Distance.Instance.Models.Binder; public class Configuration { -#nullable disable - - [Display(Name = "Check D Face and Up Dates"), Required] public bool? CheckDFaceAndUpWriteDates { get; set; } - [Display(Name = "Check Json For Distance Results"), Required] public bool? CheckJsonForDistanceResults { get; set; } - [Display(Name = "Copy Faces and Face Landmark for Output Resolutions"), Required] public string[] CopyFacesAndSaveFaceLandmarkForOutputResolutions { get; set; } - [Display(Name = "CrossDirectory Max Items In Distance Collection"), Required] public int? CrossDirectoryMaxItemsInDistanceCollection { get; set; } - [Display(Name = "Delete Possible Duplicates"), Required] public bool? DeletePossibleDuplicates { get; set; } - [Display(Name = "Distance Factor"), Required] public int? DistanceFactor { get; set; } - [Display(Name = "Distance Move Unable to Match by 1 Tick"), Required] public bool? DistanceMoveUnableToMatch { get; set; } - [Display(Name = "Distance Pixel Distance Tolerance"), Required] public int? DistancePixelDistanceTolerance { get; set; } - [Display(Name = "Distance Rename to Match"), Required] public bool? DistanceRenameToMatch { get; set; } - [Display(Name = "Eye Threshold"), Required] public int? EyeThreshold { get; set; } - [Display(Name = "Face Area Permille"), Required] public int? FaceAreaPermyriad { get; set; } - [Display(Name = "Face Distance Hidden Image Factor"), Required] public int? FaceDistanceHiddenImageFactor { get; set; } - [Display(Name = "Face Confidence Percent"), Required] public int? FaceConfidencePercent { get; set; } - [Display(Name = "Face Distance Permyriad"), Required] public int? FaceDistancePermyriad { get; set; } - [Display(Name = "Focus Directory"), Required] public string FocusDirectory { get; set; } - [Display(Name = "Focus Model"), Required] public string FocusModel { get; set; } - [Display(Name = "Force Face Last Write Time to Creation Time"), Required] public bool? ForceFaceLastWriteTimeToCreationTime { get; set; } - [Display(Name = "Force Metadata Last Write Time to Creation Time"), Required] public bool? ForceMetadataLastWriteTimeToCreationTime { get; set; } - [Display(Name = "Force Resize Last Write Time to Creation Time"), Required] public bool? ForceResizeLastWriteTimeToCreationTime { get; set; } - [Display(Name = "GenealogicalDataCommunication File"), Required] public string GenealogicalDataCommunicationFile { get; set; } - [Display(Name = "Ignore Extensions"), Required] public string[] IgnoreExtensions { get; set; } - [Display(Name = "Julie Phares Copy Birthdays"), Required] public string[] JLinks { get; set; } - [Display(Name = "Load Or Create Then Save Distance Results"), Required] public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } - [Display(Name = "Load Or Create Then Save Image Faces Results"), Required] public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } - [Display(Name = "Load PhotoPrism Locations"), Required] public bool? LoadPhotoPrismLocations { get; set; } - [Display(Name = "Location Containers Distance Tolerance"), Required] public float? LocationContainerDistanceTolerance { get; set; } - [Display(Name = "Location Digits"), Required] public int? LocationDigits { get; set; } - [Display(Name = "Location Factor"), Required] public int? LocationFactor { get; set; } - [Display(Name = "Look for Abandoned"), Required] public bool? LookForAbandoned { get; set; } - [Display(Name = "Mapping Default Name"), Required] public string MappingDefaultName { get; set; } - [Display(Name = "Mapping Use Deterministic Hash Code Unknown Face Key Value Pairs for Add to Mapping"), Required] public bool? MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping { get; set; } - [Display(Name = "Mapping Use Deterministic Hash Code Unknown Face Key Value Pairs for Save Mapping"), Required] public bool? MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping { get; set; } - [Display(Name = "Mixed Year Relative Paths"), Required] public string[] MixedYearRelativePaths { get; set; } - [Display(Name = "Model Directory"), Required] public string ModelDirectory { get; set; } - [Display(Name = "Model Name"), Required] public string ModelName { get; set; } - [Display(Name = "Number Jitters"), Required] public int? NumberOfJitters { get; set; } - [Display(Name = "Number of Times To Up Sample"), Required] public int? NumberOfTimesToUpsample { get; set; } - [Display(Name = "Output Extension"), Required] public string OutputExtension { get; set; } - [Display(Name = "Output Quality"), Required] public int? OutputQuality { get; set; } - [Display(Name = "Output Resolutions"), Required] public string[] OutputResolutions { get; set; } - [Display(Name = "Override For Face Images"), Required] public bool? OverrideForFaceImages { get; set; } - [Display(Name = "Override For Face Landmark Images"), Required] public bool? OverrideForFaceLandmarkImages { get; set; } - [Display(Name = "Override For Resize Images"), Required] public bool? OverrideForResizeImages { get; set; } - [Display(Name = "Person Birthday First Year"), Required] public int? PersonBirthdayFirstYear { get; set; } - [Display(Name = "Person Birthday Format"), Required] public string PersonBirthdayFormat { get; set; } - [Display(Name = "Person Characters"), Required] public string PersonCharacters { get; set; } - [Display(Name = "Person Characters Copy Count"), Required] public int? PersonCharactersCopyCount { get; set; } - [Display(Name = "PersonKey Format"), Required] public string PersonKeyFormat { get; set; } - [Display(Name = "Predictor Model Name"), Required] public string PredictorModelName { get; set; } - [Display(Name = "Properties Changed For Distance"), Required] public bool? PropertiesChangedForDistance { get; set; } - [Display(Name = "Properties Changed For Faces"), Required] public bool? PropertiesChangedForFaces { get; set; } - [Display(Name = "Properties Changed For Index"), Required] public bool? PropertiesChangedForIndex { get; set; } - [Display(Name = "Properties Changed For Metadata"), Required] public bool? PropertiesChangedForMetadata { get; set; } - [Display(Name = "Properties Changed For Resize"), Required] public bool? PropertiesChangedForResize { get; set; } - [Display(Name = "Property Configuration"), Required] public Property.Models.Configuration PropertyConfiguration { get; set; } - [Display(Name = "Sorting Days Delta Tolerance"), Required] public int[] RangeDaysDeltaTolerance { get; set; } - [Display(Name = "Face Distance Tolerance"), Required] public float[] RangeDistanceTolerance { get; set; } - [Display(Name = "Face Area Permille Tolerance"), Required] public float[] RangeFaceAreaTolerance { get; set; } - [Display(Name = "Location Minimum Confidence"), Required] public float[] RangeFaceConfidence { get; set; } - [Display(Name = "Rectangle Intersect Minimums"), Required] public float[] RectangleIntersectMinimums { get; set; } - [Display(Name = "Reverse"), Required] public bool? Reverse { get; set; } - [Display(Name = "Save Blur Hash For Output Resolutions"), Required] public string[] SaveBlurHashForOutputResolutions { get; set; } - [Display(Name = "Save Face Distances For Output Resolutions"), Required] public string[] SaveFaceDistancesForOutputResolutions { get; set; } - [Display(Name = "Save Face Landmark For Output Resolutions"), Required] public string[] SaveFaceLandmarkForOutputResolutions { get; set; } - [Display(Name = "Save Full Year Of Random Files"), Required] public bool? SaveFullYearOfRandomFiles { get; set; } - [Display(Name = "Save Mapped"), Required] public string[] SaveMappedForOutputResolutions { get; set; } - [Display(Name = "Save Resized Images by Person Key Formatted"), Required] public string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions { get; set; } - [Display(Name = "Save For Individually"), Required] public bool? SaveIndividually { get; set; } - [Display(Name = "Save Property Shortcuts for Output Resolutions"), Required] public string[] SavePropertyShortcutsForOutputResolutions { get; set; } - [Display(Name = "Save Random For Output Resolutions"), Required] public string[] SaveRandomForOutputResolutions { get; set; } - [Display(Name = "Save Resized Subfiles"), Required] public bool? SaveResizedSubfiles { get; set; } - [Display(Name = "Save Shortcuts"), Required] public string[] SaveShortcutsForOutputResolutions { get; set; } - [Display(Name = "Save Sorting Without Person"), Required] public bool? SaveSortingWithoutPerson { get; set; } - [Display(Name = "Skip Not Skip Directories"), Required] public string[] SkipNotSkipDirectories { get; set; } - [Display(Name = "Skip Older Than Days"), Required] public int? SkipOlderThanDays { get; set; } - [Display(Name = "Skip Person With More Then"), Required] public int? SkipPersonWithMoreThen { get; set; } - [Display(Name = "Skip Search"), Required] public bool? SkipSearch { get; set; } - [Display(Name = "SortingMaximumPerFaceShould be High"), Required] public int? SortingMaximumPerFaceShouldBeHigh { get; set; } - [Display(Name = "Sorting Maximum Per Key"), Required] public int? SortingMaximumPerKey { get; set; } - [Display(Name = "Sorting Minimum to use Sigma"), Required] public int? SortingMinimumToUseSigma { get; set; } - [Display(Name = "Test Distance Results"), Required] public bool? TestDistanceResults { get; set; } - [Display(Name = "Use Filter Tries"), Required] public int? UseFilterTries { get; set; } - [Display(Name = "Valid KeyWords to Ignore in Random"), Required] public string[] ValidKeyWordsToIgnoreInRandom { get; set; } - [Display(Name = "Valid Resolutions"), Required] public string[] ValidResolutions { get; set; } - -#nullable restore + public bool? CheckDFaceAndUpWriteDates { get; set; } + public bool? CheckJsonForDistanceResults { get; set; } + public string[]? CopyFacesAndSaveFaceLandmarkForOutputResolutions { get; set; } + public int? CrossDirectoryMaxItemsInDistanceCollection { get; set; } + public bool? DeletePossibleDuplicates { get; set; } + public int? DistanceFactor { get; set; } + public bool? DistanceMoveUnableToMatch { get; set; } + public int? DistancePixelDistanceTolerance { get; set; } + public bool? DistanceRenameToMatch { get; set; } + public int? EyeThreshold { get; set; } + public int? FaceAreaPermyriad { get; set; } + public int? FaceConfidencePercent { get; set; } + public int? FaceDistanceHiddenImageFactor { get; set; } + public int? FaceDistancePermyriad { get; set; } + public string? FocusDirectory { get; set; } + public string? FocusModel { get; set; } + public bool? ForceFaceLastWriteTimeToCreationTime { get; set; } + public bool? ForceMetadataLastWriteTimeToCreationTime { get; set; } + public bool? ForceResizeLastWriteTimeToCreationTime { get; set; } + public string? GenealogicalDataCommunicationFile { get; set; } + public string[]? IgnoreExtensions { get; set; } + public string[]? JLinks { get; set; } + public string[]? LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } + public string[]? LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } + public bool? LoadPhotoPrismLocations { get; set; } + public float? LocationContainerDistanceTolerance { get; set; } + public int? LocationDigits { get; set; } + public int? LocationFactor { get; set; } + public bool? LookForAbandoned { get; set; } + public string? MappingDefaultName { get; set; } + public bool? MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping { get; set; } + public bool? MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping { 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 int? OutputQuality { get; set; } + public string[]? OutputResolutions { get; set; } + public bool? OverrideForFaceImages { get; set; } + public bool? OverrideForFaceLandmarkImages { get; set; } + public bool? OverrideForResizeImages { get; set; } + public int? PersonBirthdayFirstYear { get; set; } + public string? PersonBirthdayFormat { get; set; } + public string? PersonCharacters { get; set; } + public int? PersonCharactersCopyCount { get; set; } + public string? PersonKeyFormat { 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 int? RadomUseBirthdayMinimum { get; set; } + public int[]? RangeDaysDeltaTolerance { get; set; } + public float[]? RangeDistanceTolerance { get; set; } + public float[]? RangeFaceAreaTolerance { get; set; } + public float[]? RangeFaceConfidence { get; set; } + public float[]? RectangleIntersectMinimums { get; set; } + public bool? Reverse { get; set; } + public string[]? SaveBlurHashForOutputResolutions { get; set; } + public string[]? SaveFaceDistancesForOutputResolutions { get; set; } + public string[]? SaveFaceLandmarkForOutputResolutions { get; set; } + public string[]? SaveFilteredOriginalImagesFromJLinksForOutputResolutions { get; set; } + public bool? SaveFullYearOfRandomFiles { get; set; } + public bool? SaveIndividually { get; set; } + public string[]? SaveMappedForOutputResolutions { get; set; } + public string[]? SavePropertyShortcutsForOutputResolutions { get; set; } + public string[]? SaveRandomForOutputResolutions { get; set; } + public bool? SaveResizedSubfiles { get; set; } + public string[]? SaveShortcutsForOutputResolutions { get; set; } + public bool? SaveSortingWithoutPerson { get; set; } + public string[]? SkipNotSkipDirectories { get; set; } + public int? SkipOlderThanDays { get; set; } + public int? SkipPersonWithMoreThen { get; set; } + public bool? SkipSearch { get; set; } + public int? SortingMaximumPerFaceShouldBeHigh { get; set; } + public int? SortingMaximumPerKey { get; set; } + public int? SortingMinimumToUseSigma { get; set; } + public bool? TestDistanceResults { get; set; } + public int? UseFilterTries { get; set; } + public string[]? ValidKeyWordsToIgnoreInRandom { get; set; } + public string[]? ValidResolutions { get; set; } public override string ToString() { @@ -103,154 +98,99 @@ public class Configuration return result; } - private static Models.Configuration Get(Configuration? configuration) +#pragma warning restore csharp_preserve_single_line_statements + + private static Models.Configuration Get(Configuration? configuration, Property.Models.Configuration propertyConfiguration) { Models.Configuration result; - if (configuration is null) - throw new NullReferenceException(nameof(configuration)); - if (configuration.CheckDFaceAndUpWriteDates is null) - throw new NullReferenceException(nameof(configuration.CheckDFaceAndUpWriteDates)); - if (configuration.CheckJsonForDistanceResults is null) - throw new NullReferenceException(nameof(configuration.CheckJsonForDistanceResults)); - configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions ??= Array.Empty(); - if (configuration.CrossDirectoryMaxItemsInDistanceCollection is null) - throw new NullReferenceException(nameof(configuration.CrossDirectoryMaxItemsInDistanceCollection)); - if (configuration.DeletePossibleDuplicates is null) - throw new NullReferenceException(nameof(configuration.DeletePossibleDuplicates)); - if (configuration.DistanceFactor is null) - throw new NullReferenceException(nameof(configuration.DistanceFactor)); - if (configuration.DistanceMoveUnableToMatch is null) - throw new NullReferenceException(nameof(configuration.DistanceMoveUnableToMatch)); - if (configuration.DistancePixelDistanceTolerance is null) - throw new NullReferenceException(nameof(configuration.DistancePixelDistanceTolerance)); - if (configuration.DistanceRenameToMatch is null) - throw new NullReferenceException(nameof(configuration.DistanceRenameToMatch)); - if (configuration.EyeThreshold is null) - throw new NullReferenceException(nameof(configuration.EyeThreshold)); - if (configuration.FaceAreaPermyriad is null) - throw new NullReferenceException(nameof(configuration.FaceAreaPermyriad)); - if (configuration.FaceDistanceHiddenImageFactor is null) - throw new NullReferenceException(nameof(configuration.FaceDistanceHiddenImageFactor)); - if (configuration.FaceConfidencePercent is null) - throw new NullReferenceException(nameof(configuration.FaceConfidencePercent)); - if (configuration.FaceDistancePermyriad is null) - throw new NullReferenceException(nameof(configuration.FaceDistancePermyriad)); - if (configuration.FocusDirectory is null) - throw new NullReferenceException(nameof(configuration.FocusDirectory)); - if (configuration.FocusModel is null) - throw new NullReferenceException(nameof(configuration.FocusModel)); - 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.GenealogicalDataCommunicationFile is null) - throw new NullReferenceException(nameof(configuration.GenealogicalDataCommunicationFile)); - if (configuration.IgnoreExtensions is null) - throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); - configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions ??= Array.Empty(); - configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions ??= Array.Empty(); - if (configuration.LoadPhotoPrismLocations is null) - throw new NullReferenceException(nameof(configuration.LoadPhotoPrismLocations)); - if (configuration.LocationDigits is null) - throw new NullReferenceException(nameof(configuration.LocationDigits)); - if (configuration.LocationFactor is null) - throw new NullReferenceException(nameof(configuration.LocationFactor)); - if (configuration.LookForAbandoned is null) - throw new NullReferenceException(nameof(configuration.LookForAbandoned)); - if (configuration.MappingDefaultName is null) - throw new NullReferenceException(nameof(configuration.MappingDefaultName)); - if (configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping is null) - throw new NullReferenceException(nameof(configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping)); - if (configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping is null) - throw new NullReferenceException(nameof(configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping)); - if (configuration.MixedYearRelativePaths is null) - throw new NullReferenceException(nameof(configuration.MixedYearRelativePaths)); - if (configuration.NumberOfJitters is null) - throw new NullReferenceException(nameof(configuration.NumberOfJitters)); - if (configuration.NumberOfTimesToUpsample is null) - throw new NullReferenceException(nameof(configuration.NumberOfTimesToUpsample)); - 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.PersonBirthdayFirstYear is null) - throw new NullReferenceException(nameof(configuration.PersonBirthdayFirstYear)); - if (configuration.PersonBirthdayFormat is null) - throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); - if (configuration.PersonCharacters is null) - throw new NullReferenceException(nameof(configuration.PersonCharacters)); - if (configuration.PersonCharactersCopyCount is null) - throw new NullReferenceException(nameof(configuration.PersonCharactersCopyCount)); - if (configuration.PersonKeyFormat is null) - throw new NullReferenceException(nameof(configuration.PersonKeyFormat)); - 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)); - if (configuration.PropertiesChangedForMetadata is null) - throw new NullReferenceException(nameof(configuration.PropertiesChangedForMetadata)); - if (configuration.PropertiesChangedForResize is null) - throw new NullReferenceException(nameof(configuration.PropertiesChangedForResize)); - if (configuration.RangeDaysDeltaTolerance is null || configuration.RangeDaysDeltaTolerance.Length != 3) - throw new NullReferenceException(nameof(configuration.RangeDaysDeltaTolerance)); - if (configuration.RangeFaceAreaTolerance is null || configuration.RangeFaceAreaTolerance.Length != 3) - throw new NullReferenceException(nameof(configuration.RangeFaceAreaTolerance)); - if (configuration.RangeFaceConfidence is null || configuration.RangeFaceConfidence.Length != 3) - throw new NullReferenceException(nameof(configuration.RangeFaceConfidence)); - if (configuration.RangeDistanceTolerance is null || configuration.RangeDistanceTolerance.Length != 3) - throw new NullReferenceException(nameof(configuration.RangeDistanceTolerance)); - configuration.RectangleIntersectMinimums ??= Array.Empty(); - if (configuration.Reverse is null) - throw new NullReferenceException(nameof(configuration.Reverse)); - configuration.SaveBlurHashForOutputResolutions ??= Array.Empty(); - configuration.SaveFaceDistancesForOutputResolutions ??= Array.Empty(); - configuration.SaveFaceLandmarkForOutputResolutions ??= Array.Empty(); - if (configuration.SaveFullYearOfRandomFiles is null) - throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); - configuration.SaveMappedForOutputResolutions ??= Array.Empty(); - configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions ??= Array.Empty(); - if (configuration.SaveIndividually is null) - throw new NullReferenceException(nameof(configuration.SaveIndividually)); - configuration.SavePropertyShortcutsForOutputResolutions ??= Array.Empty(); - configuration.SaveRandomForOutputResolutions ??= Array.Empty(); - if (configuration.SaveResizedSubfiles is null) - throw new NullReferenceException(nameof(configuration.SaveResizedSubfiles)); - configuration.SaveShortcutsForOutputResolutions ??= Array.Empty(); - configuration.SaveShortcutsForOutputResolutions ??= Array.Empty(); - configuration.SkipNotSkipDirectories ??= Array.Empty(); - if (configuration.SaveSortingWithoutPerson is null) - throw new NullReferenceException(nameof(configuration.SaveSortingWithoutPerson)); - if (configuration.SkipSearch is null) - throw new NullReferenceException(nameof(configuration.SkipSearch)); - if (configuration.SortingMaximumPerFaceShouldBeHigh is null) - throw new NullReferenceException(nameof(configuration.SortingMaximumPerFaceShouldBeHigh)); - if (configuration.SortingMaximumPerKey is null) - throw new NullReferenceException(nameof(configuration.SortingMaximumPerKey)); - if (configuration.SortingMinimumToUseSigma is null) - throw new NullReferenceException(nameof(configuration.SortingMinimumToUseSigma)); - if (configuration.TestDistanceResults is null) - throw new NullReferenceException(nameof(configuration.TestDistanceResults)); - if (configuration.UseFilterTries is null) - throw new NullReferenceException(nameof(configuration.UseFilterTries)); - if (configuration.ValidKeyWordsToIgnoreInRandom is null) - throw new NullReferenceException(nameof(configuration.ValidKeyWordsToIgnoreInRandom)); - if (configuration.ValidResolutions is null) - throw new NullReferenceException(nameof(configuration.ValidResolutions)); - _ = DateTime.Now.AddDays(-configuration.RangeDaysDeltaTolerance[1]); - result = new(configuration.PropertyConfiguration, + if (configuration is null) throw new NullReferenceException(nameof(configuration)); + if (configuration.CheckDFaceAndUpWriteDates is null) throw new NullReferenceException(nameof(configuration.CheckDFaceAndUpWriteDates)); + if (configuration?.CheckDFaceAndUpWriteDates is null) throw new NullReferenceException(nameof(configuration.CheckDFaceAndUpWriteDates)); + if (configuration?.CheckJsonForDistanceResults is null) throw new NullReferenceException(nameof(configuration.CheckJsonForDistanceResults)); + // if (configuration?.CopyFacesAndSaveFaceLandmarkForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions)); + if (configuration?.CrossDirectoryMaxItemsInDistanceCollection is null) throw new NullReferenceException(nameof(configuration.CrossDirectoryMaxItemsInDistanceCollection)); + if (configuration?.DeletePossibleDuplicates is null) throw new NullReferenceException(nameof(configuration.DeletePossibleDuplicates)); + if (configuration?.DistanceFactor is null) throw new NullReferenceException(nameof(configuration.DistanceFactor)); + if (configuration?.DistanceMoveUnableToMatch is null) throw new NullReferenceException(nameof(configuration.DistanceMoveUnableToMatch)); + if (configuration?.DistancePixelDistanceTolerance is null) throw new NullReferenceException(nameof(configuration.DistancePixelDistanceTolerance)); + if (configuration?.DistanceRenameToMatch is null) throw new NullReferenceException(nameof(configuration.DistanceRenameToMatch)); + if (configuration?.EyeThreshold is null) throw new NullReferenceException(nameof(configuration.EyeThreshold)); + if (configuration?.FaceAreaPermyriad is null) throw new NullReferenceException(nameof(configuration.FaceAreaPermyriad)); + if (configuration?.FaceConfidencePercent is null) throw new NullReferenceException(nameof(configuration.FaceConfidencePercent)); + if (configuration?.FaceDistanceHiddenImageFactor is null) throw new NullReferenceException(nameof(configuration.FaceDistanceHiddenImageFactor)); + if (configuration?.FaceDistancePermyriad is null) throw new NullReferenceException(nameof(configuration.FaceDistancePermyriad)); + if (configuration?.FocusDirectory is null) throw new NullReferenceException(nameof(configuration.FocusDirectory)); + if (configuration?.FocusModel is null) throw new NullReferenceException(nameof(configuration.FocusModel)); + 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?.GenealogicalDataCommunicationFile is null) throw new NullReferenceException(nameof(configuration.GenealogicalDataCommunicationFile)); + // if (configuration?.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); + // if (configuration?.JLinks is null) throw new NullReferenceException(nameof(configuration.JLinks)); + // if (configuration?.LoadOrCreateThenSaveDistanceResultsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions)); + // if (configuration?.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions)); + if (configuration?.LoadPhotoPrismLocations is null) throw new NullReferenceException(nameof(configuration.LoadPhotoPrismLocations)); + // if (configuration?.LocationContainerDistanceTolerance is null) throw new NullReferenceException(nameof(configuration.LocationContainerDistanceTolerance)); + if (configuration?.LocationDigits is null) throw new NullReferenceException(nameof(configuration.LocationDigits)); + if (configuration?.LocationFactor is null) throw new NullReferenceException(nameof(configuration.LocationFactor)); + if (configuration?.LookForAbandoned is null) throw new NullReferenceException(nameof(configuration.LookForAbandoned)); + if (configuration?.MappingDefaultName is null) throw new NullReferenceException(nameof(configuration.MappingDefaultName)); + if (configuration?.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping is null) throw new NullReferenceException(nameof(configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping)); + if (configuration?.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping is null) throw new NullReferenceException(nameof(configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping)); + // 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?.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?.PersonBirthdayFirstYear is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFirstYear)); + if (configuration?.PersonBirthdayFormat is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); + if (configuration?.PersonCharacters is null) throw new NullReferenceException(nameof(configuration.PersonCharacters)); + if (configuration?.PersonCharactersCopyCount is null) throw new NullReferenceException(nameof(configuration.PersonCharactersCopyCount)); + if (configuration?.PersonKeyFormat is null) throw new NullReferenceException(nameof(configuration.PersonKeyFormat)); + 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)); + if (configuration?.PropertiesChangedForMetadata is null) throw new NullReferenceException(nameof(configuration.PropertiesChangedForMetadata)); + if (configuration?.PropertiesChangedForResize is null) throw new NullReferenceException(nameof(configuration.PropertiesChangedForResize)); + if (configuration?.RadomUseBirthdayMinimum is null) throw new NullReferenceException(nameof(configuration.RadomUseBirthdayMinimum)); + // if (configuration?.RangeDaysDeltaTolerance is null) throw new NullReferenceException(nameof(configuration.RangeDaysDeltaTolerance)); + // if (configuration?.RangeDistanceTolerance is null) throw new NullReferenceException(nameof(configuration.RangeDistanceTolerance)); + // if (configuration?.RangeFaceAreaTolerance is null) throw new NullReferenceException(nameof(configuration.RangeFaceAreaTolerance)); + // if (configuration?.RangeFaceConfidence is null) throw new NullReferenceException(nameof(configuration.RangeFaceConfidence)); + // if (configuration?.RectangleIntersectMinimums is null) throw new NullReferenceException(nameof(configuration.RectangleIntersectMinimums)); + if (configuration?.Reverse is null) throw new NullReferenceException(nameof(configuration.Reverse)); + // if (configuration?.SaveBlurHashForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveBlurHashForOutputResolutions)); + // if (configuration?.SaveFaceDistancesForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveFaceDistancesForOutputResolutions)); + // if (configuration?.SaveFaceLandmarkForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveFaceLandmarkForOutputResolutions)); + // if (configuration?.SaveFilteredOriginalImagesFromJLinksForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions)); + if (configuration?.SaveFullYearOfRandomFiles is null) throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); + if (configuration?.SaveIndividually is null) throw new NullReferenceException(nameof(configuration.SaveIndividually)); + // if (configuration?.SaveMappedForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveMappedForOutputResolutions)); + // if (configuration?.SavePropertyShortcutsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SavePropertyShortcutsForOutputResolutions)); + // if (configuration?.SaveRandomForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveRandomForOutputResolutions)); + if (configuration?.SaveResizedSubfiles is null) throw new NullReferenceException(nameof(configuration.SaveResizedSubfiles)); + // if (configuration?.SaveShortcutsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveShortcutsForOutputResolutions)); + if (configuration?.SaveSortingWithoutPerson is null) throw new NullReferenceException(nameof(configuration.SaveSortingWithoutPerson)); + // if (configuration?.SkipNotSkipDirectories is null) throw new NullReferenceException(nameof(configuration.SkipNotSkipDirectories)); + // if (configuration?.SkipOlderThanDays is null) throw new NullReferenceException(nameof(configuration.SkipOlderThanDays)); + // if (configuration?.SkipPersonWithMoreThen is null) throw new NullReferenceException(nameof(configuration.SkipPersonWithMoreThen)); + if (configuration?.SkipSearch is null) throw new NullReferenceException(nameof(configuration.SkipSearch)); + if (configuration?.SortingMaximumPerFaceShouldBeHigh is null) throw new NullReferenceException(nameof(configuration.SortingMaximumPerFaceShouldBeHigh)); + if (configuration?.SortingMaximumPerKey is null) throw new NullReferenceException(nameof(configuration.SortingMaximumPerKey)); + if (configuration?.SortingMinimumToUseSigma is null) throw new NullReferenceException(nameof(configuration.SortingMinimumToUseSigma)); + if (configuration?.TestDistanceResults is null) throw new NullReferenceException(nameof(configuration.TestDistanceResults)); + if (configuration?.UseFilterTries is null) throw new NullReferenceException(nameof(configuration.UseFilterTries)); + // if (configuration?.ValidKeyWordsToIgnoreInRandom is null) throw new NullReferenceException(nameof(configuration.ValidKeyWordsToIgnoreInRandom)); + // if (configuration?.ValidResolutions is null) throw new NullReferenceException(nameof(configuration.ValidResolutions)); + result = new(propertyConfiguration, configuration.CheckDFaceAndUpWriteDates.Value, configuration.CheckJsonForDistanceResults.Value, - configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions, + configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions ?? Array.Empty(), configuration.CrossDirectoryMaxItemsInDistanceCollection.Value, configuration.DeletePossibleDuplicates.Value, configuration.DistanceFactor.Value, @@ -268,10 +208,10 @@ public class Configuration configuration.ForceMetadataLastWriteTimeToCreationTime.Value, configuration.ForceResizeLastWriteTimeToCreationTime.Value, configuration.GenealogicalDataCommunicationFile, - configuration.IgnoreExtensions, - configuration.JLinks, - configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions, - configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions, + configuration.IgnoreExtensions ?? Array.Empty(), + configuration.JLinks ?? Array.Empty(), + configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions ?? Array.Empty(), + configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions ?? Array.Empty(), configuration.LoadPhotoPrismLocations.Value, configuration.LocationContainerDistanceTolerance, configuration.LocationDigits.Value, @@ -280,12 +220,12 @@ public class Configuration configuration.MappingDefaultName, configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping.Value, configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping.Value, - configuration.MixedYearRelativePaths, + configuration.MixedYearRelativePaths ?? Array.Empty(), configuration.ModelDirectory, configuration.ModelName, configuration.OutputExtension, configuration.OutputQuality.Value, - configuration.OutputResolutions, + configuration.OutputResolutions ?? Array.Empty(), configuration.OverrideForFaceImages.Value, configuration.OverrideForFaceLandmarkImages.Value, configuration.OverrideForResizeImages.Value, @@ -300,25 +240,26 @@ public class Configuration configuration.PropertiesChangedForIndex.Value, configuration.PropertiesChangedForMetadata.Value, configuration.PropertiesChangedForResize.Value, - configuration.RangeDaysDeltaTolerance, - configuration.RangeDistanceTolerance, - configuration.RangeFaceAreaTolerance, - configuration.RangeFaceConfidence, - configuration.RectangleIntersectMinimums, + configuration.RadomUseBirthdayMinimum.Value, + configuration.RangeDaysDeltaTolerance ?? Array.Empty(), + configuration.RangeDistanceTolerance ?? Array.Empty(), + configuration.RangeFaceAreaTolerance ?? Array.Empty(), + configuration.RangeFaceConfidence ?? Array.Empty(), + configuration.RectangleIntersectMinimums ?? Array.Empty(), configuration.Reverse.Value, - configuration.SaveBlurHashForOutputResolutions, - configuration.SaveFaceDistancesForOutputResolutions, - configuration.SaveFaceLandmarkForOutputResolutions, - configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions, + configuration.SaveBlurHashForOutputResolutions ?? Array.Empty(), + configuration.SaveFaceDistancesForOutputResolutions ?? Array.Empty(), + configuration.SaveFaceLandmarkForOutputResolutions ?? Array.Empty(), + configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions ?? Array.Empty(), configuration.SaveIndividually.Value, configuration.SaveFullYearOfRandomFiles.Value, - configuration.SaveMappedForOutputResolutions, - configuration.SavePropertyShortcutsForOutputResolutions, - configuration.SaveRandomForOutputResolutions, + configuration.SaveMappedForOutputResolutions ?? Array.Empty(), + configuration.SavePropertyShortcutsForOutputResolutions ?? Array.Empty(), + configuration.SaveRandomForOutputResolutions ?? Array.Empty(), configuration.SaveResizedSubfiles.Value, - configuration.SaveShortcutsForOutputResolutions, + configuration.SaveShortcutsForOutputResolutions ?? Array.Empty(), configuration.SaveSortingWithoutPerson.Value, - configuration.SkipNotSkipDirectories, + configuration.SkipNotSkipDirectories ?? Array.Empty(), configuration.SkipOlderThanDays, configuration.SkipPersonWithMoreThen, configuration.SkipSearch.Value, @@ -327,8 +268,8 @@ public class Configuration configuration.SortingMinimumToUseSigma.Value, configuration.TestDistanceResults.Value, configuration.UseFilterTries.Value, - configuration.ValidKeyWordsToIgnoreInRandom, - configuration.ValidResolutions); + configuration.ValidKeyWordsToIgnoreInRandom ?? Array.Empty(), + configuration.ValidResolutions ?? Array.Empty()); return result; } @@ -345,8 +286,7 @@ public class Configuration IConfigurationSection configurationSection = configurationRoot.GetSection(section); configuration = configurationSection.Get(); } - result = Get(configuration); - result.SetAndUpdate(propertyConfiguration, configuration?.NumberOfJitters, configuration?.NumberOfTimesToUpsample, configuration?.ModelName, configuration?.PredictorModelName); + result = Get(configuration, propertyConfiguration); return result; } diff --git a/Instance/Models/Configuration.cs b/Instance/Models/Configuration.cs index 628247c..7313785 100644 --- a/Instance/Models/Configuration.cs +++ b/Instance/Models/Configuration.cs @@ -1,275 +1,85 @@ -using System.Text.Json; -using System.Text.Json.Serialization; - namespace View_by_Distance.Instance.Models; -public class Configuration -{ - - protected Property.Models.Configuration _PropertyConfiguration; - - public Property.Models.Configuration PropertyConfiguration => _PropertyConfiguration; - - public bool CheckDFaceAndUpWriteDates { init; get; } - public bool CheckJsonForDistanceResults { init; get; } - public string[] CopyFacesAndSaveFaceLandmarkForOutputResolutions { init; get; } - public int CrossDirectoryMaxItemsInDistanceCollection { init; get; } - public int DistanceFactor { init; get; } - public bool DistanceMoveUnableToMatch { init; get; } - public int DistancePixelDistanceTolerance { init; get; } - public bool DistanceRenameToMatch { init; get; } - public int EyeThreshold { init; get; } - public int FaceAreaPermyriad { init; get; } - public int FaceConfidencePercent { init; get; } - public int FaceDistanceHiddenImageFactor { init; get; } - public int FaceDistancePermyriad { init; get; } - public string FocusDirectory { init; get; } - public string FocusModel { init; get; } - public bool ForceFaceLastWriteTimeToCreationTime { init; get; } - public bool ForceMetadataLastWriteTimeToCreationTime { init; get; } - public bool ForceResizeLastWriteTimeToCreationTime { init; get; } - public string GenealogicalDataCommunicationFile { init; get; } - public string[] IgnoreExtensions { init; get; } - public string[] JLinks { init; get; } - public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { init; get; } - public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { init; get; } - public bool LoadPhotoPrismLocations { init; get; } - public float? LocationContainerDistanceTolerance { init; get; } - public int LocationDigits { init; get; } - public int LocationFactor { init; get; } - public bool LookForAbandoned { init; get; } - public string MappingDefaultName { init; get; } - public bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping { init; get; } - public bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping { init; get; } - public string[] MixedYearRelativePaths { init; get; } - public string ModelDirectory { init; get; } - public string ModelName { init; get; } - public string OutputExtension { init; get; } - public int OutputQuality { init; get; } - public string[] OutputResolutions { init; get; } - public bool OverrideForFaceImages { init; get; } - public bool OverrideForFaceLandmarkImages { init; get; } - public bool OverrideForResizeImages { init; get; } - public int PersonBirthdayFirstYear { init; get; } - public string PersonBirthdayFormat { init; get; } - public string PersonCharacters { init; get; } - public int PersonCharactersCopyCount { init; get; } - public string PersonKeyFormat { init; get; } - public string PredictorModelName { init; get; } - public bool PropertiesChangedForDistance { init; get; } - public bool PropertiesChangedForFaces { init; get; } - public bool PropertiesChangedForIndex { init; get; } - public bool PropertiesChangedForMetadata { init; get; } - public bool PropertiesChangedForResize { init; get; } - public int[] RangeDaysDeltaTolerance { init; get; } - public float[] RangeDistanceTolerance { init; get; } - public float[] RangeFaceAreaTolerance { init; get; } - public float[] RangeFaceConfidence { init; get; } - public float[] RectangleIntersectMinimums { init; get; } - public bool Reverse { init; get; } - public string[] SaveBlurHashForOutputResolutions { init; get; } - public string[] SaveFaceDistancesForOutputResolutions { init; get; } - public string[] SaveFaceLandmarkForOutputResolutions { init; get; } - public string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions { init; get; } - public bool SaveFullYearOfRandomFiles { init; get; } - public bool SaveIndividually { init; get; } - public string[] SaveMappedForOutputResolutions { init; get; } - public string[] SavePropertyShortcutsForOutputResolutions { init; get; } - public string[] SaveRandomForOutputResolutions { init; get; } - public bool SaveResizedSubfiles { init; get; } - public string[] SaveShortcutsForOutputResolutions { init; get; } - public bool SaveSortingWithoutPerson { init; get; } - public string[] SkipNotSkipDirectories { init; get; } - public int? SkipOlderThanDays { init; get; } - public int? SkipPersonWithMoreThen { init; get; } - public bool SkipSearch { init; get; } - public int SortingMaximumPerFaceShouldBeHigh { init; get; } - public int SortingMaximumPerKey { init; get; } - public int SortingMinimumToUseSigma { init; get; } - public bool TestDistanceResults { init; get; } - public int UseFilterTries { init; get; } - public string[] ValidResolutions { init; get; } - public string[] ValidKeyWordsToIgnoreInRandom { init; get; } - public bool DeletePossibleDuplicates { get; internal set; } - - [JsonConstructor] - public Configuration(Property.Models.Configuration propertyConfiguration, - bool checkDFaceAndUpWriteDates, - bool checkJsonForDistanceResults, - string[] copyFacesAndSaveFaceLandmarkForOutputResolutions, - int crossDirectoryMaxItemsInDistanceCollection, - bool deletePossibleDuplicates, - int distanceFactor, - bool distanceMoveUnableToMatch, - int distancePixelDistanceTolerance, - bool distanceRenameToMatch, - int eyeThreshold, - int faceAreaPermyriad, - int faceConfidencePercent, - int faceDistanceHiddenImageFactor, - int faceDistancePermyriad, - string focusDirectory, - string focusModel, - bool forceFaceLastWriteTimeToCreationTime, - bool forceMetadataLastWriteTimeToCreationTime, - bool forceResizeLastWriteTimeToCreationTime, - string genealogicalDataCommunicationFile, - string[] ignoreExtensions, - string[] jLinks, - string[] loadOrCreateThenSaveDistanceResultsForOutputResolutions, - string[] loadOrCreateThenSaveImageFacesResultsForOutputResolutions, - bool loadPhotoPrismLocations, - float? locationContainerDistanceTolerance, - int locationDigits, - int locationFactor, - bool lookForAbandoned, - string mappingDefaultName, - bool mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping, - bool mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping, - string[] mixedYearRelativePaths, - string modelDirectory, - string modelName, - string outputExtension, - int outputQuality, - string[] outputResolutions, - bool overrideForFaceImages, - bool overrideForFaceLandmarkImages, - bool overrideForResizeImages, - int personBirthdayFirstYear, - string personBirthdayFormat, - string personCharacters, - int personCharactersCopyCount, - string personKeyFormat, - string predictorModelName, - bool propertiesChangedForDistance, - bool propertiesChangedForFaces, - bool propertiesChangedForIndex, - bool propertiesChangedForMetadata, - bool propertiesChangedForResize, - int[] rangeDaysDeltaTolerance, - float[] rangeDistanceTolerance, - float[] rangeFaceAreaPermyriadTolerance, - float[] rangeFaceConfidence, - float[] rectangleIntersectMinimums, - bool reverse, - string[] saveBlurHashForOutputResolutions, - string[] saveFaceDistancesForOutputResolutions, - string[] saveFaceLandmarkForOutputResolutions, - string[] saveFilteredOriginalImagesFromJLinksForOutputResolutions, - bool saveIndividually, - bool saveFullYearOfRandomFiles, - string[] saveMappedForOutputResolutions, - string[] savePropertyShortcutsForOutputResolutions, - string[] saveRandomForOutputResolutions, - bool saveResizedSubfiles, - string[] saveShortcutsForOutputResolutions, - bool saveSortingWithoutPerson, - string[] skipNotSkipDirectories, - int? skipOlderThanDays, - int? skipPersonWithMoreThen, - bool skipSearch, - int sortingMaximumPerFaceShouldBeHigh, - int sortingMaximumPerKey, - int sortingSigma, - bool testDistanceResults, - int useFilterTries, - string[] validKeyWordsToIgnoreInRandom, - string[] validResolutions) - { - _PropertyConfiguration = propertyConfiguration; - CheckDFaceAndUpWriteDates = checkDFaceAndUpWriteDates; - CheckJsonForDistanceResults = checkJsonForDistanceResults; - CopyFacesAndSaveFaceLandmarkForOutputResolutions = copyFacesAndSaveFaceLandmarkForOutputResolutions; - CrossDirectoryMaxItemsInDistanceCollection = crossDirectoryMaxItemsInDistanceCollection; - DeletePossibleDuplicates = deletePossibleDuplicates; - DistanceFactor = distanceFactor; - DistanceMoveUnableToMatch = distanceMoveUnableToMatch; - DistancePixelDistanceTolerance = distancePixelDistanceTolerance; - DistanceRenameToMatch = distanceRenameToMatch; - EyeThreshold = eyeThreshold; - FaceAreaPermyriad = faceAreaPermyriad; - FaceConfidencePercent = faceConfidencePercent; - FaceDistanceHiddenImageFactor = faceDistanceHiddenImageFactor; - FaceDistancePermyriad = faceDistancePermyriad; - FocusDirectory = focusDirectory; - FocusModel = focusModel; - ForceFaceLastWriteTimeToCreationTime = forceFaceLastWriteTimeToCreationTime; - ForceMetadataLastWriteTimeToCreationTime = forceMetadataLastWriteTimeToCreationTime; - ForceResizeLastWriteTimeToCreationTime = forceResizeLastWriteTimeToCreationTime; - GenealogicalDataCommunicationFile = genealogicalDataCommunicationFile; - IgnoreExtensions = ignoreExtensions; - JLinks = jLinks; - LoadOrCreateThenSaveDistanceResultsForOutputResolutions = loadOrCreateThenSaveDistanceResultsForOutputResolutions; - LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = loadOrCreateThenSaveImageFacesResultsForOutputResolutions; - LoadPhotoPrismLocations = loadPhotoPrismLocations; - LocationContainerDistanceTolerance = locationContainerDistanceTolerance; - LocationDigits = locationDigits; - LocationFactor = locationFactor; - LookForAbandoned = lookForAbandoned; - MappingDefaultName = mappingDefaultName; - MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping = mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping; - MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping = mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping; - MixedYearRelativePaths = mixedYearRelativePaths; - ModelDirectory = modelDirectory; - ModelName = modelName; - OutputExtension = outputExtension; - OutputQuality = outputQuality; - OutputResolutions = outputResolutions; - OverrideForFaceImages = overrideForFaceImages; - OverrideForFaceLandmarkImages = overrideForFaceLandmarkImages; - OverrideForResizeImages = overrideForResizeImages; - PersonBirthdayFirstYear = personBirthdayFirstYear; - PersonBirthdayFormat = personBirthdayFormat; - PersonCharacters = personCharacters; - PersonCharactersCopyCount = personCharactersCopyCount; - PersonKeyFormat = personKeyFormat; - PredictorModelName = predictorModelName; - PropertiesChangedForDistance = propertiesChangedForDistance; - PropertiesChangedForFaces = propertiesChangedForFaces; - PropertiesChangedForIndex = propertiesChangedForIndex; - PropertiesChangedForMetadata = propertiesChangedForMetadata; - PropertiesChangedForResize = propertiesChangedForResize; - RangeDaysDeltaTolerance = rangeDaysDeltaTolerance; - RangeDistanceTolerance = rangeDistanceTolerance; - RangeFaceAreaTolerance = rangeFaceAreaPermyriadTolerance; - RangeFaceConfidence = rangeFaceConfidence; - RectangleIntersectMinimums = rectangleIntersectMinimums; - Reverse = reverse; - SaveBlurHashForOutputResolutions = saveBlurHashForOutputResolutions; - SaveFaceDistancesForOutputResolutions = saveFaceDistancesForOutputResolutions; - SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions; - SaveFilteredOriginalImagesFromJLinksForOutputResolutions = saveFilteredOriginalImagesFromJLinksForOutputResolutions; - SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles; - SaveIndividually = saveIndividually; - SaveMappedForOutputResolutions = saveMappedForOutputResolutions; - SavePropertyShortcutsForOutputResolutions = savePropertyShortcutsForOutputResolutions; - SaveRandomForOutputResolutions = saveRandomForOutputResolutions; - SaveResizedSubfiles = saveResizedSubfiles; - SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions; - SaveSortingWithoutPerson = saveSortingWithoutPerson; - SkipNotSkipDirectories = skipNotSkipDirectories; - SkipOlderThanDays = skipOlderThanDays; - SkipPersonWithMoreThen = skipPersonWithMoreThen; - SkipSearch = skipSearch; - SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh; - SortingMaximumPerKey = sortingMaximumPerKey; - SortingMinimumToUseSigma = sortingSigma; - TestDistanceResults = testDistanceResults; - UseFilterTries = useFilterTries; - ValidKeyWordsToIgnoreInRandom = validKeyWordsToIgnoreInRandom; - ValidResolutions = validResolutions; - } - - public override string ToString() - { - string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); - return result; - } - - public void SetAndUpdate(Property.Models.Configuration configuration, int? numberOfJitters, int? numberOfTimesToUpsample, string? modelName, string? predictorModelName) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(numberOfJitters, numberOfTimesToUpsample, modelName, predictorModelName); - } - -} \ No newline at end of file +public record Configuration(Property.Models.Configuration PropertyConfiguration, + bool CheckDFaceAndUpWriteDates, + bool CheckJsonForDistanceResults, + string[] CopyFacesAndSaveFaceLandmarkForOutputResolutions, + int CrossDirectoryMaxItemsInDistanceCollection, + bool DeletePossibleDuplicates, + int DistanceFactor, + bool DistanceMoveUnableToMatch, + int DistancePixelDistanceTolerance, + bool DistanceRenameToMatch, + int EyeThreshold, + int FaceAreaPermyriad, + int FaceConfidencePercent, + int FaceDistanceHiddenImageFactor, + int FaceDistancePermyriad, + string FocusDirectory, + string FocusModel, + bool ForceFaceLastWriteTimeToCreationTime, + bool ForceMetadataLastWriteTimeToCreationTime, + bool ForceResizeLastWriteTimeToCreationTime, + string GenealogicalDataCommunicationFile, + string[] IgnoreExtensions, + string[] JLinks, + string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions, + string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions, + bool LoadPhotoPrismLocations, + float? LocationContainerDistanceTolerance, + int LocationDigits, + int LocationFactor, + bool LookForAbandoned, + string MappingDefaultName, + bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping, + bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping, + string[] MixedYearRelativePaths, + string ModelDirectory, + string ModelName, + string OutputExtension, + int OutputQuality, + string[] OutputResolutions, + bool OverrideForFaceImages, + bool OverrideForFaceLandmarkImages, + bool OverrideForResizeImages, + int PersonBirthdayFirstYear, + string PersonBirthdayFormat, + string PersonCharacters, + int PersonCharactersCopyCount, + string PersonKeyFormat, + string PredictorModelName, + bool PropertiesChangedForDistance, + bool PropertiesChangedForFaces, + bool PropertiesChangedForIndex, + bool PropertiesChangedForMetadata, + bool PropertiesChangedForResize, + int RadomUseBirthdayMinimum, + int[] RangeDaysDeltaTolerance, + float[] RangeDistanceTolerance, + float[] RangeFaceAreaPermyriadTolerance, + float[] RangeFaceConfidence, + float[] RectangleIntersectMinimums, + bool Reverse, + string[] SaveBlurHashForOutputResolutions, + string[] SaveFaceDistancesForOutputResolutions, + string[] SaveFaceLandmarkForOutputResolutions, + string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions, + bool SaveIndividually, + bool SaveFullYearOfRandomFiles, + string[] SaveMappedForOutputResolutions, + string[] SavePropertyShortcutsForOutputResolutions, + string[] SaveRandomForOutputResolutions, + bool SaveResizedSubfiles, + string[] SaveShortcutsForOutputResolutions, + bool SaveSortingWithoutPerson, + string[] SkipNotSkipDirectories, + int? SkipOlderThanDays, + int? SkipPersonWithMoreThen, + bool SkipSearch, + int SortingMaximumPerFaceShouldBeHigh, + int SortingMaximumPerKey, + int SortingMinimumToUseSigma, + bool TestDistanceResults, + int UseFilterTries, + string[] ValidKeyWordsToIgnoreInRandom, + string[] ValidResolutions); \ No newline at end of file diff --git a/Instance/Models/_F_Random.cs b/Instance/Models/_F_Random.cs index 6ad673f..8ff650c 100644 --- a/Instance/Models/_F_Random.cs +++ b/Instance/Models/_F_Random.cs @@ -58,7 +58,7 @@ internal class F_Random return new(results); } - internal void Random(Property.Models.Configuration configuration, string[] validKeyWordsToIgnoreInRandom, string outputResolution, ReadOnlyDictionary> personKeyToIds, ReadOnlyCollection mappingCollection) + internal void Random(Property.Models.Configuration configuration, int radomUseBirthdayMinimum, string[] validKeyWordsToIgnoreInRandom, string outputResolution, ReadOnlyDictionary> personKeyToIds, ReadOnlyCollection mappingCollection) { string key; string json; @@ -92,7 +92,7 @@ internal class F_Random { random = new(i); key = dateTime.AddDays(i).ToString(dateFormat); - if (dayToRelativePaths.TryGetValue(key, out collection) && collection.Count > 100) + if (dayToRelativePaths.TryGetValue(key, out collection) && collection.Count > radomUseBirthdayMinimum) collection = (from l in collection orderby random.NextDouble() select l).ToList(); else collection = (from l in relativePaths orderby random.NextDouble() select l).ToList(); diff --git a/Metadata-Query/MetadataQuery.cs b/Metadata-Query/MetadataQuery.cs index 0ec4cee..159a4e0 100644 --- a/Metadata-Query/MetadataQuery.cs +++ b/Metadata-Query/MetadataQuery.cs @@ -35,7 +35,6 @@ public class MetadataQuery Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration); _PropertyConfiguration = propertyConfiguration; _Configuration = configuration; - propertyConfiguration.Update(); log.Information(propertyConfiguration.RootDirectory); Verify(); MetadataQueryFilesInDirectories(log, ticks); diff --git a/Metadata-Query/Models/Binder/Configuration.cs b/Metadata-Query/Models/Binder/Configuration.cs index 5b16fde..b79616e 100644 --- a/Metadata-Query/Models/Binder/Configuration.cs +++ b/Metadata-Query/Models/Binder/Configuration.cs @@ -52,7 +52,6 @@ public class Configuration configuration = configurationSection.Get(); } result = Get(configuration); - result.SetAndUpdate(propertyConfiguration); return result; } diff --git a/Metadata-Query/Models/Configuration.cs b/Metadata-Query/Models/Configuration.cs index 34dc4df..931502d 100644 --- a/Metadata-Query/Models/Configuration.cs +++ b/Metadata-Query/Models/Configuration.cs @@ -29,10 +29,4 @@ public class Configuration return result; } - public void SetAndUpdate(Property.Models.Configuration configuration) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(); - } - } \ No newline at end of file diff --git a/Mirror-Length/MirrorLength.cs b/Mirror-Length/MirrorLength.cs index 446a22a..6414e81 100644 --- a/Mirror-Length/MirrorLength.cs +++ b/Mirror-Length/MirrorLength.cs @@ -33,7 +33,6 @@ public class MirrorLength Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration); _PropertyConfiguration = propertyConfiguration; _Configuration = configuration; - propertyConfiguration.Update(); log.Information(propertyConfiguration.RootDirectory); Verify(); MirrorLengthFilesInDirectories(log, ticks); diff --git a/Mirror-Length/Models/Binder/Configuration.cs b/Mirror-Length/Models/Binder/Configuration.cs index 2bdfdaa..34d6b69 100644 --- a/Mirror-Length/Models/Binder/Configuration.cs +++ b/Mirror-Length/Models/Binder/Configuration.cs @@ -52,7 +52,6 @@ public class Configuration configuration = configurationSection.Get(); } result = Get(configuration); - result.SetAndUpdate(propertyConfiguration); return result; } diff --git a/Mirror-Length/Models/Configuration.cs b/Mirror-Length/Models/Configuration.cs index 42903e8..135dd8d 100644 --- a/Mirror-Length/Models/Configuration.cs +++ b/Mirror-Length/Models/Configuration.cs @@ -29,10 +29,4 @@ public class Configuration return result; } - public void SetAndUpdate(Property.Models.Configuration configuration) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(); - } - } \ No newline at end of file diff --git a/Move-By-Id/Models/Binder/Configuration.cs b/Move-By-Id/Models/Binder/Configuration.cs index 8c11d1f..5813a16 100644 --- a/Move-By-Id/Models/Binder/Configuration.cs +++ b/Move-By-Id/Models/Binder/Configuration.cs @@ -52,7 +52,6 @@ public class Configuration configuration = configurationSection.Get(); } result = Get(configuration); - result.SetAndUpdate(propertyConfiguration); return result; } diff --git a/Move-By-Id/Models/Configuration.cs b/Move-By-Id/Models/Configuration.cs index 776bb93..1b1b8be 100644 --- a/Move-By-Id/Models/Configuration.cs +++ b/Move-By-Id/Models/Configuration.cs @@ -29,10 +29,4 @@ public class Configuration return result; } - public void SetAndUpdate(Property.Models.Configuration configuration) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(); - } - } \ No newline at end of file diff --git a/Move-By-Id/MoveById.cs b/Move-By-Id/MoveById.cs index 48a3413..b0ca637 100644 --- a/Move-By-Id/MoveById.cs +++ b/Move-By-Id/MoveById.cs @@ -36,7 +36,6 @@ public class MoveById _PropertyConfiguration = propertyConfiguration; _Configuration = configuration; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; - propertyConfiguration.Update(); string? comparePathRoot = Path.GetDirectoryName(appSettings.ComparePathsFile); if (comparePathRoot is null || comparePathRoot == propertyConfiguration.RootDirectory) throw new Exception("Nested isn't allowed!"); diff --git a/Offset-Date-Time-Original/Models/Binder/Configuration.cs b/Offset-Date-Time-Original/Models/Binder/Configuration.cs index 3aa5ea0..fa1bca2 100644 --- a/Offset-Date-Time-Original/Models/Binder/Configuration.cs +++ b/Offset-Date-Time-Original/Models/Binder/Configuration.cs @@ -52,7 +52,6 @@ public class Configuration configuration = configurationSection.Get(); } result = Get(configuration); - result.SetAndUpdate(propertyConfiguration); return result; } diff --git a/Offset-Date-Time-Original/Models/Configuration.cs b/Offset-Date-Time-Original/Models/Configuration.cs index 402754c..0bf09df 100644 --- a/Offset-Date-Time-Original/Models/Configuration.cs +++ b/Offset-Date-Time-Original/Models/Configuration.cs @@ -29,10 +29,4 @@ public class Configuration return result; } - public void SetAndUpdate(Property.Models.Configuration configuration) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(); - } - } \ No newline at end of file diff --git a/Offset-Date-Time-Original/OffsetDateTimeOriginal.cs b/Offset-Date-Time-Original/OffsetDateTimeOriginal.cs index a6090fb..1ed0d90 100644 --- a/Offset-Date-Time-Original/OffsetDateTimeOriginal.cs +++ b/Offset-Date-Time-Original/OffsetDateTimeOriginal.cs @@ -45,7 +45,6 @@ public class OffsetDateTimeOriginal Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration); _PropertyConfiguration = propertyConfiguration; _Configuration = configuration; - propertyConfiguration.Update(); log.Information(propertyConfiguration.RootDirectory); Verify(); List lines = OffsetDateTimeOriginalFilesInDirectories(log); diff --git a/PrepareForOld/Models/Configuration.cs b/PrepareForOld/Models/Configuration.cs index 49d4c22..0e660a1 100644 --- a/PrepareForOld/Models/Configuration.cs +++ b/PrepareForOld/Models/Configuration.cs @@ -24,10 +24,4 @@ public class Configuration return result; } - public void SetAndUpdate(Property.Models.Configuration configuration) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(); - } - } \ No newline at end of file diff --git a/PrepareForOld/Models/Stateless/Configuration.cs b/PrepareForOld/Models/Stateless/Configuration.cs index 44d7910..c7d4a64 100644 --- a/PrepareForOld/Models/Stateless/Configuration.cs +++ b/PrepareForOld/Models/Stateless/Configuration.cs @@ -19,7 +19,6 @@ public abstract class Configuration if (result is null) throw new Exception(json); string jsonThis = result.ToString(); - result.SetAndUpdate(propertyConfiguration); if (jsonThis != json) { int? check = null; diff --git a/Property/Models/Binder/.editorconfig b/Property/Models/Binder/.editorconfig new file mode 100644 index 0000000..1c444cd --- /dev/null +++ b/Property/Models/Binder/.editorconfig @@ -0,0 +1,2 @@ +[*.cs] +csharp_preserve_single_line_statements = true \ No newline at end of file diff --git a/Property/Models/Binder/Configuration.cs b/Property/Models/Binder/Configuration.cs index c1082af..2228fb3 100644 --- a/Property/Models/Binder/Configuration.cs +++ b/Property/Models/Binder/Configuration.cs @@ -1,6 +1,5 @@ using Microsoft.Extensions.Configuration; using Phares.Shared; -using System.ComponentModel.DataAnnotations; using System.Text.Json; namespace View_by_Distance.Property.Models.Binder; @@ -8,28 +7,28 @@ namespace View_by_Distance.Property.Models.Binder; public class Configuration { -#nullable disable - - [Display(Name = "Date Group"), Required] public string DateGroup { get; set; } - [Display(Name = "File Name Directory Separator"), Required] public string FileNameDirectorySeparator { get; set; } - [Display(Name = "Force Property Last Write Time to Creation Time"), Required] public bool? ForcePropertyLastWriteTimeToCreationTime { get; set; } - [Display(Name = "Ignore Extensions"), Required] public string[] IgnoreExtensions { get; set; } - [Display(Name = "Max Images In Directory For Top Level First Pass"), Required] public int? MaxImagesInDirectoryForTopLevelFirstPass { get; set; } - [Display(Name = "Pattern"), Required] public string Pattern { get; set; } - [Display(Name = "Person Birthday Format"), Required] public string PersonBirthdayFormat { get; set; } - [Display(Name = "Populate Properties FileId"), Required] public bool? PopulatePropertyId { get; set; } - [Display(Name = "Properties Changed For Property"), Required] public bool? PropertiesChangedForProperty { get; set; } - [Display(Name = "Property Content Collection Files"), Required] public string[] PropertyContentCollectionFiles { get; set; } - [Display(Name = "Result All In One"), Required] public string ResultAllInOne { get; set; } - [Display(Name = "Result All In One Max Value"), Required] public int? ResultAllInOneSubdirectoryLength { get; set; } - [Display(Name = "Result Collection"), Required] public string ResultCollection { get; set; } - [Display(Name = "Result Content"), Required] public string ResultContent { get; set; } - [Display(Name = "Result Singleton"), Required] public string ResultSingleton { get; set; } - [Display(Name = "Root Directory"), Required] public string RootDirectory { get; set; } - [Display(Name = "Valid Image Format Extensions"), Required] public string[] ValidImageFormatExtensions { get; set; } - [Display(Name = "Verify to Season"), Required] public string[] VerifyToSeason { get; set; } - -#nullable restore + public string? DateGroup { get; set; } + public string? FileNameDirectorySeparator { get; set; } + public bool? ForcePropertyLastWriteTimeToCreationTime { get; set; } + public string[]? IgnoreExtensions { get; set; } + public int? MaxImagesInDirectoryForTopLevelFirstPass { get; set; } + public string? ModelName { init; get; } + public int? NumberOfJitters { init; get; } + public int? NumberOfTimesToUpsample { init; get; } + public string? Pattern { get; set; } + public string? PersonBirthdayFormat { get; set; } + public bool? PopulatePropertyId { get; set; } + public string? PredictorModelName { get; set; } + public bool? PropertiesChangedForProperty { get; set; } + public string[]? PropertyContentCollectionFiles { get; set; } + public string? ResultAllInOne { get; set; } + public int? ResultAllInOneSubdirectoryLength { get; set; } + public string? ResultCollection { get; set; } + public string? ResultContent { get; set; } + public string? ResultSingleton { get; set; } + public string? RootDirectory { get; set; } + public string[]? ValidImageFormatExtensions { get; set; } + public string[]? VerifyToSeason { get; set; } public override string ToString() { @@ -40,48 +39,51 @@ public class Configuration private static Models.Configuration Get(Configuration? configuration) { Models.Configuration result; - if (configuration is null) - throw new NullReferenceException(nameof(configuration)); - if (configuration.ForcePropertyLastWriteTimeToCreationTime is null) - throw new NullReferenceException(nameof(configuration.ForcePropertyLastWriteTimeToCreationTime)); - if (configuration.MaxImagesInDirectoryForTopLevelFirstPass is null) - throw new NullReferenceException(nameof(configuration.MaxImagesInDirectoryForTopLevelFirstPass)); - if (configuration.PopulatePropertyId is null) - throw new NullReferenceException(nameof(configuration.PopulatePropertyId)); - if (configuration.PropertiesChangedForProperty is null) - throw new NullReferenceException(nameof(configuration.PropertiesChangedForProperty)); - if (configuration.ResultAllInOne is null) - throw new NullReferenceException(nameof(configuration.ResultAllInOne)); - if (configuration.ResultAllInOneSubdirectoryLength is null) - throw new NullReferenceException(nameof(configuration.ResultAllInOneSubdirectoryLength)); - if (configuration.ResultCollection is null) - throw new NullReferenceException(nameof(configuration.ResultCollection)); - if (configuration.ResultContent is null) - throw new NullReferenceException(nameof(configuration.ResultContent)); - if (configuration.ResultSingleton is null) - throw new NullReferenceException(nameof(configuration.ResultSingleton)); - configuration.IgnoreExtensions ??= Array.Empty(); - configuration.PropertyContentCollectionFiles ??= Array.Empty(); - configuration.ValidImageFormatExtensions ??= Array.Empty(); - configuration.VerifyToSeason ??= Array.Empty(); + if (configuration is null) throw new NullReferenceException(nameof(configuration)); + if (configuration.DateGroup is null) throw new NullReferenceException(nameof(configuration.DateGroup)); + if (configuration.FileNameDirectorySeparator is null) throw new NullReferenceException(nameof(configuration.FileNameDirectorySeparator)); + if (configuration.ForcePropertyLastWriteTimeToCreationTime is null) throw new NullReferenceException(nameof(configuration.ForcePropertyLastWriteTimeToCreationTime)); + // if (configuration.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); + if (configuration.MaxImagesInDirectoryForTopLevelFirstPass is null) throw new NullReferenceException(nameof(configuration.MaxImagesInDirectoryForTopLevelFirstPass)); + // 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.Pattern is null) throw new NullReferenceException(nameof(configuration.Pattern)); + if (configuration.PersonBirthdayFormat is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); + if (configuration.PopulatePropertyId is null) throw new NullReferenceException(nameof(configuration.PopulatePropertyId)); + // if (configuration.PredictorModelName is null) throw new NullReferenceException(nameof(configuration.PredictorModelName)); + if (configuration.PropertiesChangedForProperty is null) throw new NullReferenceException(nameof(configuration.PropertiesChangedForProperty)); + // if (configuration.PropertyContentCollectionFiles is null) throw new NullReferenceException(nameof(configuration.PropertyContentCollectionFiles)); + if (configuration.ResultAllInOne is null) throw new NullReferenceException(nameof(configuration.ResultAllInOne)); + if (configuration.ResultAllInOneSubdirectoryLength is null) throw new NullReferenceException(nameof(configuration.ResultAllInOneSubdirectoryLength)); + if (configuration.ResultCollection is null) throw new NullReferenceException(nameof(configuration.ResultCollection)); + if (configuration.ResultContent is null) throw new NullReferenceException(nameof(configuration.ResultContent)); + if (configuration.ResultSingleton is null) throw new NullReferenceException(nameof(configuration.ResultSingleton)); + if (configuration.RootDirectory is null) throw new NullReferenceException(nameof(configuration.RootDirectory)); + // if (configuration.ValidImageFormatExtensions is null) throw new NullReferenceException(nameof(configuration.ValidImageFormatExtensions)); + // if (configuration.VerifyToSeason is null) throw new NullReferenceException(nameof(configuration.VerifyToSeason)); result = new(configuration.DateGroup, configuration.FileNameDirectorySeparator, configuration.ForcePropertyLastWriteTimeToCreationTime.Value, - configuration.IgnoreExtensions, + configuration.IgnoreExtensions ?? Array.Empty(), configuration.MaxImagesInDirectoryForTopLevelFirstPass.Value, + configuration.ModelName, + configuration.NumberOfJitters, + configuration.NumberOfTimesToUpsample, configuration.Pattern, configuration.PersonBirthdayFormat, configuration.PopulatePropertyId.Value, + configuration.PredictorModelName, configuration.PropertiesChangedForProperty.Value, - configuration.PropertyContentCollectionFiles, + configuration.PropertyContentCollectionFiles ?? Array.Empty(), configuration.ResultAllInOne, configuration.ResultAllInOneSubdirectoryLength.Value, configuration.ResultCollection, configuration.ResultContent, configuration.ResultSingleton, - configuration.RootDirectory, - configuration.ValidImageFormatExtensions, - configuration.VerifyToSeason); + Path.GetFullPath(configuration.RootDirectory), + configuration.ValidImageFormatExtensions ?? Array.Empty(), + configuration.VerifyToSeason ?? Array.Empty()); return result; } @@ -98,8 +100,7 @@ public class Configuration IConfigurationSection configurationSection = configurationRoot.GetSection(section); configuration = configurationSection.Get(); } - if (configuration is null) - throw new NullReferenceException(nameof(configuration)); + if (configuration is null) throw new NullReferenceException(nameof(configuration)); result = Get(configuration); return result; } diff --git a/Property/Models/Configuration.cs b/Property/Models/Configuration.cs index 6863d16..d95cec5 100644 --- a/Property/Models/Configuration.cs +++ b/Property/Models/Configuration.cs @@ -6,16 +6,8 @@ namespace View_by_Distance.Property.Models; public class Configuration : Shared.Models.Properties.IPropertyConfiguration { - protected string? _ModelName; - protected int? _NumberOfJitters; - protected int? _NumberOfTimesToUpsample; - protected string? _PredictorModelName; protected string _RootDirectory; - public string? ModelName => _ModelName; - public int? NumberOfJitters => _NumberOfJitters; - public int? NumberOfTimesToUpsample => _NumberOfTimesToUpsample; - public string? PredictorModelName => _PredictorModelName; public string RootDirectory => _RootDirectory; public string DateGroup { init; get; } @@ -23,9 +15,13 @@ public class Configuration : Shared.Models.Properties.IPropertyConfiguration public bool ForcePropertyLastWriteTimeToCreationTime { init; get; } public string[] IgnoreExtensions { init; get; } public int MaxImagesInDirectoryForTopLevelFirstPass { init; get; } + public string? ModelName { init; get; } + public int? NumberOfJitters { init; get; } + public int? NumberOfTimesToUpsample { init; get; } public string Pattern { init; get; } public string PersonBirthdayFormat { init; get; } public bool PopulatePropertyId { init; get; } + public string? PredictorModelName { init; get; } public bool PropertiesChangedForProperty { init; get; } public string[] PropertyContentCollectionFiles { init; get; } public string ResultAllInOne { init; get; } @@ -41,9 +37,13 @@ public class Configuration : Shared.Models.Properties.IPropertyConfiguration bool forcePropertyLastWriteTimeToCreationTime, string[] ignoreExtensions, int maxImagesInDirectoryForTopLevelFirstPass, + string? modelName, + int? numberOfJitters, + int? numberOfTimesToUpsample, string pattern, string personBirthdayFormat, bool populatePropertyId, + string? predictorModelName, bool propertiesChangedForProperty, string[] propertyContentCollectionFiles, string resultAllInOne, @@ -60,8 +60,12 @@ public class Configuration : Shared.Models.Properties.IPropertyConfiguration ForcePropertyLastWriteTimeToCreationTime = forcePropertyLastWriteTimeToCreationTime; IgnoreExtensions = ignoreExtensions; MaxImagesInDirectoryForTopLevelFirstPass = maxImagesInDirectoryForTopLevelFirstPass; + ModelName = modelName; + NumberOfJitters = numberOfJitters; + NumberOfTimesToUpsample = numberOfTimesToUpsample; Pattern = pattern; PersonBirthdayFormat = personBirthdayFormat; + PredictorModelName = predictorModelName; PopulatePropertyId = populatePropertyId; PropertiesChangedForProperty = propertiesChangedForProperty; PropertyContentCollectionFiles = propertyContentCollectionFiles; @@ -80,18 +84,8 @@ public class Configuration : Shared.Models.Properties.IPropertyConfiguration return result; } - public void ChangeRootDirectory(string rootDirectory) => _RootDirectory = rootDirectory; - - public void Update(int? numberOfJitters, int? numberOfTimesToUpsample, string? modelName, string? predictorModelName) - { - _NumberOfJitters = numberOfJitters; - _NumberOfTimesToUpsample = numberOfTimesToUpsample; - _ModelName = modelName; - _PredictorModelName = predictorModelName; - _RootDirectory = Path.GetFullPath(_RootDirectory); - } - - public void Update() => Update(numberOfJitters: null, numberOfTimesToUpsample: null, modelName: null, predictorModelName: null); + public void ChangeRootDirectory(string rootDirectory) => + _RootDirectory = Path.GetFullPath(rootDirectory); public static void Verify(Configuration propertyConfiguration, bool requireExist) { diff --git a/Rename/Models/Binder/Configuration.cs b/Rename/Models/Binder/Configuration.cs index 4a07478..e510e8a 100644 --- a/Rename/Models/Binder/Configuration.cs +++ b/Rename/Models/Binder/Configuration.cs @@ -52,7 +52,6 @@ public class Configuration configuration = configurationSection.Get(); } result = Get(configuration); - result.SetAndUpdate(propertyConfiguration); return result; } diff --git a/Rename/Models/Configuration.cs b/Rename/Models/Configuration.cs index fa75f95..94072b0 100644 --- a/Rename/Models/Configuration.cs +++ b/Rename/Models/Configuration.cs @@ -29,10 +29,4 @@ public class Configuration return result; } - public void SetAndUpdate(Property.Models.Configuration configuration) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(); - } - } \ No newline at end of file diff --git a/Rename/Rename.cs b/Rename/Rename.cs index ad991bf..be9ff60 100644 --- a/Rename/Rename.cs +++ b/Rename/Rename.cs @@ -46,7 +46,6 @@ public class Rename Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration); _PropertyConfiguration = propertyConfiguration; _Configuration = configuration; - propertyConfiguration.Update(); log.Information(propertyConfiguration.RootDirectory); Verify(); List lines = RenameFilesInDirectories(log); diff --git a/Set-Created-Date/Models/Binder/Configuration.cs b/Set-Created-Date/Models/Binder/Configuration.cs index 0f479c3..42cadd7 100644 --- a/Set-Created-Date/Models/Binder/Configuration.cs +++ b/Set-Created-Date/Models/Binder/Configuration.cs @@ -52,7 +52,6 @@ public class Configuration configuration = configurationSection.Get(); } result = Get(configuration); - result.SetAndUpdate(propertyConfiguration); return result; } diff --git a/Set-Created-Date/Models/Configuration.cs b/Set-Created-Date/Models/Configuration.cs index 4c65693..c112444 100644 --- a/Set-Created-Date/Models/Configuration.cs +++ b/Set-Created-Date/Models/Configuration.cs @@ -29,10 +29,4 @@ public class Configuration return result; } - public void SetAndUpdate(Property.Models.Configuration configuration) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(); - } - } \ No newline at end of file diff --git a/Set-Created-Date/SetCreatedDate.cs b/Set-Created-Date/SetCreatedDate.cs index 887fe60..290296e 100644 --- a/Set-Created-Date/SetCreatedDate.cs +++ b/Set-Created-Date/SetCreatedDate.cs @@ -40,7 +40,6 @@ public class SetCreatedDate Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration); _PropertyConfiguration = propertyConfiguration; _Configuration = configuration; - propertyConfiguration.Update(); log.Information(propertyConfiguration.RootDirectory); Verify(); List lines = SetCreatedDateFilesInDirectories(log); diff --git a/Tests/Models/AppSettings.cs b/Tests/Models/AppSettings.cs index ff0c37b..da800a2 100644 --- a/Tests/Models/AppSettings.cs +++ b/Tests/Models/AppSettings.cs @@ -3,25 +3,21 @@ using System.Text.Json.Serialization; namespace View_by_Distance.Tests.Models; -public class AppSettings +public record AppSettings(string Company, + int MaxDegreeOfParallelism, + string WorkingDirectoryName) { - public string Company { init; get; } - public int MaxDegreeOfParallelism { init; get; } - public string WorkingDirectoryName { init; get; } - - [JsonConstructor] - public AppSettings(string company, int maxDegreeOfParallelism, string workingDirectoryName) - { - Company = company; - MaxDegreeOfParallelism = maxDegreeOfParallelism; - WorkingDirectoryName = workingDirectoryName; - } - public override string ToString() { - string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + string result = JsonSerializer.Serialize(this, AppSettingsSourceGenerationContext.Default.AppSettings); return result; } +} + +[JsonSourceGenerationOptions(WriteIndented = true)] +[JsonSerializable(typeof(AppSettings))] +internal partial class AppSettingsSourceGenerationContext : JsonSerializerContext +{ } \ No newline at end of file diff --git a/Tests/Models/Binder/.editorconfig b/Tests/Models/Binder/.editorconfig new file mode 100644 index 0000000..1c444cd --- /dev/null +++ b/Tests/Models/Binder/.editorconfig @@ -0,0 +1,2 @@ +[*.cs] +csharp_preserve_single_line_statements = true \ No newline at end of file diff --git a/Tests/Models/Binder/AppSettings.cs b/Tests/Models/Binder/AppSettings.cs index 55a8982..7704b04 100644 --- a/Tests/Models/Binder/AppSettings.cs +++ b/Tests/Models/Binder/AppSettings.cs @@ -1,30 +1,28 @@ using Microsoft.Extensions.Configuration; using System.Text.Json; +using System.Text.Json.Serialization; namespace View_by_Distance.Tests.Models.Binder; public class AppSettings { -#nullable disable - - public string Company { get; set; } + public string? Company { get; set; } public int? MaxDegreeOfParallelism { get; set; } - public string WorkingDirectoryName { get; set; } - -#nullable restore + public string? WorkingDirectoryName { get; set; } public override string ToString() { - string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + string result = JsonSerializer.Serialize(this, BinderAppSettingsSourceGenerationContext.Default.AppSettings); return result; } private static Models.AppSettings Get(AppSettings? appSettings) { Models.AppSettings result; - if (appSettings?.MaxDegreeOfParallelism is null) - throw new NullReferenceException(nameof(appSettings.MaxDegreeOfParallelism)); + if (appSettings?.Company is null) throw new NullReferenceException(nameof(appSettings.Company)); + if (appSettings?.MaxDegreeOfParallelism is null) throw new NullReferenceException(nameof(appSettings.MaxDegreeOfParallelism)); + if (appSettings?.WorkingDirectoryName is null) throw new NullReferenceException(nameof(appSettings.WorkingDirectoryName)); result = new( appSettings.Company, appSettings.MaxDegreeOfParallelism.Value, @@ -36,9 +34,17 @@ public class AppSettings public static Models.AppSettings Get(IConfigurationRoot configurationRoot) { Models.AppSettings result; +#pragma warning disable IL3050, IL2026 AppSettings? appSettings = configurationRoot.Get(); +#pragma warning restore IL3050, IL2026 result = Get(appSettings); return result; } +} + +[JsonSourceGenerationOptions(WriteIndented = true)] +[JsonSerializable(typeof(AppSettings))] +internal partial class BinderAppSettingsSourceGenerationContext : JsonSerializerContext +{ } \ No newline at end of file diff --git a/Tests/Models/Binder/Configuration.cs b/Tests/Models/Binder/Configuration.cs index 4df67a9..7646fc4 100644 --- a/Tests/Models/Binder/Configuration.cs +++ b/Tests/Models/Binder/Configuration.cs @@ -1,6 +1,5 @@ using Microsoft.Extensions.Configuration; using Phares.Shared; -using System.ComponentModel.DataAnnotations; using System.Text.Json; namespace View_by_Distance.Tests.Models.Binder; @@ -8,48 +7,90 @@ namespace View_by_Distance.Tests.Models.Binder; public class Configuration { -#nullable disable - - [Display(Name = "Check D Face and Up Dates"), Required] public bool? CheckDFaceAndUpWriteDates { get; set; } - [Display(Name = "Check Json For Distance Results"), Required] public bool? CheckJsonForDistanceResults { get; set; } - [Display(Name = "CrossDirectory Max Items In Distance Collection"), Required] public int? CrossDirectoryMaxItemsInDistanceCollection { get; set; } - [Display(Name = "Distance Factor"), Required] public int? DistanceFactor { get; set; } - [Display(Name = "Force Face Last Write Time to Creation Time"), Required] public bool? ForceFaceLastWriteTimeToCreationTime { get; set; } - [Display(Name = "Force Metadata Last Write Time to Creation Time"), Required] public bool? ForceMetadataLastWriteTimeToCreationTime { get; set; } - [Display(Name = "Force Resize Last Write Time to Creation Time"), Required] public bool? ForceResizeLastWriteTimeToCreationTime { get; set; } - [Display(Name = "Ignore Extensions"), Required] public string[] IgnoreExtensions { get; set; } - [Display(Name = "Julie Phares Copy Birthdays"), Required] public string[] JLinks { get; set; } - [Display(Name = "Load Or GetPersonName Then Save Distance Results"), Required] public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } - [Display(Name = "Load Or GetPersonName Then Save Image Faces Results"), Required] public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } - [Display(Name = "Mixed Year Relative Paths"), Required] public string[] MixedYearRelativePaths { get; set; } - [Display(Name = "Model Directory"), Required] public string ModelDirectory { get; set; } - [Display(Name = "Model Name"), Required] public string ModelName { get; set; } - [Display(Name = "Number Jitters"), Required] public int? NumberOfJitters { get; set; } - [Display(Name = "Number of Times To Up Sample"), Required] public int? NumberOfTimesToUpsample { get; set; } - [Display(Name = "Output Extension"), Required] public string OutputExtension { get; set; } - [Display(Name = "Output Quality"), Required] public int? OutputQuality { get; set; } - [Display(Name = "Output Resolutions"), Required] public string[] OutputResolutions { get; set; } - [Display(Name = "Override For Face Images"), Required] public bool? OverrideForFaceImages { get; set; } - [Display(Name = "Override For Face Landmark Images"), Required] public bool? OverrideForFaceLandmarkImages { get; set; } - [Display(Name = "Override For Resize Images"), Required] public bool? OverrideForResizeImages { get; set; } - [Display(Name = "Predictor Model Name"), Required] public string PredictorModelName { get; set; } - [Display(Name = "Properties Changed For Distance"), Required] public bool? PropertiesChangedForDistance { get; set; } - [Display(Name = "Properties Changed For Faces"), Required] public bool? PropertiesChangedForFaces { get; set; } - [Display(Name = "Properties Changed For Index"), Required] public bool? PropertiesChangedForIndex { get; set; } - [Display(Name = "Properties Changed For Metadata"), Required] public bool? PropertiesChangedForMetadata { get; set; } - [Display(Name = "Properties Changed For Resize"), Required] public bool? PropertiesChangedForResize { get; set; } - [Display(Name = "Property Configuration"), Required] public Property.Models.Configuration PropertyConfiguration { get; set; } - [Display(Name = "Reverse"), Required] public bool? Reverse { get; set; } - [Display(Name = "Save Face Landmark For Output Resolutions"), Required] public string[] SaveFaceLandmarkForOutputResolutions { get; set; } - [Display(Name = "Save Full Year Of Random Files"), Required] public bool? SaveFullYearOfRandomFiles { get; set; } - [Display(Name = "Save Resized Images by Person Key Formatted"), Required] public string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions { get; set; } - [Display(Name = "Save Shortcuts"), Required] public string[] SaveShortcutsForOutputResolutions { get; set; } - [Display(Name = "Save Resized Subfiles"), Required] public bool? SaveResizedSubfiles { get; set; } - [Display(Name = "Skip Search"), Required] public bool? SkipSearch { get; set; } - [Display(Name = "Test Distance Results"), Required] public bool? TestDistanceResults { get; set; } - [Display(Name = "Valid Resolutions"), Required] public string[] ValidResolutions { get; set; } - -#nullable restore + public bool? CheckDFaceAndUpWriteDates { get; set; } + public bool? CheckJsonForDistanceResults { get; set; } + public string[]? CopyFacesAndSaveFaceLandmarkForOutputResolutions { get; set; } + public int? CrossDirectoryMaxItemsInDistanceCollection { get; set; } + public bool? DeletePossibleDuplicates { get; set; } + public int? DistanceFactor { get; set; } + public bool? DistanceMoveUnableToMatch { get; set; } + public int? DistancePixelDistanceTolerance { get; set; } + public bool? DistanceRenameToMatch { get; set; } + public int? EyeThreshold { get; set; } + public int? FaceAreaPermyriad { get; set; } + public int? FaceConfidencePercent { get; set; } + public int? FaceDistanceHiddenImageFactor { get; set; } + public int? FaceDistancePermyriad { get; set; } + public string? FocusDirectory { get; set; } + public string? FocusModel { get; set; } + public bool? ForceFaceLastWriteTimeToCreationTime { get; set; } + public bool? ForceMetadataLastWriteTimeToCreationTime { get; set; } + public bool? ForceResizeLastWriteTimeToCreationTime { get; set; } + public string? GenealogicalDataCommunicationFile { get; set; } + public string[]? IgnoreExtensions { get; set; } + public string[]? JLinks { get; set; } + public string[]? LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } + public string[]? LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } + public bool? LoadPhotoPrismLocations { get; set; } + public float? LocationContainerDistanceTolerance { get; set; } + public int? LocationDigits { get; set; } + public int? LocationFactor { get; set; } + public bool? LookForAbandoned { get; set; } + public string? MappingDefaultName { get; set; } + public bool? MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping { get; set; } + public bool? MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping { 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 int? OutputQuality { get; set; } + public string[]? OutputResolutions { get; set; } + public bool? OverrideForFaceImages { get; set; } + public bool? OverrideForFaceLandmarkImages { get; set; } + public bool? OverrideForResizeImages { get; set; } + public int? PersonBirthdayFirstYear { get; set; } + public string? PersonBirthdayFormat { get; set; } + public string? PersonCharacters { get; set; } + public int? PersonCharactersCopyCount { get; set; } + public string? PersonKeyFormat { 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 int? RadomUseBirthdayMinimum { get; set; } + public int[]? RangeDaysDeltaTolerance { get; set; } + public float[]? RangeDistanceTolerance { get; set; } + public float[]? RangeFaceAreaTolerance { get; set; } + public float[]? RangeFaceConfidence { get; set; } + public float[]? RectangleIntersectMinimums { get; set; } + public bool? Reverse { get; set; } + public string[]? SaveBlurHashForOutputResolutions { get; set; } + public string[]? SaveFaceDistancesForOutputResolutions { get; set; } + public string[]? SaveFaceLandmarkForOutputResolutions { get; set; } + public string[]? SaveFilteredOriginalImagesFromJLinksForOutputResolutions { get; set; } + public bool? SaveFullYearOfRandomFiles { get; set; } + public bool? SaveIndividually { get; set; } + public string[]? SaveMappedForOutputResolutions { get; set; } + public string[]? SavePropertyShortcutsForOutputResolutions { get; set; } + public string[]? SaveRandomForOutputResolutions { get; set; } + public bool? SaveResizedSubfiles { get; set; } + public string[]? SaveShortcutsForOutputResolutions { get; set; } + public bool? SaveSortingWithoutPerson { get; set; } + public string[]? SkipNotSkipDirectories { get; set; } + public int? SkipOlderThanDays { get; set; } + public int? SkipPersonWithMoreThen { get; set; } + public bool? SkipSearch { get; set; } + public int? SortingMaximumPerFaceShouldBeHigh { get; set; } + public int? SortingMaximumPerKey { get; set; } + public int? SortingMinimumToUseSigma { get; set; } + public bool? TestDistanceResults { get; set; } + public int? UseFilterTries { get; set; } + public string[]? ValidKeyWordsToIgnoreInRandom { get; set; } + public string[]? ValidResolutions { get; set; } public override string ToString() { @@ -57,108 +98,178 @@ public class Configuration return result; } - private static Models.Configuration Get(Configuration? configuration) +#pragma warning restore csharp_preserve_single_line_statements + + private static Models.Configuration Get(Configuration? configuration, Property.Models.Configuration propertyConfiguration) { Models.Configuration result; - if (configuration is null) - throw new NullReferenceException(nameof(configuration)); - 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)); - if (configuration.DistanceFactor is null) - throw new NullReferenceException(nameof(configuration.DistanceFactor)); - 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.IgnoreExtensions is null) - throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); - configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions ??= Array.Empty(); - configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions ??= Array.Empty(); - if (configuration.MixedYearRelativePaths is null) - throw new NullReferenceException(nameof(configuration.MixedYearRelativePaths)); - if (configuration.NumberOfJitters is null) - throw new NullReferenceException(nameof(configuration.NumberOfJitters)); - if (configuration.NumberOfTimesToUpsample is null) - throw new NullReferenceException(nameof(configuration.NumberOfTimesToUpsample)); - 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.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)); - if (configuration.PropertiesChangedForMetadata is null) - throw new NullReferenceException(nameof(configuration.PropertiesChangedForMetadata)); - if (configuration.PropertiesChangedForResize is null) - throw new NullReferenceException(nameof(configuration.PropertiesChangedForResize)); - if (configuration.Reverse is null) - throw new NullReferenceException(nameof(configuration.Reverse)); - configuration.SaveFaceLandmarkForOutputResolutions ??= Array.Empty(); - if (configuration.SaveFullYearOfRandomFiles is null) - throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); - configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions ??= Array.Empty(); - if (configuration.SaveResizedSubfiles is null) - throw new NullReferenceException(nameof(configuration.SaveResizedSubfiles)); - configuration.SaveShortcutsForOutputResolutions ??= Array.Empty(); - if (configuration.SkipSearch is null) - throw new NullReferenceException(nameof(configuration.SkipSearch)); - if (configuration.TestDistanceResults is null) - throw new NullReferenceException(nameof(configuration.TestDistanceResults)); - if (configuration.ValidResolutions is null) - throw new NullReferenceException(nameof(configuration.ValidResolutions)); - result = new(configuration.PropertyConfiguration, + if (configuration is null) throw new NullReferenceException(nameof(configuration)); + if (configuration.CheckDFaceAndUpWriteDates is null) throw new NullReferenceException(nameof(configuration.CheckDFaceAndUpWriteDates)); + if (configuration?.CheckDFaceAndUpWriteDates is null) throw new NullReferenceException(nameof(configuration.CheckDFaceAndUpWriteDates)); + if (configuration?.CheckJsonForDistanceResults is null) throw new NullReferenceException(nameof(configuration.CheckJsonForDistanceResults)); + // if (configuration?.CopyFacesAndSaveFaceLandmarkForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions)); + if (configuration?.CrossDirectoryMaxItemsInDistanceCollection is null) throw new NullReferenceException(nameof(configuration.CrossDirectoryMaxItemsInDistanceCollection)); + if (configuration?.DeletePossibleDuplicates is null) throw new NullReferenceException(nameof(configuration.DeletePossibleDuplicates)); + if (configuration?.DistanceFactor is null) throw new NullReferenceException(nameof(configuration.DistanceFactor)); + if (configuration?.DistanceMoveUnableToMatch is null) throw new NullReferenceException(nameof(configuration.DistanceMoveUnableToMatch)); + if (configuration?.DistancePixelDistanceTolerance is null) throw new NullReferenceException(nameof(configuration.DistancePixelDistanceTolerance)); + if (configuration?.DistanceRenameToMatch is null) throw new NullReferenceException(nameof(configuration.DistanceRenameToMatch)); + if (configuration?.EyeThreshold is null) throw new NullReferenceException(nameof(configuration.EyeThreshold)); + if (configuration?.FaceAreaPermyriad is null) throw new NullReferenceException(nameof(configuration.FaceAreaPermyriad)); + if (configuration?.FaceConfidencePercent is null) throw new NullReferenceException(nameof(configuration.FaceConfidencePercent)); + if (configuration?.FaceDistanceHiddenImageFactor is null) throw new NullReferenceException(nameof(configuration.FaceDistanceHiddenImageFactor)); + if (configuration?.FaceDistancePermyriad is null) throw new NullReferenceException(nameof(configuration.FaceDistancePermyriad)); + if (configuration?.FocusDirectory is null) throw new NullReferenceException(nameof(configuration.FocusDirectory)); + if (configuration?.FocusModel is null) throw new NullReferenceException(nameof(configuration.FocusModel)); + 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?.GenealogicalDataCommunicationFile is null) throw new NullReferenceException(nameof(configuration.GenealogicalDataCommunicationFile)); + // if (configuration?.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); + // if (configuration?.JLinks is null) throw new NullReferenceException(nameof(configuration.JLinks)); + // if (configuration?.LoadOrCreateThenSaveDistanceResultsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions)); + // if (configuration?.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions)); + if (configuration?.LoadPhotoPrismLocations is null) throw new NullReferenceException(nameof(configuration.LoadPhotoPrismLocations)); + // if (configuration?.LocationContainerDistanceTolerance is null) throw new NullReferenceException(nameof(configuration.LocationContainerDistanceTolerance)); + if (configuration?.LocationDigits is null) throw new NullReferenceException(nameof(configuration.LocationDigits)); + if (configuration?.LocationFactor is null) throw new NullReferenceException(nameof(configuration.LocationFactor)); + if (configuration?.LookForAbandoned is null) throw new NullReferenceException(nameof(configuration.LookForAbandoned)); + if (configuration?.MappingDefaultName is null) throw new NullReferenceException(nameof(configuration.MappingDefaultName)); + if (configuration?.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping is null) throw new NullReferenceException(nameof(configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping)); + if (configuration?.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping is null) throw new NullReferenceException(nameof(configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping)); + // 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?.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?.PersonBirthdayFirstYear is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFirstYear)); + if (configuration?.PersonBirthdayFormat is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); + if (configuration?.PersonCharacters is null) throw new NullReferenceException(nameof(configuration.PersonCharacters)); + if (configuration?.PersonCharactersCopyCount is null) throw new NullReferenceException(nameof(configuration.PersonCharactersCopyCount)); + if (configuration?.PersonKeyFormat is null) throw new NullReferenceException(nameof(configuration.PersonKeyFormat)); + 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)); + if (configuration?.PropertiesChangedForMetadata is null) throw new NullReferenceException(nameof(configuration.PropertiesChangedForMetadata)); + if (configuration?.PropertiesChangedForResize is null) throw new NullReferenceException(nameof(configuration.PropertiesChangedForResize)); + if (configuration?.RadomUseBirthdayMinimum is null) throw new NullReferenceException(nameof(configuration.RadomUseBirthdayMinimum)); + // if (configuration?.RangeDaysDeltaTolerance is null) throw new NullReferenceException(nameof(configuration.RangeDaysDeltaTolerance)); + // if (configuration?.RangeDistanceTolerance is null) throw new NullReferenceException(nameof(configuration.RangeDistanceTolerance)); + // if (configuration?.RangeFaceAreaTolerance is null) throw new NullReferenceException(nameof(configuration.RangeFaceAreaTolerance)); + // if (configuration?.RangeFaceConfidence is null) throw new NullReferenceException(nameof(configuration.RangeFaceConfidence)); + // if (configuration?.RectangleIntersectMinimums is null) throw new NullReferenceException(nameof(configuration.RectangleIntersectMinimums)); + if (configuration?.Reverse is null) throw new NullReferenceException(nameof(configuration.Reverse)); + // if (configuration?.SaveBlurHashForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveBlurHashForOutputResolutions)); + // if (configuration?.SaveFaceDistancesForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveFaceDistancesForOutputResolutions)); + // if (configuration?.SaveFaceLandmarkForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveFaceLandmarkForOutputResolutions)); + // if (configuration?.SaveFilteredOriginalImagesFromJLinksForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions)); + if (configuration?.SaveFullYearOfRandomFiles is null) throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); + if (configuration?.SaveIndividually is null) throw new NullReferenceException(nameof(configuration.SaveIndividually)); + // if (configuration?.SaveMappedForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveMappedForOutputResolutions)); + // if (configuration?.SavePropertyShortcutsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SavePropertyShortcutsForOutputResolutions)); + // if (configuration?.SaveRandomForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveRandomForOutputResolutions)); + if (configuration?.SaveResizedSubfiles is null) throw new NullReferenceException(nameof(configuration.SaveResizedSubfiles)); + // if (configuration?.SaveShortcutsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveShortcutsForOutputResolutions)); + if (configuration?.SaveSortingWithoutPerson is null) throw new NullReferenceException(nameof(configuration.SaveSortingWithoutPerson)); + // if (configuration?.SkipNotSkipDirectories is null) throw new NullReferenceException(nameof(configuration.SkipNotSkipDirectories)); + // if (configuration?.SkipOlderThanDays is null) throw new NullReferenceException(nameof(configuration.SkipOlderThanDays)); + // if (configuration?.SkipPersonWithMoreThen is null) throw new NullReferenceException(nameof(configuration.SkipPersonWithMoreThen)); + if (configuration?.SkipSearch is null) throw new NullReferenceException(nameof(configuration.SkipSearch)); + if (configuration?.SortingMaximumPerFaceShouldBeHigh is null) throw new NullReferenceException(nameof(configuration.SortingMaximumPerFaceShouldBeHigh)); + if (configuration?.SortingMaximumPerKey is null) throw new NullReferenceException(nameof(configuration.SortingMaximumPerKey)); + if (configuration?.SortingMinimumToUseSigma is null) throw new NullReferenceException(nameof(configuration.SortingMinimumToUseSigma)); + if (configuration?.TestDistanceResults is null) throw new NullReferenceException(nameof(configuration.TestDistanceResults)); + if (configuration?.UseFilterTries is null) throw new NullReferenceException(nameof(configuration.UseFilterTries)); + // if (configuration?.ValidKeyWordsToIgnoreInRandom is null) throw new NullReferenceException(nameof(configuration.ValidKeyWordsToIgnoreInRandom)); + // if (configuration?.ValidResolutions is null) throw new NullReferenceException(nameof(configuration.ValidResolutions)); + result = new(propertyConfiguration, configuration.CheckDFaceAndUpWriteDates.Value, configuration.CheckJsonForDistanceResults.Value, + configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions ?? Array.Empty(), configuration.CrossDirectoryMaxItemsInDistanceCollection.Value, + configuration.DeletePossibleDuplicates.Value, configuration.DistanceFactor.Value, + configuration.DistanceMoveUnableToMatch.Value, + configuration.DistancePixelDistanceTolerance.Value, + configuration.DistanceRenameToMatch.Value, + configuration.EyeThreshold.Value, + configuration.FaceAreaPermyriad.Value, + configuration.FaceConfidencePercent.Value, + configuration.FaceDistanceHiddenImageFactor.Value, + configuration.FaceDistancePermyriad.Value, + configuration.FocusDirectory, + configuration.FocusModel, configuration.ForceFaceLastWriteTimeToCreationTime.Value, configuration.ForceMetadataLastWriteTimeToCreationTime.Value, configuration.ForceResizeLastWriteTimeToCreationTime.Value, - configuration.IgnoreExtensions, - configuration.JLinks, - configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions, - configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions, - configuration.MixedYearRelativePaths, + configuration.GenealogicalDataCommunicationFile, + configuration.IgnoreExtensions ?? Array.Empty(), + configuration.JLinks ?? Array.Empty(), + configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions ?? Array.Empty(), + configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions ?? Array.Empty(), + configuration.LoadPhotoPrismLocations.Value, + configuration.LocationContainerDistanceTolerance, + configuration.LocationDigits.Value, + configuration.LocationFactor.Value, + configuration.LookForAbandoned.Value, + configuration.MappingDefaultName, + configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping.Value, + configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping.Value, + configuration.MixedYearRelativePaths ?? Array.Empty(), configuration.ModelDirectory, configuration.ModelName, - configuration.NumberOfJitters.Value, - configuration.NumberOfTimesToUpsample.Value, configuration.OutputExtension, configuration.OutputQuality.Value, - configuration.OutputResolutions, + configuration.OutputResolutions ?? Array.Empty(), configuration.OverrideForFaceImages.Value, configuration.OverrideForFaceLandmarkImages.Value, configuration.OverrideForResizeImages.Value, + configuration.PersonBirthdayFirstYear.Value, + configuration.PersonBirthdayFormat, + configuration.PersonCharacters, + configuration.PersonCharactersCopyCount.Value, + configuration.PersonKeyFormat, configuration.PredictorModelName, configuration.PropertiesChangedForDistance.Value, configuration.PropertiesChangedForFaces.Value, configuration.PropertiesChangedForIndex.Value, configuration.PropertiesChangedForMetadata.Value, configuration.PropertiesChangedForResize.Value, + configuration.RadomUseBirthdayMinimum.Value, + configuration.RangeDaysDeltaTolerance ?? Array.Empty(), + configuration.RangeDistanceTolerance ?? Array.Empty(), + configuration.RangeFaceAreaTolerance ?? Array.Empty(), + configuration.RangeFaceConfidence ?? Array.Empty(), + configuration.RectangleIntersectMinimums ?? Array.Empty(), configuration.Reverse.Value, - configuration.SaveFaceLandmarkForOutputResolutions, + configuration.SaveBlurHashForOutputResolutions ?? Array.Empty(), + configuration.SaveFaceDistancesForOutputResolutions ?? Array.Empty(), + configuration.SaveFaceLandmarkForOutputResolutions ?? Array.Empty(), + configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions ?? Array.Empty(), + configuration.SaveIndividually.Value, configuration.SaveFullYearOfRandomFiles.Value, - configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions, - configuration.SaveShortcutsForOutputResolutions, + configuration.SaveMappedForOutputResolutions ?? Array.Empty(), + configuration.SavePropertyShortcutsForOutputResolutions ?? Array.Empty(), + configuration.SaveRandomForOutputResolutions ?? Array.Empty(), configuration.SaveResizedSubfiles.Value, + configuration.SaveShortcutsForOutputResolutions ?? Array.Empty(), + configuration.SaveSortingWithoutPerson.Value, + configuration.SkipNotSkipDirectories ?? Array.Empty(), + configuration.SkipOlderThanDays, + configuration.SkipPersonWithMoreThen, configuration.SkipSearch.Value, + configuration.SortingMaximumPerFaceShouldBeHigh.Value, + configuration.SortingMaximumPerKey.Value, + configuration.SortingMinimumToUseSigma.Value, configuration.TestDistanceResults.Value, - configuration.ValidResolutions); + configuration.UseFilterTries.Value, + configuration.ValidKeyWordsToIgnoreInRandom ?? Array.Empty(), + configuration.ValidResolutions ?? Array.Empty()); return result; } @@ -175,8 +286,7 @@ public class Configuration IConfigurationSection configurationSection = configurationRoot.GetSection(section); configuration = configurationSection.Get(); } - result = Get(configuration); - result.SetAndUpdate(propertyConfiguration); + result = Get(configuration, propertyConfiguration); return result; } diff --git a/Tests/Models/Configuration.cs b/Tests/Models/Configuration.cs index 773c990..74b7e4b 100644 --- a/Tests/Models/Configuration.cs +++ b/Tests/Models/Configuration.cs @@ -1,142 +1,85 @@ -using System.Text.Json; -using System.Text.Json.Serialization; - namespace View_by_Distance.Tests.Models; -public class Configuration -{ - - protected Property.Models.Configuration _PropertyConfiguration; - public Property.Models.Configuration PropertyConfiguration => _PropertyConfiguration; - - public bool CheckDFaceAndUpWriteDates { init; get; } - public bool CheckJsonForDistanceResults { init; get; } - public int CrossDirectoryMaxItemsInDistanceCollection { init; get; } - public int DistanceFactor { init; get; } - public bool ForceFaceLastWriteTimeToCreationTime { init; get; } - public bool ForceMetadataLastWriteTimeToCreationTime { init; get; } - public bool ForceResizeLastWriteTimeToCreationTime { init; get; } - public string[] IgnoreExtensions { init; get; } - public string[] JLinks { init; get; } - public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { init; get; } - public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { init; get; } - public string[] MixedYearRelativePaths { init; get; } - public string ModelDirectory { init; get; } - public string ModelName { init; get; } - public int NumberOfJitters { init; get; } - public int NumberOfTimesToUpsample { init; get; } - public string OutputExtension { init; get; } - public int OutputQuality { init; get; } - public string[] OutputResolutions { init; get; } - public bool OverrideForFaceImages { init; get; } - public bool OverrideForFaceLandmarkImages { init; get; } - public bool OverrideForResizeImages { init; get; } - public string PredictorModelName { init; get; } - public bool PropertiesChangedForDistance { init; get; } - public bool PropertiesChangedForFaces { init; get; } - public bool PropertiesChangedForIndex { init; get; } - public bool PropertiesChangedForMetadata { init; get; } - public bool PropertiesChangedForResize { init; get; } - public bool Reverse { init; get; } - public string[] SaveFaceLandmarkForOutputResolutions { init; get; } - public bool SaveFullYearOfRandomFiles { init; get; } - public string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions { init; get; } - public string[] SaveShortcutsForOutputResolutions { init; get; } - public bool SaveResizedSubfiles { init; get; } - public bool SkipSearch { init; get; } - public bool TestDistanceResults { init; get; } - public string[] ValidResolutions { init; get; } - - [JsonConstructor] - public Configuration(Property.Models.Configuration propertyConfiguration, - bool checkDFaceAndUpWriteDates, - bool checkJsonForDistanceResults, - int crossDirectoryMaxItemsInDistanceCollection, - int distanceFactor, - bool forceFaceLastWriteTimeToCreationTime, - bool forceMetadataLastWriteTimeToCreationTime, - bool forceResizeLastWriteTimeToCreationTime, - string[] ignoreExtensions, - string[] jLinks, - string[] loadOrCreateThenSaveDistanceResultsForOutputResolutions, - string[] loadOrCreateThenSaveImageFacesResultsForOutputResolutions, - string[] mixedYearRelativePaths, - string modelDirectory, - string modelName, - int numberOfJitters, - int numberOfTimesToUpsample, - string outputExtension, - int outputQuality, - string[] outputResolutions, - bool overrideForFaceImages, - bool overrideForFaceLandmarkImages, - bool overrideForResizeImages, - string predictorModelName, - bool propertiesChangedForDistance, - bool propertiesChangedForFaces, - bool propertiesChangedForIndex, - bool propertiesChangedForMetadata, - bool propertiesChangedForResize, - bool reverse, - string[] saveFaceLandmarkForOutputResolutions, - bool saveFullYearOfRandomFiles, - string[] saveFilteredOriginalImagesFromJLinksForOutputResolutions, - string[] saveShortcutsForOutputResolutions, - bool saveResizedSubfiles, - bool skipSearch, - bool testDistanceResults, - string[] validResolutions) - { - _PropertyConfiguration = propertyConfiguration; - CheckDFaceAndUpWriteDates = checkDFaceAndUpWriteDates; - CheckJsonForDistanceResults = checkJsonForDistanceResults; - CrossDirectoryMaxItemsInDistanceCollection = crossDirectoryMaxItemsInDistanceCollection; - DistanceFactor = distanceFactor; - ForceFaceLastWriteTimeToCreationTime = forceFaceLastWriteTimeToCreationTime; - ForceMetadataLastWriteTimeToCreationTime = forceMetadataLastWriteTimeToCreationTime; - ForceResizeLastWriteTimeToCreationTime = forceResizeLastWriteTimeToCreationTime; - IgnoreExtensions = ignoreExtensions; - JLinks = jLinks; - LoadOrCreateThenSaveDistanceResultsForOutputResolutions = loadOrCreateThenSaveDistanceResultsForOutputResolutions; - LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = loadOrCreateThenSaveImageFacesResultsForOutputResolutions; - MixedYearRelativePaths = mixedYearRelativePaths; - ModelDirectory = modelDirectory; - ModelName = modelName; - NumberOfJitters = numberOfJitters; - NumberOfTimesToUpsample = numberOfTimesToUpsample; - OutputExtension = outputExtension; - OutputQuality = outputQuality; - OutputResolutions = outputResolutions; - OverrideForFaceImages = overrideForFaceImages; - OverrideForFaceLandmarkImages = overrideForFaceLandmarkImages; - OverrideForResizeImages = overrideForResizeImages; - PredictorModelName = predictorModelName; - PropertiesChangedForDistance = propertiesChangedForDistance; - PropertiesChangedForFaces = propertiesChangedForFaces; - PropertiesChangedForIndex = propertiesChangedForIndex; - PropertiesChangedForMetadata = propertiesChangedForMetadata; - PropertiesChangedForResize = propertiesChangedForResize; - Reverse = reverse; - SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions; - SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles; - SaveFilteredOriginalImagesFromJLinksForOutputResolutions = saveFilteredOriginalImagesFromJLinksForOutputResolutions; - SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions; - SaveResizedSubfiles = saveResizedSubfiles; - SkipSearch = skipSearch; - TestDistanceResults = testDistanceResults; - ValidResolutions = validResolutions; - } - - public override string ToString() - { - string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); - return result; - } - - public void SetAndUpdate(Property.Models.Configuration configuration) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(); - } - -} \ No newline at end of file +public record Configuration(Property.Models.Configuration PropertyConfiguration, + bool CheckDFaceAndUpWriteDates, + bool CheckJsonForDistanceResults, + string[] CopyFacesAndSaveFaceLandmarkForOutputResolutions, + int CrossDirectoryMaxItemsInDistanceCollection, + bool DeletePossibleDuplicates, + int DistanceFactor, + bool DistanceMoveUnableToMatch, + int DistancePixelDistanceTolerance, + bool DistanceRenameToMatch, + int EyeThreshold, + int FaceAreaPermyriad, + int FaceConfidencePercent, + int FaceDistanceHiddenImageFactor, + int FaceDistancePermyriad, + string FocusDirectory, + string FocusModel, + bool ForceFaceLastWriteTimeToCreationTime, + bool ForceMetadataLastWriteTimeToCreationTime, + bool ForceResizeLastWriteTimeToCreationTime, + string GenealogicalDataCommunicationFile, + string[] IgnoreExtensions, + string[] JLinks, + string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions, + string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions, + bool LoadPhotoPrismLocations, + float? LocationContainerDistanceTolerance, + int LocationDigits, + int LocationFactor, + bool LookForAbandoned, + string MappingDefaultName, + bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping, + bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping, + string[] MixedYearRelativePaths, + string ModelDirectory, + string ModelName, + string OutputExtension, + int OutputQuality, + string[] OutputResolutions, + bool OverrideForFaceImages, + bool OverrideForFaceLandmarkImages, + bool OverrideForResizeImages, + int PersonBirthdayFirstYear, + string PersonBirthdayFormat, + string PersonCharacters, + int PersonCharactersCopyCount, + string PersonKeyFormat, + string PredictorModelName, + bool PropertiesChangedForDistance, + bool PropertiesChangedForFaces, + bool PropertiesChangedForIndex, + bool PropertiesChangedForMetadata, + bool PropertiesChangedForResize, + int RadomUseBirthdayMinimum, + int[] RangeDaysDeltaTolerance, + float[] RangeDistanceTolerance, + float[] RangeFaceAreaPermyriadTolerance, + float[] RangeFaceConfidence, + float[] RectangleIntersectMinimums, + bool Reverse, + string[] SaveBlurHashForOutputResolutions, + string[] SaveFaceDistancesForOutputResolutions, + string[] SaveFaceLandmarkForOutputResolutions, + string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions, + bool SaveIndividually, + bool SaveFullYearOfRandomFiles, + string[] SaveMappedForOutputResolutions, + string[] SavePropertyShortcutsForOutputResolutions, + string[] SaveRandomForOutputResolutions, + bool SaveResizedSubfiles, + string[] SaveShortcutsForOutputResolutions, + bool SaveSortingWithoutPerson, + string[] SkipNotSkipDirectories, + int? SkipOlderThanDays, + int? SkipPersonWithMoreThen, + bool SkipSearch, + int SortingMaximumPerFaceShouldBeHigh, + int SortingMaximumPerKey, + int SortingMinimumToUseSigma, + bool TestDistanceResults, + int UseFilterTries, + string[] ValidKeyWordsToIgnoreInRandom, + string[] ValidResolutions); \ No newline at end of file diff --git a/Tests/UnitTestResize.cs b/Tests/UnitTestResize.cs index 08dd319..9e55d0c 100644 --- a/Tests/UnitTestResize.cs +++ b/Tests/UnitTestResize.cs @@ -87,22 +87,22 @@ public class UnitTestResize { A_Property result; if (_Configuration?.PropertyConfiguration is null) - throw new NullReferenceException(nameof(_Configuration.PropertyConfiguration)); - result = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Configuration.OutputExtension, reverse, aResultsFullGroupDirectory); + throw new NullReferenceException(nameof(_PropertyConfiguration)); + result = new(_AppSettings.MaxDegreeOfParallelism, _PropertyConfiguration, _Configuration.OutputExtension, reverse, aResultsFullGroupDirectory); return result; } private (string, string) GetResultsFullGroupDirectories() { string aResultsFullGroupDirectory = Property.Models.Stateless.IResult.GetResultsFullGroupDirectory( - _Configuration.PropertyConfiguration, + _PropertyConfiguration, nameof(A_Property), string.Empty, includeResizeGroup: false, includeModel: false, includePredictorModel: false); string bResultsFullGroupDirectory = Property.Models.Stateless.IResult.GetResultsFullGroupDirectory( - _Configuration.PropertyConfiguration, + _PropertyConfiguration, nameof(B_Metadata), string.Empty, includeResizeGroup: false, @@ -114,7 +114,7 @@ public class UnitTestResize private (string, string, string) GetResultsFullGroupDirectories(string outputResolution) { string cResultsFullGroupDirectory = Property.Models.Stateless.IResult.GetResultsFullGroupDirectory( - _Configuration.PropertyConfiguration, + _PropertyConfiguration, nameof(C_Resize), outputResolution, includeResizeGroup: true, @@ -128,6 +128,10 @@ public class UnitTestResize [TestMethod] public void TestMethodResize() { + if (_PropertyConfiguration.NumberOfJitters is null) + throw new NullReferenceException(nameof(_PropertyConfiguration.NumberOfJitters)); + if (_PropertyConfiguration.NumberOfTimesToUpsample is null) + throw new NullReferenceException(nameof(_PropertyConfiguration.NumberOfTimesToUpsample)); string sourceFileName = "100000507001158650387.jpg"; string sourceDirectoryName = "Facebook/2023.2 Summer Facebook"; Item item; @@ -144,16 +148,16 @@ public class UnitTestResize bool outputResolutionHasNumber = outputResolution.Any(l => char.IsNumber(l)); (string cResultsFullGroupDirectory, _, _) = GetResultsFullGroupDirectories(outputResolution); (string aResultsFullGroupDirectory, string bResultsFullGroupDirectory) = GetResultsFullGroupDirectories(); - Shared.Models.Methods.IBlurHasher blurHasher = new BlurHash.Models.C2_BlurHasher(_Configuration.PropertyConfiguration); + Shared.Models.Methods.IBlurHasher blurHasher = new BlurHash.Models.C2_BlurHasher(_PropertyConfiguration); _Logger.Information(_Configuration.ModelDirectory); A_Property propertyLogic = GetPropertyLogic(reverse, aResultsFullGroupDirectory); string aPropertySingletonDirectory = Path.Combine(aResultsFullGroupDirectory, "{}"); if (!Directory.Exists(aPropertySingletonDirectory)) _ = Directory.CreateDirectory(aPropertySingletonDirectory); (ImageCodecInfo imageCodecInfo, EncoderParameters encoderParameters, string filenameExtension) = C_Resize.GetTuple(_Configuration.OutputExtension, _Configuration.OutputQuality); - B_Metadata metadata = new(_Configuration.PropertyConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata, bResultsFullGroupDirectory); + B_Metadata metadata = new(_PropertyConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata, bResultsFullGroupDirectory); _ = metadata.ToString(); - C_Resize resize = new(_Configuration.PropertyConfiguration, _Configuration.ForceResizeLastWriteTimeToCreationTime, _Configuration.OverrideForResizeImages, _Configuration.PropertiesChangedForResize, _Configuration.ValidResolutions, imageCodecInfo, encoderParameters, filenameExtension); + C_Resize resize = new(_PropertyConfiguration, _Configuration.ForceResizeLastWriteTimeToCreationTime, _Configuration.OverrideForResizeImages, _Configuration.PropertiesChangedForResize, _Configuration.ValidResolutions, imageCodecInfo, encoderParameters, filenameExtension); _ = resize.ToString(); bool isUniqueFileName = false; bool? isNotUniqueAndNeedsReview = null; @@ -182,9 +186,9 @@ public class UnitTestResize item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder); MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item); (int _, metadataCollection) = metadata.GetMetadataCollection(subFileTuples, parseExceptions, changesFrom, mappingFromItem); - Dictionary outputResolutionToResize = resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, metadataCollection, item.Property, mappingFromItem); + Dictionary outputResolutionToResize = resize.GetResizeKeyValuePairs(_PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, metadataCollection, item.Property, mappingFromItem); Assert.IsNotNull(mappingFromItem.ResizedFileHolder); - resize.SaveResizedSubfile(_Configuration.PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize); + resize.SaveResizedSubfile(_PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize); string blurHash = blurHasher.Encode(resizedFileHolder); Assert.IsNotNull(blurHash); NonThrowTryCatch(); diff --git a/TestsWithFaceRecognitionDotNet/Models/AppSettings.cs b/TestsWithFaceRecognitionDotNet/Models/AppSettings.cs index ff0c37b..da800a2 100644 --- a/TestsWithFaceRecognitionDotNet/Models/AppSettings.cs +++ b/TestsWithFaceRecognitionDotNet/Models/AppSettings.cs @@ -3,25 +3,21 @@ using System.Text.Json.Serialization; namespace View_by_Distance.Tests.Models; -public class AppSettings +public record AppSettings(string Company, + int MaxDegreeOfParallelism, + string WorkingDirectoryName) { - public string Company { init; get; } - public int MaxDegreeOfParallelism { init; get; } - public string WorkingDirectoryName { init; get; } - - [JsonConstructor] - public AppSettings(string company, int maxDegreeOfParallelism, string workingDirectoryName) - { - Company = company; - MaxDegreeOfParallelism = maxDegreeOfParallelism; - WorkingDirectoryName = workingDirectoryName; - } - public override string ToString() { - string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + string result = JsonSerializer.Serialize(this, AppSettingsSourceGenerationContext.Default.AppSettings); return result; } +} + +[JsonSourceGenerationOptions(WriteIndented = true)] +[JsonSerializable(typeof(AppSettings))] +internal partial class AppSettingsSourceGenerationContext : JsonSerializerContext +{ } \ No newline at end of file diff --git a/TestsWithFaceRecognitionDotNet/Models/Binder/.editorconfig b/TestsWithFaceRecognitionDotNet/Models/Binder/.editorconfig new file mode 100644 index 0000000..1c444cd --- /dev/null +++ b/TestsWithFaceRecognitionDotNet/Models/Binder/.editorconfig @@ -0,0 +1,2 @@ +[*.cs] +csharp_preserve_single_line_statements = true \ No newline at end of file diff --git a/TestsWithFaceRecognitionDotNet/Models/Binder/AppSettings.cs b/TestsWithFaceRecognitionDotNet/Models/Binder/AppSettings.cs index 55a8982..7704b04 100644 --- a/TestsWithFaceRecognitionDotNet/Models/Binder/AppSettings.cs +++ b/TestsWithFaceRecognitionDotNet/Models/Binder/AppSettings.cs @@ -1,30 +1,28 @@ using Microsoft.Extensions.Configuration; using System.Text.Json; +using System.Text.Json.Serialization; namespace View_by_Distance.Tests.Models.Binder; public class AppSettings { -#nullable disable - - public string Company { get; set; } + public string? Company { get; set; } public int? MaxDegreeOfParallelism { get; set; } - public string WorkingDirectoryName { get; set; } - -#nullable restore + public string? WorkingDirectoryName { get; set; } public override string ToString() { - string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + string result = JsonSerializer.Serialize(this, BinderAppSettingsSourceGenerationContext.Default.AppSettings); return result; } private static Models.AppSettings Get(AppSettings? appSettings) { Models.AppSettings result; - if (appSettings?.MaxDegreeOfParallelism is null) - throw new NullReferenceException(nameof(appSettings.MaxDegreeOfParallelism)); + if (appSettings?.Company is null) throw new NullReferenceException(nameof(appSettings.Company)); + if (appSettings?.MaxDegreeOfParallelism is null) throw new NullReferenceException(nameof(appSettings.MaxDegreeOfParallelism)); + if (appSettings?.WorkingDirectoryName is null) throw new NullReferenceException(nameof(appSettings.WorkingDirectoryName)); result = new( appSettings.Company, appSettings.MaxDegreeOfParallelism.Value, @@ -36,9 +34,17 @@ public class AppSettings public static Models.AppSettings Get(IConfigurationRoot configurationRoot) { Models.AppSettings result; +#pragma warning disable IL3050, IL2026 AppSettings? appSettings = configurationRoot.Get(); +#pragma warning restore IL3050, IL2026 result = Get(appSettings); return result; } +} + +[JsonSourceGenerationOptions(WriteIndented = true)] +[JsonSerializable(typeof(AppSettings))] +internal partial class BinderAppSettingsSourceGenerationContext : JsonSerializerContext +{ } \ No newline at end of file diff --git a/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs b/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs index 90321fd..7646fc4 100644 --- a/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs +++ b/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs @@ -1,6 +1,5 @@ using Microsoft.Extensions.Configuration; using Phares.Shared; -using System.ComponentModel.DataAnnotations; using System.Text.Json; namespace View_by_Distance.Tests.Models.Binder; @@ -8,69 +7,90 @@ namespace View_by_Distance.Tests.Models.Binder; public class Configuration { -#nullable disable - - [Display(Name = "Check D Face and Up Dates"), Required] public bool? CheckDFaceAndUpWriteDates { get; set; } - [Display(Name = "Check Json For Distance Results"), Required] public bool? CheckJsonForDistanceResults { get; set; } - [Display(Name = "CrossDirectory Max Items In Distance Collection"), Required] public int? CrossDirectoryMaxItemsInDistanceCollection { get; set; } - [Display(Name = "Distance Factor"), Required] public int? DistanceFactor { get; set; } - [Display(Name = "Distance Move Unable to Match by 1 Tick"), Required] public bool? DistanceMoveUnableToMatch { get; set; } - [Display(Name = "Distance Pixel Distance Tolerance"), Required] public int? DistancePixelDistanceTolerance { get; set; } - [Display(Name = "Distance Rename to Match"), Required] public bool? DistanceRenameToMatch { get; set; } - [Display(Name = "Face Distance Hidden Image Factor"), Required] public int? FaceDistanceHiddenImageFactor { get; set; } - [Display(Name = "Face Confidence Percent"), Required] public int? FaceConfidencePercent { get; set; } - [Display(Name = "Face Distance Permyriad"), Required] public int? FaceDistancePermyriad { get; set; } - [Display(Name = "Force Face Last Write Time to Creation Time"), Required] public bool? ForceFaceLastWriteTimeToCreationTime { get; set; } - [Display(Name = "Force Metadata Last Write Time to Creation Time"), Required] public bool? ForceMetadataLastWriteTimeToCreationTime { get; set; } - [Display(Name = "Force Resize Last Write Time to Creation Time"), Required] public bool? ForceResizeLastWriteTimeToCreationTime { get; set; } - [Display(Name = "Ignore Extensions"), Required] public string[] IgnoreExtensions { get; set; } - [Display(Name = "Julie Phares Copy Birthdays"), Required] public string[] JLinks { get; set; } - [Display(Name = "Load Or GetPersonName Then Save Distance Results"), Required] public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } - [Display(Name = "Load Or GetPersonName Then Save Image Faces Results"), Required] public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } - [Display(Name = "Location Digits"), Required] public int? LocationDigits { get; set; } - [Display(Name = "Location Factor"), Required] public int? LocationFactor { get; set; } - [Display(Name = "Mapping Default Name"), Required] public string MappingDefaultName { get; set; } - [Display(Name = "Mapping Use Deterministic Hash Code Unknown Face Key Value Pairs for Add to Mapping"), Required] public bool? MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping { get; set; } - [Display(Name = "Mapping Use Deterministic Hash Code Unknown Face Key Value Pairs for Save Mapping"), Required] public bool? MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping { get; set; } - [Display(Name = "Mixed Year Relative Paths"), Required] public string[] MixedYearRelativePaths { get; set; } - [Display(Name = "Model Directory"), Required] public string ModelDirectory { get; set; } - [Display(Name = "Model Name"), Required] public string ModelName { get; set; } - [Display(Name = "Number Jitters"), Required] public int? NumberOfJitters { get; set; } - [Display(Name = "Number of Times To Up Sample"), Required] public int? NumberOfTimesToUpsample { get; set; } - [Display(Name = "Output Extension"), Required] public string OutputExtension { get; set; } - [Display(Name = "Output Quality"), Required] public int? OutputQuality { get; set; } - [Display(Name = "Output Resolutions"), Required] public string[] OutputResolutions { get; set; } - [Display(Name = "Override For Face Images"), Required] public bool? OverrideForFaceImages { get; set; } - [Display(Name = "Override For Face Landmark Images"), Required] public bool? OverrideForFaceLandmarkImages { get; set; } - [Display(Name = "Override For Resize Images"), Required] public bool? OverrideForResizeImages { get; set; } - [Display(Name = "Person Birthday First Year"), Required] public int? PersonBirthdayFirstYear { get; set; } - [Display(Name = "Person Birthday Format"), Required] public string PersonBirthdayFormat { get; set; } - [Display(Name = "PersonKey Format"), Required] public string PersonKeyFormat { get; set; } - [Display(Name = "Predictor Model Name"), Required] public string PredictorModelName { get; set; } - [Display(Name = "Properties Changed For Distance"), Required] public bool? PropertiesChangedForDistance { get; set; } - [Display(Name = "Properties Changed For Faces"), Required] public bool? PropertiesChangedForFaces { get; set; } - [Display(Name = "Properties Changed For Index"), Required] public bool? PropertiesChangedForIndex { get; set; } - [Display(Name = "Properties Changed For Metadata"), Required] public bool? PropertiesChangedForMetadata { get; set; } - [Display(Name = "Properties Changed For Resize"), Required] public bool? PropertiesChangedForResize { get; set; } - [Display(Name = "Property Configuration"), Required] public Property.Models.Configuration PropertyConfiguration { get; set; } - [Display(Name = "Sorting Days Delta Tolerance"), Required] public int[] RangeDaysDeltaTolerance { get; set; } - [Display(Name = "Face Area Permille Tolerance"), Required] public float[] RangeFaceAreaTolerance { get; set; } - [Display(Name = "Location Minimum Confidence"), Required] public float[] RangeFaceConfidence { get; set; } - [Display(Name = "Face Distance Tolerance"), Required] public float[] RangeDistanceTolerance { get; set; } - [Display(Name = "Reverse"), Required] public bool? Reverse { get; set; } - [Display(Name = "Save Face Landmark For Output Resolutions"), Required] public string[] SaveFaceLandmarkForOutputResolutions { get; set; } - [Display(Name = "Save Full Year Of Random Files"), Required] public bool? SaveFullYearOfRandomFiles { get; set; } - [Display(Name = "Save Resized Images by Person Key Formatted"), Required] public string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions { get; set; } - [Display(Name = "Save Resized Subfiles"), Required] public bool? SaveResizedSubfiles { get; set; } - [Display(Name = "Save Shortcuts"), Required] public string[] SaveShortcutsForOutputResolutions { get; set; } - [Display(Name = "Skip Search"), Required] public bool? SkipSearch { get; set; } - [Display(Name = "SortingMaximumPerFaceShould be High"), Required] public int? SortingMaximumPerFaceShouldBeHigh { get; set; } - [Display(Name = "Sorting Maximum Per Key"), Required] public int? SortingMaximumPerKey { get; set; } - [Display(Name = "Sorting Minimum to use Sigma"), Required] public int? SortingMinimumToUseSigma { get; set; } - [Display(Name = "Test Distance Results"), Required] public bool? TestDistanceResults { get; set; } - [Display(Name = "Valid Resolutions"), Required] public string[] ValidResolutions { get; set; } - -#nullable restore + public bool? CheckDFaceAndUpWriteDates { get; set; } + public bool? CheckJsonForDistanceResults { get; set; } + public string[]? CopyFacesAndSaveFaceLandmarkForOutputResolutions { get; set; } + public int? CrossDirectoryMaxItemsInDistanceCollection { get; set; } + public bool? DeletePossibleDuplicates { get; set; } + public int? DistanceFactor { get; set; } + public bool? DistanceMoveUnableToMatch { get; set; } + public int? DistancePixelDistanceTolerance { get; set; } + public bool? DistanceRenameToMatch { get; set; } + public int? EyeThreshold { get; set; } + public int? FaceAreaPermyriad { get; set; } + public int? FaceConfidencePercent { get; set; } + public int? FaceDistanceHiddenImageFactor { get; set; } + public int? FaceDistancePermyriad { get; set; } + public string? FocusDirectory { get; set; } + public string? FocusModel { get; set; } + public bool? ForceFaceLastWriteTimeToCreationTime { get; set; } + public bool? ForceMetadataLastWriteTimeToCreationTime { get; set; } + public bool? ForceResizeLastWriteTimeToCreationTime { get; set; } + public string? GenealogicalDataCommunicationFile { get; set; } + public string[]? IgnoreExtensions { get; set; } + public string[]? JLinks { get; set; } + public string[]? LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } + public string[]? LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } + public bool? LoadPhotoPrismLocations { get; set; } + public float? LocationContainerDistanceTolerance { get; set; } + public int? LocationDigits { get; set; } + public int? LocationFactor { get; set; } + public bool? LookForAbandoned { get; set; } + public string? MappingDefaultName { get; set; } + public bool? MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping { get; set; } + public bool? MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping { 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 int? OutputQuality { get; set; } + public string[]? OutputResolutions { get; set; } + public bool? OverrideForFaceImages { get; set; } + public bool? OverrideForFaceLandmarkImages { get; set; } + public bool? OverrideForResizeImages { get; set; } + public int? PersonBirthdayFirstYear { get; set; } + public string? PersonBirthdayFormat { get; set; } + public string? PersonCharacters { get; set; } + public int? PersonCharactersCopyCount { get; set; } + public string? PersonKeyFormat { 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 int? RadomUseBirthdayMinimum { get; set; } + public int[]? RangeDaysDeltaTolerance { get; set; } + public float[]? RangeDistanceTolerance { get; set; } + public float[]? RangeFaceAreaTolerance { get; set; } + public float[]? RangeFaceConfidence { get; set; } + public float[]? RectangleIntersectMinimums { get; set; } + public bool? Reverse { get; set; } + public string[]? SaveBlurHashForOutputResolutions { get; set; } + public string[]? SaveFaceDistancesForOutputResolutions { get; set; } + public string[]? SaveFaceLandmarkForOutputResolutions { get; set; } + public string[]? SaveFilteredOriginalImagesFromJLinksForOutputResolutions { get; set; } + public bool? SaveFullYearOfRandomFiles { get; set; } + public bool? SaveIndividually { get; set; } + public string[]? SaveMappedForOutputResolutions { get; set; } + public string[]? SavePropertyShortcutsForOutputResolutions { get; set; } + public string[]? SaveRandomForOutputResolutions { get; set; } + public bool? SaveResizedSubfiles { get; set; } + public string[]? SaveShortcutsForOutputResolutions { get; set; } + public bool? SaveSortingWithoutPerson { get; set; } + public string[]? SkipNotSkipDirectories { get; set; } + public int? SkipOlderThanDays { get; set; } + public int? SkipPersonWithMoreThen { get; set; } + public bool? SkipSearch { get; set; } + public int? SortingMaximumPerFaceShouldBeHigh { get; set; } + public int? SortingMaximumPerKey { get; set; } + public int? SortingMinimumToUseSigma { get; set; } + public bool? TestDistanceResults { get; set; } + public int? UseFilterTries { get; set; } + public string[]? ValidKeyWordsToIgnoreInRandom { get; set; } + public string[]? ValidResolutions { get; set; } public override string ToString() { @@ -78,149 +98,141 @@ public class Configuration return result; } - private static Models.Configuration Get(Configuration? configuration) +#pragma warning restore csharp_preserve_single_line_statements + + private static Models.Configuration Get(Configuration? configuration, Property.Models.Configuration propertyConfiguration) { Models.Configuration result; - if (configuration is null) - throw new NullReferenceException(nameof(configuration)); - 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)); - if (configuration.DistanceFactor is null) - throw new NullReferenceException(nameof(configuration.DistanceFactor)); - if (configuration.DistanceMoveUnableToMatch is null) - throw new NullReferenceException(nameof(configuration.DistanceMoveUnableToMatch)); - if (configuration.DistancePixelDistanceTolerance is null) - throw new NullReferenceException(nameof(configuration.DistancePixelDistanceTolerance)); - if (configuration.DistanceRenameToMatch is null) - throw new NullReferenceException(nameof(configuration.DistanceRenameToMatch)); - if (configuration.FaceDistanceHiddenImageFactor is null) - throw new NullReferenceException(nameof(configuration.FaceDistanceHiddenImageFactor)); - if (configuration.FaceConfidencePercent is null) - throw new NullReferenceException(nameof(configuration.FaceConfidencePercent)); - if (configuration.FaceDistancePermyriad is null) - throw new NullReferenceException(nameof(configuration.FaceDistancePermyriad)); - 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.IgnoreExtensions is null) - throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); - configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions ??= Array.Empty(); - configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions ??= Array.Empty(); - if (configuration.LocationDigits is null) - throw new NullReferenceException(nameof(configuration.LocationDigits)); - if (configuration.LocationFactor is null) - throw new NullReferenceException(nameof(configuration.LocationFactor)); - if (configuration.MappingDefaultName is null) - throw new NullReferenceException(nameof(configuration.MappingDefaultName)); - if (configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping is null) - throw new NullReferenceException(nameof(configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping)); - if (configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping is null) - throw new NullReferenceException(nameof(configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping)); - if (configuration.MixedYearRelativePaths is null) - throw new NullReferenceException(nameof(configuration.MixedYearRelativePaths)); - if (configuration.NumberOfJitters is null) - throw new NullReferenceException(nameof(configuration.NumberOfJitters)); - if (configuration.NumberOfTimesToUpsample is null) - throw new NullReferenceException(nameof(configuration.NumberOfTimesToUpsample)); - 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.PersonBirthdayFirstYear is null) - throw new NullReferenceException(nameof(configuration.PersonBirthdayFirstYear)); - if (configuration.PersonBirthdayFormat is null) - throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); - if (configuration.PersonKeyFormat is null) - throw new NullReferenceException(nameof(configuration.PersonKeyFormat)); - 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)); - if (configuration.PropertiesChangedForMetadata is null) - throw new NullReferenceException(nameof(configuration.PropertiesChangedForMetadata)); - if (configuration.PropertiesChangedForResize is null) - throw new NullReferenceException(nameof(configuration.PropertiesChangedForResize)); - if (configuration.RangeDaysDeltaTolerance is null || configuration.RangeDaysDeltaTolerance.Length != 3) - throw new NullReferenceException(nameof(configuration.RangeDaysDeltaTolerance)); - if (configuration.RangeFaceAreaTolerance is null || configuration.RangeFaceAreaTolerance.Length != 3) - throw new NullReferenceException(nameof(configuration.RangeFaceAreaTolerance)); - if (configuration.RangeFaceConfidence is null || configuration.RangeFaceConfidence.Length != 3) - throw new NullReferenceException(nameof(configuration.RangeFaceConfidence)); - if (configuration.RangeDistanceTolerance is null || configuration.RangeDistanceTolerance.Length != 3) - throw new NullReferenceException(nameof(configuration.RangeDistanceTolerance)); - if (configuration.Reverse is null) - throw new NullReferenceException(nameof(configuration.Reverse)); - configuration.SaveFaceLandmarkForOutputResolutions ??= Array.Empty(); - if (configuration.SaveFullYearOfRandomFiles is null) - throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); - configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions ??= Array.Empty(); - if (configuration.SaveResizedSubfiles is null) - throw new NullReferenceException(nameof(configuration.SaveResizedSubfiles)); - configuration.SaveShortcutsForOutputResolutions ??= Array.Empty(); - if (configuration.SkipSearch is null) - throw new NullReferenceException(nameof(configuration.SkipSearch)); - if (configuration.SortingMaximumPerFaceShouldBeHigh is null) - throw new NullReferenceException(nameof(configuration.SortingMaximumPerFaceShouldBeHigh)); - if (configuration.SortingMaximumPerKey is null) - throw new NullReferenceException(nameof(configuration.SortingMaximumPerKey)); - if (configuration.SortingMinimumToUseSigma is null) - throw new NullReferenceException(nameof(configuration.SortingMinimumToUseSigma)); - if (configuration.TestDistanceResults is null) - throw new NullReferenceException(nameof(configuration.TestDistanceResults)); - if (configuration.ValidResolutions is null) - throw new NullReferenceException(nameof(configuration.ValidResolutions)); - _ = DateTime.Now.AddDays(-configuration.RangeDaysDeltaTolerance[1]); - result = new(configuration.PropertyConfiguration, + if (configuration is null) throw new NullReferenceException(nameof(configuration)); + if (configuration.CheckDFaceAndUpWriteDates is null) throw new NullReferenceException(nameof(configuration.CheckDFaceAndUpWriteDates)); + if (configuration?.CheckDFaceAndUpWriteDates is null) throw new NullReferenceException(nameof(configuration.CheckDFaceAndUpWriteDates)); + if (configuration?.CheckJsonForDistanceResults is null) throw new NullReferenceException(nameof(configuration.CheckJsonForDistanceResults)); + // if (configuration?.CopyFacesAndSaveFaceLandmarkForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions)); + if (configuration?.CrossDirectoryMaxItemsInDistanceCollection is null) throw new NullReferenceException(nameof(configuration.CrossDirectoryMaxItemsInDistanceCollection)); + if (configuration?.DeletePossibleDuplicates is null) throw new NullReferenceException(nameof(configuration.DeletePossibleDuplicates)); + if (configuration?.DistanceFactor is null) throw new NullReferenceException(nameof(configuration.DistanceFactor)); + if (configuration?.DistanceMoveUnableToMatch is null) throw new NullReferenceException(nameof(configuration.DistanceMoveUnableToMatch)); + if (configuration?.DistancePixelDistanceTolerance is null) throw new NullReferenceException(nameof(configuration.DistancePixelDistanceTolerance)); + if (configuration?.DistanceRenameToMatch is null) throw new NullReferenceException(nameof(configuration.DistanceRenameToMatch)); + if (configuration?.EyeThreshold is null) throw new NullReferenceException(nameof(configuration.EyeThreshold)); + if (configuration?.FaceAreaPermyriad is null) throw new NullReferenceException(nameof(configuration.FaceAreaPermyriad)); + if (configuration?.FaceConfidencePercent is null) throw new NullReferenceException(nameof(configuration.FaceConfidencePercent)); + if (configuration?.FaceDistanceHiddenImageFactor is null) throw new NullReferenceException(nameof(configuration.FaceDistanceHiddenImageFactor)); + if (configuration?.FaceDistancePermyriad is null) throw new NullReferenceException(nameof(configuration.FaceDistancePermyriad)); + if (configuration?.FocusDirectory is null) throw new NullReferenceException(nameof(configuration.FocusDirectory)); + if (configuration?.FocusModel is null) throw new NullReferenceException(nameof(configuration.FocusModel)); + 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?.GenealogicalDataCommunicationFile is null) throw new NullReferenceException(nameof(configuration.GenealogicalDataCommunicationFile)); + // if (configuration?.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); + // if (configuration?.JLinks is null) throw new NullReferenceException(nameof(configuration.JLinks)); + // if (configuration?.LoadOrCreateThenSaveDistanceResultsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions)); + // if (configuration?.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions)); + if (configuration?.LoadPhotoPrismLocations is null) throw new NullReferenceException(nameof(configuration.LoadPhotoPrismLocations)); + // if (configuration?.LocationContainerDistanceTolerance is null) throw new NullReferenceException(nameof(configuration.LocationContainerDistanceTolerance)); + if (configuration?.LocationDigits is null) throw new NullReferenceException(nameof(configuration.LocationDigits)); + if (configuration?.LocationFactor is null) throw new NullReferenceException(nameof(configuration.LocationFactor)); + if (configuration?.LookForAbandoned is null) throw new NullReferenceException(nameof(configuration.LookForAbandoned)); + if (configuration?.MappingDefaultName is null) throw new NullReferenceException(nameof(configuration.MappingDefaultName)); + if (configuration?.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping is null) throw new NullReferenceException(nameof(configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping)); + if (configuration?.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping is null) throw new NullReferenceException(nameof(configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping)); + // 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?.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?.PersonBirthdayFirstYear is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFirstYear)); + if (configuration?.PersonBirthdayFormat is null) throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); + if (configuration?.PersonCharacters is null) throw new NullReferenceException(nameof(configuration.PersonCharacters)); + if (configuration?.PersonCharactersCopyCount is null) throw new NullReferenceException(nameof(configuration.PersonCharactersCopyCount)); + if (configuration?.PersonKeyFormat is null) throw new NullReferenceException(nameof(configuration.PersonKeyFormat)); + 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)); + if (configuration?.PropertiesChangedForMetadata is null) throw new NullReferenceException(nameof(configuration.PropertiesChangedForMetadata)); + if (configuration?.PropertiesChangedForResize is null) throw new NullReferenceException(nameof(configuration.PropertiesChangedForResize)); + if (configuration?.RadomUseBirthdayMinimum is null) throw new NullReferenceException(nameof(configuration.RadomUseBirthdayMinimum)); + // if (configuration?.RangeDaysDeltaTolerance is null) throw new NullReferenceException(nameof(configuration.RangeDaysDeltaTolerance)); + // if (configuration?.RangeDistanceTolerance is null) throw new NullReferenceException(nameof(configuration.RangeDistanceTolerance)); + // if (configuration?.RangeFaceAreaTolerance is null) throw new NullReferenceException(nameof(configuration.RangeFaceAreaTolerance)); + // if (configuration?.RangeFaceConfidence is null) throw new NullReferenceException(nameof(configuration.RangeFaceConfidence)); + // if (configuration?.RectangleIntersectMinimums is null) throw new NullReferenceException(nameof(configuration.RectangleIntersectMinimums)); + if (configuration?.Reverse is null) throw new NullReferenceException(nameof(configuration.Reverse)); + // if (configuration?.SaveBlurHashForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveBlurHashForOutputResolutions)); + // if (configuration?.SaveFaceDistancesForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveFaceDistancesForOutputResolutions)); + // if (configuration?.SaveFaceLandmarkForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveFaceLandmarkForOutputResolutions)); + // if (configuration?.SaveFilteredOriginalImagesFromJLinksForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions)); + if (configuration?.SaveFullYearOfRandomFiles is null) throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); + if (configuration?.SaveIndividually is null) throw new NullReferenceException(nameof(configuration.SaveIndividually)); + // if (configuration?.SaveMappedForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveMappedForOutputResolutions)); + // if (configuration?.SavePropertyShortcutsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SavePropertyShortcutsForOutputResolutions)); + // if (configuration?.SaveRandomForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveRandomForOutputResolutions)); + if (configuration?.SaveResizedSubfiles is null) throw new NullReferenceException(nameof(configuration.SaveResizedSubfiles)); + // if (configuration?.SaveShortcutsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveShortcutsForOutputResolutions)); + if (configuration?.SaveSortingWithoutPerson is null) throw new NullReferenceException(nameof(configuration.SaveSortingWithoutPerson)); + // if (configuration?.SkipNotSkipDirectories is null) throw new NullReferenceException(nameof(configuration.SkipNotSkipDirectories)); + // if (configuration?.SkipOlderThanDays is null) throw new NullReferenceException(nameof(configuration.SkipOlderThanDays)); + // if (configuration?.SkipPersonWithMoreThen is null) throw new NullReferenceException(nameof(configuration.SkipPersonWithMoreThen)); + if (configuration?.SkipSearch is null) throw new NullReferenceException(nameof(configuration.SkipSearch)); + if (configuration?.SortingMaximumPerFaceShouldBeHigh is null) throw new NullReferenceException(nameof(configuration.SortingMaximumPerFaceShouldBeHigh)); + if (configuration?.SortingMaximumPerKey is null) throw new NullReferenceException(nameof(configuration.SortingMaximumPerKey)); + if (configuration?.SortingMinimumToUseSigma is null) throw new NullReferenceException(nameof(configuration.SortingMinimumToUseSigma)); + if (configuration?.TestDistanceResults is null) throw new NullReferenceException(nameof(configuration.TestDistanceResults)); + if (configuration?.UseFilterTries is null) throw new NullReferenceException(nameof(configuration.UseFilterTries)); + // if (configuration?.ValidKeyWordsToIgnoreInRandom is null) throw new NullReferenceException(nameof(configuration.ValidKeyWordsToIgnoreInRandom)); + // if (configuration?.ValidResolutions is null) throw new NullReferenceException(nameof(configuration.ValidResolutions)); + result = new(propertyConfiguration, configuration.CheckDFaceAndUpWriteDates.Value, configuration.CheckJsonForDistanceResults.Value, + configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions ?? Array.Empty(), configuration.CrossDirectoryMaxItemsInDistanceCollection.Value, + configuration.DeletePossibleDuplicates.Value, configuration.DistanceFactor.Value, configuration.DistanceMoveUnableToMatch.Value, configuration.DistancePixelDistanceTolerance.Value, configuration.DistanceRenameToMatch.Value, - configuration.FaceDistanceHiddenImageFactor.Value, + configuration.EyeThreshold.Value, + configuration.FaceAreaPermyriad.Value, configuration.FaceConfidencePercent.Value, + configuration.FaceDistanceHiddenImageFactor.Value, configuration.FaceDistancePermyriad.Value, + configuration.FocusDirectory, + configuration.FocusModel, configuration.ForceFaceLastWriteTimeToCreationTime.Value, configuration.ForceMetadataLastWriteTimeToCreationTime.Value, configuration.ForceResizeLastWriteTimeToCreationTime.Value, - configuration.IgnoreExtensions, - configuration.JLinks, - configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions, - configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions, + configuration.GenealogicalDataCommunicationFile, + configuration.IgnoreExtensions ?? Array.Empty(), + configuration.JLinks ?? Array.Empty(), + configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions ?? Array.Empty(), + configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions ?? Array.Empty(), + configuration.LoadPhotoPrismLocations.Value, + configuration.LocationContainerDistanceTolerance, configuration.LocationDigits.Value, configuration.LocationFactor.Value, + configuration.LookForAbandoned.Value, configuration.MappingDefaultName, configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping.Value, configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping.Value, - configuration.MixedYearRelativePaths, + configuration.MixedYearRelativePaths ?? Array.Empty(), configuration.ModelDirectory, configuration.ModelName, - configuration.NumberOfJitters.Value, - configuration.NumberOfTimesToUpsample.Value, configuration.OutputExtension, configuration.OutputQuality.Value, - configuration.OutputResolutions, + configuration.OutputResolutions ?? Array.Empty(), configuration.OverrideForFaceImages.Value, configuration.OverrideForFaceLandmarkImages.Value, configuration.OverrideForResizeImages.Value, configuration.PersonBirthdayFirstYear.Value, configuration.PersonBirthdayFormat, + configuration.PersonCharacters, + configuration.PersonCharactersCopyCount.Value, configuration.PersonKeyFormat, configuration.PredictorModelName, configuration.PropertiesChangedForDistance.Value, @@ -228,22 +240,36 @@ public class Configuration configuration.PropertiesChangedForIndex.Value, configuration.PropertiesChangedForMetadata.Value, configuration.PropertiesChangedForResize.Value, - configuration.RangeDaysDeltaTolerance, - configuration.RangeFaceAreaTolerance, - configuration.RangeFaceConfidence, - configuration.RangeDistanceTolerance, + configuration.RadomUseBirthdayMinimum.Value, + configuration.RangeDaysDeltaTolerance ?? Array.Empty(), + configuration.RangeDistanceTolerance ?? Array.Empty(), + configuration.RangeFaceAreaTolerance ?? Array.Empty(), + configuration.RangeFaceConfidence ?? Array.Empty(), + configuration.RectangleIntersectMinimums ?? Array.Empty(), configuration.Reverse.Value, - configuration.SaveFaceLandmarkForOutputResolutions, + configuration.SaveBlurHashForOutputResolutions ?? Array.Empty(), + configuration.SaveFaceDistancesForOutputResolutions ?? Array.Empty(), + configuration.SaveFaceLandmarkForOutputResolutions ?? Array.Empty(), + configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions ?? Array.Empty(), + configuration.SaveIndividually.Value, configuration.SaveFullYearOfRandomFiles.Value, - configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions, + configuration.SaveMappedForOutputResolutions ?? Array.Empty(), + configuration.SavePropertyShortcutsForOutputResolutions ?? Array.Empty(), + configuration.SaveRandomForOutputResolutions ?? Array.Empty(), configuration.SaveResizedSubfiles.Value, - configuration.SaveShortcutsForOutputResolutions, + configuration.SaveShortcutsForOutputResolutions ?? Array.Empty(), + configuration.SaveSortingWithoutPerson.Value, + configuration.SkipNotSkipDirectories ?? Array.Empty(), + configuration.SkipOlderThanDays, + configuration.SkipPersonWithMoreThen, configuration.SkipSearch.Value, configuration.SortingMaximumPerFaceShouldBeHigh.Value, configuration.SortingMaximumPerKey.Value, configuration.SortingMinimumToUseSigma.Value, configuration.TestDistanceResults.Value, - configuration.ValidResolutions); + configuration.UseFilterTries.Value, + configuration.ValidKeyWordsToIgnoreInRandom ?? Array.Empty(), + configuration.ValidResolutions ?? Array.Empty()); return result; } @@ -260,8 +286,7 @@ public class Configuration IConfigurationSection configurationSection = configurationRoot.GetSection(section); configuration = configurationSection.Get(); } - result = Get(configuration); - result.SetAndUpdate(propertyConfiguration, configuration?.NumberOfJitters, configuration?.NumberOfTimesToUpsample, configuration?.ModelName, configuration?.PredictorModelName); + result = Get(configuration, propertyConfiguration); return result; } diff --git a/TestsWithFaceRecognitionDotNet/Models/Configuration.cs b/TestsWithFaceRecognitionDotNet/Models/Configuration.cs index e9bef10..74b7e4b 100644 --- a/TestsWithFaceRecognitionDotNet/Models/Configuration.cs +++ b/TestsWithFaceRecognitionDotNet/Models/Configuration.cs @@ -1,205 +1,85 @@ -using System.Text.Json; -using System.Text.Json.Serialization; - namespace View_by_Distance.Tests.Models; -public class Configuration -{ - - protected Property.Models.Configuration _PropertyConfiguration; - public Property.Models.Configuration PropertyConfiguration => _PropertyConfiguration; - - public bool CheckDFaceAndUpWriteDates { init; get; } - public bool CheckJsonForDistanceResults { init; get; } - public int CrossDirectoryMaxItemsInDistanceCollection { init; get; } - public int DistanceFactor { init; get; } - public bool DistanceMoveUnableToMatch { init; get; } - public int DistancePixelDistanceTolerance { init; get; } - public bool DistanceRenameToMatch { init; get; } - public int FaceDistanceHiddenImageFactor { init; get; } - public int FaceConfidencePercent { init; get; } - public int FaceDistancePermyriad { init; get; } - public bool ForceFaceLastWriteTimeToCreationTime { init; get; } - public bool ForceMetadataLastWriteTimeToCreationTime { init; get; } - public bool ForceResizeLastWriteTimeToCreationTime { init; get; } - public string[] IgnoreExtensions { init; get; } - public string[] JLinks { init; get; } - public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { init; get; } - public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { init; get; } - public int LocationDigits { init; get; } - public int LocationFactor { init; get; } - public string MappingDefaultName { init; get; } - public bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping { init; get; } - public bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping { init; get; } - public string[] MixedYearRelativePaths { init; get; } - public string ModelDirectory { init; get; } - public string ModelName { init; get; } - public int NumberOfJitters { init; get; } - public int NumberOfTimesToUpsample { init; get; } - public string OutputExtension { init; get; } - public int OutputQuality { init; get; } - public string[] OutputResolutions { init; get; } - public bool OverrideForFaceImages { init; get; } - public bool OverrideForFaceLandmarkImages { init; get; } - public bool OverrideForResizeImages { init; get; } - public int PersonBirthdayFirstYear { init; get; } - public string PersonBirthdayFormat { init; get; } - public string PersonKeyFormat { init; get; } - public string PredictorModelName { init; get; } - public bool PropertiesChangedForDistance { init; get; } - public bool PropertiesChangedForFaces { init; get; } - public bool PropertiesChangedForIndex { init; get; } - public bool PropertiesChangedForMetadata { init; get; } - public bool PropertiesChangedForResize { init; get; } - public int[] RangeDaysDeltaTolerance { init; get; } - public float[] RangeFaceAreaTolerance { init; get; } - public float[] RangeFaceConfidence { init; get; } - public float[] RangeDistanceTolerance { init; get; } - public bool Reverse { init; get; } - public string[] SaveFaceLandmarkForOutputResolutions { init; get; } - public bool SaveFullYearOfRandomFiles { init; get; } - public string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions { init; get; } - public bool SaveResizedSubfiles { init; get; } - public string[] SaveShortcutsForOutputResolutions { init; get; } - public bool SkipSearch { init; get; } - public int SortingMaximumPerFaceShouldBeHigh { init; get; } - public int SortingMaximumPerKey { init; get; } - public int SortingMinimumToUseSigma { init; get; } - public bool TestDistanceResults { init; get; } - public string[] ValidResolutions { init; get; } - - [JsonConstructor] - public Configuration(Property.Models.Configuration propertyConfiguration, - bool checkDFaceAndUpWriteDates, - bool checkJsonForDistanceResults, - int crossDirectoryMaxItemsInDistanceCollection, - int distanceFactor, - bool distanceMoveUnableToMatch, - int distancePixelDistanceTolerance, - bool distanceRenameToMatch, - int faceDistanceHiddenImageFactor, - int faceConfidencePercent, - int faceDistancePermyriad, - bool forceFaceLastWriteTimeToCreationTime, - bool forceMetadataLastWriteTimeToCreationTime, - bool forceResizeLastWriteTimeToCreationTime, - string[] ignoreExtensions, - string[] jLinks, - string[] loadOrCreateThenSaveDistanceResultsForOutputResolutions, - string[] loadOrCreateThenSaveImageFacesResultsForOutputResolutions, - int locationDigits, - int locationFactor, - string mappingDefaultName, - bool mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping, - bool mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping, - string[] mixedYearRelativePaths, - string modelDirectory, - string modelName, - int numberOfJitters, - int numberOfTimesToUpsample, - string outputExtension, - int outputQuality, - string[] outputResolutions, - bool overrideForFaceImages, - bool overrideForFaceLandmarkImages, - bool overrideForResizeImages, - int personBirthdayFirstYear, - string personBirthdayFormat, - string personKeyFormat, - string predictorModelName, - bool propertiesChangedForDistance, - bool propertiesChangedForFaces, - bool propertiesChangedForIndex, - bool propertiesChangedForMetadata, - bool propertiesChangedForResize, - int[] rangeDaysDeltaTolerance, - float[] rangeFaceAreaPermyriadTolerance, - float[] rangeFaceConfidence, - float[] rangeDistanceTolerance, - bool reverse, - string[] saveFaceLandmarkForOutputResolutions, - bool saveFullYearOfRandomFiles, - string[] saveFilteredOriginalImagesFromJLinksForOutputResolutions, - bool saveResizedSubfiles, - string[] saveShortcutsForOutputResolutions, - bool skipSearch, - int sortingMaximumPerFaceShouldBeHigh, - int sortingMaximumPerKey, - int sortingSigma, - bool testDistanceResults, - string[] validResolutions) - { - _PropertyConfiguration = propertyConfiguration; - CheckDFaceAndUpWriteDates = checkDFaceAndUpWriteDates; - CheckJsonForDistanceResults = checkJsonForDistanceResults; - CrossDirectoryMaxItemsInDistanceCollection = crossDirectoryMaxItemsInDistanceCollection; - DistanceFactor = distanceFactor; - DistanceMoveUnableToMatch = distanceMoveUnableToMatch; - DistancePixelDistanceTolerance = distancePixelDistanceTolerance; - DistanceRenameToMatch = distanceRenameToMatch; - FaceDistanceHiddenImageFactor = faceDistanceHiddenImageFactor; - FaceConfidencePercent = faceConfidencePercent; - FaceDistancePermyriad = faceDistancePermyriad; - ForceFaceLastWriteTimeToCreationTime = forceFaceLastWriteTimeToCreationTime; - ForceMetadataLastWriteTimeToCreationTime = forceMetadataLastWriteTimeToCreationTime; - ForceResizeLastWriteTimeToCreationTime = forceResizeLastWriteTimeToCreationTime; - IgnoreExtensions = ignoreExtensions; - JLinks = jLinks; - LoadOrCreateThenSaveDistanceResultsForOutputResolutions = loadOrCreateThenSaveDistanceResultsForOutputResolutions; - LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = loadOrCreateThenSaveImageFacesResultsForOutputResolutions; - LocationDigits = locationDigits; - LocationFactor = locationFactor; - MappingDefaultName = mappingDefaultName; - MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping = mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping; - MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping = mappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping; - MixedYearRelativePaths = mixedYearRelativePaths; - ModelDirectory = modelDirectory; - ModelName = modelName; - NumberOfJitters = numberOfJitters; - NumberOfTimesToUpsample = numberOfTimesToUpsample; - OutputExtension = outputExtension; - OutputQuality = outputQuality; - OutputResolutions = outputResolutions; - OverrideForFaceImages = overrideForFaceImages; - OverrideForFaceLandmarkImages = overrideForFaceLandmarkImages; - OverrideForResizeImages = overrideForResizeImages; - PersonBirthdayFirstYear = personBirthdayFirstYear; - PersonBirthdayFormat = personBirthdayFormat; - PersonKeyFormat = personKeyFormat; - PredictorModelName = predictorModelName; - PropertiesChangedForDistance = propertiesChangedForDistance; - PropertiesChangedForFaces = propertiesChangedForFaces; - PropertiesChangedForIndex = propertiesChangedForIndex; - PropertiesChangedForMetadata = propertiesChangedForMetadata; - PropertiesChangedForResize = propertiesChangedForResize; - RangeDaysDeltaTolerance = rangeDaysDeltaTolerance; - RangeFaceAreaTolerance = rangeFaceAreaPermyriadTolerance; - RangeFaceConfidence = rangeFaceConfidence; - RangeDistanceTolerance = rangeDistanceTolerance; - Reverse = reverse; - SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions; - SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles; - SaveFilteredOriginalImagesFromJLinksForOutputResolutions = saveFilteredOriginalImagesFromJLinksForOutputResolutions; - SaveResizedSubfiles = saveResizedSubfiles; - SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions; - SkipSearch = skipSearch; - SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh; - SortingMaximumPerKey = sortingMaximumPerKey; - SortingMinimumToUseSigma = sortingSigma; - TestDistanceResults = testDistanceResults; - ValidResolutions = validResolutions; - } - - public override string ToString() - { - string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); - return result; - } - - public void SetAndUpdate(Property.Models.Configuration configuration, int? numberOfJitters, int? numberOfTimesToUpsample, string? modelName, string? predictorModelName) - { - _PropertyConfiguration = configuration; - _PropertyConfiguration.Update(numberOfJitters, numberOfTimesToUpsample, modelName, predictorModelName); - } - -} \ No newline at end of file +public record Configuration(Property.Models.Configuration PropertyConfiguration, + bool CheckDFaceAndUpWriteDates, + bool CheckJsonForDistanceResults, + string[] CopyFacesAndSaveFaceLandmarkForOutputResolutions, + int CrossDirectoryMaxItemsInDistanceCollection, + bool DeletePossibleDuplicates, + int DistanceFactor, + bool DistanceMoveUnableToMatch, + int DistancePixelDistanceTolerance, + bool DistanceRenameToMatch, + int EyeThreshold, + int FaceAreaPermyriad, + int FaceConfidencePercent, + int FaceDistanceHiddenImageFactor, + int FaceDistancePermyriad, + string FocusDirectory, + string FocusModel, + bool ForceFaceLastWriteTimeToCreationTime, + bool ForceMetadataLastWriteTimeToCreationTime, + bool ForceResizeLastWriteTimeToCreationTime, + string GenealogicalDataCommunicationFile, + string[] IgnoreExtensions, + string[] JLinks, + string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions, + string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions, + bool LoadPhotoPrismLocations, + float? LocationContainerDistanceTolerance, + int LocationDigits, + int LocationFactor, + bool LookForAbandoned, + string MappingDefaultName, + bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping, + bool MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping, + string[] MixedYearRelativePaths, + string ModelDirectory, + string ModelName, + string OutputExtension, + int OutputQuality, + string[] OutputResolutions, + bool OverrideForFaceImages, + bool OverrideForFaceLandmarkImages, + bool OverrideForResizeImages, + int PersonBirthdayFirstYear, + string PersonBirthdayFormat, + string PersonCharacters, + int PersonCharactersCopyCount, + string PersonKeyFormat, + string PredictorModelName, + bool PropertiesChangedForDistance, + bool PropertiesChangedForFaces, + bool PropertiesChangedForIndex, + bool PropertiesChangedForMetadata, + bool PropertiesChangedForResize, + int RadomUseBirthdayMinimum, + int[] RangeDaysDeltaTolerance, + float[] RangeDistanceTolerance, + float[] RangeFaceAreaPermyriadTolerance, + float[] RangeFaceConfidence, + float[] RectangleIntersectMinimums, + bool Reverse, + string[] SaveBlurHashForOutputResolutions, + string[] SaveFaceDistancesForOutputResolutions, + string[] SaveFaceLandmarkForOutputResolutions, + string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions, + bool SaveIndividually, + bool SaveFullYearOfRandomFiles, + string[] SaveMappedForOutputResolutions, + string[] SavePropertyShortcutsForOutputResolutions, + string[] SaveRandomForOutputResolutions, + bool SaveResizedSubfiles, + string[] SaveShortcutsForOutputResolutions, + bool SaveSortingWithoutPerson, + string[] SkipNotSkipDirectories, + int? SkipOlderThanDays, + int? SkipPersonWithMoreThen, + bool SkipSearch, + int SortingMaximumPerFaceShouldBeHigh, + int SortingMaximumPerKey, + int SortingMinimumToUseSigma, + bool TestDistanceResults, + int UseFilterTries, + string[] ValidKeyWordsToIgnoreInRandom, + string[] ValidResolutions); \ No newline at end of file diff --git a/TestsWithFaceRecognitionDotNet/UnitTestFace.cs b/TestsWithFaceRecognitionDotNet/UnitTestFace.cs index 4195a90..90b0842 100644 --- a/TestsWithFaceRecognitionDotNet/UnitTestFace.cs +++ b/TestsWithFaceRecognitionDotNet/UnitTestFace.cs @@ -99,8 +99,8 @@ public class UnitTestFace { A_Property result; if (_Configuration?.PropertyConfiguration is null) - throw new NullReferenceException(nameof(_Configuration.PropertyConfiguration)); - result = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Configuration.OutputExtension, reverse, aResultsFullGroupDirectory); + throw new NullReferenceException(nameof(_PropertyConfiguration)); + result = new(_AppSettings.MaxDegreeOfParallelism, _PropertyConfiguration, _Configuration.OutputExtension, reverse, aResultsFullGroupDirectory); return result; } @@ -170,14 +170,14 @@ public class UnitTestFace private (string, string) GetResultsFullGroupDirectories() { string aResultsFullGroupDirectory = Property.Models.Stateless.IResult.GetResultsFullGroupDirectory( - _Configuration.PropertyConfiguration, + _PropertyConfiguration, nameof(A_Property), string.Empty, includeResizeGroup: false, includeModel: false, includePredictorModel: false); string bResultsFullGroupDirectory = Property.Models.Stateless.IResult.GetResultsFullGroupDirectory( - _Configuration.PropertyConfiguration, + _PropertyConfiguration, nameof(B_Metadata), string.Empty, includeResizeGroup: false, @@ -189,7 +189,7 @@ public class UnitTestFace private (string, string, string) GetResultsFullGroupDirectories(string outputResolution) { string cResultsFullGroupDirectory = Property.Models.Stateless.IResult.GetResultsFullGroupDirectory( - _Configuration.PropertyConfiguration, + _PropertyConfiguration, nameof(C_Resize), outputResolution, includeResizeGroup: true, @@ -203,6 +203,10 @@ public class UnitTestFace [TestMethod] public void TestMethodFace() { + if (_PropertyConfiguration.NumberOfJitters is null) + throw new NullReferenceException(nameof(_PropertyConfiguration.NumberOfJitters)); + if (_PropertyConfiguration.NumberOfTimesToUpsample is null) + throw new NullReferenceException(nameof(_PropertyConfiguration.NumberOfTimesToUpsample)); string sourceFileName = "100000507001158650387.jpg"; string sourceDirectoryName = "Facebook/2023.2 Summer Facebook"; Item item; @@ -219,16 +223,16 @@ public class UnitTestFace bool outputResolutionHasNumber = outputResolution.Any(l => char.IsNumber(l)); (string cResultsFullGroupDirectory, _, _) = GetResultsFullGroupDirectories(outputResolution); (string aResultsFullGroupDirectory, string bResultsFullGroupDirectory) = GetResultsFullGroupDirectories(); - Shared.Models.Methods.IBlurHasher blurHasher = new BlurHash.Models.C2_BlurHasher(_Configuration.PropertyConfiguration); + Shared.Models.Methods.IBlurHasher blurHasher = new BlurHash.Models.C2_BlurHasher(_PropertyConfiguration); _Logger.Information(_Configuration.ModelDirectory); A_Property propertyLogic = GetPropertyLogic(reverse, aResultsFullGroupDirectory); string aPropertySingletonDirectory = Path.Combine(aResultsFullGroupDirectory, "{}"); if (!Directory.Exists(aPropertySingletonDirectory)) _ = Directory.CreateDirectory(aPropertySingletonDirectory); (ImageCodecInfo imageCodecInfo, EncoderParameters encoderParameters, string filenameExtension) = C_Resize.GetTuple(_Configuration.OutputExtension, _Configuration.OutputQuality); - B_Metadata metadata = new(_Configuration.PropertyConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata, bResultsFullGroupDirectory); + B_Metadata metadata = new(_PropertyConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata, bResultsFullGroupDirectory); _ = metadata.ToString(); - C_Resize resize = new(_Configuration.PropertyConfiguration, _Configuration.ForceResizeLastWriteTimeToCreationTime, _Configuration.OverrideForResizeImages, _Configuration.PropertiesChangedForResize, _Configuration.ValidResolutions, imageCodecInfo, encoderParameters, filenameExtension); + C_Resize resize = new(_PropertyConfiguration, _Configuration.ForceResizeLastWriteTimeToCreationTime, _Configuration.OverrideForResizeImages, _Configuration.PropertiesChangedForResize, _Configuration.ValidResolutions, imageCodecInfo, encoderParameters, filenameExtension); _ = resize.ToString(); bool isUniqueFileName = false; bool? isNotUniqueAndNeedsReview = null; @@ -257,15 +261,15 @@ public class UnitTestFace item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder); MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item); (int _, metadataCollection) = metadata.GetMetadataCollection(subFileTuples, parseExceptions, changesFrom, mappingFromItem); - Dictionary outputResolutionToResize = resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, metadataCollection, item.Property, mappingFromItem); + Dictionary outputResolutionToResize = resize.GetResizeKeyValuePairs(_PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, metadataCollection, item.Property, mappingFromItem); Assert.IsNotNull(mappingFromItem.ResizedFileHolder); - resize.SaveResizedSubfile(_Configuration.PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize); + resize.SaveResizedSubfile(_PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize); string blurHash = blurHasher.Encode(resizedFileHolder); Assert.IsNotNull(blurHash); Image image = FaceRecognition.LoadImageFile(mappingFromItem.ResizedFileHolder.FullName); Assert.IsNotNull(image); (Model model, PredictorModel predictorModel, ModelParameter modelParameter) = GetModel(_Configuration); - FaceRecognition faceRecognition = new(_Configuration.NumberOfJitters, _Configuration.NumberOfTimesToUpsample, model, modelParameter, predictorModel); + FaceRecognition faceRecognition = new(_PropertyConfiguration.NumberOfJitters.Value, _PropertyConfiguration.NumberOfTimesToUpsample.Value, model, modelParameter, predictorModel); List<(Location Location, FaceRecognitionDotNet.FaceEncoding? FaceEncoding, Dictionary? FaceParts)> collection; collection = faceRecognition.GetCollection(image, locations: new(), includeFaceEncoding: true, includeFaceParts: true); Assert.IsTrue(collection.Count == 2);