diff --git a/Compare/Compare.cs b/Compare/Compare.cs index 33547be..f53779d 100644 --- a/Compare/Compare.cs +++ b/Compare/Compare.cs @@ -63,10 +63,9 @@ public partial class Compare : ICompare, IDisposable ReadOnlyDictionary onlyOne; bool runToDoCollectionFirst = GetRunToDoCollectionFirst(appSettings, compare); ReadOnlyCollections readOnlyCollections = GetReadOnlyCollections(appSettings); - ReadOnlyCollection mappedExifDirectoryWithEncoding = GetMappedExifDirectoryWithEncoding(appSettings, compare, readOnlyCollections); - ReadOnlyDictionary> mappedIdsThenWholePercentagesToLocationContainer = IDistance.Extract(appSettings.DistanceSettings, appSettings.CompareSettings, compare, mappedExifDirectoryWithEncoding); - if (appSettings.CompareSettings.SaveExtractFaces) - SaveExtractFaces(appSettings, mappedIdsThenWholePercentagesToLocationContainer); + ReadOnlyDictionary> mappedIdsThenWholePercentagesToLocationContainer = GetMappedIdsThenWholePercentagesToLocationContainer(appSettings, compare, readOnlyCollections); + if (appSettings.CompareSettings.SaveExtractedFaces || appSettings.CompareSettings.SaveExtractedJavaScriptObjectNotation) + SaveExtracted(appSettings, mappedIdsThenWholePercentagesToLocationContainer); foreach (string outputResolution in appSettings.CompareSettings.OutputResolutions) { if (runToDoCollectionFirst || outputResolution.Any(char.IsNumber)) @@ -76,8 +75,8 @@ public partial class Compare : ICompare, IDisposable preFiltered = IDistance.GetPreFilterLocationContainer(appSettings.DistanceSettings, appSettings.CompareSettings, compare, readOnlyCollections, mappedIdsThenWholePercentagesToLocationContainer, exifDirectories); if (preFiltered.Count == 0) continue; - if (appSettings.CompareSettings.SaveExtractFaces) - SaveExtractFaces(appSettings, preFiltered); + if (appSettings.CompareSettings.SaveExtractedFaces || appSettings.CompareSettings.SaveExtractedJavaScriptObjectNotation) + SaveExtracted(appSettings, preFiltered); distanceLimits = new(appSettings.DistanceSettings); postFiltered = IDistance.GetPostFilterLocationContainer(preFiltered, distanceLimits); if (postFiltered.Count == 0) @@ -160,19 +159,23 @@ public partial class Compare : ICompare, IDisposable return result; } - private static ReadOnlyCollection GetMappedExifDirectoryWithEncoding(AppSettings appSettings, ICompare compare, ReadOnlyCollections readOnlyCollections) + private static ReadOnlyDictionary> GetMappedIdsThenWholePercentagesToLocationContainer(AppSettings appSettings, ICompare compare, ReadOnlyCollections readOnlyCollections) { - ReadOnlyCollection results; - ReadOnlyCollection exifDirectories = IDistance.GetMapped(appSettings.ResultSettings, appSettings.MetadataSettings, appSettings.PeopleSettings, appSettings.DistanceSettings, appSettings.CompareSettings, compare, readOnlyCollections); - if (exifDirectories.Count == 0 && !appSettings.DistanceSettings.SaveSortingWithoutPerson) - throw new NotSupportedException($"Switch {nameof(appSettings.DistanceSettings.SaveSortingWithoutPerson)}!"); - results = IDistance.GetMappedExifDirectoryWithEncoding(compare, exifDirectories); + + ReadOnlyDictionary> results; + results = IDistance.GetMappedIdsThenWholePercentagesToLocationContainer(appSettings.ResultSettings, + appSettings.MetadataSettings, + appSettings.PeopleSettings, + appSettings.DistanceSettings, + appSettings.CompareSettings, + compare, + readOnlyCollections); if (results.Count == 0 && !appSettings.DistanceSettings.SaveSortingWithoutPerson) throw new NotSupportedException($"Switch {nameof(appSettings.DistanceSettings.SaveSortingWithoutPerson)}!"); return results; } - private void SaveExtractFaces(AppSettings appSettings, ReadOnlyDictionary> mappedIdsThenWholePercentagesToLocationContainer) + private void SaveExtracted(AppSettings appSettings, ReadOnlyDictionary> mappedIdsThenWholePercentagesToLocationContainer) { ReadOnlyCollection? paths; ReadOnlyDictionary> rootDirectoryFileNameToPaths = GetRootDirectoryFileNameToPaths(appSettings.ResultSettings, appSettings.CompareSettings); @@ -183,12 +186,17 @@ public partial class Compare : ICompare, IDisposable if (keyValue.Value.ExifDirectory is null || keyValue.Value.FaceFile?.Location is null) continue; if (rootDirectoryFileNameToPaths.TryGetValue(keyValue.Value.FilePath.FileNameFirstSegment, out paths)) - ExtractFace(keyValuePair.Key, keyValue.Key, keyValue.Value.ExifDirectory, keyValue.Value.FaceFile.Location, keyValue.Value.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName, paths); + { + if (appSettings.CompareSettings.SaveExtractedFaces) + SaveExtractedFace(keyValuePair.Key, keyValue.Key, keyValue.Value.ExifDirectory, keyValue.Value.FaceFile.Location, keyValue.Value.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName, paths); + if (appSettings.CompareSettings.SaveExtractedJavaScriptObjectNotation && keyValue.Value.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName is not null) + SaveExtractedJavaScriptObjectNotation(keyValuePair.Key, keyValue.Key, keyValue.Value, paths); + } } } } - private static void SaveExtractFaces(AppSettings appSettings, ReadOnlyCollection preFiltered) + private static void SaveExtracted(AppSettings appSettings, ReadOnlyCollection preFiltered) { ReadOnlyCollection? paths; ReadOnlyDictionary> rootDirectoryFileNameToPaths = GetRootDirectoryFileNameToPaths(appSettings.ResultSettings, appSettings.CompareSettings); @@ -197,7 +205,12 @@ public partial class Compare : ICompare, IDisposable if (locationContainer?.FilePath?.Id is null || locationContainer?.WholePercentages is null || locationContainer?.ExifDirectory is null || locationContainer?.FaceFile?.Location is null) continue; if (rootDirectoryFileNameToPaths.TryGetValue(locationContainer.FilePath.FileNameFirstSegment, out paths)) - ExtractFace(locationContainer.FilePath.Id.Value, locationContainer.WholePercentages.Value, locationContainer.ExifDirectory, locationContainer.FaceFile.Location, locationContainer.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName, paths); + { + if (appSettings.CompareSettings.SaveExtractedFaces) + SaveExtractedFace(locationContainer.FilePath.Id.Value, locationContainer.WholePercentages.Value, locationContainer.ExifDirectory, locationContainer.FaceFile.Location, locationContainer.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName, paths); + if (appSettings.CompareSettings.SaveExtractedJavaScriptObjectNotation && locationContainer.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName is not null) + SaveExtractedJavaScriptObjectNotation(locationContainer.FilePath.Id.Value, locationContainer.WholePercentages.Value, locationContainer, paths); + } } } @@ -208,7 +221,7 @@ public partial class Compare : ICompare, IDisposable string extension; List? collection; Dictionary> keyValuePairs = []; - string[] files = !compareSettings.SaveExtractFaces ? [] : Directory.GetFiles(resultSettings.RootDirectory, "*", SearchOption.AllDirectories); + string[] files = !compareSettings.SaveExtractedFaces && !compareSettings.SaveExtractedJavaScriptObjectNotation ? [] : Directory.GetFiles(resultSettings.RootDirectory, "*", SearchOption.AllDirectories); foreach (string file in files) { extension = Path.GetExtension(file); @@ -228,10 +241,11 @@ public partial class Compare : ICompare, IDisposable return results.AsReadOnly(); } - private static void ExtractFace(int id, int wholePercentages, ExifDirectory _, Location location, PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName? __, ReadOnlyCollection paths) + private static void SaveExtractedFace(int id, int wholePercentages, ExifDirectory _, Location location, PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName? personKeyFormattedAndKeyTicksAndDisplayDirectoryName, ReadOnlyCollection paths) { int width; int height; + string person; foreach (string path in paths) { // RectangleF? rectangleF = Shared.Models.Stateless.ILocation.GetPercentagesRectangle(faceFile); @@ -250,12 +264,13 @@ public partial class Compare : ICompare, IDisposable // return; width = location.Right - location.Left; height = location.Bottom - location.Top; + person = personKeyFormattedAndKeyTicksAndDisplayDirectoryName is null ? string.Empty : $"-{personKeyFormattedAndKeyTicksAndDisplayDirectoryName.DisplayDirectoryName}"; ExtractFace(file: path, width: width, height: height, left: location.Left, top: location.Top, - suffix: $"-{id}-{wholePercentages}-face.jpg"); + suffix: $"-{id}-{wholePercentages}{person}-face.jpg"); } } @@ -269,4 +284,16 @@ public partial class Compare : ICompare, IDisposable bitmap.Save($"{file}{suffix}"); } + private static void SaveExtractedJavaScriptObjectNotation(int id, int wholePercentages, LocationContainer locationContainer, ReadOnlyCollection paths) + { + string file; + string json; + foreach (string path in paths) + { + json = locationContainer.GetWithoutEncoding(); + file = $"{path}-{id}-{wholePercentages}.json"; + _ = IPath.WriteAllText(file, json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null); + } + } + } \ No newline at end of file diff --git a/Compare/Models/CompareSettings.cs b/Compare/Models/CompareSettings.cs index 9629d21..299a46c 100644 --- a/Compare/Models/CompareSettings.cs +++ b/Compare/Models/CompareSettings.cs @@ -10,7 +10,8 @@ public record CompareSettings(string Company, string FacesPartsFileNameExtension, int MaxDegreeOfParallelism, string[] OutputResolutions, - bool SaveExtractFaces) : Shared.Models.Properties.ICompareSettings + bool SaveExtractedFaces, + bool SaveExtractedJavaScriptObjectNotation) : Shared.Models.Properties.ICompareSettings { public override string ToString() diff --git a/Distance/Models/Stateless/FaceEncodingLogic.cs b/Distance/Models/Stateless/FaceEncodingLogic.cs index 696faf0..2d12908 100644 --- a/Distance/Models/Stateless/FaceEncodingLogic.cs +++ b/Distance/Models/Stateless/FaceEncodingLogic.cs @@ -1,6 +1,7 @@ using System.Collections.ObjectModel; using System.Text.Json; using View_by_Distance.Shared.Models; +using View_by_Distance.Shared.Models.Properties; using View_by_Distance.Shared.Models.Stateless; namespace View_by_Distance.Distance.Models.Stateless; @@ -8,27 +9,135 @@ namespace View_by_Distance.Distance.Models.Stateless; internal static class FaceEncodingLogic { - internal static ReadOnlyCollection GetMappedExifDirectoryWithEncoding(ICompare compare, ReadOnlyCollection exifDirectories) + internal static void MoveUnableToMatch(FilePath filePath) { - List results = []; - string? json; - FaceEncoding? faceEncoding; - ExifDirectory exifDirectory; - FaceRecognitionDotNet.Models.FaceEncoding? encoding; + string checkFile = $"{filePath.FullName}.unk"; + if (File.Exists(filePath.FullName) && !File.Exists(checkFile)) + File.Move(filePath.FullName, checkFile); + } + + internal static ReadOnlyDictionary> GetMappedIdsThenWholePercentagesToLocationContainer(ResultSettings resultSettings, MetadataSettings metadataSettings, PeopleSettings peopleSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections) + { + ReadOnlyDictionary> results; + List locationContainers = []; + int maxDegreeOfParallelism = compareSettings.MaxDegreeOfParallelism; + ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism }; + ReadOnlyCollection exifDirectories = MappedLogicA.GetMapped(resultSettings, + metadataSettings, + peopleSettings, + distanceSettings, + compareSettings, + compare, + readOnlyCollections); int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - compare.Ticks).TotalSeconds); string message = $") Building Mapped with Encoding Face Files Collection - {totalSeconds} total second(s)"; compare.ConstructProgressBar(exifDirectories.Count, message); - foreach (ExifDirectory e in exifDirectories) + _ = Parallel.For(0, exifDirectories.Count, parallelOptions, (i, state) => + LocationContainersParallelFor(distanceSettings, compareSettings, compare, exifDirectories, i, locationContainers)); + results = GetMappedIdsThenWholePercentagesToLocationContainer(locationContainers); + return results; + } + + private static void LocationContainersParallelFor(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollection exifDirectories, int i, List results) + { + compare.Tick(); + ExifDirectory exifDirectory = exifDirectories[i]; + LocationContainer? locationContainer = GetLocationContainer(distanceSettings, compareSettings, exifDirectory); + results.Add(locationContainer); + } + + internal static LocationContainer? GetLocationContainer(DistanceSettings distanceSettings, ICompareSettings compareSettings, ExifDirectory exifDirectory) + { + LocationContainer? result; + string? json; + DateOnly dateOnly; + FaceFile? faceFile; + int? wholePercentages; + FaceEncoding? faceEncoding; + FaceRecognitionDotNet.Models.FaceEncoding? encoding; + wholePercentages = IMapping.GetWholePercentages(compareSettings, exifDirectory.FilePath); + if (wholePercentages is null) { - compare.Tick(); - json = Metadata.Models.Stateless.IMetadata.GetFaceEncoding(e); - faceEncoding = json is null ? null : JsonSerializer.Deserialize(json, FaceEncodingGenerationContext.Default.FaceEncoding); - if (faceEncoding is null) - continue; - encoding = FaceRecognitionDotNet.Models.FaceRecognition.LoadFaceEncoding(faceEncoding.RawEncoding); - exifDirectory = ExifDirectory.Get(encoding, e); - results.Add(exifDirectory); + if (distanceSettings.DistanceMoveUnableToMatch) + MoveUnableToMatch(exifDirectory.FilePath); + result = null; } + else + { + faceFile = GetFaceFile(distanceSettings, exifDirectory); + if (faceFile is null) + result = null; + else + { + dateOnly = DateOnly.FromDateTime(new DateTime(exifDirectory.FilePath.CreationTicks)); + json = Metadata.Models.Stateless.IMetadata.GetFaceEncoding(exifDirectory); + faceEncoding = json is null ? null : JsonSerializer.Deserialize(json, FaceEncodingGenerationContext.Default.FaceEncoding); + if (faceEncoding is null) + result = null; + else + { + encoding = FaceRecognitionDotNet.Models.FaceRecognition.LoadFaceEncoding(faceEncoding.RawEncoding); + result = new(CreationDateOnly: dateOnly, + ExifDirectory: exifDirectory, + Encoding: encoding, + FaceFile: faceFile, + FilePath: exifDirectory.FilePath, + LengthPermyriad: null, + LengthSource: null, + PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName: exifDirectory.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName, + WholePercentages: wholePercentages); + } + } + } + return result; + } + + private static FaceFile? GetFaceFile(DistanceSettings distanceSettings, ExifDirectory exifDirectory) + { + FaceFile? result; + string? json = Metadata.Models.Stateless.IMetadata.GetOutputResolution(exifDirectory); + if (json is null || !json.Contains(nameof(DateTime))) + { + if (distanceSettings.DistanceMoveUnableToMatch) + MoveUnableToMatch(exifDirectory.FilePath); + result = null; + } + else + { + result = JsonSerializer.Deserialize(json, FaceFileGenerationContext.Default.FaceFile); + if (result is null || result.Location is null) + { + if (distanceSettings.DistanceMoveUnableToMatch) + MoveUnableToMatch(exifDirectory.FilePath); + result = null; + } + } + return result; + } + + private static ReadOnlyDictionary> GetMappedIdsThenWholePercentagesToLocationContainer(List locationContainers) + { + Dictionary> results = []; + int id; + int wholePercentages; + Dictionary? keyValue; + Dictionary> keyValuePairs = []; + foreach (LocationContainer? locationContainer in locationContainers) + { + if (locationContainer?.FilePath.Id is null || locationContainer.WholePercentages is null) + continue; + id = locationContainer.FilePath.Id.Value; + wholePercentages = locationContainer.WholePercentages.Value; + if (!keyValuePairs.TryGetValue(id, out keyValue)) + { + keyValuePairs.Add(id, []); + if (!keyValuePairs.TryGetValue(id, out keyValue)) + throw new Exception(); + } + keyValue.Add(wholePercentages, locationContainer); + } + foreach (KeyValuePair> keyValuePair in keyValuePairs) + results.Add(keyValuePair.Key, keyValuePair.Value.AsReadOnly()); return results.AsReadOnly(); } diff --git a/Distance/Models/Stateless/FilterLogicB.cs b/Distance/Models/Stateless/FilterLogicB.cs index 513bd5b..52cf2dc 100644 --- a/Distance/Models/Stateless/FilterLogicB.cs +++ b/Distance/Models/Stateless/FilterLogicB.cs @@ -1,5 +1,4 @@ using System.Collections.ObjectModel; -using System.Text.Json; using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models.Properties; using View_by_Distance.Shared.Models.Stateless; @@ -9,13 +8,6 @@ namespace View_by_Distance.Distance.Models.Stateless; internal static class FilterLogicB { - private static void MoveUnableToMatch(FilePath filePath) - { - string checkFile = $"{filePath.FullName}.unk"; - if (File.Exists(filePath.FullName) && !File.Exists(checkFile)) - File.Move(filePath.FullName, checkFile); - } - internal static ReadOnlyCollection GetLocationContainers(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollection exifDirectories, string sourceClass) { List results = []; @@ -35,45 +27,11 @@ internal static class FilterLogicB ExifDirectory exifDirectory = exifDirectories[i]; if (exifDirectory.FilePath.Id is null) return; - int? wholePercentages = IMapping.GetWholePercentages(compareSettings, exifDirectory.FilePath); - if (wholePercentages is null) - { - if (distanceSettings.DistanceMoveUnableToMatch) - MoveUnableToMatch(exifDirectory.FilePath); + LocationContainer? locationContainer = FaceEncodingLogic.GetLocationContainer(distanceSettings, compareSettings, exifDirectory); + if (locationContainer is null) return; - } - LocationContainersParallelFor(distanceSettings, results, exifDirectory, wholePercentages); - } - - private static void LocationContainersParallelFor(DistanceSettings distanceSettings, List locationContainers, ExifDirectory exifDirectory, int? wholePercentages) - { - string? json; - DateOnly dateOnly = DateOnly.FromDateTime(new DateTime(exifDirectory.FilePath.CreationTicks)); - json = Metadata.Models.Stateless.IMetadata.GetOutputResolution(exifDirectory); - if (json is null || !json.Contains(nameof(DateTime))) - { - if (distanceSettings.DistanceMoveUnableToMatch) - MoveUnableToMatch(exifDirectory.FilePath); - return; - } - FaceFile? faceFile = JsonSerializer.Deserialize(json, FaceFileGenerationContext.Default.FaceFile); - if (faceFile is null || faceFile.Location is null) - { - if (distanceSettings.DistanceMoveUnableToMatch) - MoveUnableToMatch(exifDirectory.FilePath); - return; - } - LocationContainer locationContainer = new(CreationDateOnly: dateOnly, - ExifDirectory: exifDirectory, - Encoding: exifDirectory.Encoding, - FaceFile: faceFile, - FilePath: exifDirectory.FilePath, - LengthPermyriad: null, - LengthSource: null, - PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName: exifDirectory.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName, - WholePercentages: wholePercentages); - lock (locationContainers) - locationContainers.Add(locationContainer); + lock (results) + results.Add(locationContainer); } } \ No newline at end of file diff --git a/Distance/Models/Stateless/IDistance.cs b/Distance/Models/Stateless/IDistance.cs index 67f7777..bc3fcc9 100644 --- a/Distance/Models/Stateless/IDistance.cs +++ b/Distance/Models/Stateless/IDistance.cs @@ -9,7 +9,7 @@ namespace View_by_Distance.Distance.Models.Stateless; public interface IDistance { - static string Get(bool saveIndividually, string forceSingleImageHumanized, int by, bool isDefaultName) => + public static string Get(bool saveIndividually, string forceSingleImageHumanized, int by, bool isDefaultName) => $"{by switch { IMapLogic.Mapping => nameof(IMapLogic.Mapping), @@ -23,54 +23,42 @@ public interface IDistance public static ReadOnlyDictionary GetOnlyOne(DistanceSettings distanceSettings, ReadOnlyCollection matrix) => FilterLogicC.GetOnlyOne(distanceSettings, matrix); - public static ReadOnlyCollection GetMappedExifDirectoryWithEncoding(ICompare compare, ReadOnlyCollection exifDirectories) => - FaceEncodingLogic.GetMappedExifDirectoryWithEncoding(compare, exifDirectories); - public static ReadOnlyCollection GetPostFilterLocationContainer(ReadOnlyCollection preFiltered, DistanceLimits distanceLimits) => FilterLogicC.GetPostFilterLocationContainer(preFiltered, distanceLimits); - public static ReadOnlyDictionary> Extract(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollection exifDirectories) => - MappedLogicA.Extract(distanceSettings, compareSettings, compare, exifDirectories); - public static void SaveContainers(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, int? updated, ReadOnlyCollection saveContainers) => FilterLogicD.SaveContainers(distanceSettings, compareSettings, compare, updated, saveContainers); public static ReadOnlyCollection GetSaveContainers(ResultSettings resultSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, string outputResolution, ReadOnlyDictionary onlyOne) => FilterLogicD.GetSaveContainers(resultSettings, distanceSettings, compareSettings, compare, outputResolution, onlyOne); - public static ReadOnlyCollection GetMapped(ResultSettings resultSettings, MetadataSettings metadataSettings, PeopleSettings peopleSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections) => - MappedLogicA.GetMapped(resultSettings, metadataSettings, peopleSettings, distanceSettings, compareSettings, compare, readOnlyCollections); - public static ReadOnlyCollection GetMatrixLocationContainers(DistanceSettings distanceSettings, ICompare compare, ReadOnlyDictionary> mappedIdsThenWholePercentagesToLocationContainer, DistanceLimits distanceLimits, ReadOnlyCollection postFiltered) => FilterLogicC.GetMatrixLocationContainers(distanceSettings, compare, mappedIdsThenWholePercentagesToLocationContainer, distanceLimits, postFiltered); + public static ReadOnlyDictionary> GetMappedIdsThenWholePercentagesToLocationContainer(ResultSettings resultSettings, MetadataSettings metadataSettings, PeopleSettings peopleSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections) => + FaceEncodingLogic.GetMappedIdsThenWholePercentagesToLocationContainer(resultSettings, metadataSettings, peopleSettings, distanceSettings, compareSettings, compare, readOnlyCollections); + public static ReadOnlyCollection GetPreFilterLocationContainer(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections, ReadOnlyDictionary> mappedIdsThenWholePercentagesToLocationContainer, ReadOnlyCollection exifDirectories) => FilterLogicA.GetPreFilterLocationContainer(distanceSettings, compareSettings, compare, readOnlyCollections, mappedIdsThenWholePercentagesToLocationContainer, exifDirectories); internal static ReadOnlyDictionary TestStatic_GetOnlyOne(DistanceSettings distanceSettings, ReadOnlyCollection matrix) => GetOnlyOne(distanceSettings, matrix); - internal static ReadOnlyCollection TestStatic_GetMappedExifDirectoryWithEncoding(ICompare compare, ReadOnlyCollection exifDirectories) => - GetMappedExifDirectoryWithEncoding(compare, exifDirectories); - internal static ReadOnlyCollection TestStatic_GetPostFilterLocationContainer(ReadOnlyCollection preFiltered, DistanceLimits distanceLimits) => GetPostFilterLocationContainer(preFiltered, distanceLimits); - internal static ReadOnlyDictionary> TestStatic_Extract(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollection exifDirectories) => - Extract(distanceSettings, compareSettings, compare, exifDirectories); - internal static void TestStatic_SaveContainers(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, int? updated, ReadOnlyCollection saveContainers) => SaveContainers(distanceSettings, compareSettings, compare, updated, saveContainers); internal static ReadOnlyCollection TestStatic_GetSaveContainers(ResultSettings resultSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, string outputResolution, ReadOnlyDictionary onlyOne) => GetSaveContainers(resultSettings, distanceSettings, compareSettings, compare, outputResolution, onlyOne); - internal static ReadOnlyCollection TestStatic_GetMapped(ResultSettings resultSettings, MetadataSettings metadataSettings, PeopleSettings peopleSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections) => - GetMapped(resultSettings, metadataSettings, peopleSettings, distanceSettings, compareSettings, compare, readOnlyCollections); - internal static ReadOnlyCollection TestStatic_GetMatrixLocationContainers(DistanceSettings distanceSettings, ICompare compare, ReadOnlyDictionary> mappedIdsThenWholePercentagesToLocationContainer, DistanceLimits distanceLimits, ReadOnlyCollection postFiltered) => GetMatrixLocationContainers(distanceSettings, compare, mappedIdsThenWholePercentagesToLocationContainer, distanceLimits, postFiltered); + internal static ReadOnlyDictionary> TestStatic_GetMappedIdsThenWholePercentagesToLocationContainer(ResultSettings resultSettings, MetadataSettings metadataSettings, PeopleSettings peopleSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections) => + GetMappedIdsThenWholePercentagesToLocationContainer(resultSettings, metadataSettings, peopleSettings, distanceSettings, compareSettings, compare, readOnlyCollections); + internal static ReadOnlyCollection TestStatic_GetPreFilterLocationContainer(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections, ReadOnlyDictionary> mappedIdsThenWholePercentagesToLocationContainer, ReadOnlyCollection exifDirectories) => GetPreFilterLocationContainer(distanceSettings, compareSettings, compare, readOnlyCollections, mappedIdsThenWholePercentagesToLocationContainer, exifDirectories); diff --git a/Distance/Models/Stateless/MappedLogicA.cs b/Distance/Models/Stateless/MappedLogicA.cs index 67ee26e..201959c 100644 --- a/Distance/Models/Stateless/MappedLogicA.cs +++ b/Distance/Models/Stateless/MappedLogicA.cs @@ -14,33 +14,6 @@ internal static class MappedLogicA string? PersonDisplayDirectoryName, FilePath FilePath); - internal static ReadOnlyDictionary> Extract(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollection exifDirectories) - { - Dictionary> results = []; - int id; - int wholePercentages; - Dictionary? keyValue; - Dictionary> keyValuePairs = []; - ReadOnlyCollection locationContainers = FilterLogicB.GetLocationContainers(distanceSettings, compareSettings, compare, exifDirectories, nameof(MappedLogicA)); - foreach (LocationContainer locationContainer in locationContainers) - { - if (locationContainer.FilePath.Id is null || locationContainer.WholePercentages is null) - continue; - id = locationContainer.FilePath.Id.Value; - wholePercentages = locationContainer.WholePercentages.Value; - if (!keyValuePairs.TryGetValue(id, out keyValue)) - { - keyValuePairs.Add(id, []); - if (!keyValuePairs.TryGetValue(id, out keyValue)) - throw new Exception(); - } - keyValue.Add(wholePercentages, locationContainer); - } - foreach (KeyValuePair> keyValuePair in keyValuePairs) - results.Add(keyValuePair.Key, keyValuePair.Value.AsReadOnly()); - return results.AsReadOnly(); - } - internal static ReadOnlyCollection GetMapped(ResultSettings resultSettings, MetadataSettings metadataSettings, PeopleSettings peopleSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections) { List results = []; diff --git a/Metadata/Models/Stateless/Exif.cs b/Metadata/Models/Stateless/Exif.cs index d91ce64..3583933 100644 --- a/Metadata/Models/Stateless/Exif.cs +++ b/Metadata/Models/Stateless/Exif.cs @@ -529,7 +529,6 @@ internal abstract class Exif Shared.Models.QuickTimeMovieHeaderDirectory[] quickTimeMovieHeaderDirectories = GetQuickTimeMovieHeaderDirectoryDirectories(directories); Shared.Models.QuickTimeTrackHeaderDirectory[] quickTimeTrackHeaderDirectories = GetQuickTimeTrackHeaderDirectoryDirectories(directories); result = new(aviDirectories, - null, exifBaseDirectories, fileMetadataDirectories, filePath, diff --git a/Shared/Models/ExifDirectory.cs b/Shared/Models/ExifDirectory.cs index 7953c92..5bff7d2 100644 --- a/Shared/Models/ExifDirectory.cs +++ b/Shared/Models/ExifDirectory.cs @@ -4,7 +4,6 @@ using System.Text.Json.Serialization; namespace View_by_Distance.Shared.Models; public record ExifDirectory(AviDirectory[] AviDirectories, - object? Encoding, ExifDirectoryBase[] ExifBaseDirectories, FileMetadataDirectory[] FileMetadataDirectories, FilePath FilePath, @@ -28,25 +27,6 @@ public record ExifDirectory(AviDirectory[] AviDirectories, return result; } - public static ExifDirectory Get(object encoding, ExifDirectory e) => - new(e.AviDirectories, - encoding, - e.ExifBaseDirectories, - e.FileMetadataDirectories, - e.FilePath, - e.GifHeaderDirectories, - e.GpsDirectories, - e.Height, - e.JpegDirectories, - e.MakernoteDirectories, - e.PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName, - e.PhotoshopDirectories, - e.PngDirectories, - e.QuickTimeMovieHeaderDirectories, - e.QuickTimeTrackHeaderDirectories, - e.WebPDirectories, - e.Width); - } [JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] diff --git a/Shared/Models/LocationContainer.cs b/Shared/Models/LocationContainer.cs index da7f8f4..0f8231c 100644 --- a/Shared/Models/LocationContainer.cs +++ b/Shared/Models/LocationContainer.cs @@ -1,3 +1,6 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + namespace View_by_Distance.Shared.Models; public record LocationContainer(DateOnly? CreationDateOnly, @@ -11,6 +14,21 @@ public record LocationContainer(DateOnly? CreationDateOnly, int? WholePercentages) { + public string GetWithoutEncoding() + { + string result; + WithoutEncoding withoutEncoding = new(CreationDateOnly: CreationDateOnly, + ExifDirectory: ExifDirectory, + FaceFile: FaceFile, + FilePath: FilePath, + LengthPermyriad: LengthPermyriad, + LengthSource: LengthSource, + PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName: PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName, + WholePercentages: WholePercentages); + result = JsonSerializer.Serialize(withoutEncoding, WithoutEncodingSourceGenerationContext.Default.WithoutEncoding); + return result; + } + public static LocationContainer Get(LocationContainer locationContainer, object? encoding) { LocationContainer result; @@ -41,4 +59,19 @@ public record LocationContainer(DateOnly? CreationDateOnly, return result; } +} + +internal record WithoutEncoding(DateOnly? CreationDateOnly, + ExifDirectory? ExifDirectory, + FaceFile? FaceFile, + FilePath FilePath, + int? LengthPermyriad, + FilePath? LengthSource, + PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName? PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName, + int? WholePercentages); + +[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] +[JsonSerializable(typeof(WithoutEncoding))] +internal partial class WithoutEncodingSourceGenerationContext : JsonSerializerContext +{ } \ No newline at end of file