diff --git a/Compare/Models/Binder/Configuration.cs b/Compare/Models/Binder/Configuration.cs index f398234..1fa648f 100644 --- a/Compare/Models/Binder/Configuration.cs +++ b/Compare/Models/Binder/Configuration.cs @@ -5,6 +5,8 @@ namespace View_by_Distance.Compare.Models.Binder; public class Configuration { + +#nullable disable [Display(Name = "Diff Property Directory"), Required] public string DiffPropertyDirectory { get; set; } [Display(Name = "Property Configuration"), Required] public Property.Models.Configuration PropertyConfiguration { get; set; } [Display(Name = "Rename"), Required] public string[] Rename { get; set; } @@ -12,14 +14,7 @@ public class Configuration [Display(Name = "Rename C"), Required] public string[] RenameC { get; set; } [Display(Name = "Spelling"), Required] public string[] Spelling { get; set; } - public Configuration() - { - DiffPropertyDirectory = string.Empty; - Rename = Array.Empty(); - RenameB = Array.Empty(); - RenameC = Array.Empty(); - Spelling = Array.Empty(); - } +#nullable restore public override string ToString() { diff --git a/Date-Group/Models/Binder/Configuration.cs b/Date-Group/Models/Binder/Configuration.cs index d007bbb..6a49f15 100644 --- a/Date-Group/Models/Binder/Configuration.cs +++ b/Date-Group/Models/Binder/Configuration.cs @@ -5,6 +5,9 @@ namespace View_by_Distance.Date.Group.Models.Binder; public class Configuration { + +#nullable disable + [Display(Name = "By Create Date Shortcut"), Required] public bool? ByCreateDateShortcut { get; set; } [Display(Name = "By Date"), Required] public bool? ByDay { get; set; } [Display(Name = "By Hash"), Required] public bool? ByHash { get; set; } @@ -13,15 +16,7 @@ public class Configuration [Display(Name = "Ignore Subdirectories for Rename"), Required] public bool? KeepFullPath { get; set; } [Display(Name = "Property Configuration"), Required] public Property.Models.Configuration PropertyConfiguration { get; set; } - public Configuration() - { - ByDay = null; - ByCreateDateShortcut = null; - ByHash = null; - BySeason = null; - ByWeek = null; - KeepFullPath = null; - } +#nullable restore public override string ToString() { diff --git a/Face/Models/_D_Face.cs b/Face/Models/_D_Face.cs index f7dfbd3..a614b69 100644 --- a/Face/Models/_D_Face.cs +++ b/Face/Models/_D_Face.cs @@ -63,21 +63,18 @@ public class D_Face string hiddenFileNameExtension, ImageCodecInfo hiddenImageCodecInfo, ImageCodecInfo imageCodecInfo, - Model model, - ModelParameter modelParameter, + string modelDirectory, + string modelName, int numberOfJitters, int numberOfTimesToUpsample, bool overrideForFaceImages, bool retryImagesWithoutAFace, - PredictorModel predictorModel, + string predictorModelName, bool propertiesChangedForFaces) { - _Model = model; _ArgZero = argZero; _Configuration = configuration; _ImageCodecInfo = imageCodecInfo; - _ModelParameter = modelParameter; - _PredictorModel = predictorModel; _NumberOfJitters = numberOfJitters; _EncoderParameters = encoderParameters; _FileNameExtension = filenameExtension; @@ -94,6 +91,10 @@ public class D_Face _FaceDistanceAreaPermilleTolerance = faceDistanceAreaPermilleTolerance; _FaceDistanceHiddenImageFactor = faceDistanceHiddenImageFactor; _ForceFaceLastWriteTimeToCreationTime = forceFaceLastWriteTimeToCreationTime; + (Model model, PredictorModel predictorModel, ModelParameter modelParameter) = GetModel(modelDirectory, modelName, predictorModelName); + _Model = model; + _PredictorModel = predictorModel; + _ModelParameter = modelParameter; ConstructorInfo? constructorInfo = typeof(PropertyItem).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public, null, Array.Empty(), null); if (constructorInfo is null) throw new Exception(); @@ -107,6 +108,47 @@ public class D_Face return result; } + private static (Model model, PredictorModel predictorModel, ModelParameter modelParameter) GetModel(string modelDirectory, string modelName, string predictorModelName) + { + (Model, PredictorModel, ModelParameter) result; + Array array; + Model? model = null; + PredictorModel? predictorModel = null; + array = Enum.GetValues(typeof(Model)); + foreach (Model check in array) + { + if (modelName.Contains(check.ToString())) + { + model = check; + break; + } + } + if (model is null) + throw new Exception("Destination directory must have Model name!"); + model = model.Value; + array = Enum.GetValues(typeof(PredictorModel)); + foreach (PredictorModel check in array) + { + if (predictorModelName.Contains(check.ToString())) + { + predictorModel = check; + break; + } + } + if (predictorModel is null) + throw new Exception("Destination directory must have Predictor Model name!"); + predictorModel = predictorModel.Value; + ModelParameter modelParameter = new() + { + CnnFaceDetectorModel = File.ReadAllBytes(Path.Combine(modelDirectory, "mmod_human_face_detector.dat")), + FaceRecognitionModel = File.ReadAllBytes(Path.Combine(modelDirectory, "dlib_face_recognition_resnet_model_v1.dat")), + PosePredictor5FaceLandmarksModel = File.ReadAllBytes(Path.Combine(modelDirectory, "shape_predictor_5_face_landmarks.dat")), + PosePredictor68FaceLandmarksModel = File.ReadAllBytes(Path.Combine(modelDirectory, "shape_predictor_68_face_landmarks.dat")) + }; + result = new(model.Value, predictorModel.Value, modelParameter); + return result; + } + #pragma warning disable CA1416 private static byte[] GetBytes(string value) diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index 69fd780..ff8a9fe 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -6,7 +6,6 @@ using System.Text.Json; using View_by_Distance.Distance.Models; using View_by_Distance.Face.Models; using View_by_Distance.FaceParts.Models; -using View_by_Distance.FaceRecognitionDotNet; using View_by_Distance.Instance.Models; using View_by_Distance.Map.Models; using View_by_Distance.Metadata.Models; @@ -14,7 +13,6 @@ using View_by_Distance.Property.Models; using View_by_Distance.Resize.Models; using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models.Methods; -using View_by_Distance.Shared.Models.Stateless; namespace View_by_Distance.Instance; @@ -71,20 +69,13 @@ public partial class DlibDotNet _Index = new(configuration); _Random = new(configuration); _Rename = new(configuration); - _Distance = new( - configuration.DistanceMoveUnableToMatch, - configuration.DistancePixelDistanceTolerance, - configuration.DistanceRenameToMatch, - configuration.FaceDistanceTolerance); if (configuration.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); string propertyRoot = Property.Models.Stateless.IResult.GetResultsGroupDirectory(propertyConfiguration, nameof(A_Property), create: false); _FirstRun = !Directory.Exists(propertyRoot); - _Metadata = new(configuration.ForceMetadataLastWriteTimeToCreationTime, configuration.PropertiesChangedForMetadata); argZero = args.Count > 0 ? Path.GetFullPath(args[0]) : Path.GetFullPath(propertyConfiguration.RootDirectory); _ArgZeroIsConfigurationRootDirectory = propertyConfiguration.RootDirectory == argZero; _Log.Information(configuration.ModelDirectory); - (Model model, PredictorModel predictorModel, ModelParameter modelParameter) = GetModel(configuration); { (ImageCodecInfo imageCodecInfo, EncoderParameters encoderParameters, string filenameExtension) = C_Resize.GetPngLowQuality(); (ImageCodecInfo hiddenImageCodecInfo, EncoderParameters hiddenEncoderParameters, string hiddenFileNameExtension) = C_Resize.GetGifLowQuality(); @@ -101,20 +92,22 @@ public partial class DlibDotNet hiddenFileNameExtension, hiddenImageCodecInfo, imageCodecInfo, - model, - modelParameter, + configuration.ModelDirectory, + configuration.ModelName, configuration.NumberOfJitters, configuration.NumberOfTimesToUpsample, configuration.OverrideForFaceImages, configuration.RetryImagesWithoutAFace, - predictorModel, + configuration.PredictorModelName, configuration.PropertiesChangedForFaces); } { (ImageCodecInfo imageCodecInfo, EncoderParameters encoderParameters, string filenameExtension) = C_Resize.GetGifLowQuality(); _FaceParts = new D2_FaceParts(imageCodecInfo, encoderParameters, filenameExtension, configuration.CheckDFaceAndUpWriteDates, configuration.OverrideForFaceLandmarkImages); } + _Metadata = new(configuration.ForceMetadataLastWriteTimeToCreationTime, configuration.PropertiesChangedForMetadata); _MapConfiguration = Get(configuration, _Faces.FileNameExtension, _Faces.HiddenFileNameExtension, _FaceParts.FileNameExtension); + _Distance = new(configuration.DistanceMoveUnableToMatch, configuration.DistancePixelDistanceTolerance, configuration.DistanceRenameToMatch, configuration.FaceDistanceTolerance); if (_FirstRun || !_ArgZeroIsConfigurationRootDirectory) personContainers = Array.Empty(); else @@ -152,7 +145,7 @@ public partial class DlibDotNet filenameExtension); } if (!configuration.SkipSearch) - Search(ticks, model, predictorModel, argZero, propertyRoot, personContainers); + Search(ticks, argZero, propertyRoot, personContainers); if (!_FirstRun && !_IsEnvironment.Development && _Exceptions.Count == 0 && _ArgZeroIsConfigurationRootDirectory) { List directoryCollections = _Rename.GetDirectoryRenameCollections( @@ -212,50 +205,6 @@ public partial class DlibDotNet return result; } -#pragma warning disable CA1416 -#pragma warning restore CA1416 - - private static (Model model, PredictorModel predictorModel, ModelParameter modelParameter) GetModel(Models.Configuration configuration) - { - (Model, PredictorModel, ModelParameter) result; - Array array; - Model? model = null; - PredictorModel? predictorModel = null; - array = Enum.GetValues(typeof(Model)); - foreach (Model check in array) - { - if (configuration.ModelName.Contains(check.ToString())) - { - model = check; - break; - } - } - if (model is null) - throw new Exception("Destination directory must have Model name!"); - model = model.Value; - array = Enum.GetValues(typeof(PredictorModel)); - foreach (PredictorModel check in array) - { - if (configuration.PredictorModelName.Contains(check.ToString())) - { - predictorModel = check; - break; - } - } - if (predictorModel is null) - throw new Exception("Destination directory must have Predictor Model name!"); - predictorModel = predictorModel.Value; - ModelParameter modelParameter = new() - { - CnnFaceDetectorModel = File.ReadAllBytes(Path.Combine(configuration.ModelDirectory, "mmod_human_face_detector.dat")), - FaceRecognitionModel = File.ReadAllBytes(Path.Combine(configuration.ModelDirectory, "dlib_face_recognition_resnet_model_v1.dat")), - PosePredictor5FaceLandmarksModel = File.ReadAllBytes(Path.Combine(configuration.ModelDirectory, "shape_predictor_5_face_landmarks.dat")), - PosePredictor68FaceLandmarksModel = File.ReadAllBytes(Path.Combine(configuration.ModelDirectory, "shape_predictor_68_face_landmarks.dat")) - }; - result = new(model.Value, predictorModel.Value, modelParameter); - return result; - } - private void Verify(Models.Configuration configuration) { if (!configuration.OutputResolutions.Any() || string.IsNullOrEmpty(configuration.OutputResolutions[0]) || !configuration.ValidResolutions.Contains(configuration.OutputResolutions[0])) @@ -268,6 +217,8 @@ public partial class DlibDotNet throw new Exception($"One or more {nameof(configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions)} are not in the ValidResolutions list!"); if ((from l in configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions where !configuration.ValidResolutions.Contains(l) select false).Any()) throw new Exception($"One or more {nameof(configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions)} are not in the ValidResolutions list!"); + if ((from l in configuration.SaveShortcutsForOutputResolutions where !configuration.ValidResolutions.Contains(l) select false).Any()) + throw new Exception($"One or more {nameof(configuration.SaveShortcutsForOutputResolutions)} are not in the ValidResolutions list!"); if ((from l in configuration.SaveFaceLandmarkForOutputResolutions where !configuration.ValidResolutions.Contains(l) select false).Any()) throw new Exception($"One or more {nameof(configuration.SaveFaceLandmarkForOutputResolutions)} are not in the ValidResolutions list!"); if (configuration.DistanceFactor + configuration.LocationConfidenceFactor != 10) @@ -628,7 +579,7 @@ public partial class DlibDotNet } } - private (string, string, string, string) GetResultsFullGroupDirectories(Model? model, PredictorModel? predictorModel, string outputResolution) + private (string, string, string, string) GetResultsFullGroupDirectories(string outputResolution) { string aResultsFullGroupDirectory = Property.Models.Stateless.IResult.GetResultsFullGroupDirectory( _Configuration.PropertyConfiguration, @@ -716,7 +667,7 @@ public partial class DlibDotNet return results.ToArray(); } - private void FullDoWork(string argZero, Model? model, PredictorModel? predictorModel, string propertyRoot, long ticks, A_Property propertyLogic, int t, Container[] containers, string? eDistanceContentDirectory, Dictionary> idToMappedFaceFilesCollection) + private void FullDoWork(string argZero, string propertyRoot, long ticks, A_Property propertyLogic, int t, Container[] containers, string? eDistanceContentDirectory, Dictionary> idToMappedFaceFilesCollection) { if (_Log is null) throw new NullReferenceException(nameof(_Log)); @@ -744,7 +695,7 @@ public partial class DlibDotNet total = 0; _FileKeyValuePairs.Clear(); _FilePropertiesKeyValuePairs.Clear(); - (aResultsFullGroupDirectory, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory) = GetResultsFullGroupDirectories(model, predictorModel, outputResolution); + (aResultsFullGroupDirectory, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution); for (int i = 0; i < containers.Length; i++) { container = containers[i]; @@ -839,9 +790,10 @@ public partial class DlibDotNet return result; } - private Shared.Models.Face[] SetMappingThenGetDistinctFilteredFacesWithMapping(string argZero, Container[] containers) + private (List, Shared.Models.Face[]) SetMappingThenGetDistinctFilteredFacesWithMapping(string argZero, Container[] containers) { - Shared.Models.Face[] results; + List items = new(); + Shared.Models.Face[] faces; Mapping mapping; int areaPermille; bool? isWrongYear; @@ -868,7 +820,10 @@ public partial class DlibDotNet if (item.Property?.Id is null || item.ImageFileHolder is null || item.ResizedFileHolder is null) continue; if (!item.Faces.Any(l => l.FaceEncoding is not null && l.Location is not null && l.OutputResolution is not null)) + { + items.Add(item); continue; + } minimumDateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property); (isWrongYear, _) = item.Property.IsWrongYear(item.ImageFileHolder.FullName, minimumDateTime); mappingFromItem = new(item.Property.Id.Value, item.ImageFileHolder, isWrongYear, minimumDateTime, item.RelativePath, item.ResizedFileHolder); @@ -888,8 +843,8 @@ public partial class DlibDotNet } } } - results = (from l in collection orderby l.Mapping?.MappingFromItem.Id select l).ToArray(); - return results; + faces = (from l in collection orderby l.Mapping?.MappingFromItem.Id select l).ToArray(); + return new(items, faces); } private void MapLogic(string argZero, long ticks, PersonContainer[] personContainers, Container[] containers, string a2PeopleSingletonDirectory, string dResultsFullGroupDirectory, string d2FacePartsContentDirectory, string eDistanceContentDirectory, string outputResolution) @@ -897,7 +852,7 @@ public partial class DlibDotNet int? useFiltersCounter = null; SortingContainer[] sortingContainers; string dFacesContentDirectory = Path.Combine(dResultsFullGroupDirectory, "()"); - Shared.Models.Face[] distinctFilteredFaces = SetMappingThenGetDistinctFilteredFacesWithMapping(argZero, containers); + (List filteredItems, Shared.Models.Face[] distinctFilteredFaces) = SetMappingThenGetDistinctFilteredFacesWithMapping(argZero, containers); Mapping[] mappingCollection = MapLogicSupport.GetSelectedMappingCollection(distinctFilteredFaces); MapLogicSupport mapLogicSupport = new( _Configuration.FaceDistanceAreaPermilleTolerance, @@ -920,6 +875,12 @@ public partial class DlibDotNet int totalNotMapped = mapLogic.AddToMapping(mappingCollection); if (_Configuration.MappingSaveMapped) mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, totalNotMapped); + if (_Configuration.MappingSaveNotMapped) + mapLogic.SaveNotMappedTicks(); + if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) + mapLogic.SaveShortcuts(a2PeopleSingletonDirectory, personContainers, filteredItems, mappingCollection); + if (_Configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions.Contains(outputResolution)) + mapLogic.SaveResizedImagesByPersonKeyFormatted(_Configuration.JLinks, a2PeopleSingletonDirectory, personContainers, mappingCollection, totalNotMapped); MapLogicSupport.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces); sortingContainers = mapLogicSupport.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, ticks, mapLogic, distinctFilteredFaces, useFiltersCounter); if (!sortingContainers.Any()) @@ -934,10 +895,6 @@ public partial class DlibDotNet MapLogicSupport.SaveFaceDistances(_Configuration.PropertyConfiguration, sortingContainers); if (totalNotMapped > 0) mapLogic.UpdateFromSortingContainersThenSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, useFiltersCounter, sortingContainers, totalNotMapped); - if (_Configuration.MappingSaveNotMapped) - mapLogic.SaveNotMappedTicks(); - if (_Configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions.Contains(outputResolution)) - mapLogic.SaveResizedImagesByPersonKeyFormatted(_Configuration.JLinks, a2PeopleSingletonDirectory, personContainers, mappingCollection, totalNotMapped); } private static Container? AreAllSameEndsWith(string argZero, Container[] containers) @@ -1006,7 +963,7 @@ public partial class DlibDotNet return result; } - private void Search(long ticks, Model? model, PredictorModel? predictorModel, string argZero, string propertyRoot, PersonContainer[] personContainers) + private void Search(long ticks, string argZero, string propertyRoot, PersonContainer[] personContainers) { int j; int f; @@ -1048,13 +1005,13 @@ public partial class DlibDotNet propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FileNameExtension, _Configuration.Reverse); } Dictionary> idToMappedFaceFilesCollection = Map.Models.Stateless.Methods.IMapLogic.DeleteEmptyDirectoriesAndGetMappedFaceFiles(_MapConfiguration, ticks, a2PeopleContentDirectory, eDistanceContentDirectory, personContainers); - FullDoWork(argZero, model, predictorModel, propertyRoot, ticks, propertyLogic, t, containers, eDistanceContentDirectory, idToMappedFaceFilesCollection); + FullDoWork(argZero, propertyRoot, ticks, propertyLogic, t, containers, eDistanceContentDirectory, idToMappedFaceFilesCollection); _Distance.Clear(); foreach (string outputResolution in _Configuration.OutputResolutions) { if (_FirstRun || container is not null) break; - (aResultsFullGroupDirectory, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory) = GetResultsFullGroupDirectories(model, predictorModel, outputResolution); + (aResultsFullGroupDirectory, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution); if (_ArgZeroIsConfigurationRootDirectory && _Configuration.SaveResizedSubfiles && outputResolution == _Configuration.OutputResolutions[0] diff --git a/Instance/Models/Binder/Configuration.cs b/Instance/Models/Binder/Configuration.cs index 6e39ba5..d667c12 100644 --- a/Instance/Models/Binder/Configuration.cs +++ b/Instance/Models/Binder/Configuration.cs @@ -67,7 +67,8 @@ public class Configuration [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 Shortcuts"), Required] public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { get; set; } + [Display(Name = "Save Resized Images by Person Key Formatted"), Required] public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { 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 = "Sorting Days Delta Tolerance"), Required] public int? SortingDaysDeltaTolerance { get; set; } @@ -136,10 +137,10 @@ public class Configuration throw new NullReferenceException(nameof(configuration.LocationFactor)); if (configuration.MappingDefaultName is null) throw new NullReferenceException(nameof(configuration.MappingDefaultName)); - if (configuration.MappingSaveNotMapped is null) - throw new NullReferenceException(nameof(configuration.MappingSaveNotMapped)); if (configuration.MappingSaveMapped is null) throw new NullReferenceException(nameof(configuration.MappingSaveMapped)); + if (configuration.MappingSaveNotMapped is null) + throw new NullReferenceException(nameof(configuration.MappingSaveNotMapped)); if (configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping is null) throw new NullReferenceException(nameof(configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping)); if (configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping is null) @@ -186,14 +187,16 @@ public class Configuration throw new NullReferenceException(nameof(configuration.Reverse)); if (configuration.SaveFaceLandmarkForOutputResolutions is null) configuration.SaveFaceLandmarkForOutputResolutions = Array.Empty(); - if (configuration.SaveFaceLandmarkForOutputResolutions is null) - throw new NullReferenceException(nameof(configuration.SaveFaceLandmarkForOutputResolutions)); if (configuration.SaveFullYearOfRandomFiles is null) throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); if (configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions is null) configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions = Array.Empty(); if (configuration.SaveResizedSubfiles is null) throw new NullReferenceException(nameof(configuration.SaveResizedSubfiles)); + if (configuration.SaveShortcutsForOutputResolutions is null) + configuration.SaveShortcutsForOutputResolutions = Array.Empty(); + if (configuration.SaveShortcutsForOutputResolutions is null) + configuration.SaveShortcutsForOutputResolutions = Array.Empty(); if (configuration.SkipSearch is null) throw new NullReferenceException(nameof(configuration.SkipSearch)); if (configuration.SortingDaysDeltaTolerance is null) @@ -208,14 +211,6 @@ public class Configuration throw new NullReferenceException(nameof(configuration.TestDistanceResults)); if (configuration.ValidResolutions is null) throw new NullReferenceException(nameof(configuration.ValidResolutions)); - if (configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions is null) - configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions = Array.Empty(); - if (configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions is null) - configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = Array.Empty(); - if (configuration.SaveFaceLandmarkForOutputResolutions is null) - configuration.SaveFaceLandmarkForOutputResolutions = Array.Empty(); - if (configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions is null) - configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions = Array.Empty(); _ = DateTime.Now.AddDays(-configuration.SortingDaysDeltaTolerance.Value); result = new(configuration.PropertyConfiguration, configuration.CheckDFaceAndUpWriteDates.Value, @@ -275,6 +270,7 @@ public class Configuration configuration.SaveFaceLandmarkForOutputResolutions, configuration.SaveFullYearOfRandomFiles.Value, configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions, + configuration.SaveShortcutsForOutputResolutions, configuration.SaveResizedSubfiles.Value, configuration.SkipSearch.Value, configuration.SortingDaysDeltaTolerance.Value, diff --git a/Instance/Models/Configuration.cs b/Instance/Models/Configuration.cs index b628b41..07a38b1 100644 --- a/Instance/Models/Configuration.cs +++ b/Instance/Models/Configuration.cs @@ -66,6 +66,7 @@ public class Configuration public string[] SaveFaceLandmarkForOutputResolutions { init; get; } public bool SaveFullYearOfRandomFiles { init; get; } public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { init; get; } + public string[] SaveShortcutsForOutputResolutions { init; get; } public bool SaveResizedSubfiles { init; get; } public bool SkipSearch { init; get; } public int SortingDaysDeltaTolerance { init; get; } @@ -134,6 +135,7 @@ public class Configuration string[] saveFaceLandmarkForOutputResolutions, bool saveFullYearOfRandomFiles, string[] saveResizedImagesByPersonKeyFormattedForOutputResolutions, + string[] saveShortcutsForOutputResolutions, bool saveResizedSubfiles, bool skipSearch, int sortingDaysDeltaTolerance, @@ -201,6 +203,7 @@ public class Configuration SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions; SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles; SaveResizedImagesByPersonKeyFormattedForOutputResolutions = saveResizedImagesByPersonKeyFormattedForOutputResolutions; + SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions; SaveResizedSubfiles = saveResizedSubfiles; SkipSearch = skipSearch; SortingDaysDeltaTolerance = sortingDaysDeltaTolerance; diff --git a/Instance/Models/_E2_Navigate.cs b/Instance/Models/_E2_Navigate.cs index a15f7ec..614ca2b 100644 --- a/Instance/Models/_E2_Navigate.cs +++ b/Instance/Models/_E2_Navigate.cs @@ -6,7 +6,6 @@ using View_by_Distance.Metadata.Models; using View_by_Distance.Resize.Models; using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models.Methods; -using View_by_Distance.Shared.Models.Stateless; namespace View_by_Distance.Instance.Models; diff --git a/Instance/Models/_E3_Rename.cs b/Instance/Models/_E3_Rename.cs index 3b5ce5b..778356e 100644 --- a/Instance/Models/_E3_Rename.cs +++ b/Instance/Models/_E3_Rename.cs @@ -4,7 +4,6 @@ using View_by_Distance.Face.Models; using View_by_Distance.FaceParts.Models; using View_by_Distance.Metadata.Models; using View_by_Distance.Resize.Models; -using View_by_Distance.Shared.Models.Stateless; namespace View_by_Distance.Instance.Models; diff --git a/Instance/appsettings.Development.json b/Instance/appsettings.Development.json index ac55b82..6ac0c87 100644 --- a/Instance/appsettings.Development.json +++ b/Instance/appsettings.Development.json @@ -83,8 +83,8 @@ "MaxItemsInDistanceCollection": 50, "ModelDirectory": "C:/GitHub/dlib-models", "ModelName": "Hog", - "NumberOfJitters": 1, - "NumberOfTimesToUpsample": 1, + "NumberOfJitters": 0, + "NumberOfTimesToUpsample": 0, "OutputExtension": ".jpg", "OutputQuality": 95, "OverrideForFaceImages": false, @@ -147,6 +147,7 @@ "256 x 256" ], "SaveResizedImagesByPersonKeyFormattedForOutputResolutions": [], + "SaveShortcutsForOutputResolutions": [], "ValidImageFormatExtensions": [ ".bmp", ".BMP", diff --git a/Instance/appsettings.Staging.json b/Instance/appsettings.Staging.json index 97c0ab0..086414f 100644 --- a/Instance/appsettings.Staging.json +++ b/Instance/appsettings.Staging.json @@ -83,8 +83,8 @@ "MaxItemsInDistanceCollection": 50, "ModelDirectory": "L:/GitHub/dlib-models", "ModelName": "Hog", - "NumberOfJitters": 1, - "NumberOfTimesToUpsample": 1, + "NumberOfJitters": 0, + "NumberOfTimesToUpsample": 0, "OutputExtension": ".jpg", "OutputQuality": 95, "OverrideForFaceImages": false, @@ -139,6 +139,9 @@ "SaveResizedImagesByPersonKeyFormattedForOutputResolutions": [ "1920 x 1080" ], + "SaveShortcutsForOutputResolutions": [ + "1920 x 1080" + ], "ValidImageFormatExtensions": [ ".bmp", ".BMP", diff --git a/Instance/appsettings.json b/Instance/appsettings.json index 7745a3a..ff0840c 100644 --- a/Instance/appsettings.json +++ b/Instance/appsettings.json @@ -83,8 +83,8 @@ "MaxItemsInDistanceCollection": 50, "ModelDirectory": "C:/GitHub/dlib-models", "ModelName": "Hog", - "NumberOfJitters": 1, - "NumberOfTimesToUpsample": 1, + "NumberOfJitters": 0, + "NumberOfTimesToUpsample": 0, "OutputExtension": ".jpg", "OutputQuality": 95, "OverrideForFaceImages": false, @@ -148,6 +148,9 @@ "SaveResizedImagesByPersonKeyFormattedForOutputResolutions": [ "1920 x 1080" ], + "SaveShortcutsForOutputResolutions": [ + "1920 x 1080" + ], "ValidImageFormatExtensions": [ ".bmp", ".BMP", diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index 8e811b7..71acf94 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -25,12 +25,14 @@ public class MapLogic private readonly int _MaxDegreeOfParallelism; private readonly Configuration? _Configuration; private readonly string _EDistanceContentTicksDirectory; + private readonly Shared.Models.Properties.IPropertyConfiguration _PropertyConfiguration; public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, long ticks, PersonContainer[] personContainers, string a2PeopleSingletonDirectory, string eDistanceContentDirectory, Mapping[] mappingCollection, Shared.Models.Methods.IMapLogicSupport? faceDistance) { _Ticks = ticks; _Configuration = configuration; _Log = Serilog.Log.ForContext(); + _PropertyConfiguration = propertyConfiguration; _MaxDegreeOfParallelism = maxDegreeOfParallelism; if (_Log is null) { } @@ -704,47 +706,82 @@ public class MapLogic SaveContainers(totalNotMapped, updated, saveContainers); } + private (string, PersonBirthday?) GetPersonBirthday(string windowsShortcutPath) + { + if (_Configuration is null) + throw new NullReferenceException(nameof(_Configuration)); + PersonBirthday? personBirthday = null; + string personKeyFormatted = string.Empty; + string[] directoryNames = IPath.GetDirectoryNames(windowsShortcutPath); + foreach (string directoryName in directoryNames) + { + personBirthday = IPersonBirthday.GetPersonBirthday(_Configuration.PersonBirthdayFormat, directoryName); + if (personBirthday is not null) + { + personKeyFormatted = directoryName; + break; + } + } + return new(personKeyFormatted, personBirthday); + } + private List<(string, PersonContainer)> GetPersonContainers(string[] jLinks, string a2PeopleSingletonDirectory, PersonContainer[] personContainers) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); List<(string, PersonContainer)> results = new(); string[] files; - long personKey; const int zero = 0; string[] directories; string checkDirectory; + string[] checkDirectories; string personKeyFormatted; - string displayDirectoryName; - PersonContainer[] collection; + PersonContainer[] matches; PersonBirthday? personBirthday; + string fileNameWithoutExtension; WindowsShortcut windowsShortcut; + List<(long, string)> collection = new(); foreach (string directoryName in jLinks) { checkDirectory = Path.Combine(a2PeopleSingletonDirectory, directoryName); if (!Directory.Exists(checkDirectory)) continue; + checkDirectories = Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly); files = Directory.GetFiles(checkDirectory, "*.lnk", SearchOption.TopDirectoryOnly); foreach (string file in files) { + collection.Clear(); windowsShortcut = WindowsShortcut.Load(file); - if (windowsShortcut.Path is null || !Directory.Exists(windowsShortcut.Path)) + fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file); + if (windowsShortcut.Path is null) continue; - directories = Directory.GetDirectories(windowsShortcut.Path, "*", SearchOption.TopDirectoryOnly); - foreach (string directory in directories) + if (!Directory.Exists(windowsShortcut.Path) && files.Length != checkDirectories.Length) + throw new NotSupportedException(fileNameWithoutExtension); + (personKeyFormatted, personBirthday) = GetPersonBirthday(windowsShortcut.Path); + if (personBirthday is not null) + collection.Add(new(personBirthday.Value.Ticks, Path.Combine(checkDirectory, personKeyFormatted, fileNameWithoutExtension))); + else { - personKeyFormatted = Path.GetFileName(directory); - personBirthday = IPersonBirthday.GetPersonBirthday(_Configuration.PersonBirthdayFormat, personKeyFormatted); - if (personBirthday is null) - continue; - personKey = personBirthday.Value.Ticks; - collection = (from l in personContainers where l.Key == personKey && l.ApproximateYears.HasValue select l).ToArray(); - if (!collection.Any()) - continue; - displayDirectoryName = Path.Combine(checkDirectory, personKeyFormatted, Path.GetFileNameWithoutExtension(file)); + directories = Directory.GetDirectories(windowsShortcut.Path, "*", SearchOption.TopDirectoryOnly); + foreach (string directory in directories) + { + personKeyFormatted = Path.GetFileName(directory); + personBirthday = IPersonBirthday.GetPersonBirthday(_Configuration.PersonBirthdayFormat, personKeyFormatted); + if (personBirthday is null) + continue; + collection.Add(new(personBirthday.Value.Ticks, Path.Combine(checkDirectory, personKeyFormatted, fileNameWithoutExtension))); + } + } + if (!collection.Any()) + throw new NotSupportedException(fileNameWithoutExtension); + foreach ((long personKey, string displayDirectoryName) in collection) + { + matches = (from l in personContainers where l.Key == personKey && l.ApproximateYears.HasValue select l).ToArray(); + if (!matches.Any()) + throw new NotSupportedException(fileNameWithoutExtension); if (!Directory.Exists(displayDirectoryName)) _ = Directory.CreateDirectory(displayDirectoryName); - results.Add(new(personKeyFormatted, collection[zero])); + results.Add(new(personKeyFormatted, matches[zero])); } } } @@ -759,7 +796,7 @@ public class MapLogic return results; } - private (int, FileHolder, int, string, string, string, string)[] GetCollection(string[] jLinks, string a2PeopleSingletonDirectory, PersonContainer[] personContainers, Mapping[] mappingCollection) + private (int, FileHolder, int, string, string, string, string)[] GetCollectionForSaveResizedImagesByPersonKeyFormatted(string[] jLinks, string a2PeopleSingletonDirectory, PersonContainer[] personContainers, Mapping[] mappingCollection) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); @@ -805,7 +842,7 @@ public class MapLogic SaveContainer? saveContainer; List distinctCollection = new(); List saveContainers = new(); - (int, FileHolder, int, string, string, string, string)[] collection = GetCollection(jLinks, a2PeopleSingletonDirectory, personContainers, mappingCollection); + (int, FileHolder, int, string, string, string, string)[] collection = GetCollectionForSaveResizedImagesByPersonKeyFormatted(jLinks, a2PeopleSingletonDirectory, personContainers, mappingCollection); foreach ((int id, FileHolder resizedFileHolder, int approximateYears, string personKeyFormatted, string directory, string personDirectory, string checkFile) in collection) { if (distinctCollection.Contains(id)) @@ -819,4 +856,89 @@ public class MapLogic SaveContainers(totalNotMapped, null, saveContainers); } + private List<(string, string, string)> GetCollectionForSaveShortcuts(string[] jLinks, string a2PeopleSingletonDirectory, PersonContainer[] personContainers, List filteredItems, Mapping[] mappingCollection) + { + if (_Configuration is null) + throw new NullReferenceException(nameof(_Configuration)); + string fileName; + string directory; + string? directoryName; + string personDirectory; + string personKeyFormatted; + List<(string, string Directory, string)> collection = new(); + string[] personKeyFormattedCollection = GetPersonKeyFormattedCollection(jLinks, a2PeopleSingletonDirectory, personContainers); + foreach (Item item in filteredItems) + { + directoryName = Path.GetDirectoryName(item.RelativePath); + if (directoryName is null) + throw new NotSupportedException(); + if (item.ResizedFileHolder?.DirectoryName is null || !item.ResizedFileHolder.Exists) + continue; + directory = Path.Combine(item.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", _PropertyConfiguration.ResultAllInOne); + personDirectory = Path.Combine(directory, "No Faces"); + fileName = Path.Combine(personDirectory, $"{item.ResizedFileHolder.Name}.lnk"); + collection.Add(new(item.ResizedFileHolder.FullName, personDirectory, fileName)); + } + foreach (Mapping mapping in mappingCollection) + { + directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath); + if (directoryName is null) + throw new NotSupportedException(); + if (mapping.MappingFromItem.ResizedFileHolder.DirectoryName is null || !mapping.MappingFromItem.ResizedFileHolder.Exists) + continue; + if (mapping.By is null or IMapLogic.Sorting || mapping.MappingFromPerson?.ApproximateYears is null) + { + directory = Path.Combine(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", _PropertyConfiguration.ResultAllInOne); + personDirectory = Path.Combine(directory, "Unknown"); + fileName = Path.Combine(personDirectory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk"); + collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, fileName)); + } + else + { + if (string.IsNullOrEmpty(mapping.MappingFromPerson.SegmentB)) + throw new NotSupportedException(); + if (string.IsNullOrEmpty(mapping.MappingFromPerson.DisplayDirectoryName)) + throw new NotSupportedException(); + personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday); + if (!personKeyFormattedCollection.Contains(personKeyFormatted)) + continue; + directory = Path.Combine(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", personKeyFormatted); + personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName); + fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk"); + collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, fileName)); + } + } + return collection; + } + + public void SaveShortcuts(string a2PeopleSingletonDirectory, PersonContainer[] personContainers, List filteredItems, Mapping[] mappingCollection) + { + if (_Configuration is null) + throw new NullReferenceException(nameof(_Configuration)); + WindowsShortcut windowsShortcut; + string[] jLinks = new string[] { "All" }; + List<(string, string Directory, string)> collection = GetCollectionForSaveShortcuts(jLinks, a2PeopleSingletonDirectory, personContainers, filteredItems, mappingCollection); + string[] directories = (from l in collection select l.Directory).Distinct().ToArray(); + foreach (string directory in directories) + { + if (string.IsNullOrEmpty(directory)) + continue; + if (!Directory.Exists(directory)) + _ = Directory.CreateDirectory(directory); + } + foreach ((string fullName, string directory, string fileName) in collection) + { + if (File.Exists(fileName)) + continue; + try + { + windowsShortcut = new() { Path = fullName }; + windowsShortcut.Save(fileName); + windowsShortcut.Dispose(); + } + catch (Exception) + { } + } + } + } \ No newline at end of file diff --git a/Not-Copy-Copy/Models/Binder/Configuration.cs b/Not-Copy-Copy/Models/Binder/Configuration.cs index 2285296..a7d231f 100644 --- a/Not-Copy-Copy/Models/Binder/Configuration.cs +++ b/Not-Copy-Copy/Models/Binder/Configuration.cs @@ -6,17 +6,14 @@ namespace View_by_Distance.Not.Copy.Copy.Models.Binder; public class Configuration { +#nullable disable + [Display(Name = "Compare Source"), Required] public string CompareSource { get; set; } [Display(Name = "Empty Destination"), Required] public string EmptyDestination { get; set; } [Display(Name = "Property Configuration"), Required] public Property.Models.Configuration PropertyConfiguration { get; set; } [Display(Name = "Selected Source"), Required] public string SelectedSource { get; set; } - public Configuration() - { - CompareSource = string.Empty; - EmptyDestination = string.Empty; - SelectedSource = string.Empty; - } +#nullable restore public override string ToString() { diff --git a/PrepareForOld/Models/Binder/Configuration.cs b/PrepareForOld/Models/Binder/Configuration.cs index 63c0ebb..2734f28 100644 --- a/PrepareForOld/Models/Binder/Configuration.cs +++ b/PrepareForOld/Models/Binder/Configuration.cs @@ -6,10 +6,12 @@ namespace View_by_Distance.PrepareForOld.Models.Binder; public class Configuration { +#nullable disable + [Display(Name = "Property Configuration"), Required] public Property.Models.Configuration PropertyConfiguration { get; set; } [Display(Name = "Spelling"), Required] public string[] Spelling { get; set; } - public Configuration() => Spelling = Array.Empty(); +#nullable restore public override string ToString() { diff --git a/Shared/Models/Stateless/Methods/IPersonBirthday.cs b/Shared/Models/Stateless/Methods/IPersonBirthday.cs index a4b0e8a..543e80b 100644 --- a/Shared/Models/Stateless/Methods/IPersonBirthday.cs +++ b/Shared/Models/Stateless/Methods/IPersonBirthday.cs @@ -13,10 +13,10 @@ public interface IPersonBirthday // ... - string TestStatic_GetDateTime(string personKey) => - GetDateTime(personKey); - static string GetDateTime(string personKey) => - personKey.Length < 5 || !personKey.Contains('#') ? personKey : personKey[..2] == "19" ? $"1600{personKey[4..]}" : $"1700{personKey[4..]}"; + string TestStatic_GetDateTime(string personKeyFormatted) => + GetDateTime(personKeyFormatted); + static string GetDateTime(string personKeyFormatted) => + personKeyFormatted.Length < 5 || !personKeyFormatted.Contains('#') ? personKeyFormatted : personKeyFormatted[..2] == "19" ? $"1600{personKeyFormatted[4..]}" : $"1700{personKeyFormatted[4..]}"; double? TestStatic_GetAge(Models.PersonBirthday birthday) => GetAge(birthday); @@ -68,10 +68,10 @@ public interface IPersonBirthday static TimeSpan? GetTimeSpan(DateTime minimumDateTime, Models.PersonBirthday personBirthday) => PersonBirthday.GetTimeSpan(minimumDateTime, isWrongYear: false, personBirthday); - Models.PersonBirthday? TestStatic_GetPersonBirthday(string personBirthdayFormat, string personKey) => - GetPersonBirthday(personBirthdayFormat, personKey); - static Models.PersonBirthday? GetPersonBirthday(string personBirthdayFormat, string personKey) => - PersonBirthday.GetPersonBirthday(personBirthdayFormat, personKey); + Models.PersonBirthday? TestStatic_GetPersonBirthday(string personBirthdayFormat, string personKeyFormatted) => + GetPersonBirthday(personBirthdayFormat, personKeyFormatted); + static Models.PersonBirthday? GetPersonBirthday(string personBirthdayFormat, string personKeyFormatted) => + PersonBirthday.GetPersonBirthday(personBirthdayFormat, personKeyFormatted); bool TestStatic_DoesBirthDateExits(Properties.IStorage storage, Models.PersonBirthday personBirthday) => DoesBirthDateExits(storage, personBirthday); @@ -103,9 +103,9 @@ public interface IPersonBirthday internal static bool DoesBirthDateExits(Properties.IStorage storage, string personBirthdayFormat, Models.PersonBirthday personBirthday) => File.Exists(GetFileFullName(storage, personBirthdayFormat, personBirthday)); - DateTime? TestStatic_GetDateTime(string personBirthdayFormat, string personKey) => - GetDateTime(personBirthdayFormat, personKey); - static DateTime? GetDateTime(string personBirthdayFormat, string personKey) => - DateTime.TryParseExact(GetDateTime(personKey), personBirthdayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dateTime) ? dateTime : null; + DateTime? TestStatic_GetDateTime(string personBirthdayFormat, string personKeyFormatted) => + GetDateTime(personBirthdayFormat, personKeyFormatted); + static DateTime? GetDateTime(string personBirthdayFormat, string personKeyFormatted) => + DateTime.TryParseExact(GetDateTime(personKeyFormatted), personBirthdayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dateTime) ? dateTime : null; } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/PersonBirthday.cs b/Shared/Models/Stateless/Methods/PersonBirthday.cs index 749dced..2e2ca91 100644 --- a/Shared/Models/Stateless/Methods/PersonBirthday.cs +++ b/Shared/Models/Stateless/Methods/PersonBirthday.cs @@ -7,14 +7,20 @@ internal abstract class PersonBirthday // ... - internal static Models.PersonBirthday? GetPersonBirthday(string personBirthdayFormat, string personKey) + internal static Models.PersonBirthday? GetPersonBirthday(string personBirthdayFormat, string personKeyFormatted) { Models.PersonBirthday? result; - DateTime? dateTime = IPersonBirthday.GetDateTime(personBirthdayFormat, personKey); - if (dateTime is null) + DateTime? dateTime; + if (personKeyFormatted.Length != personBirthdayFormat.Length) result = null; else - result = new(dateTime.Value); + { + dateTime = IPersonBirthday.GetDateTime(personBirthdayFormat, personKeyFormatted); + if (dateTime is null) + result = null; + else + result = new(dateTime.Value); + } return result; } diff --git a/Tests/Models/Binder/Configuration.cs b/Tests/Models/Binder/Configuration.cs index ac921f3..75b0b3b 100644 --- a/Tests/Models/Binder/Configuration.cs +++ b/Tests/Models/Binder/Configuration.cs @@ -48,7 +48,8 @@ public class Configuration [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 Shortcuts"), Required] public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { get; set; } + [Display(Name = "Save Resized Images by Person Key Formatted"), Required] public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { 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; } @@ -83,6 +84,10 @@ public class Configuration throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); if (configuration.IgnoreRelativePaths is null) throw new NullReferenceException(nameof(configuration.IgnoreRelativePaths)); + if (configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions is null) + configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions = Array.Empty(); + if (configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions is null) + configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = Array.Empty(); if (configuration.LoadOrCreateThenSaveIndex is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveIndex)); if (configuration.LocationConfidenceFactor is null) @@ -120,25 +125,21 @@ public class Configuration if (configuration.Reverse is null) throw new NullReferenceException(nameof(configuration.Reverse)); if (configuration.SaveFaceLandmarkForOutputResolutions is null) - throw new NullReferenceException(nameof(configuration.SaveFaceLandmarkForOutputResolutions)); + configuration.SaveFaceLandmarkForOutputResolutions = Array.Empty(); if (configuration.SaveFullYearOfRandomFiles is null) throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); + if (configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions is null) + configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions = Array.Empty(); if (configuration.SaveResizedSubfiles is null) throw new NullReferenceException(nameof(configuration.SaveResizedSubfiles)); + if (configuration.SaveShortcutsForOutputResolutions is null) + 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)); - if (configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions is null) - configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions = Array.Empty(); - if (configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions is null) - configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = Array.Empty(); - if (configuration.SaveFaceLandmarkForOutputResolutions is null) - configuration.SaveFaceLandmarkForOutputResolutions = Array.Empty(); - if (configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions is null) - configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions = Array.Empty(); result = new(configuration.PropertyConfiguration, configuration.CheckDFaceAndUpWriteDates.Value, configuration.CheckJsonForDistanceResults.Value, @@ -178,6 +179,7 @@ public class Configuration configuration.SaveFaceLandmarkForOutputResolutions, configuration.SaveFullYearOfRandomFiles.Value, configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions, + configuration.SaveShortcutsForOutputResolutions, configuration.SaveResizedSubfiles.Value, configuration.SkipSearch.Value, configuration.TestDistanceResults.Value, diff --git a/Tests/Models/Configuration.cs b/Tests/Models/Configuration.cs index 33820f7..45ae9fe 100644 --- a/Tests/Models/Configuration.cs +++ b/Tests/Models/Configuration.cs @@ -47,6 +47,7 @@ public class Configuration public string[] SaveFaceLandmarkForOutputResolutions { init; get; } public bool SaveFullYearOfRandomFiles { init; get; } public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { init; get; } + public string[] SaveShortcutsForOutputResolutions { init; get; } public bool SaveResizedSubfiles { init; get; } public bool SkipSearch { init; get; } public bool TestDistanceResults { init; get; } @@ -92,6 +93,7 @@ public class Configuration string[] saveFaceLandmarkForOutputResolutions, bool saveFullYearOfRandomFiles, string[] saveResizedImagesByPersonKeyFormattedForOutputResolutions, + string[] saveShortcutsForOutputResolutions, bool saveResizedSubfiles, bool skipSearch, bool testDistanceResults, @@ -136,6 +138,7 @@ public class Configuration SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions; SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles; SaveResizedImagesByPersonKeyFormattedForOutputResolutions = saveResizedImagesByPersonKeyFormattedForOutputResolutions; + SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions; SaveResizedSubfiles = saveResizedSubfiles; SkipSearch = skipSearch; TestDistanceResults = testDistanceResults; diff --git a/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs b/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs index 5a7a9e5..6e8d359 100644 --- a/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs +++ b/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs @@ -67,7 +67,8 @@ public class Configuration [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 Shortcuts"), Required] public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { get; set; } + [Display(Name = "Save Resized Images by Person Key Formatted"), Required] public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { 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 = "Sorting Days Delta Tolerance"), Required] public int? SortingDaysDeltaTolerance { get; set; } @@ -136,10 +137,10 @@ public class Configuration throw new NullReferenceException(nameof(configuration.LocationFactor)); if (configuration.MappingDefaultName is null) throw new NullReferenceException(nameof(configuration.MappingDefaultName)); - if (configuration.MappingSaveNotMapped is null) - throw new NullReferenceException(nameof(configuration.MappingSaveNotMapped)); if (configuration.MappingSaveMapped is null) throw new NullReferenceException(nameof(configuration.MappingSaveMapped)); + if (configuration.MappingSaveNotMapped is null) + throw new NullReferenceException(nameof(configuration.MappingSaveNotMapped)); if (configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping is null) throw new NullReferenceException(nameof(configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping)); if (configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping is null) @@ -186,14 +187,14 @@ public class Configuration throw new NullReferenceException(nameof(configuration.Reverse)); if (configuration.SaveFaceLandmarkForOutputResolutions is null) configuration.SaveFaceLandmarkForOutputResolutions = Array.Empty(); - if (configuration.SaveFaceLandmarkForOutputResolutions is null) - throw new NullReferenceException(nameof(configuration.SaveFaceLandmarkForOutputResolutions)); if (configuration.SaveFullYearOfRandomFiles is null) throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); if (configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions is null) configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions = Array.Empty(); if (configuration.SaveResizedSubfiles is null) throw new NullReferenceException(nameof(configuration.SaveResizedSubfiles)); + if (configuration.SaveShortcutsForOutputResolutions is null) + configuration.SaveShortcutsForOutputResolutions = Array.Empty(); if (configuration.SkipSearch is null) throw new NullReferenceException(nameof(configuration.SkipSearch)); if (configuration.SortingDaysDeltaTolerance is null) @@ -208,14 +209,6 @@ public class Configuration throw new NullReferenceException(nameof(configuration.TestDistanceResults)); if (configuration.ValidResolutions is null) throw new NullReferenceException(nameof(configuration.ValidResolutions)); - if (configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions is null) - configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions = Array.Empty(); - if (configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions is null) - configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = Array.Empty(); - if (configuration.SaveFaceLandmarkForOutputResolutions is null) - configuration.SaveFaceLandmarkForOutputResolutions = Array.Empty(); - if (configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions is null) - configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions = Array.Empty(); _ = DateTime.Now.AddDays(-configuration.SortingDaysDeltaTolerance.Value); result = new(configuration.PropertyConfiguration, configuration.CheckDFaceAndUpWriteDates.Value, @@ -275,6 +268,7 @@ public class Configuration configuration.SaveFaceLandmarkForOutputResolutions, configuration.SaveFullYearOfRandomFiles.Value, configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions, + configuration.SaveShortcutsForOutputResolutions, configuration.SaveResizedSubfiles.Value, configuration.SkipSearch.Value, configuration.SortingDaysDeltaTolerance.Value, diff --git a/TestsWithFaceRecognitionDotNet/Models/Configuration.cs b/TestsWithFaceRecognitionDotNet/Models/Configuration.cs index 1687be9..48dffa1 100644 --- a/TestsWithFaceRecognitionDotNet/Models/Configuration.cs +++ b/TestsWithFaceRecognitionDotNet/Models/Configuration.cs @@ -66,6 +66,7 @@ public class Configuration public string[] SaveFaceLandmarkForOutputResolutions { init; get; } public bool SaveFullYearOfRandomFiles { init; get; } public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { init; get; } + public string[] SaveShortcutsForOutputResolutions { init; get; } public bool SaveResizedSubfiles { init; get; } public bool SkipSearch { init; get; } public int SortingDaysDeltaTolerance { init; get; } @@ -134,6 +135,7 @@ public class Configuration string[] saveFaceLandmarkForOutputResolutions, bool saveFullYearOfRandomFiles, string[] saveResizedImagesByPersonKeyFormattedForOutputResolutions, + string[] saveShortcutsForOutputResolutions, bool saveResizedSubfiles, bool skipSearch, int sortingDaysDeltaTolerance, @@ -201,6 +203,7 @@ public class Configuration SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions; SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles; SaveResizedImagesByPersonKeyFormattedForOutputResolutions = saveResizedImagesByPersonKeyFormattedForOutputResolutions; + SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions; SaveResizedSubfiles = saveResizedSubfiles; SkipSearch = skipSearch; SortingDaysDeltaTolerance = sortingDaysDeltaTolerance;