diff --git a/.vscode/settings.json b/.vscode/settings.json index 0025030..99872b6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -23,6 +23,9 @@ "Immich", "jfif", "JOSN", + "makernote", + "Makernote", + "Makernotes", "mmod", "Nicéphore", "Niépce", @@ -32,6 +35,8 @@ "permyriad", "Phares", "Phgtv", + "photoshop", + "Photoshop", "RDHC", "Rects", "resnet", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index ad3cef8..9d23c61 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -79,6 +79,38 @@ "--no-restore" ], "problemMatcher": "$msCompile" + }, + { + "label": "buildShared", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/Shared/View-by-Distance.Shared.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary", + "/property:WarningLevel=0", + "--verbosity", + "quiet", + "--no-restore" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "buildMetadata", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/Metadata/Metadata.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary", + "/property:WarningLevel=0", + "--verbosity", + "quiet", + "--no-restore" + ], + "problemMatcher": "$msCompile" } ] } \ No newline at end of file diff --git a/Distance/Models/DistanceLimits.cs b/Distance/Models/DistanceLimits.cs index 0c858e4..a0b1785 100644 --- a/Distance/Models/DistanceLimits.cs +++ b/Distance/Models/DistanceLimits.cs @@ -21,7 +21,7 @@ public class DistanceLimits : IDistanceLimits int faceDistancePermyriad, int[] rangeDaysDeltaTolerance, float[] rangeDistanceTolerance, - float[] rangeFaceAreaPermyriadTolerance, + float[] rangeFaceAreaTolerance, float[] rangeFaceConfidence, int sortingMaximumPerFaceShouldBeHigh, int? useFiltersCounter = null) @@ -33,7 +33,7 @@ public class DistanceLimits : IDistanceLimits { RangeDaysDeltaTolerance = rangeDaysDeltaTolerance[1]; FaceConfidencePercent = faceConfidencePercent * rangeFaceConfidence[1]; - FaceAreaPermyriad = faceAreaPermyriad * rangeFaceAreaPermyriadTolerance[1]; + FaceAreaPermyriad = faceAreaPermyriad * rangeFaceAreaTolerance[1]; FaceDistancePermyriad = faceDistancePermyriad * rangeDistanceTolerance[1]; } else @@ -41,7 +41,7 @@ public class DistanceLimits : IDistanceLimits RangeDaysDeltaTolerance = ((rangeDaysDeltaTolerance[2] - rangeDaysDeltaTolerance[0]) * 0.01 * useFiltersCounter.Value) + rangeDaysDeltaTolerance[1]; FaceConfidencePercent = faceConfidencePercent * ((rangeFaceConfidence[2] - rangeFaceConfidence[0]) * 0.01 * useFiltersCounter.Value) + rangeFaceConfidence[1]; FaceDistancePermyriad = faceDistancePermyriad * ((rangeDistanceTolerance[2] - rangeDistanceTolerance[0]) * 0.01 * useFiltersCounter.Value) + rangeDistanceTolerance[1]; - FaceAreaPermyriad = faceAreaPermyriad * ((rangeFaceAreaPermyriadTolerance[2] - rangeFaceAreaPermyriadTolerance[0]) * 0.01 * useFiltersCounter.Value) + rangeFaceAreaPermyriadTolerance[1]; + FaceAreaPermyriad = faceAreaPermyriad * ((rangeFaceAreaTolerance[2] - rangeFaceAreaTolerance[0]) * 0.01 * useFiltersCounter.Value) + rangeFaceAreaTolerance[1]; } } diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index c9f6e29..169b62e 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -113,7 +113,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable (ImageCodecInfo imageCodecInfo, EncoderParameters encoderParameters, string filenameExtension) = C_Resize.GetJpegLowQuality(); _FaceParts = new D2_FaceParts(_Configuration.PropertyConfiguration, imageCodecInfo, encoderParameters, filenameExtension, configuration.CheckDFaceAndUpWriteDates, configuration.OverrideForFaceLandmarkImages); } - _DistanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaPermyriadTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh); + _DistanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh); _MapConfiguration = Get(configuration, _DistanceLimits, _Faces.FileNameExtension, _Faces.HiddenFileNameExtension, _FaceParts.FileNameExtension); _Distance = new(configuration.DistanceMoveUnableToMatch, configuration.DistanceRenameToMatch, configuration.FaceConfidencePercent, configuration.RangeDistanceTolerance, configuration.RectangleIntersectMinimums); if (_PropertyRootExistedBefore || !_ArgZeroIsConfigurationRootDirectory) @@ -183,8 +183,8 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable 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.RangeFaceAreaTolerance.Length != 3) + throw new NullReferenceException(nameof(configuration.RangeFaceAreaTolerance)); if (configuration.RangeFaceConfidence.Length != 3) throw new NullReferenceException(nameof(configuration.RangeFaceConfidence)); if (configuration.LocationContainerDistanceTolerance is null && !string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory)) @@ -929,7 +929,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable results = []; else { - DistanceLimits distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaPermyriadTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh); + DistanceLimits distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh); List postFiltered = E_Distance.GetPostFilterLocationContainer(mapLogic, preFiltered, distanceLimits); if (postFiltered.Count == 0) results = []; @@ -1385,7 +1385,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable ReadOnlyCollection 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.RangeFaceAreaPermyriadTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh); + distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh); filteredFaceDistanceContainers = E_Distance.FilteredPostLoadFaceDistanceContainers(mapLogic, faceDistanceContainers, skipOlderThan, distanceLimits); if (filteredFaceDistanceContainers.Length == 0) _Logger?.LogInformation("All images have been filtered!"); @@ -1396,7 +1396,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable { for (useFiltersCounter = 1; useFiltersCounter < _Configuration.UseFilterTries; useFiltersCounter++) { - distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaPermyriadTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh, useFiltersCounter); + distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh, useFiltersCounter); filteredFaceDistanceContainers = E_Distance.FilteredPostLoadFaceDistanceContainers(mapLogic, faceDistanceContainers, skipOlderThan, distanceLimits); if (filteredFaceDistanceContainers.Length == 0) _Logger?.LogInformation("All images have been filtered!"); diff --git a/Instance/Models/Configuration.cs b/Instance/Models/Configuration.cs index 71ddcb4..34a9e58 100644 --- a/Instance/Models/Configuration.cs +++ b/Instance/Models/Configuration.cs @@ -64,7 +64,7 @@ public record Configuration(Property.Models.Configuration PropertyConfiguration, int RadomUseBirthdayMinimum, int[] RangeDaysDeltaTolerance, float[] RangeDistanceTolerance, - float[] RangeFaceAreaPermyriadTolerance, + float[] RangeFaceAreaTolerance, float[] RangeFaceConfidence, float[] RectangleIntersectMinimums, bool ReMap, diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index 56524a6..6c4ddc4 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -264,7 +264,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic { List personKeyFormattedCollection = []; Dictionary personKeyFormattedToNewestPersonKeyFormatted = []; - Stateless.MapLogic.SetPersonCollections(configuration, personContainers, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection); + Stateless.MapLogic.SetPersonCollectionsAfterSetSkipCollections(configuration, personContainers, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection); readOnlyPersonKeyFormattedCollection = new(personKeyFormattedCollection); readOnlyPersonKeyFormattedToNewestPersonKeyFormatted = new(personKeyFormattedToNewestPersonKeyFormatted); } @@ -1265,6 +1265,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); + int? updated = null; FileHolder fileHolder; SaveContainer? saveContainer; List saveContainers = []; @@ -1277,7 +1278,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic saveContainer = new(fileHolder, filteredOriginalImage.CheckFile, filteredOriginalImage.Directory); saveContainers.Add(saveContainer); } - SaveContainers(null, saveContainers); + SaveContainers(updated, saveContainers); } public void SaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, ReadOnlyDictionary> personKeyToIds, ReadOnlyCollection distinctValidImageMappingCollection) diff --git a/Map/Models/Stateless/FaceFileLogic.cs b/Map/Models/Stateless/FaceFileLogic.cs index 4b9bbee..2c6f975 100644 --- a/Map/Models/Stateless/FaceFileLogic.cs +++ b/Map/Models/Stateless/FaceFileLogic.cs @@ -64,21 +64,22 @@ internal abstract class FaceFileLogic exifDirectory = Metadata.Models.Stateless.Methods.IMetadata.GetExifDirectory(mappedFile.FilePath); RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value); personDisplayDirectoryName = mappedFile.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : mappedFile.PersonDisplayDirectoryName; + LocationContainer locationContainer = new(dateOnly, + exifDirectory, + mappedFile.DirectoryNumber, + personDisplayDirectoryName, + null, + null, + mappedFile.FilePath, + fromDistanceContent, + id.Value, + null, + null, + mappedFile.PersonKey, + rectangle, + wholePercentages.Value); lock (locationContainers) - locationContainers.Add(new(dateOnly, - exifDirectory, - mappedFile.DirectoryNumber, - personDisplayDirectoryName, - null, - null, - mappedFile.FilePath, - fromDistanceContent, - id.Value, - null, - null, - mappedFile.PersonKey, - rectangle, - wholePercentages.Value)); + locationContainers.Add(locationContainer); } private static ReadOnlyDictionary> GetReadOnly(Dictionary> keyValuePairs) @@ -93,33 +94,26 @@ internal abstract class FaceFileLogic { Dictionary> results = []; List locationContainers = []; + List personKeyFormattedCollection = []; Dictionary? keyValuePairs; Dictionary> skipCollection = []; Dictionary> skipNotSkipCollection = []; - ReadOnlyCollection readOnlyPersonKeyFormattedCollection; - ReadOnlyDictionary readOnlyPersonKeyFormattedToNewestPersonKeyFormatted; + Dictionary personKeyFormattedToNewestPersonKeyFormatted = []; SetSkipCollections(configuration, personContainers, a2PeopleSingletonDirectory, skipCollection, skipNotSkipCollection); - { - List personKeyFormattedCollection = []; - Dictionary personKeyFormattedToNewestPersonKeyFormatted = []; - SetPersonCollections(configuration, personContainers, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection); - readOnlyPersonKeyFormattedCollection = new(personKeyFormattedCollection); - readOnlyPersonKeyFormattedToNewestPersonKeyFormatted = new(personKeyFormattedToNewestPersonKeyFormatted); - } - List records = DistanceLogic.DeleteEmptyDirectoriesAndGetCollection(propertyConfiguration, configuration, ticks, eDistanceContentDirectory, readOnlyPersonKeyFormattedToNewestPersonKeyFormatted, readOnlyPersonKeyFormattedCollection); + SetPersonCollectionsAfterSetSkipCollections(configuration, personContainers, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection); + List records = DistanceLogic.DeleteEmptyDirectoriesAndGetCollection(propertyConfiguration, configuration, ticks, eDistanceContentDirectory, personKeyFormattedToNewestPersonKeyFormatted.AsReadOnly(), personKeyFormattedCollection.AsReadOnly()); List mappedFiles = GetMappedFiles(propertyConfiguration, configuration, personContainers, records); if (mappedFiles.Count > 0) { int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); string message = $") Building Mapped Face Files Collection - {totalSeconds} total second(s)"; ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism }; - ReadOnlyDictionary> readOnlySkipNotSkipCollection = new(skipCollection); ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; using ProgressBar progressBar = new(mappedFiles.Count, message, options); _ = Parallel.For(0, mappedFiles.Count, parallelOptions, (i, state) => { progressBar.Tick(); - MappedParallelFor(propertyConfiguration, configuration, readOnlySkipNotSkipCollection, locationContainers, mappedFiles[i]); + MappedParallelFor(propertyConfiguration, configuration, skipCollection.AsReadOnly(), locationContainers, mappedFiles[i]); }); } foreach (LocationContainer locationContainer in locationContainers) @@ -176,21 +170,22 @@ internal abstract class FaceFileLogic RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value); if (rectangle is null) return; + LocationContainer locationContainer = new(dateOnly, + exifDirectory, + null, + null, + null, + faceFile, + filePath, + fromDistanceContent, + filePath.Id.Value, + null, + null, + null, + rectangle, + wholePercentages.Value); lock (locationContainers) - locationContainers.Add(new(dateOnly, - exifDirectory, - null, - null, - null, - faceFile, - filePath, - fromDistanceContent, - filePath.Id.Value, - null, - null, - null, - rectangle, - wholePercentages.Value)); + locationContainers.Add(locationContainer); } internal static List GetAvailable(int maxDegreeOfParallelism, Configuration configuration, IFaceD dFace, long ticks, ReadOnlyCollection filePaths) diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index 5852d05..64d406b 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -83,7 +83,7 @@ internal abstract class MapLogic } } - internal static void SetPersonCollections(Configuration configuration, ReadOnlyCollection personContainers, Dictionary personKeyFormattedToNewestPersonKeyFormatted, List personKeyFormattedCollection) + internal static void SetPersonCollectionsAfterSetSkipCollections(Configuration configuration, ReadOnlyCollection personContainers, Dictionary personKeyFormattedToNewestPersonKeyFormatted, List personKeyFormattedCollection) { string personKeyFormatted; string newestPersonKeyFormatted; @@ -418,7 +418,7 @@ internal abstract class MapLogic if (check) continue; personBirthday = IPersonBirthday.GetPersonBirthday(personKey + (oneHour * 2)); - personContainer = new(approximateYears, [personBirthday], new(personDisplayDirectoryAllFilePaths), configuration.MappingDefaultName, personKey); + personContainer = PersonContainer.Get(approximateYears, [personBirthday], new(personDisplayDirectoryAllFilePaths), configuration.MappingDefaultName, personKey); results.Add(personContainer); if (results.Count > 99) break; @@ -535,21 +535,22 @@ internal abstract class MapLogic exifDirectory = Metadata.Models.Stateless.Methods.IMetadata.GetExifDirectory(mappedFile.FilePath); RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value); personDisplayDirectoryName = mappedFile.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : mappedFile.PersonDisplayDirectoryName; + LocationContainer locationContainer = new(dateOnly, + exifDirectory, + mappedFile.DirectoryNumber, + personDisplayDirectoryName, + null, + null, + mappedFile.FilePath, + fromDistanceContent, + id.Value, + null, + null, + mappedFile.PersonKey, + rectangle, + wholePercentages.Value); lock (locationContainers) - locationContainers.Add(new(dateOnly, - exifDirectory, - mappedFile.DirectoryNumber, - personDisplayDirectoryName, - null, - null, - mappedFile.FilePath, - fromDistanceContent, - id.Value, - null, - null, - mappedFile.PersonKey, - rectangle, - wholePercentages.Value)); + locationContainers.Add(locationContainer); } private static void LookForPossibleDuplicates(Configuration configuration, ReadOnlyCollection locationContainers) @@ -739,7 +740,7 @@ internal abstract class MapLogic group = IPerson.GetHourGroup(personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName, personBirthday.Value.Hour); (status, sex, first) = IPerson.GetPersonHour(personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName, personBirthday.Value.Hour); personDirectory = new(matches.First(), group, status, sex, first); - personContainer = new(configuration.PersonCharacters.ToArray(), personBirthday, personDisplayDirectoryName, personDirectory); + personContainer = PersonContainer.Get(configuration.PersonCharacters.ToArray(), personBirthday, personDisplayDirectoryName, personDirectory); personKeyFormattedToPersonContainer.Add(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, personContainer); } if (personContainer.Key is null) @@ -839,9 +840,9 @@ internal abstract class MapLogic continue; personBirthday = IPersonBirthday.GetPersonBirthday(keyValuePair.Key); if (!personKeyToPersonContainerCollection.TryGetValue(keyValuePair.Key, out collection)) - personContainer = new(approximateYears, personBirthday, displayDirectoryName, keyValuePair.Key); + personContainer = PersonContainer.Get(approximateYears, personBirthday, displayDirectoryName, keyValuePair.Key); else - personContainer = new(approximateYears, personBirthday, collection[zero].PersonDirectory, displayDirectoryName, keyValuePair.Key); + personContainer = PersonContainer.Get(approximateYears, personBirthday, collection[zero].PersonDirectory, displayDirectoryName, keyValuePair.Key); personKeyToPersonContainer.Add(keyValuePair.Key, personContainer); } } diff --git a/Metadata/Models/Stateless/Exif.cs b/Metadata/Models/Stateless/Exif.cs index 468cbaf..2db4198 100644 --- a/Metadata/Models/Stateless/Exif.cs +++ b/Metadata/Models/Stateless/Exif.cs @@ -502,12 +502,12 @@ internal abstract class Exif result = new(aviDirectories, exifBaseDirectories, fileMetadataDirectories, + filePath, gifHeaderDirectories, gpsDirectories, size?.Height, jpegDirectories, makernoteDirectories, - filePath.Name, photoshopDirectories, pngDirectories, quickTimeMovieHeaderDirectories, diff --git a/Rename/Rename.csproj b/Rename/Rename.csproj index 5642e1d..485c54f 100644 --- a/Rename/Rename.csproj +++ b/Rename/Rename.csproj @@ -34,7 +34,7 @@ - + diff --git a/Shared/Models/ExifDirectory.cs b/Shared/Models/ExifDirectory.cs index 65747b8..70b9651 100644 --- a/Shared/Models/ExifDirectory.cs +++ b/Shared/Models/ExifDirectory.cs @@ -6,12 +6,12 @@ namespace View_by_Distance.Shared.Models; public record ExifDirectory(AviDirectory[] AviDirectories, ExifDirectoryBase[] ExifBaseDirectories, FileMetadataDirectory[] FileMetadataDirectories, + FilePath FilePath, GifHeaderDirectory[] GifHeaderDirectories, GpsDirectory[] GpsDirectories, int? Height, JpegDirectory[] JpegDirectories, MakernoteDirectory[] MakernoteDirectories, - string OriginalFileName, PhotoshopDirectory[] PhotoshopDirectories, PngDirectory[] PngDirectories, QuickTimeMovieHeaderDirectory[] QuickTimeMovieHeaderDirectories, diff --git a/Shared/Models/FaceDistance.cs b/Shared/Models/FaceDistance.cs index 600fd38..2507797 100644 --- a/Shared/Models/FaceDistance.cs +++ b/Shared/Models/FaceDistance.cs @@ -40,8 +40,14 @@ public record class FaceDistance : Properties.IFaceDistance public override string ToString() { - string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + string result = JsonSerializer.Serialize(this, FaceDistanceSourceGenerationContext.Default.FaceDistance); return result; } +} + +[JsonSourceGenerationOptions(WriteIndented = true)] +[JsonSerializable(typeof(FaceDistance))] +internal partial class FaceDistanceSourceGenerationContext : JsonSerializerContext +{ } \ No newline at end of file diff --git a/Shared/Models/PersonBirthday.cs b/Shared/Models/PersonBirthday.cs index ba26258..1b5b053 100644 --- a/Shared/Models/PersonBirthday.cs +++ b/Shared/Models/PersonBirthday.cs @@ -3,23 +3,19 @@ using System.Text.Json.Serialization; namespace View_by_Distance.Shared.Models; -public class PersonBirthday : Properties.IPersonBirthday +public record PersonBirthday(DateTime Value) { - protected readonly DateTime _Value; // {{1}}SingletonValue - - public DateTime Value => _Value; // {{1}}SingletonValue - - [JsonConstructor] - public PersonBirthday - ( - DateTime value - ) => _Value = value; // {{1}}SingletonValue - public override string ToString() { - string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + string result = JsonSerializer.Serialize(this, PersonBirthdaySourceGenerationContext.Default.PersonBirthday); return result; - } // ... + } +} + +[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] +[JsonSerializable(typeof(PersonBirthday))] +public partial class PersonBirthdaySourceGenerationContext : JsonSerializerContext +{ } \ No newline at end of file diff --git a/Shared/Models/PersonContainer.cs b/Shared/Models/PersonContainer.cs index 0c7ce76..6dc4526 100644 --- a/Shared/Models/PersonContainer.cs +++ b/Shared/Models/PersonContainer.cs @@ -4,53 +4,45 @@ using System.Text.Json.Serialization; namespace View_by_Distance.Shared.Models; -public class PersonContainer : Properties.IPersonContainer +public record PersonContainer(int? ApproximateYears, + PersonBirthday[]? Birthdays, + ReadOnlyCollection DisplayDirectoryAllFilePaths, + string DisplayDirectoryName, + long? Key, + PersonDirectory? PersonDirectory) { - public int? ApproximateYears { init; get; } - public PersonBirthday[]? Birthdays { init; get; } - public ReadOnlyCollection DisplayDirectoryAllFilePaths { init; get; } - public string DisplayDirectoryName { init; get; } - public long? Key { init; get; } - public bool? KeyIsMaxBirthday { init; get; } - public PersonDirectory? PersonDirectory { init; get; } - - [JsonConstructor] - public PersonContainer(int? approximateYears, PersonBirthday[]? birthdays, ReadOnlyCollection displayDirectoryAllFiles, string displayDirectoryName, long? key, PersonDirectory? personDirectory) - { - ApproximateYears = approximateYears; - Birthdays = birthdays; - DisplayDirectoryAllFilePaths = displayDirectoryAllFiles; - DisplayDirectoryName = displayDirectoryName; - Key = key; - PersonDirectory = personDirectory; - KeyIsMaxBirthday = birthdays is null || key is null ? null : key.Value == birthdays.First().Value.Ticks; - } - - public PersonContainer(char[] personCharacters, PersonBirthday birthday, string displayDirectoryName, PersonDirectory personDirectory) : - this(Stateless.Methods.IAge.GetApproximateYears(personCharacters, displayDirectoryName), [birthday], new([]), displayDirectoryName, birthday.Value.Ticks, personDirectory) - { } - - public PersonContainer(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) : - this(approximateYears, [birthdays], new([]), displayDirectoryName, key, null) - { } - - public PersonContainer(int? approximateYears, PersonBirthday birthdays, PersonDirectory? personDirectory, string displayDirectoryName, long key) : - this(approximateYears, [birthdays], new([]), displayDirectoryName, key, personDirectory) - { } - - public PersonContainer(int? approximateYears, ReadOnlyCollection displayDirectoryAllFiles, string displayDirectoryName, PersonDirectory? personDirectory) : - this(approximateYears, null, displayDirectoryAllFiles, displayDirectoryName, null, personDirectory) - { } - - public PersonContainer(int? approximateYears, PersonBirthday[]? birthdays, ReadOnlyCollection displayDirectoryAllFiles, string displayDirectoryName, long? key) : - this(approximateYears, birthdays, displayDirectoryAllFiles, displayDirectoryName, key, null) - { } - public override string ToString() { - string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + string result = JsonSerializer.Serialize(this, PersonContainerSourceGenerationContext.Default.PersonContainer); return result; } + public static PersonContainer Get(int? approximateYears, PersonBirthday[]? birthdays, ReadOnlyCollection displayDirectoryAllFilePaths, string displayDirectoryName, long? key, PersonDirectory? personDirectory) => + new(approximateYears, birthdays, displayDirectoryAllFilePaths, displayDirectoryName, key, personDirectory); + + public static PersonContainer Get(char[] personCharacters, PersonBirthday birthday, string displayDirectoryName, PersonDirectory personDirectory) => + new(Stateless.Methods.IAge.GetApproximateYears(personCharacters, displayDirectoryName), [birthday], new([]), displayDirectoryName, birthday.Value.Ticks, personDirectory); + + public static PersonContainer Get(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) => + new(approximateYears, [birthdays], new([]), displayDirectoryName, key, null); + + public static PersonContainer Get(int? approximateYears, PersonBirthday birthdays, PersonDirectory? personDirectory, string displayDirectoryName, long key) => + new(approximateYears, [birthdays], new([]), displayDirectoryName, key, personDirectory); + + public static PersonContainer Get(int? approximateYears, ReadOnlyCollection displayDirectoryAllFilePaths, string displayDirectoryName, PersonDirectory? personDirectory) => + new(approximateYears, null, displayDirectoryAllFilePaths, displayDirectoryName, null, personDirectory); + + public static PersonContainer Get(int? approximateYears, PersonBirthday[]? birthdays, ReadOnlyCollection displayDirectoryAllFilePaths, string displayDirectoryName, long? key) => + new(approximateYears, birthdays, displayDirectoryAllFilePaths, displayDirectoryName, key, null); + + public static bool? IsKeyIsMaxBirthday(PersonContainer personContainer) => + personContainer.Birthdays is null || personContainer.Key is null ? null : personContainer.Key.Value == personContainer.Birthdays.First().Value.Ticks; + +} + +[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] +[JsonSerializable(typeof(PersonContainer))] +public partial class PersonContainerSourceGenerationContext : JsonSerializerContext +{ } \ No newline at end of file diff --git a/Shared/Models/PersonDirectory.cs b/Shared/Models/PersonDirectory.cs index 4e701b4..bb5838c 100644 --- a/Shared/Models/PersonDirectory.cs +++ b/Shared/Models/PersonDirectory.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using System.Text.Json.Serialization; namespace View_by_Distance.Shared.Models; @@ -7,8 +8,14 @@ public record PersonDirectory(char Char, string Group, char Status, char Sex, ch public override string ToString() { - string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + string result = JsonSerializer.Serialize(this, PersonDirectorySourceGenerationContext.Default.PersonDirectory); return result; } +} + +[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] +[JsonSerializable(typeof(PersonDirectory))] +public partial class PersonDirectorySourceGenerationContext : JsonSerializerContext +{ } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/PersonBirthday.cs b/Shared/Models/Stateless/Methods/PersonBirthday.cs index 1fab3dd..03caca7 100644 --- a/Shared/Models/Stateless/Methods/PersonBirthday.cs +++ b/Shared/Models/Stateless/Methods/PersonBirthday.cs @@ -95,11 +95,9 @@ internal abstract class PersonBirthday foreach (string personKeyDirectory in personKeyDirectories) { personKeyFormatted = Path.GetFileName(personKeyDirectory); - if (!DateTime.TryParseExact(personKeyFormatted, "MM.dd.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime birthday)) - personBirthday = IPersonBirthday.GetPersonBirthday(personBirthdayFormat, personKeyFormatted); - else - // (personBirthday, personKeyFormatted) = Person.Get(personBirthdayFormat, personDisplayDirectory, personKeyDirectory, birthday); + if (DateTime.TryParseExact(personKeyFormatted, "MM.dd.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime birthday)) continue; + personBirthday = IPersonBirthday.GetPersonBirthday(personBirthdayFormat, personKeyFormatted); if (personBirthday is null) continue; if (!IPersonBirthday.IsCounterPersonBirthday(personBirthday) && ((!personKeyDirectory.Contains('#') && (personDisplayDirectoryName.Contains('~') || personDisplayDirectoryName.Contains('#'))) || (personKeyDirectory.Contains('#') && !personDisplayDirectoryName.Contains('#')))) diff --git a/Shared/Models/Stateless/Methods/PersonContainer.cs b/Shared/Models/Stateless/Methods/PersonContainer.cs index 6349744..2d4d4d9 100644 --- a/Shared/Models/Stateless/Methods/PersonContainer.cs +++ b/Shared/Models/Stateless/Methods/PersonContainer.cs @@ -215,7 +215,7 @@ internal abstract class PersonContainer else { personDisplayDirectoryAllFilePaths = GetFilePaths(facesFileNameExtension, propertyConfiguration, personDisplayDirectory); - personContainer = new(approximateYears, new(personDisplayDirectoryAllFilePaths), personDisplayDirectoryName, personDirectory); + personContainer = Models.PersonContainer.Get(approximateYears, new(personDisplayDirectoryAllFilePaths), personDisplayDirectoryName, personDirectory); results.Add(personContainer); } } diff --git a/Tests/Models/Configuration.cs b/Tests/Models/Configuration.cs index 9a94207..489c0c5 100644 --- a/Tests/Models/Configuration.cs +++ b/Tests/Models/Configuration.cs @@ -56,7 +56,7 @@ public record Configuration(Property.Models.Configuration PropertyConfiguration, int RadomUseBirthdayMinimum, int[] RangeDaysDeltaTolerance, float[] RangeDistanceTolerance, - float[] RangeFaceAreaPermyriadTolerance, + float[] RangeFaceAreaTolerance, float[] RangeFaceConfidence, float[] RectangleIntersectMinimums, bool Reverse, diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index 7f29d28..9c0da84 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -33,8 +33,8 @@ - - + + diff --git a/TestsWithFaceRecognitionDotNet/Models/Configuration.cs b/TestsWithFaceRecognitionDotNet/Models/Configuration.cs index 3074e95..d5d6b35 100644 --- a/TestsWithFaceRecognitionDotNet/Models/Configuration.cs +++ b/TestsWithFaceRecognitionDotNet/Models/Configuration.cs @@ -55,7 +55,7 @@ public record Configuration(Property.Models.Configuration PropertyConfiguration, int RadomUseBirthdayMinimum, int[] RangeDaysDeltaTolerance, float[] RangeDistanceTolerance, - float[] RangeFaceAreaPermyriadTolerance, + float[] RangeFaceAreaTolerance, float[] RangeFaceConfidence, float[] RectangleIntersectMinimums, bool Reverse, diff --git a/TestsWithFaceRecognitionDotNet/TestsWithFaceRecognitionDotNet.csproj b/TestsWithFaceRecognitionDotNet/TestsWithFaceRecognitionDotNet.csproj index d447611..d509a89 100644 --- a/TestsWithFaceRecognitionDotNet/TestsWithFaceRecognitionDotNet.csproj +++ b/TestsWithFaceRecognitionDotNet/TestsWithFaceRecognitionDotNet.csproj @@ -32,8 +32,8 @@ - - + + diff --git a/ThumbHash/ThumbHash.csproj b/ThumbHash/ThumbHash.csproj index 9ba5abb..e7cc500 100644 --- a/ThumbHash/ThumbHash.csproj +++ b/ThumbHash/ThumbHash.csproj @@ -33,7 +33,7 @@ - +