Removed Rectangle from LocationContainer
mapped-ids-then-whole-percentages-to-location-container save-extracted-face save-extracted-java-script-object-notation
This commit is contained in:
@ -63,10 +63,9 @@ public partial class Compare : ICompare, IDisposable
|
|||||||
ReadOnlyDictionary<string, LocationContainer> onlyOne;
|
ReadOnlyDictionary<string, LocationContainer> onlyOne;
|
||||||
bool runToDoCollectionFirst = GetRunToDoCollectionFirst(appSettings, compare);
|
bool runToDoCollectionFirst = GetRunToDoCollectionFirst(appSettings, compare);
|
||||||
ReadOnlyCollections readOnlyCollections = GetReadOnlyCollections(appSettings);
|
ReadOnlyCollections readOnlyCollections = GetReadOnlyCollections(appSettings);
|
||||||
ReadOnlyCollection<ExifDirectory> mappedExifDirectoryWithEncoding = GetMappedExifDirectoryWithEncoding(appSettings, compare, readOnlyCollections);
|
ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer = GetMappedIdsThenWholePercentagesToLocationContainer(appSettings, compare, readOnlyCollections);
|
||||||
ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer = IDistance.Extract(appSettings.DistanceSettings, appSettings.CompareSettings, compare, mappedExifDirectoryWithEncoding);
|
if (appSettings.CompareSettings.SaveExtractedFaces || appSettings.CompareSettings.SaveExtractedJavaScriptObjectNotation)
|
||||||
if (appSettings.CompareSettings.SaveExtractFaces)
|
SaveExtracted(appSettings, mappedIdsThenWholePercentagesToLocationContainer);
|
||||||
SaveExtractFaces(appSettings, mappedIdsThenWholePercentagesToLocationContainer);
|
|
||||||
foreach (string outputResolution in appSettings.CompareSettings.OutputResolutions)
|
foreach (string outputResolution in appSettings.CompareSettings.OutputResolutions)
|
||||||
{
|
{
|
||||||
if (runToDoCollectionFirst || outputResolution.Any(char.IsNumber))
|
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);
|
preFiltered = IDistance.GetPreFilterLocationContainer(appSettings.DistanceSettings, appSettings.CompareSettings, compare, readOnlyCollections, mappedIdsThenWholePercentagesToLocationContainer, exifDirectories);
|
||||||
if (preFiltered.Count == 0)
|
if (preFiltered.Count == 0)
|
||||||
continue;
|
continue;
|
||||||
if (appSettings.CompareSettings.SaveExtractFaces)
|
if (appSettings.CompareSettings.SaveExtractedFaces || appSettings.CompareSettings.SaveExtractedJavaScriptObjectNotation)
|
||||||
SaveExtractFaces(appSettings, preFiltered);
|
SaveExtracted(appSettings, preFiltered);
|
||||||
distanceLimits = new(appSettings.DistanceSettings);
|
distanceLimits = new(appSettings.DistanceSettings);
|
||||||
postFiltered = IDistance.GetPostFilterLocationContainer(preFiltered, distanceLimits);
|
postFiltered = IDistance.GetPostFilterLocationContainer(preFiltered, distanceLimits);
|
||||||
if (postFiltered.Count == 0)
|
if (postFiltered.Count == 0)
|
||||||
@ -160,19 +159,23 @@ public partial class Compare : ICompare, IDisposable
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ReadOnlyCollection<ExifDirectory> GetMappedExifDirectoryWithEncoding(AppSettings appSettings, ICompare compare, ReadOnlyCollections readOnlyCollections)
|
private static ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> GetMappedIdsThenWholePercentagesToLocationContainer(AppSettings appSettings, ICompare compare, ReadOnlyCollections readOnlyCollections)
|
||||||
{
|
{
|
||||||
ReadOnlyCollection<ExifDirectory> results;
|
|
||||||
ReadOnlyCollection<ExifDirectory> exifDirectories = IDistance.GetMapped(appSettings.ResultSettings, appSettings.MetadataSettings, appSettings.PeopleSettings, appSettings.DistanceSettings, appSettings.CompareSettings, compare, readOnlyCollections);
|
ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> results;
|
||||||
if (exifDirectories.Count == 0 && !appSettings.DistanceSettings.SaveSortingWithoutPerson)
|
results = IDistance.GetMappedIdsThenWholePercentagesToLocationContainer(appSettings.ResultSettings,
|
||||||
throw new NotSupportedException($"Switch {nameof(appSettings.DistanceSettings.SaveSortingWithoutPerson)}!");
|
appSettings.MetadataSettings,
|
||||||
results = IDistance.GetMappedExifDirectoryWithEncoding(compare, exifDirectories);
|
appSettings.PeopleSettings,
|
||||||
|
appSettings.DistanceSettings,
|
||||||
|
appSettings.CompareSettings,
|
||||||
|
compare,
|
||||||
|
readOnlyCollections);
|
||||||
if (results.Count == 0 && !appSettings.DistanceSettings.SaveSortingWithoutPerson)
|
if (results.Count == 0 && !appSettings.DistanceSettings.SaveSortingWithoutPerson)
|
||||||
throw new NotSupportedException($"Switch {nameof(appSettings.DistanceSettings.SaveSortingWithoutPerson)}!");
|
throw new NotSupportedException($"Switch {nameof(appSettings.DistanceSettings.SaveSortingWithoutPerson)}!");
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SaveExtractFaces(AppSettings appSettings, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer)
|
private void SaveExtracted(AppSettings appSettings, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer)
|
||||||
{
|
{
|
||||||
ReadOnlyCollection<string>? paths;
|
ReadOnlyCollection<string>? paths;
|
||||||
ReadOnlyDictionary<string, ReadOnlyCollection<string>> rootDirectoryFileNameToPaths = GetRootDirectoryFileNameToPaths(appSettings.ResultSettings, appSettings.CompareSettings);
|
ReadOnlyDictionary<string, ReadOnlyCollection<string>> 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)
|
if (keyValue.Value.ExifDirectory is null || keyValue.Value.FaceFile?.Location is null)
|
||||||
continue;
|
continue;
|
||||||
if (rootDirectoryFileNameToPaths.TryGetValue(keyValue.Value.FilePath.FileNameFirstSegment, out paths))
|
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<LocationContainer> preFiltered)
|
private static void SaveExtracted(AppSettings appSettings, ReadOnlyCollection<LocationContainer> preFiltered)
|
||||||
{
|
{
|
||||||
ReadOnlyCollection<string>? paths;
|
ReadOnlyCollection<string>? paths;
|
||||||
ReadOnlyDictionary<string, ReadOnlyCollection<string>> rootDirectoryFileNameToPaths = GetRootDirectoryFileNameToPaths(appSettings.ResultSettings, appSettings.CompareSettings);
|
ReadOnlyDictionary<string, ReadOnlyCollection<string>> 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)
|
if (locationContainer?.FilePath?.Id is null || locationContainer?.WholePercentages is null || locationContainer?.ExifDirectory is null || locationContainer?.FaceFile?.Location is null)
|
||||||
continue;
|
continue;
|
||||||
if (rootDirectoryFileNameToPaths.TryGetValue(locationContainer.FilePath.FileNameFirstSegment, out paths))
|
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;
|
string extension;
|
||||||
List<string>? collection;
|
List<string>? collection;
|
||||||
Dictionary<string, List<string>> keyValuePairs = [];
|
Dictionary<string, List<string>> 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)
|
foreach (string file in files)
|
||||||
{
|
{
|
||||||
extension = Path.GetExtension(file);
|
extension = Path.GetExtension(file);
|
||||||
@ -228,10 +241,11 @@ public partial class Compare : ICompare, IDisposable
|
|||||||
return results.AsReadOnly();
|
return results.AsReadOnly();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ExtractFace(int id, int wholePercentages, ExifDirectory _, Location location, PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName? __, ReadOnlyCollection<string> paths)
|
private static void SaveExtractedFace(int id, int wholePercentages, ExifDirectory _, Location location, PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName? personKeyFormattedAndKeyTicksAndDisplayDirectoryName, ReadOnlyCollection<string> paths)
|
||||||
{
|
{
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
|
string person;
|
||||||
foreach (string path in paths)
|
foreach (string path in paths)
|
||||||
{
|
{
|
||||||
// RectangleF? rectangleF = Shared.Models.Stateless.ILocation.GetPercentagesRectangle(faceFile);
|
// RectangleF? rectangleF = Shared.Models.Stateless.ILocation.GetPercentagesRectangle(faceFile);
|
||||||
@ -250,12 +264,13 @@ public partial class Compare : ICompare, IDisposable
|
|||||||
// return;
|
// return;
|
||||||
width = location.Right - location.Left;
|
width = location.Right - location.Left;
|
||||||
height = location.Bottom - location.Top;
|
height = location.Bottom - location.Top;
|
||||||
|
person = personKeyFormattedAndKeyTicksAndDisplayDirectoryName is null ? string.Empty : $"-{personKeyFormattedAndKeyTicksAndDisplayDirectoryName.DisplayDirectoryName}";
|
||||||
ExtractFace(file: path,
|
ExtractFace(file: path,
|
||||||
width: width,
|
width: width,
|
||||||
height: height,
|
height: height,
|
||||||
left: location.Left,
|
left: location.Left,
|
||||||
top: location.Top,
|
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}");
|
bitmap.Save($"{file}{suffix}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void SaveExtractedJavaScriptObjectNotation(int id, int wholePercentages, LocationContainer locationContainer, ReadOnlyCollection<string> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -10,7 +10,8 @@ public record CompareSettings(string Company,
|
|||||||
string FacesPartsFileNameExtension,
|
string FacesPartsFileNameExtension,
|
||||||
int MaxDegreeOfParallelism,
|
int MaxDegreeOfParallelism,
|
||||||
string[] OutputResolutions,
|
string[] OutputResolutions,
|
||||||
bool SaveExtractFaces) : Shared.Models.Properties.ICompareSettings
|
bool SaveExtractedFaces,
|
||||||
|
bool SaveExtractedJavaScriptObjectNotation) : Shared.Models.Properties.ICompareSettings
|
||||||
{
|
{
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using View_by_Distance.Shared.Models;
|
using View_by_Distance.Shared.Models;
|
||||||
|
using View_by_Distance.Shared.Models.Properties;
|
||||||
using View_by_Distance.Shared.Models.Stateless;
|
using View_by_Distance.Shared.Models.Stateless;
|
||||||
|
|
||||||
namespace View_by_Distance.Distance.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 class FaceEncodingLogic
|
||||||
{
|
{
|
||||||
|
|
||||||
internal static ReadOnlyCollection<ExifDirectory> GetMappedExifDirectoryWithEncoding(ICompare compare, ReadOnlyCollection<ExifDirectory> exifDirectories)
|
internal static void MoveUnableToMatch(FilePath filePath)
|
||||||
{
|
{
|
||||||
List<ExifDirectory> results = [];
|
string checkFile = $"{filePath.FullName}.unk";
|
||||||
string? json;
|
if (File.Exists(filePath.FullName) && !File.Exists(checkFile))
|
||||||
FaceEncoding? faceEncoding;
|
File.Move(filePath.FullName, checkFile);
|
||||||
ExifDirectory exifDirectory;
|
}
|
||||||
FaceRecognitionDotNet.Models.FaceEncoding? encoding;
|
|
||||||
|
internal static ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> GetMappedIdsThenWholePercentagesToLocationContainer(ResultSettings resultSettings, MetadataSettings metadataSettings, PeopleSettings peopleSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections)
|
||||||
|
{
|
||||||
|
ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> results;
|
||||||
|
List<LocationContainer?> locationContainers = [];
|
||||||
|
int maxDegreeOfParallelism = compareSettings.MaxDegreeOfParallelism;
|
||||||
|
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
|
||||||
|
ReadOnlyCollection<ExifDirectory> exifDirectories = MappedLogicA.GetMapped(resultSettings,
|
||||||
|
metadataSettings,
|
||||||
|
peopleSettings,
|
||||||
|
distanceSettings,
|
||||||
|
compareSettings,
|
||||||
|
compare,
|
||||||
|
readOnlyCollections);
|
||||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - compare.Ticks).TotalSeconds);
|
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)";
|
string message = $") Building Mapped with Encoding Face Files Collection - {totalSeconds} total second(s)";
|
||||||
compare.ConstructProgressBar(exifDirectories.Count, message);
|
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<ExifDirectory> exifDirectories, int i, List<LocationContainer?> results)
|
||||||
{
|
{
|
||||||
compare.Tick();
|
compare.Tick();
|
||||||
json = Metadata.Models.Stateless.IMetadata.GetFaceEncoding(e);
|
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)
|
||||||
|
{
|
||||||
|
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);
|
faceEncoding = json is null ? null : JsonSerializer.Deserialize(json, FaceEncodingGenerationContext.Default.FaceEncoding);
|
||||||
if (faceEncoding is null)
|
if (faceEncoding is null)
|
||||||
continue;
|
result = null;
|
||||||
|
else
|
||||||
|
{
|
||||||
encoding = FaceRecognitionDotNet.Models.FaceRecognition.LoadFaceEncoding(faceEncoding.RawEncoding);
|
encoding = FaceRecognitionDotNet.Models.FaceRecognition.LoadFaceEncoding(faceEncoding.RawEncoding);
|
||||||
exifDirectory = ExifDirectory.Get(encoding, e);
|
result = new(CreationDateOnly: dateOnly,
|
||||||
results.Add(exifDirectory);
|
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<int, ReadOnlyDictionary<int, LocationContainer>> GetMappedIdsThenWholePercentagesToLocationContainer(List<LocationContainer?> locationContainers)
|
||||||
|
{
|
||||||
|
Dictionary<int, ReadOnlyDictionary<int, LocationContainer>> results = [];
|
||||||
|
int id;
|
||||||
|
int wholePercentages;
|
||||||
|
Dictionary<int, LocationContainer>? keyValue;
|
||||||
|
Dictionary<int, Dictionary<int, LocationContainer>> 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<int, Dictionary<int, LocationContainer>> keyValuePair in keyValuePairs)
|
||||||
|
results.Add(keyValuePair.Key, keyValuePair.Value.AsReadOnly());
|
||||||
return results.AsReadOnly();
|
return results.AsReadOnly();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Text.Json;
|
|
||||||
using View_by_Distance.Shared.Models;
|
using View_by_Distance.Shared.Models;
|
||||||
using View_by_Distance.Shared.Models.Properties;
|
using View_by_Distance.Shared.Models.Properties;
|
||||||
using View_by_Distance.Shared.Models.Stateless;
|
using View_by_Distance.Shared.Models.Stateless;
|
||||||
@ -9,13 +8,6 @@ namespace View_by_Distance.Distance.Models.Stateless;
|
|||||||
internal static class FilterLogicB
|
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<LocationContainer> GetLocationContainers(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollection<ExifDirectory> exifDirectories, string sourceClass)
|
internal static ReadOnlyCollection<LocationContainer> GetLocationContainers(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollection<ExifDirectory> exifDirectories, string sourceClass)
|
||||||
{
|
{
|
||||||
List<LocationContainer> results = [];
|
List<LocationContainer> results = [];
|
||||||
@ -35,45 +27,11 @@ internal static class FilterLogicB
|
|||||||
ExifDirectory exifDirectory = exifDirectories[i];
|
ExifDirectory exifDirectory = exifDirectories[i];
|
||||||
if (exifDirectory.FilePath.Id is null)
|
if (exifDirectory.FilePath.Id is null)
|
||||||
return;
|
return;
|
||||||
int? wholePercentages = IMapping.GetWholePercentages(compareSettings, exifDirectory.FilePath);
|
LocationContainer? locationContainer = FaceEncodingLogic.GetLocationContainer(distanceSettings, compareSettings, exifDirectory);
|
||||||
if (wholePercentages is null)
|
if (locationContainer is null)
|
||||||
{
|
|
||||||
if (distanceSettings.DistanceMoveUnableToMatch)
|
|
||||||
MoveUnableToMatch(exifDirectory.FilePath);
|
|
||||||
return;
|
return;
|
||||||
}
|
lock (results)
|
||||||
LocationContainersParallelFor(distanceSettings, results, exifDirectory, wholePercentages);
|
results.Add(locationContainer);
|
||||||
}
|
|
||||||
|
|
||||||
private static void LocationContainersParallelFor(DistanceSettings distanceSettings, List<LocationContainer> 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -9,7 +9,7 @@ namespace View_by_Distance.Distance.Models.Stateless;
|
|||||||
public interface IDistance
|
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
|
$"{by switch
|
||||||
{
|
{
|
||||||
IMapLogic.Mapping => nameof(IMapLogic.Mapping),
|
IMapLogic.Mapping => nameof(IMapLogic.Mapping),
|
||||||
@ -23,54 +23,42 @@ public interface IDistance
|
|||||||
public static ReadOnlyDictionary<string, LocationContainer> GetOnlyOne(DistanceSettings distanceSettings, ReadOnlyCollection<LocationContainer> matrix) =>
|
public static ReadOnlyDictionary<string, LocationContainer> GetOnlyOne(DistanceSettings distanceSettings, ReadOnlyCollection<LocationContainer> matrix) =>
|
||||||
FilterLogicC.GetOnlyOne(distanceSettings, matrix);
|
FilterLogicC.GetOnlyOne(distanceSettings, matrix);
|
||||||
|
|
||||||
public static ReadOnlyCollection<ExifDirectory> GetMappedExifDirectoryWithEncoding(ICompare compare, ReadOnlyCollection<ExifDirectory> exifDirectories) =>
|
|
||||||
FaceEncodingLogic.GetMappedExifDirectoryWithEncoding(compare, exifDirectories);
|
|
||||||
|
|
||||||
public static ReadOnlyCollection<LocationContainer> GetPostFilterLocationContainer(ReadOnlyCollection<LocationContainer> preFiltered, DistanceLimits distanceLimits) =>
|
public static ReadOnlyCollection<LocationContainer> GetPostFilterLocationContainer(ReadOnlyCollection<LocationContainer> preFiltered, DistanceLimits distanceLimits) =>
|
||||||
FilterLogicC.GetPostFilterLocationContainer(preFiltered, distanceLimits);
|
FilterLogicC.GetPostFilterLocationContainer(preFiltered, distanceLimits);
|
||||||
|
|
||||||
public static ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> Extract(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollection<ExifDirectory> exifDirectories) =>
|
|
||||||
MappedLogicA.Extract(distanceSettings, compareSettings, compare, exifDirectories);
|
|
||||||
|
|
||||||
public static void SaveContainers(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, int? updated, ReadOnlyCollection<SaveContainer> saveContainers) =>
|
public static void SaveContainers(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, int? updated, ReadOnlyCollection<SaveContainer> saveContainers) =>
|
||||||
FilterLogicD.SaveContainers(distanceSettings, compareSettings, compare, updated, saveContainers);
|
FilterLogicD.SaveContainers(distanceSettings, compareSettings, compare, updated, saveContainers);
|
||||||
|
|
||||||
public static ReadOnlyCollection<SaveContainer> GetSaveContainers(ResultSettings resultSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, string outputResolution, ReadOnlyDictionary<string, LocationContainer> onlyOne) =>
|
public static ReadOnlyCollection<SaveContainer> GetSaveContainers(ResultSettings resultSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, string outputResolution, ReadOnlyDictionary<string, LocationContainer> onlyOne) =>
|
||||||
FilterLogicD.GetSaveContainers(resultSettings, distanceSettings, compareSettings, compare, outputResolution, onlyOne);
|
FilterLogicD.GetSaveContainers(resultSettings, distanceSettings, compareSettings, compare, outputResolution, onlyOne);
|
||||||
|
|
||||||
public static ReadOnlyCollection<ExifDirectory> 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<LocationContainer> GetMatrixLocationContainers(DistanceSettings distanceSettings, ICompare compare, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer, DistanceLimits distanceLimits, ReadOnlyCollection<LocationContainer> postFiltered) =>
|
public static ReadOnlyCollection<LocationContainer> GetMatrixLocationContainers(DistanceSettings distanceSettings, ICompare compare, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer, DistanceLimits distanceLimits, ReadOnlyCollection<LocationContainer> postFiltered) =>
|
||||||
FilterLogicC.GetMatrixLocationContainers(distanceSettings, compare, mappedIdsThenWholePercentagesToLocationContainer, distanceLimits, postFiltered);
|
FilterLogicC.GetMatrixLocationContainers(distanceSettings, compare, mappedIdsThenWholePercentagesToLocationContainer, distanceLimits, postFiltered);
|
||||||
|
|
||||||
|
public static ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> 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<LocationContainer> GetPreFilterLocationContainer(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer, ReadOnlyCollection<ExifDirectory> exifDirectories) =>
|
public static ReadOnlyCollection<LocationContainer> GetPreFilterLocationContainer(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer, ReadOnlyCollection<ExifDirectory> exifDirectories) =>
|
||||||
FilterLogicA.GetPreFilterLocationContainer(distanceSettings, compareSettings, compare, readOnlyCollections, mappedIdsThenWholePercentagesToLocationContainer, exifDirectories);
|
FilterLogicA.GetPreFilterLocationContainer(distanceSettings, compareSettings, compare, readOnlyCollections, mappedIdsThenWholePercentagesToLocationContainer, exifDirectories);
|
||||||
|
|
||||||
internal static ReadOnlyDictionary<string, LocationContainer> TestStatic_GetOnlyOne(DistanceSettings distanceSettings, ReadOnlyCollection<LocationContainer> matrix) =>
|
internal static ReadOnlyDictionary<string, LocationContainer> TestStatic_GetOnlyOne(DistanceSettings distanceSettings, ReadOnlyCollection<LocationContainer> matrix) =>
|
||||||
GetOnlyOne(distanceSettings, matrix);
|
GetOnlyOne(distanceSettings, matrix);
|
||||||
|
|
||||||
internal static ReadOnlyCollection<ExifDirectory> TestStatic_GetMappedExifDirectoryWithEncoding(ICompare compare, ReadOnlyCollection<ExifDirectory> exifDirectories) =>
|
|
||||||
GetMappedExifDirectoryWithEncoding(compare, exifDirectories);
|
|
||||||
|
|
||||||
internal static ReadOnlyCollection<LocationContainer> TestStatic_GetPostFilterLocationContainer(ReadOnlyCollection<LocationContainer> preFiltered, DistanceLimits distanceLimits) =>
|
internal static ReadOnlyCollection<LocationContainer> TestStatic_GetPostFilterLocationContainer(ReadOnlyCollection<LocationContainer> preFiltered, DistanceLimits distanceLimits) =>
|
||||||
GetPostFilterLocationContainer(preFiltered, distanceLimits);
|
GetPostFilterLocationContainer(preFiltered, distanceLimits);
|
||||||
|
|
||||||
internal static ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> TestStatic_Extract(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollection<ExifDirectory> exifDirectories) =>
|
|
||||||
Extract(distanceSettings, compareSettings, compare, exifDirectories);
|
|
||||||
|
|
||||||
internal static void TestStatic_SaveContainers(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, int? updated, ReadOnlyCollection<SaveContainer> saveContainers) =>
|
internal static void TestStatic_SaveContainers(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, int? updated, ReadOnlyCollection<SaveContainer> saveContainers) =>
|
||||||
SaveContainers(distanceSettings, compareSettings, compare, updated, saveContainers);
|
SaveContainers(distanceSettings, compareSettings, compare, updated, saveContainers);
|
||||||
|
|
||||||
internal static ReadOnlyCollection<SaveContainer> TestStatic_GetSaveContainers(ResultSettings resultSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, string outputResolution, ReadOnlyDictionary<string, LocationContainer> onlyOne) =>
|
internal static ReadOnlyCollection<SaveContainer> TestStatic_GetSaveContainers(ResultSettings resultSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, string outputResolution, ReadOnlyDictionary<string, LocationContainer> onlyOne) =>
|
||||||
GetSaveContainers(resultSettings, distanceSettings, compareSettings, compare, outputResolution, onlyOne);
|
GetSaveContainers(resultSettings, distanceSettings, compareSettings, compare, outputResolution, onlyOne);
|
||||||
|
|
||||||
internal static ReadOnlyCollection<ExifDirectory> 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<LocationContainer> TestStatic_GetMatrixLocationContainers(DistanceSettings distanceSettings, ICompare compare, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer, DistanceLimits distanceLimits, ReadOnlyCollection<LocationContainer> postFiltered) =>
|
internal static ReadOnlyCollection<LocationContainer> TestStatic_GetMatrixLocationContainers(DistanceSettings distanceSettings, ICompare compare, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer, DistanceLimits distanceLimits, ReadOnlyCollection<LocationContainer> postFiltered) =>
|
||||||
GetMatrixLocationContainers(distanceSettings, compare, mappedIdsThenWholePercentagesToLocationContainer, distanceLimits, postFiltered);
|
GetMatrixLocationContainers(distanceSettings, compare, mappedIdsThenWholePercentagesToLocationContainer, distanceLimits, postFiltered);
|
||||||
|
|
||||||
|
internal static ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> 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<LocationContainer> TestStatic_GetPreFilterLocationContainer(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer, ReadOnlyCollection<ExifDirectory> exifDirectories) =>
|
internal static ReadOnlyCollection<LocationContainer> TestStatic_GetPreFilterLocationContainer(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedIdsThenWholePercentagesToLocationContainer, ReadOnlyCollection<ExifDirectory> exifDirectories) =>
|
||||||
GetPreFilterLocationContainer(distanceSettings, compareSettings, compare, readOnlyCollections, mappedIdsThenWholePercentagesToLocationContainer, exifDirectories);
|
GetPreFilterLocationContainer(distanceSettings, compareSettings, compare, readOnlyCollections, mappedIdsThenWholePercentagesToLocationContainer, exifDirectories);
|
||||||
|
|
||||||
|
@ -14,33 +14,6 @@ internal static class MappedLogicA
|
|||||||
string? PersonDisplayDirectoryName,
|
string? PersonDisplayDirectoryName,
|
||||||
FilePath FilePath);
|
FilePath FilePath);
|
||||||
|
|
||||||
internal static ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> Extract(DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollection<ExifDirectory> exifDirectories)
|
|
||||||
{
|
|
||||||
Dictionary<int, ReadOnlyDictionary<int, LocationContainer>> results = [];
|
|
||||||
int id;
|
|
||||||
int wholePercentages;
|
|
||||||
Dictionary<int, LocationContainer>? keyValue;
|
|
||||||
Dictionary<int, Dictionary<int, LocationContainer>> keyValuePairs = [];
|
|
||||||
ReadOnlyCollection<LocationContainer> 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<int, Dictionary<int, LocationContainer>> keyValuePair in keyValuePairs)
|
|
||||||
results.Add(keyValuePair.Key, keyValuePair.Value.AsReadOnly());
|
|
||||||
return results.AsReadOnly();
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static ReadOnlyCollection<ExifDirectory> GetMapped(ResultSettings resultSettings, MetadataSettings metadataSettings, PeopleSettings peopleSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections)
|
internal static ReadOnlyCollection<ExifDirectory> GetMapped(ResultSettings resultSettings, MetadataSettings metadataSettings, PeopleSettings peopleSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, ReadOnlyCollections readOnlyCollections)
|
||||||
{
|
{
|
||||||
List<ExifDirectory> results = [];
|
List<ExifDirectory> results = [];
|
||||||
|
@ -529,7 +529,6 @@ internal abstract class Exif
|
|||||||
Shared.Models.QuickTimeMovieHeaderDirectory[] quickTimeMovieHeaderDirectories = GetQuickTimeMovieHeaderDirectoryDirectories(directories);
|
Shared.Models.QuickTimeMovieHeaderDirectory[] quickTimeMovieHeaderDirectories = GetQuickTimeMovieHeaderDirectoryDirectories(directories);
|
||||||
Shared.Models.QuickTimeTrackHeaderDirectory[] quickTimeTrackHeaderDirectories = GetQuickTimeTrackHeaderDirectoryDirectories(directories);
|
Shared.Models.QuickTimeTrackHeaderDirectory[] quickTimeTrackHeaderDirectories = GetQuickTimeTrackHeaderDirectoryDirectories(directories);
|
||||||
result = new(aviDirectories,
|
result = new(aviDirectories,
|
||||||
null,
|
|
||||||
exifBaseDirectories,
|
exifBaseDirectories,
|
||||||
fileMetadataDirectories,
|
fileMetadataDirectories,
|
||||||
filePath,
|
filePath,
|
||||||
|
@ -4,7 +4,6 @@ using System.Text.Json.Serialization;
|
|||||||
namespace View_by_Distance.Shared.Models;
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
public record ExifDirectory(AviDirectory[] AviDirectories,
|
public record ExifDirectory(AviDirectory[] AviDirectories,
|
||||||
object? Encoding,
|
|
||||||
ExifDirectoryBase[] ExifBaseDirectories,
|
ExifDirectoryBase[] ExifBaseDirectories,
|
||||||
FileMetadataDirectory[] FileMetadataDirectories,
|
FileMetadataDirectory[] FileMetadataDirectories,
|
||||||
FilePath FilePath,
|
FilePath FilePath,
|
||||||
@ -28,25 +27,6 @@ public record ExifDirectory(AviDirectory[] AviDirectories,
|
|||||||
return result;
|
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)]
|
[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace View_by_Distance.Shared.Models;
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
public record LocationContainer(DateOnly? CreationDateOnly,
|
public record LocationContainer(DateOnly? CreationDateOnly,
|
||||||
@ -11,6 +14,21 @@ public record LocationContainer(DateOnly? CreationDateOnly,
|
|||||||
int? WholePercentages)
|
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)
|
public static LocationContainer Get(LocationContainer locationContainer, object? encoding)
|
||||||
{
|
{
|
||||||
LocationContainer result;
|
LocationContainer result;
|
||||||
@ -42,3 +60,18 @@ public record LocationContainer(DateOnly? CreationDateOnly,
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
{
|
||||||
|
}
|
Reference in New Issue
Block a user