MoveToDecade
This commit is contained in:
Mike Phares 2023-08-06 17:19:06 -07:00
parent 6d17380430
commit d4cbea3835
41 changed files with 974 additions and 637 deletions

View File

@ -59,7 +59,7 @@ public class DeleteByRelative
throw new NullReferenceException(nameof(alongSideDirectory)); throw new NullReferenceException(nameof(alongSideDirectory));
string deleteLog = Path.Combine(alongSideDirectory, $"{directoryName}-{ticks}.tsv"); string deleteLog = Path.Combine(alongSideDirectory, $"{directoryName}-{ticks}.tsv");
File.WriteAllLines(deleteLog, deleteFiles); File.WriteAllLines(deleteLog, deleteFiles);
if (deleteFiles.Any()) if (deleteFiles.Count > 0)
{ {
log.Information($"Ready to delete {deleteFiles.Count} file(s)? See <{deleteLog}>"); log.Information($"Ready to delete {deleteFiles.Count} file(s)? See <{deleteLog}>");
for (int y = 0; y < int.MaxValue; y++) for (int y = 0; y < int.MaxValue; y++)

View File

@ -1,4 +1,5 @@
using ShellProgressBar; using ShellProgressBar;
using System.Collections.ObjectModel;
using System.Text.Json; using System.Text.Json;
using View_by_Distance.Distance.Models.Stateless; using View_by_Distance.Distance.Models.Stateless;
using View_by_Distance.FaceRecognitionDotNet; using View_by_Distance.FaceRecognitionDotNet;
@ -122,7 +123,7 @@ public partial class E_Distance
(Face, double?)[] results; (Face, double?)[] results;
List<(Face Face, double? Length)> collection = GetValues(mappingFromItem, intersectFaces, modelsFaceEncoding); List<(Face Face, double? Length)> collection = GetValues(mappingFromItem, intersectFaces, modelsFaceEncoding);
results = (from l in collection where l.Length < _RangeDistanceToleranceAverage orderby l.Length select l).Take(1).ToArray(); results = (from l in collection where l.Length < _RangeDistanceToleranceAverage orderby l.Length select l).Take(1).ToArray();
if (results.Any()) if (results.Length > 0)
{ {
(Face _, double? length) = results.First(); (Face _, double? length) = results.First();
_Debug.Add(length); _Debug.Add(length);
@ -199,7 +200,7 @@ public partial class E_Distance
} }
} }
public void LookForMatchFacesAndPossiblyRename(string facesFileNameExtension, MappingFromItem mappingFromItem, List<Face> faces, List<LocationContainer<MetadataExtractor.Directory>> locationContainers) public void LookForMatchFacesAndPossiblyRename(string facesFileNameExtension, MappingFromItem mappingFromItem, List<Face> faces, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers)
{ {
string? json; string? json;
string fileName; string fileName;
@ -219,7 +220,7 @@ public partial class E_Distance
if (locationContainer.FromDistanceContent && _DuplicateMappedFaceFiles.Contains(fileName)) if (locationContainer.FromDistanceContent && _DuplicateMappedFaceFiles.Contains(fileName))
continue; continue;
checkFaces.Clear(); checkFaces.Clear();
if (!locationContainer.Directories.Any()) if (locationContainer.Directories.Count == 0)
{ {
if (locationContainer.FromDistanceContent) if (locationContainer.FromDistanceContent)
throw new NullReferenceException(nameof(locationContainer.Directories)); throw new NullReferenceException(nameof(locationContainer.Directories));
@ -232,7 +233,7 @@ public partial class E_Distance
MoveUnableToMatch(locationContainer.File); MoveUnableToMatch(locationContainer.File);
continue; continue;
} }
if (filteredFaces.Any()) if (filteredFaces.Length > 0)
checkFaces.AddRange(GetMatchingFacesByFaceEncoding(filteredFaces, json)); checkFaces.AddRange(GetMatchingFacesByFaceEncoding(filteredFaces, json));
if (checkFaces.Count == 1) if (checkFaces.Count == 1)
_Debug.Add(0); _Debug.Add(0);
@ -242,14 +243,14 @@ public partial class E_Distance
modelsFaceEncoding = JsonSerializer.Deserialize<Shared.Models.FaceEncoding>(json); modelsFaceEncoding = JsonSerializer.Deserialize<Shared.Models.FaceEncoding>(json);
if (modelsFaceEncoding is null) if (modelsFaceEncoding is null)
throw new NotSupportedException(); throw new NotSupportedException();
if (filteredFaces.Any()) if (filteredFaces.Length > 0)
{ {
intersectFaces = Shared.Models.Stateless.Methods.ILocation.FilterByIntersect(filteredFaces, _RectangleIntersectMinimum, locationContainer.WholePercentages); intersectFaces = Shared.Models.Stateless.Methods.ILocation.FilterByIntersect(filteredFaces, _RectangleIntersectMinimum, locationContainer.WholePercentages);
if (intersectFaces.Any()) if (intersectFaces.Count > 0)
checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(mappingFromItem, intersectFaces, modelsFaceEncoding)); checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(mappingFromItem, intersectFaces, modelsFaceEncoding));
} }
} }
if (!checkFaces.Any()) if (checkFaces.Count == 0)
{ {
if (_DistanceMoveUnableToMatch) if (_DistanceMoveUnableToMatch)
MoveUnableToMatch(locationContainer.File); MoveUnableToMatch(locationContainer.File);
@ -279,7 +280,7 @@ public partial class E_Distance
{ {
lock (_AllMappedFaceFiles) lock (_AllMappedFaceFiles)
matches = (from l in _AllMappedFaceFiles where l != locationContainer.File && Path.GetFileName(l) == fileName select l).ToArray(); matches = (from l in _AllMappedFaceFiles where l != locationContainer.File && Path.GetFileName(l) == fileName select l).ToArray();
if (locationContainer.FromDistanceContent && matches.Any()) if (locationContainer.FromDistanceContent && matches.Length > 0)
AppendMatchingDuplicates(locationContainer.File, matches); AppendMatchingDuplicates(locationContainer.File, matches);
} }
if (!locationContainer.FromDistanceContent) if (!locationContainer.FromDistanceContent)
@ -296,14 +297,14 @@ public partial class E_Distance
if (_Log is null) if (_Log is null)
throw new NullReferenceException(nameof(_Log)); throw new NullReferenceException(nameof(_Log));
double?[] debug = (from l in _Debug where l is null or not 0 select l).ToArray(); double?[] debug = (from l in _Debug where l is null or not 0 select l).ToArray();
if (debug.Any()) if (debug.Length > 0)
{ {
string debugMessage = $"{_Debug.Count - debug.Length} - {debug.Min()} - {_Debug.Max()}"; string debugMessage = $"{_Debug.Count - debug.Length} - {debug.Min()} - {_Debug.Max()}";
_Log.Info(debugMessage); _Log.Info(debugMessage);
} }
if (_DuplicateMappedFaceFiles.Any()) if (_DuplicateMappedFaceFiles.Count > 0)
_Log.Info($"Renamed {_DuplicateMappedFaceFiles.Count} to *.dup file(s)"); _Log.Info($"Renamed {_DuplicateMappedFaceFiles.Count} to *.dup file(s)");
if (_Moved.Any() || _Renamed.Any()) if (_Moved.Count > 0 || _Renamed.Count > 0)
throw new NotImplementedException("Restart!"); throw new NotImplementedException("Restart!");
_Debug.Clear(); _Debug.Clear();
_Moved.Clear(); _Moved.Clear();
@ -313,7 +314,7 @@ public partial class E_Distance
_DuplicateMappedFaceFiles.Clear(); _DuplicateMappedFaceFiles.Clear();
} }
public List<FaceDistanceContainer> GetMissingFaceDistanceContainer(int maxDegreeOfParallelism, long ticks, string dFacesCollectionDirectory, Dictionary<int, Dictionary<int, PersonContainer[]>> missingIdThenWholePercentagesToPersonContainers) public List<FaceDistanceContainer> GetMissingFaceDistanceContainer(int maxDegreeOfParallelism, long ticks, string dFacesCollectionDirectory, Dictionary<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> missingIdThenWholePercentagesToPersonContainers)
{ {
List<FaceDistanceContainer> results = new(); List<FaceDistanceContainer> results = new();
string[] files; string[] files;
@ -324,7 +325,7 @@ public partial class E_Distance
FaceDistance faceDistance; FaceDistance faceDistance;
List<(int id, string json)> collection = new(); List<(int id, string json)> collection = new();
FaceDistanceContainer faceDistanceContainer; FaceDistanceContainer faceDistanceContainer;
foreach (KeyValuePair<int, Dictionary<int, PersonContainer[]>> keyValuePair in missingIdThenWholePercentagesToPersonContainers) foreach (KeyValuePair<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> keyValuePair in missingIdThenWholePercentagesToPersonContainers)
{ {
files = Directory.GetFiles(dFacesCollectionDirectory, $"{keyValuePair.Key}*.json", SearchOption.TopDirectoryOnly); files = Directory.GetFiles(dFacesCollectionDirectory, $"{keyValuePair.Key}*.json", SearchOption.TopDirectoryOnly);
if (files.Length != 1) if (files.Length != 1)
@ -530,16 +531,16 @@ public partial class E_Distance
FaceDistance faceDistanceEncoding = filteredFaceDistanceContainers[i].FaceDistance; FaceDistance faceDistanceEncoding = filteredFaceDistanceContainers[i].FaceDistance;
Face face = filteredFaceDistanceContainers[i].Face; Face face = filteredFaceDistanceContainers[i].Face;
List<Sorting> sortingCollection = GetSortingCollection(mapLogic, faceDistanceEncodings, i, faceDistanceEncoding); List<Sorting> sortingCollection = GetSortingCollection(mapLogic, faceDistanceEncodings, i, faceDistanceEncoding);
if (!sortingCollection.Any()) if (sortingCollection.Count == 0)
return; return;
List<SortingContainer> sortingContainers = GetSortingContainers(mapConfiguration, distanceLimits, face, faceDistanceEncoding, sortingCollection); List<SortingContainer> sortingContainers = GetSortingContainers(mapConfiguration, distanceLimits, face, faceDistanceEncoding, sortingCollection);
if (sortingContainers.Any()) if (sortingContainers.Count > 0)
{ {
lock (collection) lock (collection)
collection.AddRange(sortingContainers); collection.AddRange(sortingContainers);
} }
}); });
if (!collection.Any()) if (collection.Count == 0)
results = Array.Empty<SortingContainer>(); results = Array.Empty<SortingContainer>();
else else
{ {

View File

@ -125,7 +125,7 @@ public partial class DragDropExplorer : Form
{ {
try try
{ {
if (e.Data is null || e.Data.GetData(DataFormats.FileDrop) is not string[] paths || !paths.Any()) if (e.Data is null || e.Data.GetData(DataFormats.FileDrop) is not string[] paths || paths.Length == 0)
{ {
_FirstTextBox.Text = string.Empty; _FirstTextBox.Text = string.Empty;
_PathTextBox.Text = string.Empty; _PathTextBox.Text = string.Empty;

View File

@ -179,7 +179,7 @@ public partial class DragDropMove : Form
{ {
try try
{ {
if (e.Data is not null && e.Data.GetData(DataFormats.FileDrop) is string[] paths && paths.Any()) if (e.Data is not null && e.Data.GetData(DataFormats.FileDrop) is string[] paths && paths.Length > 0)
MovePaths(paths); MovePaths(paths);
else else
{ {

View File

@ -1,3 +1,4 @@
using System.Collections.ObjectModel;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.Drawing.Imaging; using System.Drawing.Imaging;
@ -239,7 +240,7 @@ public class D_Face
List<(Location Location, FaceRecognitionDotNet.FaceEncoding? FaceEncoding, Dictionary<FacePart, FacePoint[]>? FaceParts)> collection; List<(Location Location, FaceRecognitionDotNet.FaceEncoding? FaceEncoding, Dictionary<FacePart, FacePoint[]>? FaceParts)> collection;
FaceRecognition faceRecognition = new(_PropertyConfiguration.NumberOfJitters.Value, _PropertyConfiguration.NumberOfTimesToUpsample.Value, _Model, _ModelParameter, _PredictorModel); FaceRecognition faceRecognition = new(_PropertyConfiguration.NumberOfJitters.Value, _PropertyConfiguration.NumberOfTimesToUpsample.Value, _Model, _ModelParameter, _PredictorModel);
collection = faceRecognition.GetCollection(unknownImage, locations, includeFaceEncoding: true, includeFaceParts: true); collection = faceRecognition.GetCollection(unknownImage, locations, includeFaceEncoding: true, includeFaceParts: true);
if (!collection.Any()) if (collection.Count == 0)
results.Add(new(property, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, location: null)); results.Add(new(property, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, location: null));
else else
{ {
@ -268,7 +269,7 @@ public class D_Face
#pragma warning restore CA1416 #pragma warning restore CA1416
private static List<LocationContainer<MetadataExtractor.Directory>> GetLocationContainers(string outputResolution, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, Dictionary<string, int[]> outputResolutionToResize, List<Shared.Models.Face> faces) private static List<LocationContainer<MetadataExtractor.Directory>> GetLocationContainers(string outputResolution, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers, Dictionary<string, int[]> outputResolutionToResize, List<Shared.Models.Face> faces)
{ {
List<LocationContainer<MetadataExtractor.Directory>> results = new(); List<LocationContainer<MetadataExtractor.Directory>> results = new();
string? json; string? json;
@ -309,12 +310,12 @@ public class D_Face
results.Add(new(locationContainer.FromDistanceContent, locationContainer.File, locationContainer.PersonKey, locationContainer.Id, locationContainer.WholePercentages, locationContainer.Directories, rectangle.Value, location)); results.Add(new(locationContainer.FromDistanceContent, locationContainer.File, locationContainer.PersonKey, locationContainer.Id, locationContainer.WholePercentages, locationContainer.Directories, rectangle.Value, location));
} }
} }
if (results.Any()) if (results.Count > 0)
outputResolutionCheck = null; outputResolutionCheck = null;
return results; return results;
} }
public List<Shared.Models.Face> GetFaces(string outputResolution, string dResultsFullGroupDirectory, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, Shared.Models.Property property, MappingFromItem mappingFromItem, Dictionary<string, int[]> outputResolutionToResize, List<LocationContainer<MetadataExtractor.Directory>>? locationContainers, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection) public List<Shared.Models.Face> GetFaces(string outputResolution, string dResultsFullGroupDirectory, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, Shared.Models.Property property, MappingFromItem mappingFromItem, Dictionary<string, int[]> outputResolutionToResize, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>>? locationContainers, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection)
{ {
List<Shared.Models.Face>? results; List<Shared.Models.Face>? results;
if (string.IsNullOrEmpty(dResultsFullGroupDirectory)) if (string.IsNullOrEmpty(dResultsFullGroupDirectory))
@ -339,7 +340,7 @@ public class D_Face
results = null; results = null;
else if (!fileInfo.Exists) else if (!fileInfo.Exists)
results = null; results = null;
else if (_CheckDFaceAndUpWriteDates && dateTimes.Any() && dateTimes.Max() > fileInfo.LastWriteTime) else if (_CheckDFaceAndUpWriteDates && dateTimes.Count > 0 && dateTimes.Max() > fileInfo.LastWriteTime)
results = null; results = null;
else else
{ {
@ -366,14 +367,14 @@ public class D_Face
locations = (from l in collection where l is not null select l.Location).ToList(); locations = (from l in collection where l is not null select l.Location).ToList();
else else
locations = Shared.Models.Stateless.Methods.ILocation.GetLocations(collection, results, mappingFromPhotoPrismCollection, _RectangleIntersectMinimum); locations = Shared.Models.Stateless.Methods.ILocation.GetLocations(collection, results, mappingFromPhotoPrismCollection, _RectangleIntersectMinimum);
if (results is null || (locations is not null && locations.Any())) if (results is null || (locations is not null && locations.Count > 0))
{ {
results = GetFaces(outputResolution, property, mappingFromItem, outputResolutionToResize, locations); results = GetFaces(outputResolution, property, mappingFromItem, outputResolutionToResize, locations);
if (!results.Any()) if (results.Count == 0)
File.Move(mappingFromItem.ResizedFileHolder.FullName, $"{mappingFromItem.ResizedFileHolder.FullName}.err"); File.Move(mappingFromItem.ResizedFileHolder.FullName, $"{mappingFromItem.ResizedFileHolder.FullName}.err");
else else
{ {
bool updateDateWhenMatches = dateTimes.Any() && fileInfo.Exists && dateTimes.Max() > fileInfo.LastWriteTime; bool updateDateWhenMatches = dateTimes.Count > 0 && fileInfo.Exists && dateTimes.Max() > fileInfo.LastWriteTime;
DateTime? dateTime = !updateDateWhenMatches ? null : dateTimes.Max(); DateTime? dateTime = !updateDateWhenMatches ? null : dateTimes.Max();
json = JsonSerializer.Serialize(results, _WriteIndentedAndWhenWritingNull); json = JsonSerializer.Serialize(results, _WriteIndentedAndWhenWritingNull);
if (Shared.Models.Stateless.Methods.IPath.WriteAllText(fileInfo.FullName, json, updateDateWhenMatches, compareBeforeWrite: true, updateToWhenMatches: dateTime)) if (Shared.Models.Stateless.Methods.IPath.WriteAllText(fileInfo.FullName, json, updateDateWhenMatches, compareBeforeWrite: true, updateToWhenMatches: dateTime))
@ -419,7 +420,7 @@ public class D_Face
save = true; save = true;
else if (!fileInfo.Exists) else if (!fileInfo.Exists)
save = true; save = true;
else if (_CheckDFaceAndUpWriteDates && dateTimes.Any() && dateTimes.Max() > fileInfo.LastWriteTime) else if (_CheckDFaceAndUpWriteDates && dateTimes.Count > 0 && dateTimes.Max() > fileInfo.LastWriteTime)
save = true; save = true;
results.Add(new(face, fileInfo, Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{_HiddenFileNameExtension}"), save)); results.Add(new(face, fileInfo, Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{_HiddenFileNameExtension}"), save));
} }

View File

@ -96,7 +96,7 @@ internal sealed class FaceRecognitionModelV1
throw new ApplicationException(); throw new ApplicationException();
} }
if (faceChipsArray.Any()) if (faceChipsArray.Count > 0)
{ {
foreach (Array<Matrix<RgbPixel>>? array in faceChipsArray) foreach (Array<Matrix<RgbPixel>>? array in faceChipsArray)
{ {

View File

@ -128,7 +128,7 @@ public partial class DlibDotNet
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(Path.Combine(peopleRootDirectory, propertyConfiguration.ResultSingleton)); _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(Path.Combine(peopleRootDirectory, propertyConfiguration.ResultSingleton));
string a2PeopleContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration.PropertyConfiguration, nameof(A2_People), "([])"); string a2PeopleContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration.PropertyConfiguration, nameof(A2_People), "([])");
personContainers = new(IPersonContainer.GetPersonContainers(storage, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), _Faces.FileNameExtension)); personContainers = new(IPersonContainer.GetPersonContainers(storage, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), _Faces.FileNameExtension));
if (configuration.JLinks.Length > 0) if (configuration.JLinks.Where(l => !string.IsNullOrEmpty(l)).Any())
{ {
string a2PeopleSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration.PropertyConfiguration, nameof(A2_People), "{}"); string a2PeopleSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration.PropertyConfiguration, nameof(A2_People), "{}");
_JLinkResolvedDirectories.AddRange(Map.Models.Stateless.Methods.IMapLogic.GetJLinkDirectories(configuration.GenealogicalDataCommunicationFile, configuration.JLinks, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), a2PeopleSingletonDirectory, a2PeopleContentDirectory)); _JLinkResolvedDirectories.AddRange(Map.Models.Stateless.Methods.IMapLogic.GetJLinkDirectories(configuration.GenealogicalDataCommunicationFile, configuration.JLinks, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), a2PeopleSingletonDirectory, a2PeopleContentDirectory));
@ -201,7 +201,7 @@ public partial class DlibDotNet
private static void Verify(Models.Configuration configuration) private static void Verify(Models.Configuration configuration)
{ {
if (!configuration.OutputResolutions.Any() || string.IsNullOrEmpty(configuration.OutputResolutions[0]) || !configuration.ValidResolutions.Contains(configuration.OutputResolutions[0])) if (configuration.OutputResolutions.Length == 0 || string.IsNullOrEmpty(configuration.OutputResolutions[0]) || !configuration.ValidResolutions.Contains(configuration.OutputResolutions[0]))
throw new NullReferenceException($"{nameof(configuration.OutputResolutions)} must be fileNameToCollection valid outputResolution!"); throw new NullReferenceException($"{nameof(configuration.OutputResolutions)} must be fileNameToCollection valid outputResolution!");
if ((from l in configuration.OutputResolutions where !configuration.ValidResolutions.Contains(l) select false).Any()) if ((from l in configuration.OutputResolutions where !configuration.ValidResolutions.Contains(l) select false).Any())
throw new Exception($"One or more {nameof(configuration.OutputResolutions)} are not in the ValidResolutions list!"); throw new Exception($"One or more {nameof(configuration.OutputResolutions)} are not in the ValidResolutions list!");
@ -228,7 +228,7 @@ public partial class DlibDotNet
private void VerifyExtra(List<string> args, Property.Models.Configuration propertyConfiguration, Models.Configuration configuration) private void VerifyExtra(List<string> args, Property.Models.Configuration propertyConfiguration, Models.Configuration configuration)
{ {
string[] sourceDirectoryNames; string[] sourceDirectoryNames;
if (!args.Any()) if (args.Count == 0)
sourceDirectoryNames = Array.Empty<string>(); sourceDirectoryNames = Array.Empty<string>();
else else
{ {
@ -249,7 +249,7 @@ public partial class DlibDotNet
} }
} }
string[] resizeMatch = (from l in sourceDirectoryNames where configuration.ValidResolutions.Contains(l) select l).ToArray(); string[] resizeMatch = (from l in sourceDirectoryNames where configuration.ValidResolutions.Contains(l) select l).ToArray();
if (resizeMatch.Any()) if (resizeMatch.Length > 0)
throw new Exception("Input directory should be the source and not fileNameToCollection resized directory!"); throw new Exception("Input directory should be the source and not fileNameToCollection resized directory!");
if (configuration.LocationDigits != Shared.Models.Stateless.ILocation.Digits) if (configuration.LocationDigits != Shared.Models.Stateless.ILocation.Digits)
throw new Exception("Configuration has to match interface!"); throw new Exception("Configuration has to match interface!");
@ -294,7 +294,7 @@ public partial class DlibDotNet
return result; return result;
} }
private void SetMapping(MapLogic mapLogic, Item item, bool? isFocusRelativePath, bool? isIgnoreRelativePath, MappingFromItem mappingFromItem, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, List<Shared.Models.Face> faces) private void SetMapping(MapLogic mapLogic, Item item, bool? isFocusRelativePath, bool? isIgnoreRelativePath, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers, MappingFromItem mappingFromItem, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, List<Shared.Models.Face> faces)
{ {
double? α; double? α;
int? eyeα; int? eyeα;
@ -311,6 +311,7 @@ public partial class DlibDotNet
MappingFromLocation? mappingFromLocation; MappingFromLocation? mappingFromLocation;
bool? isFocusModel = GetIsFocusModel(item.Property); bool? isFocusModel = GetIsFocusModel(item.Property);
bool ignoreXMatches = _JLinkResolvedDirectories.Count > 0; bool ignoreXMatches = _JLinkResolvedDirectories.Count > 0;
ReadOnlyCollection<string> locationContainersFiles = new((from l in locationContainers select l.File).ToArray());
foreach (Shared.Models.Face face in faces) foreach (Shared.Models.Face face in faces)
{ {
if (item.Property?.Id is null || face.FaceEncoding is null || face.Location is null || face.OutputResolution is null) if (item.Property?.Id is null || face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
@ -337,16 +338,16 @@ public partial class DlibDotNet
mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, eyeα, eyeReview, wholePercentRectangle); mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, eyeα, eyeReview, wholePercentRectangle);
isUsed = mapLogic.IsUsed(ignoreXMatches, item.Property.Id.Value, mappingFromLocation); isUsed = mapLogic.IsUsed(ignoreXMatches, item.Property.Id.Value, mappingFromLocation);
inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation); inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation);
isFocusPerson = mapLogic.IsFocusPerson(_JLinkResolvedDirectories, item.Property.Id.Value, mappingFromLocation); isFocusPerson = mapLogic.IsFocusPerson(_Configuration.SkipPersonWithMoreThen, _JLinkResolvedDirectories, item.Property.Id.Value, mappingFromLocation);
mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection, isUsed); mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection, isUsed);
} }
mapping = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection); mapping = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection);
_ = mapLogic.UpdateMappingFromPerson(mapping); _ = mapLogic.UpdateMappingFromPerson(locationContainersFiles, mapping);
face.SetMapping(mapping); face.SetMapping(mapping);
} }
} }
private Mapping GetMapping(MapLogic mapLogic, Item item, bool? isFocusRelativePath, bool? isIgnoreRelativePath, MappingFromItem mappingFromItem, List<(string, long)> jLinkResolvedDirectories) private Mapping GetMapping(MapLogic mapLogic, Item item, bool? isFocusRelativePath, bool? isIgnoreRelativePath, MappingFromItem mappingFromItem)
{ {
Mapping result; Mapping result;
bool? isUsed; bool? isUsed;
@ -361,7 +362,7 @@ public partial class DlibDotNet
MappingFromFilter mappingFromFilter; MappingFromFilter mappingFromFilter;
MappingFromLocation? mappingFromLocation; MappingFromLocation? mappingFromLocation;
bool? isFocusModel = GetIsFocusModel(item.Property); bool? isFocusModel = GetIsFocusModel(item.Property);
bool ignoreXMatches = jLinkResolvedDirectories.Count > 0; bool ignoreXMatches = _JLinkResolvedDirectories.Count > 0;
if (item.Property?.Id is null) if (item.Property?.Id is null)
{ {
isUsed = null; isUsed = null;
@ -377,7 +378,7 @@ public partial class DlibDotNet
mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, eyeα, eyeReview, wholePercentRectangle); mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, eyeα, eyeReview, wholePercentRectangle);
isUsed = mapLogic.IsUsed(ignoreXMatches, item.Property.Id.Value, mappingFromLocation); isUsed = mapLogic.IsUsed(ignoreXMatches, item.Property.Id.Value, mappingFromLocation);
inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation); inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation);
isFocusPerson = mapLogic.IsFocusPerson(jLinkResolvedDirectories, item.Property.Id.Value, mappingFromLocation); isFocusPerson = mapLogic.IsFocusPerson(_Configuration.SkipPersonWithMoreThen, _JLinkResolvedDirectories, item.Property.Id.Value, mappingFromLocation);
mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection, isUsed); mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection, isUsed);
} }
result = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection: null); result = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection: null);
@ -408,7 +409,6 @@ public partial class DlibDotNet
private void FullParallelForWork(A_Property propertyLogic, private void FullParallelForWork(A_Property propertyLogic,
B_Metadata metadata, B_Metadata metadata,
ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers,
MapLogic mapLogic, MapLogic mapLogic,
string outputResolution, string outputResolution,
bool outputResolutionHasNumber, bool outputResolutionHasNumber,
@ -434,6 +434,7 @@ public partial class DlibDotNet
List<KeyValuePair<string, string>> metadataCollection; List<KeyValuePair<string, string>> metadataCollection;
string[] changesFrom = new string[] { nameof(A_Property) }; string[] changesFrom = new string[] { nameof(A_Property) };
FileHolder resizedFileHolder = _Resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber); FileHolder resizedFileHolder = _Resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber);
ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers = mapLogic.GetLocationContainers(item);
if (item.Property is null || item.Property.Id is null || item.Any()) if (item.Property is null || item.Property.Id is null || item.Any())
{ {
LogItemPropertyIsNull(item); LogItemPropertyIsNull(item);
@ -495,17 +496,12 @@ public partial class DlibDotNet
else else
{ {
List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection; List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection;
List<LocationContainer<MetadataExtractor.Directory>>? locationContainers;
if (item.Property?.Id is null)
locationContainers = null;
else
_ = idToLocationContainers.TryGetValue(item.Property.Id.Value, out locationContainers);
if (!fileNameToCollection.TryGetValue(mappingFromItem.Id, out mappingFromPhotoPrismCollection)) if (!fileNameToCollection.TryGetValue(mappingFromItem.Id, out mappingFromPhotoPrismCollection))
mappingFromPhotoPrismCollection = null; mappingFromPhotoPrismCollection = null;
faces = _Faces.GetFaces(outputResolution, dResultsFullGroupDirectory, subFileTuples, parseExceptions, property, mappingFromItem, outputResolutionToResize, locationContainers, mappingFromPhotoPrismCollection); faces = _Faces.GetFaces(outputResolution, dResultsFullGroupDirectory, subFileTuples, parseExceptions, property, mappingFromItem, outputResolutionToResize, locationContainers, mappingFromPhotoPrismCollection);
if (_AppSettings.MaxDegreeOfParallelism < 2) if (_AppSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(D_Face.GetFaces)); ticks = LogDelta(ticks, nameof(D_Face.GetFaces));
SetMapping(mapLogic, item, isFocusRelativePath, isIgnoreRelativePath, mappingFromItem, mappingFromPhotoPrismCollection, faces); SetMapping(mapLogic, item, isFocusRelativePath, isIgnoreRelativePath, locationContainers, mappingFromItem, mappingFromPhotoPrismCollection, faces);
List<(Shared.Models.Face, FileInfo?, string, bool Saved)> faceCollection = _Faces.SaveFaces(_FaceParts.FileNameExtension, dResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem, faces); List<(Shared.Models.Face, FileInfo?, string, bool Saved)> faceCollection = _Faces.SaveFaces(_FaceParts.FileNameExtension, dResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem, faces);
if (_Configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions.Contains(outputResolution)) if (_Configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions.Contains(outputResolution))
_FaceParts.CopyFacesAndSaveFaceLandmarkImage(facePartsCollectionDirectory, mappingFromItem, faceCollection); _FaceParts.CopyFacesAndSaveFaceLandmarkImage(facePartsCollectionDirectory, mappingFromItem, faceCollection);
@ -535,7 +531,6 @@ public partial class DlibDotNet
private int FullParallelWork(int maxDegreeOfParallelism, private int FullParallelWork(int maxDegreeOfParallelism,
A_Property propertyLogic, A_Property propertyLogic,
B_Metadata metadata, B_Metadata metadata,
ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers,
MapLogic mapLogic, MapLogic mapLogic,
string outputResolution, string outputResolution,
bool outputResolutionHasNumber, bool outputResolutionHasNumber,
@ -558,7 +553,7 @@ public partial class DlibDotNet
string focusRelativePath = Path.GetFullPath(string.Concat(_Configuration.PropertyConfiguration.RootDirectory, _Configuration.FocusDirectory)); string focusRelativePath = Path.GetFullPath(string.Concat(_Configuration.PropertyConfiguration.RootDirectory, _Configuration.FocusDirectory));
bool? isFocusRelativePath = string.IsNullOrEmpty(_Configuration.FocusDirectory) ? null : container.SourceDirectory.StartsWith(focusRelativePath); bool? isFocusRelativePath = string.IsNullOrEmpty(_Configuration.FocusDirectory) ? null : container.SourceDirectory.StartsWith(focusRelativePath);
string facePartsCollectionDirectory = _Configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions.Contains(outputResolution) ? _FaceParts.GetFacePartsDirectory(_Configuration.PropertyConfiguration, d2ResultsFullGroupDirectory, item: filteredItems.First(), includeNameWithoutExtension: false) : string.Empty; string facePartsCollectionDirectory = _Configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions.Contains(outputResolution) ? _FaceParts.GetFacePartsDirectory(_Configuration.PropertyConfiguration, d2ResultsFullGroupDirectory, item: filteredItems.First(), includeNameWithoutExtension: false) : string.Empty;
bool? isIgnoreRelativePath = !_Configuration.IgnoreRelativePaths.Any() ? null : _Configuration.IgnoreRelativePaths.Any(l => container.SourceDirectory.Contains(l)) && Shared.Models.Stateless.Methods.IContainer.IsIgnoreRelativePath(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, container.SourceDirectory); bool? isIgnoreRelativePath = _Configuration.IgnoreRelativePaths.Length == 0 ? null : _Configuration.IgnoreRelativePaths.Any(l => container.SourceDirectory.Contains(l)) && Shared.Models.Stateless.Methods.IContainer.IsIgnoreRelativePath(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, container.SourceDirectory);
using ProgressBar progressBar = new(filteredItems.Length, message, options); using ProgressBar progressBar = new(filteredItems.Length, message, options);
_ = Parallel.For(0, filteredItems.Length, parallelOptions, (i, state) => _ = Parallel.For(0, filteredItems.Length, parallelOptions, (i, state) =>
{ {
@ -566,7 +561,6 @@ public partial class DlibDotNet
{ {
FullParallelForWork(propertyLogic, FullParallelForWork(propertyLogic,
metadata, metadata,
idToLocationContainers,
mapLogic, mapLogic,
outputResolution, outputResolution,
outputResolutionHasNumber, outputResolutionHasNumber,
@ -582,7 +576,7 @@ public partial class DlibDotNet
isFocusRelativePath, isFocusRelativePath,
isIgnoreRelativePath, isIgnoreRelativePath,
facePartsCollectionDirectory); facePartsCollectionDirectory);
if (i == 0 || sourceDirectoryChanges.Any()) if (i == 0 || sourceDirectoryChanges.Count > 0)
progressBar.Tick(); progressBar.Tick();
} }
catch (Exception ex) catch (Exception ex)
@ -619,7 +613,7 @@ public partial class DlibDotNet
if (duplicates.Contains(metadataIdLines[i].Id)) if (duplicates.Contains(metadataIdLines[i].Id))
metadataIdLines.RemoveAt(i); metadataIdLines.RemoveAt(i);
} }
if (metadataIdLines.Any()) if (metadataIdLines.Count > 0)
{ {
text = string.Join(Environment.NewLine, from l in metadataIdLines orderby l.Id select l.Line); text = string.Join(Environment.NewLine, from l in metadataIdLines orderby l.Id select l.Line);
_ = Shared.Models.Stateless.Methods.IPath.WriteAllText(fileInfo.FullName, text, updateDateWhenMatches: true, compareBeforeWrite: true); _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(fileInfo.FullName, text, updateDateWhenMatches: true, compareBeforeWrite: true);
@ -683,7 +677,7 @@ public partial class DlibDotNet
return new(cResultsFullGroupDirectory, c2ResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory); return new(cResultsFullGroupDirectory, c2ResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory);
} }
private void FullDoWork(string argZero, string propertyRoot, long ticks, string aResultsFullGroupDirectory, string bResultsFullGroupDirectory, int t, Container[] containers, A_Property propertyLogic, B_Metadata metadata, Dictionary<int, List<MappingFromPhotoPrism>> fileNameToCollection, ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, MapLogic mapLogic) private void FullDoWork(string argZero, string propertyRoot, long ticks, string aResultsFullGroupDirectory, string bResultsFullGroupDirectory, int t, Container[] containers, A_Property propertyLogic, B_Metadata metadata, Dictionary<int, List<MappingFromPhotoPrism>> fileNameToCollection, MapLogic mapLogic)
{ {
if (_Log is null) if (_Log is null)
throw new NullReferenceException(nameof(_Log)); throw new NullReferenceException(nameof(_Log));
@ -715,12 +709,12 @@ public partial class DlibDotNet
for (int i = 0; i < containers.Length; i++) for (int i = 0; i < containers.Length; i++)
{ {
container = containers[i]; container = containers[i];
if (!container.Items.Any()) if (container.Items.Count == 0)
continue; continue;
if (!_ArgZeroIsConfigurationRootDirectory && !container.SourceDirectory.StartsWith(argZero)) if (!_ArgZeroIsConfigurationRootDirectory && !container.SourceDirectory.StartsWith(argZero))
continue; continue;
filteredItems = Shared.Models.Stateless.Methods.IContainer.GetFilterItems(_Configuration.PropertyConfiguration, container); filteredItems = Shared.Models.Stateless.Methods.IContainer.GetFilterItems(_Configuration.PropertyConfiguration, container);
if (!filteredItems.Any()) if (filteredItems.Length == 0)
continue; continue;
sourceDirectoryChanges.Clear(); sourceDirectoryChanges.Clear();
anyNullOrNoIsUniqueFileName = filteredItems.Any(l => !l.IsUniqueFileName); anyNullOrNoIsUniqueFileName = filteredItems.Any(l => !l.IsUniqueFileName);
@ -732,7 +726,6 @@ public partial class DlibDotNet
exceptionCount = FullParallelWork(maxDegreeOfParallelism, exceptionCount = FullParallelWork(maxDegreeOfParallelism,
propertyLogic, propertyLogic,
metadata, metadata,
idToLocationContainers,
mapLogic, mapLogic,
outputResolution, outputResolution,
outputResolutionHasNumber, outputResolutionHasNumber,
@ -749,7 +742,7 @@ public partial class DlibDotNet
_Exceptions.Add(container.SourceDirectory); _Exceptions.Add(container.SourceDirectory);
continue; continue;
} }
if (Directory.GetFiles(propertyRoot, "*.txt", SearchOption.TopDirectoryOnly).Any()) if (Directory.GetFiles(propertyRoot, "*.txt", SearchOption.TopDirectoryOnly).Length > 0)
{ {
for (int y = 0; y < int.MaxValue; y++) for (int y = 0; y < int.MaxValue; y++)
{ {
@ -786,7 +779,7 @@ public partial class DlibDotNet
{ {
distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh, useFiltersCounter); distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh, useFiltersCounter);
filteredFaceDistanceContainers = E_Distance.FilteredFaceDistanceContainers(mapLogic, faceDistanceContainers, skipOlderThan, distanceLimits); filteredFaceDistanceContainers = E_Distance.FilteredFaceDistanceContainers(mapLogic, faceDistanceContainers, skipOlderThan, distanceLimits);
if (filteredFaceDistanceContainers.Any()) if (filteredFaceDistanceContainers.Length == 0)
_Log.Information("All images have been filtered!"); _Log.Information("All images have been filtered!");
else else
{ {
@ -800,7 +793,7 @@ public partial class DlibDotNet
if (filteredFaceDistanceContainers.Length > 0) if (filteredFaceDistanceContainers.Length > 0)
{ {
int updated = mapLogic.UpdateFromSortingContainers(_Configuration.SaveIndividually, distanceLimits, sortingContainers); int updated = mapLogic.UpdateFromSortingContainers(_Configuration.SaveIndividually, distanceLimits, sortingContainers);
List<SaveContainer> saveContainers = mapLogic.GetSaveContainers(_Configuration.SaveIndividually, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToWholePercentagesToMapping, useFiltersCounter, sortingContainers.Any()); List<SaveContainer> saveContainers = mapLogic.GetSaveContainers(_Configuration.SaveIndividually, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToWholePercentagesToMapping, useFiltersCounter, sortingContainers.Length > 0);
mapLogic.SaveContainers(_Configuration.SaveIndividually, filteredFaceDistanceContainers.Length, updated, saveContainers); mapLogic.SaveContainers(_Configuration.SaveIndividually, filteredFaceDistanceContainers.Length, updated, saveContainers);
} }
} }
@ -810,10 +803,10 @@ public partial class DlibDotNet
{ {
E_Distance.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces); E_Distance.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces);
FaceDistanceContainer[] faceDistanceContainers = E_Distance.GetFaceDistanceContainers(distinctFilteredFaces); FaceDistanceContainer[] faceDistanceContainers = E_Distance.GetFaceDistanceContainers(distinctFilteredFaces);
Dictionary<int, Dictionary<int, PersonContainer[]>> missingIdThenWholePercentagesToPersonContainers = mapLogic.GetMissing(idToWholePercentagesToMapping); Dictionary<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> missingIdThenWholePercentagesToPersonContainers = mapLogic.GetMissing(idToWholePercentagesToMapping);
List<FaceDistanceContainer> missingFaceDistanceContainers = _Distance.GetMissingFaceDistanceContainer(_AppSettings.MaxDegreeOfParallelism, ticks, dFacesCollectionDirectory, missingIdThenWholePercentagesToPersonContainers); List<FaceDistanceContainer> missingFaceDistanceContainers = _Distance.GetMissingFaceDistanceContainer(_AppSettings.MaxDegreeOfParallelism, ticks, dFacesCollectionDirectory, missingIdThenWholePercentagesToPersonContainers);
List<FaceDistance> faceDistanceEncodings = E_Distance.GetFaceDistanceEncodings(faceDistanceContainers, missingFaceDistanceContainers); List<FaceDistance> faceDistanceEncodings = E_Distance.GetFaceDistanceEncodings(faceDistanceContainers, missingFaceDistanceContainers);
if (faceDistanceContainers.Any()) if (faceDistanceContainers.Length > 0)
SaveFaceDistances(ticks, mapLogic, mappingCollection, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, idToWholePercentagesToMapping, faceDistanceEncodings, faceDistanceContainers); SaveFaceDistances(ticks, mapLogic, mappingCollection, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, idToWholePercentagesToMapping, faceDistanceEncodings, faceDistanceContainers);
} }
@ -823,7 +816,7 @@ public partial class DlibDotNet
string d2FacePartsContentDirectory = Path.Combine(d2ResultsFullGroupDirectory, _Configuration.PropertyConfiguration.ResultContent); string d2FacePartsContentDirectory = Path.Combine(d2ResultsFullGroupDirectory, _Configuration.PropertyConfiguration.ResultContent);
string d2FacePartsContentCollectionDirectory = Path.Combine(d2ResultsFullGroupDirectory, "[()]"); string d2FacePartsContentCollectionDirectory = Path.Combine(d2ResultsFullGroupDirectory, "[()]");
string dFacesCollectionDirectory = Path.Combine(dResultsFullGroupDirectory, _Configuration.PropertyConfiguration.ResultCollection, _Configuration.PropertyConfiguration.ResultAllInOne); string dFacesCollectionDirectory = Path.Combine(dResultsFullGroupDirectory, _Configuration.PropertyConfiguration.ResultCollection, _Configuration.PropertyConfiguration.ResultAllInOne);
if (distinctFilteredMappingCollection.Any()) if (distinctFilteredMappingCollection.Length > 0)
{ {
Shared.Models.Stateless.Methods.IPath.ChangeDateForEmptyDirectories(d2FacePartsContentDirectory, ticks); Shared.Models.Stateless.Methods.IPath.ChangeDateForEmptyDirectories(d2FacePartsContentDirectory, ticks);
if (Directory.Exists(d2FacePartsContentCollectionDirectory)) if (Directory.Exists(d2FacePartsContentCollectionDirectory))
@ -852,7 +845,7 @@ public partial class DlibDotNet
string result; string result;
if (_Log is null) if (_Log is null)
throw new NullReferenceException(nameof(_Log)); throw new NullReferenceException(nameof(_Log));
if (!files.Any()) if (files.Length == 0)
throw new NotSupportedException(); throw new NotSupportedException();
string? sourceDirectory = Path.GetDirectoryName(files.First()); string? sourceDirectory = Path.GetDirectoryName(files.First());
if (string.IsNullOrEmpty(sourceDirectory)) if (string.IsNullOrEmpty(sourceDirectory))
@ -893,108 +886,6 @@ public partial class DlibDotNet
return result; return result;
} }
private static void LookForAbandoned(List<int> distinctFilteredIds, string directory, string directoryName)
{
string fileNameWithoutExtension;
bool nameWithoutExtensionIsIdFormat;
List<string> renameCollection = new();
bool nameWithoutExtensionIsPaddedIdFormat;
int sortOrderOnlyLengthIndex = IDirectory.GetSortOrderOnlyLengthIndex();
string[] distinctFilteredIdsValues = distinctFilteredIds.Select(l => l.ToString()).ToArray();
string[] files = Directory.GetFiles(directory, "*", SearchOption.AllDirectories);
foreach (string file in files)
{
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(file)));
nameWithoutExtensionIsIdFormat = Shared.Models.Stateless.Methods.IProperty.NameWithoutExtensionIsIdFormat(fileNameWithoutExtension);
nameWithoutExtensionIsPaddedIdFormat = IDirectory.NameWithoutExtensionIsPaddedIdFormat(fileNameWithoutExtension, sortOrderOnlyLengthIndex);
if (!nameWithoutExtensionIsIdFormat && !nameWithoutExtensionIsPaddedIdFormat)
continue;
if (distinctFilteredIdsValues.Contains(fileNameWithoutExtension))
continue;
renameCollection.Add(file);
}
if (renameCollection.Any())
{
if (directoryName.Length == 2)
IDirectory.MoveFiles(renameCollection, directoryName, $"{directoryName[0]}abd{directoryName[^1]}");
else if (directoryName.Length == 4)
IDirectory.MoveFiles(renameCollection, directoryName, $"{directoryName[..2]}abd{directoryName[^2..]}");
else
throw new NotSupportedException();
}
}
private static void LookForAbandoned(string bResultsFullGroupDirectory, List<int> distinctFilteredIds)
{
string[] directories = Directory.GetDirectories(bResultsFullGroupDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{
string? directoryName = Path.GetFileName(directory);
if (string.IsNullOrEmpty(directoryName) || (directoryName.Length != 2 && directoryName.Length != 4))
continue;
LookForAbandoned(distinctFilteredIds, directory, directoryName);
}
}
private void LookForAbandoned(ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, List<int> distinctFilteredIds)
{
List<string> renameCollection = new();
foreach (KeyValuePair<int, List<LocationContainer<MetadataExtractor.Directory>>> keyValuePair in idToLocationContainers)
{
if (distinctFilteredIds.Contains(keyValuePair.Key))
continue;
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in keyValuePair.Value)
{
if (locationContainer.File.Contains('!'))
continue;
renameCollection.Add(locationContainer.File);
}
}
if (renameCollection.Any())
IDirectory.MoveFiles(renameCollection, _Configuration.PropertyConfiguration.ResultContent, "(abd)");
}
private void LookForAbandoned(string bResultsFullGroupDirectory, Container[] containers, ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers)
{
string[] directories;
string? directoryName;
string cResultsFullGroupDirectory;
string dResultsFullGroupDirectory;
string c2ResultsFullGroupDirectory;
string d2ResultsFullGroupDirectory;
List<int> distinctFilteredIds = Shared.Models.Stateless.Methods.IContainer.GetFilteredDistinctIds(_Configuration.PropertyConfiguration, containers);
LookForAbandoned(idToLocationContainers, distinctFilteredIds);
LookForAbandoned(bResultsFullGroupDirectory, distinctFilteredIds);
foreach (string outputResolution in _Configuration.OutputResolutions)
{
(cResultsFullGroupDirectory, c2ResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution);
directories = Directory.GetDirectories(cResultsFullGroupDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{
directoryName = Path.GetFileName(directory);
if (string.IsNullOrEmpty(directoryName) || (directoryName.Length != 2 && directoryName.Length != 4))
continue;
LookForAbandoned(distinctFilteredIds, directory, directoryName);
}
directories = Directory.GetDirectories(dResultsFullGroupDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{
directoryName = Path.GetFileName(directory);
if (string.IsNullOrEmpty(directoryName) || (directoryName.Length != 2 && directoryName.Length != 4))
continue;
LookForAbandoned(distinctFilteredIds, directory, directoryName);
}
directories = Directory.GetDirectories(d2ResultsFullGroupDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{
directoryName = Path.GetFileName(directory);
if (string.IsNullOrEmpty(directoryName) || (directoryName.Length != 2 && directoryName.Length != 4))
continue;
LookForAbandoned(distinctFilteredIds, directory, directoryName);
}
}
}
private Mapping[] GetMappings(Property.Models.Configuration propertyConfiguration, Container[] containers, MapLogic mapLogic, bool distinctItems) private Mapping[] GetMappings(Property.Models.Configuration propertyConfiguration, Container[] containers, MapLogic mapLogic, bool distinctItems)
{ {
Mapping[] results; Mapping[] results;
@ -1011,7 +902,7 @@ public partial class DlibDotNet
List<Mapping> mappingCollection = new(); List<Mapping> mappingCollection = new();
foreach (Container container in containers) foreach (Container container in containers)
{ {
if (!container.Items.Any()) if (container.Items.Count == 0)
continue; continue;
filteredItems = Shared.Models.Stateless.Methods.IContainer.GetFilterItems(propertyConfiguration, container); filteredItems = Shared.Models.Stateless.Methods.IContainer.GetFilterItems(propertyConfiguration, container);
if (!filteredItems.Any()) if (!filteredItems.Any())
@ -1019,7 +910,7 @@ public partial class DlibDotNet
containerDateTimes = Shared.Models.Stateless.Methods.IContainer.GetContainerDateTimes(filteredItems); containerDateTimes = Shared.Models.Stateless.Methods.IContainer.GetContainerDateTimes(filteredItems);
focusRelativePath = Path.GetFullPath(string.Concat(_Configuration.PropertyConfiguration.RootDirectory, _Configuration.FocusDirectory)); focusRelativePath = Path.GetFullPath(string.Concat(_Configuration.PropertyConfiguration.RootDirectory, _Configuration.FocusDirectory));
isFocusRelativePath = string.IsNullOrEmpty(_Configuration.FocusDirectory) ? null : container.SourceDirectory.StartsWith(focusRelativePath); isFocusRelativePath = string.IsNullOrEmpty(_Configuration.FocusDirectory) ? null : container.SourceDirectory.StartsWith(focusRelativePath);
isIgnoreRelativePath = !_Configuration.IgnoreRelativePaths.Any() ? null : _Configuration.IgnoreRelativePaths.Any(l => container.SourceDirectory.Contains(l)) && Shared.Models.Stateless.Methods.IContainer.IsIgnoreRelativePath(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, container.SourceDirectory); isIgnoreRelativePath = _Configuration.IgnoreRelativePaths.Length == 0 ? null : _Configuration.IgnoreRelativePaths.Any(l => container.SourceDirectory.Contains(l)) && Shared.Models.Stateless.Methods.IContainer.IsIgnoreRelativePath(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, container.SourceDirectory);
foreach (Item item in filteredItems) foreach (Item item in filteredItems)
{ {
if (item.Property?.Id is null || item.ResizedFileHolder is null) if (item.Property?.Id is null || item.ResizedFileHolder is null)
@ -1042,7 +933,7 @@ public partial class DlibDotNet
} }
if (!anyValidFaces) if (!anyValidFaces)
{ {
mapping = GetMapping(mapLogic, item, isFocusRelativePath, isIgnoreRelativePath, mappingFromItem, _JLinkResolvedDirectories); mapping = GetMapping(mapLogic, item, isFocusRelativePath, isIgnoreRelativePath, mappingFromItem);
mappingCollection.Add(mapping); mappingCollection.Add(mapping);
} }
} }
@ -1071,7 +962,7 @@ public partial class DlibDotNet
if (!found) if (!found)
notFound.Add(item); notFound.Add(item);
} }
if (notFound.Any()) if (notFound.Count > 0)
throw new NotSupportedException(); throw new NotSupportedException();
#endif #endif
string model; string model;
@ -1140,6 +1031,44 @@ public partial class DlibDotNet
} }
} }
private static bool GetRunToDoCollectionFirst(long ticks, string rootDirectory, FileSystemInfo fileSystemInfo)
{
bool result = false;
string[] directories;
string seasonDirectory;
DirectoryInfo directoryInfo;
DateTime dateTime = new(ticks);
(int season, string seasonName) = Shared.Models.Stateless.Methods.IProperty.GetSeason(dateTime.DayOfYear);
string[] checkDirectories = new string[]
{
Path.Combine(rootDirectory, "Ancestry"),
Path.Combine(rootDirectory, "Facebook"),
Path.Combine(rootDirectory, "LinkedIn"),
rootDirectory,
};
foreach (string checkDirectory in checkDirectories)
{
if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory);
seasonDirectory = Path.Combine(checkDirectory, $"{dateTime.Year}.{season} {seasonName} {Path.GetFileName(checkDirectory)}");
if (!Directory.Exists(seasonDirectory))
_ = Directory.CreateDirectory(seasonDirectory);
if (result)
continue;
directories = Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{
directoryInfo = new(directory);
if (directoryInfo.LastWriteTime > fileSystemInfo.LastWriteTime)
{
result = true;
break;
}
}
}
return result;
}
private void Search(long ticks, ReadOnlyCollection<PersonContainer> personContainers, string argZero, string propertyRoot) private void Search(long ticks, ReadOnlyCollection<PersonContainer> personContainers, string argZero, string propertyRoot)
{ {
int t; int t;
@ -1170,8 +1099,8 @@ public partial class DlibDotNet
a2PeopleContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People), "([])"); a2PeopleContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People), "([])");
eDistanceContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(E_Distance), _Configuration.PropertyConfiguration.ResultContent); eDistanceContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(E_Distance), _Configuration.PropertyConfiguration.ResultContent);
string a2PeopleSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People), _Configuration.PropertyConfiguration.ResultSingleton); string a2PeopleSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People), _Configuration.PropertyConfiguration.ResultSingleton);
TimeSpan eLastWriteTimeTimeSpan = new(ticks - new DirectoryInfo(eDistanceContentDirectory).LastWriteTime.Ticks); bool runToDoCollectionFirst = GetRunToDoCollectionFirst(ticks, _Configuration.PropertyConfiguration.RootDirectory, new DirectoryInfo(eDistanceContentDirectory));
if (eLastWriteTimeTimeSpan.TotalDays > 1) if (runToDoCollectionFirst)
mapLogic = null; mapLogic = null;
else else
mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, personContainers, ticks, a2PeopleSingletonDirectory, eDistanceContentDirectory); mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, personContainers, ticks, a2PeopleSingletonDirectory, eDistanceContentDirectory);
@ -1180,7 +1109,7 @@ public partial class DlibDotNet
if (outputResolution.Any(l => char.IsNumber(l))) if (outputResolution.Any(l => char.IsNumber(l)))
continue; continue;
configurationOutputResolutionsHas = true; configurationOutputResolutionsHas = true;
if (eLastWriteTimeTimeSpan.TotalDays < 1) if (!runToDoCollectionFirst)
break; break;
ProgressBar progressBar; ProgressBar progressBar;
(cResultsFullGroupDirectory, _, _, _) = GetResultsFullGroupDirectories(outputResolution); (cResultsFullGroupDirectory, _, _, _) = GetResultsFullGroupDirectories(outputResolution);
@ -1249,16 +1178,21 @@ public partial class DlibDotNet
B_Metadata metadata = new(_Configuration.PropertyConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata, bResultsFullGroupDirectory); B_Metadata metadata = new(_Configuration.PropertyConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata, bResultsFullGroupDirectory);
mapLogic ??= new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, personContainers, ticks, a2PeopleSingletonDirectory, eDistanceContentDirectory); mapLogic ??= new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, personContainers, ticks, a2PeopleSingletonDirectory, eDistanceContentDirectory);
containers = Shared.Models.Stateless.Methods.IContainer.SortContainers(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, _ArgZeroIsConfigurationRootDirectory, argZero, containers); containers = Shared.Models.Stateless.Methods.IContainer.SortContainers(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, _ArgZeroIsConfigurationRootDirectory, argZero, containers);
ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers = mapLogic.GetIdToLocationContainers(); FullDoWork(argZero, propertyRoot, ticks, aResultsFullGroupDirectory, bResultsFullGroupDirectory, t, containers, propertyLogic, metadata, fileNameToCollection, mapLogic);
FullDoWork(argZero, propertyRoot, ticks, aResultsFullGroupDirectory, bResultsFullGroupDirectory, t, containers, propertyLogic, metadata, fileNameToCollection, idToLocationContainers, mapLogic);
if (_Configuration.LookForAbandoned)
LookForAbandoned(bResultsFullGroupDirectory, containers, idToLocationContainers);
_Distance.Clear();
List<Item> distinctFilteredItems = Shared.Models.Stateless.Methods.IContainer.GetItems(_Configuration.PropertyConfiguration, containers, distinctItems: true, filterItems: true); List<Item> distinctFilteredItems = Shared.Models.Stateless.Methods.IContainer.GetItems(_Configuration.PropertyConfiguration, containers, distinctItems: true, filterItems: true);
if (_Configuration.LookForAbandoned)
{
foreach (string outputResolution in _Configuration.OutputResolutions)
{
(cResultsFullGroupDirectory, _, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution);
mapLogic.LookForAbandoned(_Configuration.PropertyConfiguration, bResultsFullGroupDirectory, containers, cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory);
}
}
_Distance.Clear();
Verify(eDistanceContentDirectory, distinctFilteredItems); Verify(eDistanceContentDirectory, distinctFilteredItems);
List<Shared.Models.Face> distinctFilteredFaces = Map.Models.Stateless.Methods.IMapLogic.GetFaces(distinctFilteredItems); List<Shared.Models.Face> distinctFilteredFaces = Map.Models.Stateless.Methods.IMapLogic.GetFaces(distinctFilteredItems);
Mapping[] distinctFilteredMappingCollection = GetMappings(_Configuration.PropertyConfiguration, containers, mapLogic, distinctItems: true); Mapping[] distinctFilteredMappingCollection = GetMappings(_Configuration.PropertyConfiguration, containers, mapLogic, distinctItems: true);
int totalNotMapped = mapLogic.UpdateMappingFromPerson(distinctFilteredMappingCollection); int totalNotMapped = mapLogic.UpdateMappingFromPerson(_Configuration.PropertyConfiguration, distinctFilteredMappingCollection);
string json = JsonSerializer.Serialize(distinctFilteredMappingCollection); string json = JsonSerializer.Serialize(distinctFilteredMappingCollection);
File.WriteAllText(Path.Combine(eDistanceContentDirectory, $"{ticks}.json"), json); File.WriteAllText(Path.Combine(eDistanceContentDirectory, $"{ticks}.json"), json);
foreach (string outputResolution in _Configuration.OutputResolutions) foreach (string outputResolution in _Configuration.OutputResolutions)
@ -1268,7 +1202,7 @@ public partial class DlibDotNet
personKeyToIds = mapLogic.GetPersonKeyToIds(); personKeyToIds = mapLogic.GetPersonKeyToIds();
if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution))
mapLogic.SaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, distinctFilteredMappingCollection); mapLogic.SaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, distinctFilteredMappingCollection);
if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.JLinks.Length > 0 && _Configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions.Contains(outputResolution)) if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.JLinks.Where(l => !string.IsNullOrEmpty(l)).Any() && _Configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions.Contains(outputResolution))
mapLogic.SaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, personContainers, a2PeopleContentDirectory, personKeyToIds, distinctFilteredMappingCollection, totalNotMapped); mapLogic.SaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, personContainers, a2PeopleContentDirectory, personKeyToIds, distinctFilteredMappingCollection, totalNotMapped);
(cResultsFullGroupDirectory, c2ResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution); (cResultsFullGroupDirectory, c2ResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution);
if (_ArgZeroIsConfigurationRootDirectory if (_ArgZeroIsConfigurationRootDirectory
@ -1277,7 +1211,7 @@ public partial class DlibDotNet
&& _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution) && _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution)
&& _Exceptions.Count == 0) && _Exceptions.Count == 0)
MapLogic(ticks, containers, a2PeopleSingletonDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, fPhotoPrismContentDirectory, mapLogic, outputResolution, personKeyToIds, distinctFilteredFaces, distinctFilteredMappingCollection, totalNotMapped); MapLogic(ticks, containers, a2PeopleSingletonDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, fPhotoPrismContentDirectory, mapLogic, outputResolution, personKeyToIds, distinctFilteredFaces, distinctFilteredMappingCollection, totalNotMapped);
if (_Configuration.SaveRandomForOutputResolutions.Contains(outputResolution) && personKeyToIds.Any() && distinctFilteredMappingCollection.Any()) if (_Configuration.SaveRandomForOutputResolutions.Contains(outputResolution) && personKeyToIds.Count > 0 && distinctFilteredMappingCollection.Length > 0)
_Random.Random(_Configuration.PropertyConfiguration, outputResolution, personKeyToIds, distinctFilteredMappingCollection); _Random.Random(_Configuration.PropertyConfiguration, outputResolution, personKeyToIds, distinctFilteredMappingCollection);
if (_IsEnvironment.Development) if (_IsEnvironment.Development)
continue; continue;

View File

@ -84,6 +84,7 @@ public class Configuration
[Display(Name = "Save Sorting Without Person"), Required] public bool? SaveSortingWithoutPerson { get; set; } [Display(Name = "Save Sorting Without Person"), Required] public bool? SaveSortingWithoutPerson { get; set; }
[Display(Name = "Skip Not Skip Directories"), Required] public string[] SkipNotSkipDirectories { get; set; } [Display(Name = "Skip Not Skip Directories"), Required] public string[] SkipNotSkipDirectories { get; set; }
[Display(Name = "Skip Older Than Days"), Required] public int? SkipOlderThanDays { get; set; } [Display(Name = "Skip Older Than Days"), Required] public int? SkipOlderThanDays { get; set; }
[Display(Name = "Skip Person With More Then"), Required] public int? SkipPersonWithMoreThen { get; set; }
[Display(Name = "Skip Search"), Required] public bool? SkipSearch { get; set; } [Display(Name = "Skip Search"), Required] public bool? SkipSearch { get; set; }
[Display(Name = "SortingMaximumPerFaceShould be High"), Required] public int? SortingMaximumPerFaceShouldBeHigh { get; set; } [Display(Name = "SortingMaximumPerFaceShould be High"), Required] public int? SortingMaximumPerFaceShouldBeHigh { get; set; }
[Display(Name = "Sorting Maximum Per Key"), Required] public int? SortingMaximumPerKey { get; set; } [Display(Name = "Sorting Maximum Per Key"), Required] public int? SortingMaximumPerKey { get; set; }
@ -314,6 +315,7 @@ public class Configuration
configuration.SaveSortingWithoutPerson.Value, configuration.SaveSortingWithoutPerson.Value,
configuration.SkipNotSkipDirectories, configuration.SkipNotSkipDirectories,
configuration.SkipOlderThanDays, configuration.SkipOlderThanDays,
configuration.SkipPersonWithMoreThen,
configuration.SkipSearch.Value, configuration.SkipSearch.Value,
configuration.SortingMaximumPerFaceShouldBeHigh.Value, configuration.SortingMaximumPerFaceShouldBeHigh.Value,
configuration.SortingMaximumPerKey.Value, configuration.SortingMaximumPerKey.Value,

View File

@ -14,15 +14,14 @@ public class Configuration
public bool CheckJsonForDistanceResults { init; get; } public bool CheckJsonForDistanceResults { init; get; }
public string[] CopyFacesAndSaveFaceLandmarkForOutputResolutions { init; get; } public string[] CopyFacesAndSaveFaceLandmarkForOutputResolutions { init; get; }
public int CrossDirectoryMaxItemsInDistanceCollection { init; get; } public int CrossDirectoryMaxItemsInDistanceCollection { init; get; }
public bool DeletePossibleDuplicates { get; internal set; }
public int DistanceFactor { init; get; } public int DistanceFactor { init; get; }
public bool DistanceMoveUnableToMatch { init; get; } public bool DistanceMoveUnableToMatch { init; get; }
public int DistancePixelDistanceTolerance { init; get; } public int DistancePixelDistanceTolerance { init; get; }
public bool DistanceRenameToMatch { init; get; } public bool DistanceRenameToMatch { init; get; }
public int EyeThreshold { init; get; } public int EyeThreshold { init; get; }
public int FaceAreaPermyriad { init; get; } public int FaceAreaPermyriad { init; get; }
public int FaceDistanceHiddenImageFactor { init; get; }
public int FaceConfidencePercent { init; get; } public int FaceConfidencePercent { init; get; }
public int FaceDistanceHiddenImageFactor { init; get; }
public int FaceDistancePermyriad { init; get; } public int FaceDistancePermyriad { init; get; }
public string FocusDirectory { init; get; } public string FocusDirectory { init; get; }
public string FocusModel { init; get; } public string FocusModel { init; get; }
@ -72,22 +71,24 @@ public class Configuration
public string[] SaveFaceDistancesForOutputResolutions { init; get; } public string[] SaveFaceDistancesForOutputResolutions { init; get; }
public string[] SaveFaceLandmarkForOutputResolutions { init; get; } public string[] SaveFaceLandmarkForOutputResolutions { init; get; }
public string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions { init; get; } public string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions { init; get; }
public bool SaveIndividually { init; get; }
public bool SaveFullYearOfRandomFiles { init; get; } public bool SaveFullYearOfRandomFiles { init; get; }
public bool SaveIndividually { init; get; }
public string[] SaveMappedForOutputResolutions { init; get; } public string[] SaveMappedForOutputResolutions { init; get; }
public string[] SaveRandomForOutputResolutions { init; get; } public string[] SaveRandomForOutputResolutions { init; get; }
public bool SaveResizedSubfiles { init; get; } public bool SaveResizedSubfiles { init; get; }
public string[] SaveShortcutsForOutputResolutions { init; get; } public string[] SaveShortcutsForOutputResolutions { init; get; }
public bool SaveSortingWithoutPerson { init; get; } public bool SaveSortingWithoutPerson { init; get; }
public string[] SkipNotSkipDirectories { init; get; } public string[] SkipNotSkipDirectories { init; get; }
public bool SkipSearch { init; get; }
public int? SkipOlderThanDays { init; get; } public int? SkipOlderThanDays { init; get; }
public int? SkipPersonWithMoreThen { init; get; }
public bool SkipSearch { init; get; }
public int SortingMaximumPerFaceShouldBeHigh { init; get; } public int SortingMaximumPerFaceShouldBeHigh { init; get; }
public int SortingMaximumPerKey { init; get; } public int SortingMaximumPerKey { init; get; }
public int SortingMinimumToUseSigma { init; get; } public int SortingMinimumToUseSigma { init; get; }
public bool TestDistanceResults { init; get; } public bool TestDistanceResults { init; get; }
public int UseFilterTries { init; get; } public int UseFilterTries { init; get; }
public string[] ValidResolutions { init; get; } public string[] ValidResolutions { init; get; }
public bool DeletePossibleDuplicates { get; internal set; }
[JsonConstructor] [JsonConstructor]
public Configuration(Property.Models.Configuration propertyConfiguration, public Configuration(Property.Models.Configuration propertyConfiguration,
@ -162,6 +163,7 @@ public class Configuration
bool saveSortingWithoutPerson, bool saveSortingWithoutPerson,
string[] skipNotSkipDirectories, string[] skipNotSkipDirectories,
int? skipOlderThanDays, int? skipOlderThanDays,
int? skipPersonWithMoreThen,
bool skipSearch, bool skipSearch,
int sortingMaximumPerFaceShouldBeHigh, int sortingMaximumPerFaceShouldBeHigh,
int sortingMaximumPerKey, int sortingMaximumPerKey,
@ -182,8 +184,8 @@ public class Configuration
DistanceRenameToMatch = distanceRenameToMatch; DistanceRenameToMatch = distanceRenameToMatch;
EyeThreshold = eyeThreshold; EyeThreshold = eyeThreshold;
FaceAreaPermyriad = faceAreaPermyriad; FaceAreaPermyriad = faceAreaPermyriad;
FaceDistanceHiddenImageFactor = faceDistanceHiddenImageFactor;
FaceConfidencePercent = faceConfidencePercent; FaceConfidencePercent = faceConfidencePercent;
FaceDistanceHiddenImageFactor = faceDistanceHiddenImageFactor;
FaceDistancePermyriad = faceDistancePermyriad; FaceDistancePermyriad = faceDistancePermyriad;
FocusDirectory = focusDirectory; FocusDirectory = focusDirectory;
FocusModel = focusModel; FocusModel = focusModel;
@ -233,8 +235,8 @@ public class Configuration
SaveFaceDistancesForOutputResolutions = saveFaceDistancesForOutputResolutions; SaveFaceDistancesForOutputResolutions = saveFaceDistancesForOutputResolutions;
SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions; SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions;
SaveFilteredOriginalImagesFromJLinksForOutputResolutions = saveFilteredOriginalImagesFromJLinksForOutputResolutions; SaveFilteredOriginalImagesFromJLinksForOutputResolutions = saveFilteredOriginalImagesFromJLinksForOutputResolutions;
SaveIndividually = saveIndividually;
SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles; SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles;
SaveIndividually = saveIndividually;
SaveMappedForOutputResolutions = saveMappedForOutputResolutions; SaveMappedForOutputResolutions = saveMappedForOutputResolutions;
SaveRandomForOutputResolutions = saveRandomForOutputResolutions; SaveRandomForOutputResolutions = saveRandomForOutputResolutions;
SaveResizedSubfiles = saveResizedSubfiles; SaveResizedSubfiles = saveResizedSubfiles;
@ -242,6 +244,7 @@ public class Configuration
SaveSortingWithoutPerson = saveSortingWithoutPerson; SaveSortingWithoutPerson = saveSortingWithoutPerson;
SkipNotSkipDirectories = skipNotSkipDirectories; SkipNotSkipDirectories = skipNotSkipDirectories;
SkipOlderThanDays = skipOlderThanDays; SkipOlderThanDays = skipOlderThanDays;
SkipPersonWithMoreThen = skipPersonWithMoreThen;
SkipSearch = skipSearch; SkipSearch = skipSearch;
SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh; SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh;
SortingMaximumPerKey = sortingMaximumPerKey; SortingMaximumPerKey = sortingMaximumPerKey;

View File

@ -85,7 +85,7 @@ internal class F_Random
relativePaths.Add(mapping.MappingFromItem.RelativePath); relativePaths.Add(mapping.MappingFromItem.RelativePath);
distinctCollection.Add(mapping.MappingFromItem.Id); distinctCollection.Add(mapping.MappingFromItem.Id);
} }
if (relativePaths.Any()) if (relativePaths.Count > 0)
{ {
for (int i = 0; i < 366; i++) for (int i = 0; i < 366; i++)
{ {

View File

@ -13,18 +13,18 @@ namespace View_by_Distance.Map.Models;
public class MapLogic : Shared.Models.Methods.IMapLogic public class MapLogic : Shared.Models.Methods.IMapLogic
{ {
protected readonly List<PersonContainer> _NotMappedPersonContainers;
protected readonly ReadOnlyDictionary<int, List<int>> _SkipCollection;
protected readonly ReadOnlyDictionary<int, List<int>> _SkipNotSkipCollection;
protected readonly ReadOnlyDictionary<long, PersonContainer> _PersonKeyToPersonContainer;
protected readonly List<LocationContainer<MetadataExtractor.Directory>> _LocationContainers;
protected readonly ReadOnlyDictionary<int, Dictionary<int, PersonContainer[]>> _IdThenWholePercentagesToPersonContainers;
private readonly long _Ticks; private readonly long _Ticks;
private readonly Serilog.ILogger? _Log; private readonly Serilog.ILogger? _Log;
private readonly Configuration? _Configuration; private readonly Configuration? _Configuration;
private readonly string _EDistanceContentTicksDirectory; private readonly string _EDistanceContentTicksDirectory;
private readonly ReadOnlyDictionary<long, int> _PersonKeyToCount;
private readonly List<PersonContainer> _NotMappedPersonContainers;
private readonly ReadOnlyDictionary<int, List<int>> _SkipCollection;
private readonly ReadOnlyDictionary<int, List<int>> _SkipNotSkipCollection;
private readonly ReadOnlyDictionary<long, PersonContainer> _PersonKeyToPersonContainer;
private readonly Shared.Models.Properties.IPropertyConfiguration _PropertyConfiguration; private readonly Shared.Models.Properties.IPropertyConfiguration _PropertyConfiguration;
private readonly ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> _IdToLocationContainers;
private readonly ReadOnlyDictionary<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> _IdThenWholePercentagesToPersonContainers;
public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, ReadOnlyCollection<PersonContainer> personContainers, long ticks, string a2PeopleSingletonDirectory, string eDistanceContentDirectory) public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, ReadOnlyCollection<PersonContainer> personContainers, long ticks, string a2PeopleSingletonDirectory, string eDistanceContentDirectory)
{ {
@ -34,56 +34,83 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
_PropertyConfiguration = propertyConfiguration; _PropertyConfiguration = propertyConfiguration;
if (_Log is null) if (_Log is null)
{ } { }
string json; ReadOnlyDictionary<long, int> readOnlyPersonKeyToCount;
string fullPath;
List<KeyValuePair<int, int[]>>? collection;
Dictionary<int, List<int>> skipCollection = new();
List<PersonContainer> notMappedPersonContainers = new(); List<PersonContainer> notMappedPersonContainers = new();
Dictionary<int, List<int>> skipNotSkipCollection = new(); Dictionary<int, List<(string, int)>> skipCollection = new();
Dictionary<int, List<(string, int)>> skipNotSkipCollection = new();
Dictionary<long, PersonContainer> personKeyToPersonContainer = new(); Dictionary<long, PersonContainer> personKeyToPersonContainer = new();
List<LocationContainer<MetadataExtractor.Directory>> locationContainers = new(); List<LocationContainer<MetadataExtractor.Directory>> locationContainers = new();
string? rootDirectoryParent = Path.GetDirectoryName(propertyConfiguration.RootDirectory); string? rootDirectoryParent = Path.GetDirectoryName(propertyConfiguration.RootDirectory);
string eDistanceContentTicksDirectory = Path.Combine(eDistanceContentDirectory, $"({ticks})"); string eDistanceContentTicksDirectory = Path.Combine(eDistanceContentDirectory, $"({ticks})");
Dictionary<int, Dictionary<int, PersonContainer[]>> idThenWholePercentagesToPersonContainers = new(); ReadOnlyDictionary<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> idThenWholePercentagesToPersonContainers;
Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers = new();
if (string.IsNullOrEmpty(rootDirectoryParent)) if (string.IsNullOrEmpty(rootDirectoryParent))
throw new NullReferenceException(nameof(rootDirectoryParent)); throw new NullReferenceException(nameof(rootDirectoryParent));
if (!Directory.Exists(eDistanceContentDirectory)) if (!Directory.Exists(eDistanceContentDirectory))
_ = Directory.CreateDirectory(eDistanceContentDirectory); _ = Directory.CreateDirectory(eDistanceContentDirectory);
if (configuration is not null) if (configuration is null)
{ {
Stateless.MapLogic.Set(maxDegreeOfParallelism, readOnlyPersonKeyToCount = new(new Dictionary<long, int>());
configuration, idThenWholePercentagesToPersonContainers = new(new Dictionary<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>>());
ticks,
personContainers,
a2PeopleSingletonDirectory,
eDistanceContentDirectory,
personKeyToPersonContainer,
notMappedPersonContainers,
skipCollection,
skipNotSkipCollection,
locationContainers,
idThenWholePercentagesToPersonContainers);
} }
foreach (string propertyContentCollectionFile in propertyConfiguration.PropertyContentCollectionFiles) else
{ {
fullPath = Path.GetFullPath(string.Concat(rootDirectoryParent, propertyContentCollectionFile)); ReadOnlyDictionary<string, PersonContainer> readOnlyPersonKeyFormattedToPersonContainer;
if (fullPath.Contains(propertyConfiguration.RootDirectory)) ReadOnlyDictionary<long, List<PersonContainer>> readOnlyPersonKeyToPersonContainerCollection;
continue; Stateless.MapLogic.SetSkipCollections(configuration, personContainers, a2PeopleSingletonDirectory, skipCollection, skipNotSkipCollection);
if (!File.Exists(fullPath)) List<Stateless.MapLogic.Record> records = Stateless.MapLogic.SetPersonCollectionsAndGetRecords(configuration, ticks, personContainers, eDistanceContentDirectory);
continue; locationContainers.AddRange(Stateless.MapLogic.GetLocationContainers(maxDegreeOfParallelism, configuration, ticks, personContainers, eDistanceContentDirectory, skipCollection, records));
json = File.ReadAllText(fullPath); int lossCount = records.Count - locationContainers.Count;
collection = JsonSerializer.Deserialize<List<KeyValuePair<int, int[]>>>(json); ReadOnlyCollection<Stateless.MapLogic.PersonKeyFormattedIdThenWholePercentages> personKeyFormattedIdThenWholePercentagesCollection = Stateless.MapLogic.GetPersonKeyFormattedIdThenWholePercentages(configuration, ticks, records);
if (collection is null) int unableToMatchCount = records.Count - personKeyFormattedIdThenWholePercentagesCollection.Count;
throw new NullReferenceException(nameof(collection)); if (lossCount != 0 || unableToMatchCount != 0)
{
if (lossCount != 0 || unableToMatchCount != 0)
{ }
}
//
{
Dictionary<long, int> personKeyToCount = new();
Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer = new();
Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection = new();
List<(Stateless.MapLogic.PersonKeyFormattedIdThenWholePercentages, PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer = new();
Stateless.MapLogic.SetKeyValuePairsAndAddToCollections(configuration,
personContainers,
personKeyToPersonContainer,
personKeyFormattedIdThenWholePercentagesCollection,
personKeyToCount,
personKeyFormattedToPersonContainer,
personKeyToPersonContainerCollection,
possiblyNewPersonDisplayDirectoryNamesAndPersonContainer);
readOnlyPersonKeyToCount = new(personKeyToCount);
readOnlyPersonKeyFormattedToPersonContainer = new(personKeyFormattedToPersonContainer);
readOnlyPersonKeyToPersonContainerCollection = new(personKeyToPersonContainerCollection);
if (possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Count > 0)
Stateless.MapLogic.PossiblyRebuildPersonContainers(configuration,
a2PeopleSingletonDirectory,
possiblyNewPersonDisplayDirectoryNamesAndPersonContainer);
}
Stateless.MapLogic.SetPersonKeyToPersonContainer(configuration,
personContainers,
readOnlyPersonKeyToCount,
personKeyToPersonContainer,
readOnlyPersonKeyToPersonContainerCollection);
idThenWholePercentagesToPersonContainers = Stateless.MapLogic.GetIdThenWholePercentagesToPersonContainers(configuration,
readOnlyPersonKeyFormattedToPersonContainer,
personKeyFormattedIdThenWholePercentagesCollection);
notMappedPersonContainers.AddRange(Stateless.MapLogic.GetNotMappedPersonContainers(configuration,
ticks,
personContainers,
readOnlyPersonKeyToCount));
} }
_SkipCollection = new(skipCollection); _PersonKeyToCount = readOnlyPersonKeyToCount;
_LocationContainers = locationContainers;
_SkipNotSkipCollection = new(skipNotSkipCollection);
_PersonKeyToPersonContainer = new(personKeyToPersonContainer); _PersonKeyToPersonContainer = new(personKeyToPersonContainer);
_EDistanceContentTicksDirectory = eDistanceContentTicksDirectory; _EDistanceContentTicksDirectory = eDistanceContentTicksDirectory;
_NotMappedPersonContainers = notMappedPersonContainers.OrderByDescending(l => l.Key).ToList(); _SkipCollection = Stateless.MapLogic.ConvertSkip(skipCollection);
_IdThenWholePercentagesToPersonContainers = new(idThenWholePercentagesToPersonContainers); Stateless.MapLogic.CheckCollection(propertyConfiguration, rootDirectoryParent);
_IdThenWholePercentagesToPersonContainers = idThenWholePercentagesToPersonContainers;
_SkipNotSkipCollection = Stateless.MapLogic.ConvertSkipNotSkip(skipNotSkipCollection);
_IdToLocationContainers = Stateless.MapLogic.ConvertLocationContainers(locationContainers);
_NotMappedPersonContainers = new(notMappedPersonContainers.OrderByDescending(l => l.Key).ToArray());
} }
public override string ToString() public override string ToString()
@ -92,16 +119,19 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return result; return result;
} }
public ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> GetIdToLocationContainers() public ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> GetLocationContainers(Item item)
{ {
Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> results = new(); LocationContainer<MetadataExtractor.Directory>[] results;
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in _LocationContainers) if (item.Property?.Id is null)
results = Array.Empty<LocationContainer<MetadataExtractor.Directory>>();
else
{ {
if (!results.ContainsKey(locationContainer.Id)) List<LocationContainer<MetadataExtractor.Directory>>? locationContainers;
results.Add(locationContainer.Id, new()); if (_IdToLocationContainers.TryGetValue(item.Property.Id.Value, out locationContainers))
results[locationContainer.Id].Add(locationContainer); results = locationContainers.ToArray();
else
results = Array.Empty<LocationContainer<MetadataExtractor.Directory>>();
} }
_LocationContainers.Clear();
return new(results); return new(results);
} }
@ -113,9 +143,9 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
List<int>? collection; List<int>? collection;
PersonBirthday personBirthday; PersonBirthday personBirthday;
List<string> shouldMove = new(); List<string> shouldMove = new();
foreach (KeyValuePair<int, Dictionary<int, PersonContainer[]>> idToCollection in _IdThenWholePercentagesToPersonContainers) foreach (KeyValuePair<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> idToCollection in _IdThenWholePercentagesToPersonContainers)
{ {
foreach (KeyValuePair<int, PersonContainer[]> wholePercentagesToPersonContainers in idToCollection.Value) foreach (KeyValuePair<int, ReadOnlyCollection<PersonContainer>> wholePercentagesToPersonContainers in idToCollection.Value)
{ {
foreach (PersonContainer personContainer in wholePercentagesToPersonContainers.Value) foreach (PersonContainer personContainer in wholePercentagesToPersonContainers.Value)
{ {
@ -137,28 +167,26 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
} }
} }
} }
if (shouldMove.Any()) if (shouldMove.Count > 0)
throw new Exception(string.Join(Environment.NewLine, shouldMove)); throw new Exception(string.Join(Environment.NewLine, shouldMove));
return results; return results;
} }
(bool, Dictionary<int, PersonContainer[]>?) Shared.Models.Methods.IMapLogic.GetWholePercentagesToPersonContainers(int id) (bool, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>?) Shared.Models.Methods.IMapLogic.GetWholePercentagesToPersonContainers(int id)
{ {
bool result = _IdThenWholePercentagesToPersonContainers.TryGetValue(id, out Dictionary<int, PersonContainer[]>? wholePercentagesToPersonContainers); bool result = _IdThenWholePercentagesToPersonContainers.TryGetValue(id, out ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers);
return new(result, wholePercentagesToPersonContainers); return new(result, wholePercentagesToPersonContainers);
} }
public int UpdateMappingFromPerson(Mapping mapping) public int UpdateMappingFromPerson(ReadOnlyCollection<string>? locationContainersFiles, Mapping mapping)
{ {
if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration));
int result = 0; int result = 0;
long personKey; long personKey;
const int zero = 0; const int zero = 0;
string mappingSegmentB; string mappingSegmentB;
PersonBirthday personBirthday; PersonBirthday personBirthday;
PersonContainer[]? personContainers; ReadOnlyCollection<PersonContainer>? personContainers;
Dictionary<int, PersonContainer[]>? wholePercentagesToPersonContainers; ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers;
for (int i = 1; i < 2; i++) for (int i = 1; i < 2; i++)
{ {
if (mapping.MappingFromLocation is null) if (mapping.MappingFromLocation is null)
@ -184,20 +212,31 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
personBirthday = personContainer.Birthdays[zero]; personBirthday = personContainer.Birthdays[zero];
personKey = personBirthday.Value.Ticks; personKey = personBirthday.Value.Ticks;
mappingSegmentB = Stateless.MapLogic.GetMappingSegmentB(_Ticks, personBirthday, personContainer.ApproximateYears, mapping.MappingFromItem); mappingSegmentB = Stateless.MapLogic.GetMappingSegmentB(_Ticks, personBirthday, personContainer.ApproximateYears, mapping.MappingFromItem);
mapping.UpdateMappingFromPerson(personContainer.ApproximateYears, personContainer.DisplayDirectoryName, personBirthday, mappingSegmentB); if (locationContainersFiles is null)
{
if (mapping.MappingFromPerson is null || mapping.MappingFromPerson.LocationContainersFiles.Count == 0)
locationContainersFiles = new(Array.Empty<string>());
else
locationContainersFiles = mapping.MappingFromPerson.LocationContainersFiles;
}
mapping.UpdateMappingFromPerson(locationContainersFiles, personContainer.ApproximateYears, personContainer.DisplayDirectoryName, personBirthday, mappingSegmentB);
} }
} }
return result; return result;
} }
public int UpdateMappingFromPerson(Mapping[] mappingCollection) public int UpdateMappingFromPerson(Property.Models.Configuration propertyConfiguration, Mapping[] mappingCollection)
{ {
int result = 0; int result = 0;
ReadOnlyCollection<string>? locationContainersFiles = null;
foreach (Mapping mapping in mappingCollection) foreach (Mapping mapping in mappingCollection)
{ {
if (mapping.MappingFromLocation is null) if (mapping.MappingFromLocation is null)
continue; continue;
result += UpdateMappingFromPerson(mapping); result += UpdateMappingFromPerson(locationContainersFiles, mapping);
if (mapping.MappingFromPerson is null || mapping.MappingFromPerson.LocationContainersFiles.Count == 0)
continue;
Stateless.MapLogic.MoveToDecade(propertyConfiguration, mapping.MappingFromItem, mapping.MappingFromPerson);
} }
return result; return result;
} }
@ -564,8 +603,8 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
Sorting sorting; Sorting sorting;
FaceDistance faceDistanceLength; FaceDistance faceDistanceLength;
List<int>? wholePercentagesCollection; List<int>? wholePercentagesCollection;
bool skipNotSkipCollectionAny = _SkipNotSkipCollection.Any(); bool skipNotSkipCollectionAny = _SkipNotSkipCollection.Count > 0;
Dictionary<int, PersonContainer[]>? wholePercentagesToPersonContainers; ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers;
for (int j = 0; j < faceDistanceLengths.Count; j++) for (int j = 0; j < faceDistanceLengths.Count; j++)
{ {
if (faceDistanceEncoding.WholePercentages is null) if (faceDistanceEncoding.WholePercentages is null)
@ -615,14 +654,14 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
string mappingSegmentB; string mappingSegmentB;
string personKeyFormatted; string personKeyFormatted;
PersonBirthday personBirthday; PersonBirthday personBirthday;
PersonContainer[]? personContainers;
List<int> wholePercentagesCollectionForA; List<int> wholePercentagesCollectionForA;
List<int> wholePercentagesCollectionForB; List<int> wholePercentagesCollectionForB;
Dictionary<string, int> keyToCount = new(); Dictionary<string, int> keyToCount = new();
Dictionary<string, string> keyToSegmentC = new(); Dictionary<string, string> keyToSegmentC = new();
ReadOnlyCollection<PersonContainer>? personContainers;
Dictionary<int, List<int>> idToWholePercentagesCollectionForA = new(); Dictionary<int, List<int>> idToWholePercentagesCollectionForA = new();
Dictionary<int, List<int>> idToWholePercentagesCollectionForB = new(); Dictionary<int, List<int>> idToWholePercentagesCollectionForB = new();
Dictionary<int, PersonContainer[]>? wholePercentagesToPersonContainers; ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers;
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - _Ticks).TotalSeconds); int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - _Ticks).TotalSeconds);
string message = $") {sortingContainers.Length:000} Update From Sorting Container(s) - {totalSeconds} total second(s)"; string message = $") {sortingContainers.Length:000} Update From Sorting Container(s) - {totalSeconds} total second(s)";
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
@ -707,11 +746,11 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
WindowsShortcut windowsShortcut; WindowsShortcut windowsShortcut;
Dictionary<int, Mapping>? wholePercentagesToMapping; Dictionary<int, Mapping>? wholePercentagesToMapping;
string by = nameof(Shared.Models.Stateless.IMapLogic.ManualCopy); string by = nameof(Shared.Models.Stateless.IMapLogic.ManualCopy);
Dictionary<int, PersonContainer[]>? wholePercentagesToPeronContainerCollection; ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPeronContainerCollection;
string successful = $"_ {nameof(Shared.Models.Stateless.IMapLogic.ManualCopy).Humanize(LetterCasing.Title)} Successful"; string successful = $"_ {nameof(Shared.Models.Stateless.IMapLogic.ManualCopy).Humanize(LetterCasing.Title)} Successful";
foreach (KeyValuePair<long, PersonContainer> personKeyToPersonContainer in _PersonKeyToPersonContainer) foreach (KeyValuePair<long, PersonContainer> personKeyToPersonContainer in _PersonKeyToPersonContainer)
{ {
if (personKeyToPersonContainer.Value.Key is null || personKeyToPersonContainer.Value.Birthdays is null || !personKeyToPersonContainer.Value.Birthdays.Any() || personKeyToPersonContainer.Value.PersonDirectory is null) if (personKeyToPersonContainer.Value.Key is null || personKeyToPersonContainer.Value.Birthdays is null || personKeyToPersonContainer.Value.Birthdays.Length == 0 || personKeyToPersonContainer.Value.PersonDirectory is null)
continue; continue;
personBirthday = personKeyToPersonContainer.Value.Birthdays[zero]; personBirthday = personKeyToPersonContainer.Value.Birthdays[zero];
foreach (string personDisplayDirectoryAllFile in personKeyToPersonContainer.Value.DisplayDirectoryAllFiles) foreach (string personDisplayDirectoryAllFile in personKeyToPersonContainer.Value.DisplayDirectoryAllFiles)
@ -786,49 +825,37 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
List<string> results = new(); List<string> results = new();
int count;
long personKey; long personKey;
string directory; string directory;
string? directoryName; string? directoryName;
PersonContainer? personContainer; PersonContainer? personContainer;
Dictionary<long, int> personKeyToCount = new(); foreach (Mapping mapping in mappingCollection)
for (int i = 1; i < 3; i++)
{ {
foreach (Mapping mapping in mappingCollection) if (mapping.MappingFromLocation is null || mapping.MappingFromPerson is null)
{ continue;
if (mapping.MappingFromLocation is null || mapping.MappingFromPerson is null) if (mapping.By is null or Shared.Models.Stateless.IMapLogic.Sorting)
continue; continue;
if (mapping.By is null or Shared.Models.Stateless.IMapLogic.Sorting) if (string.IsNullOrEmpty(mapping.MappingFromPerson.SegmentB))
continue; throw new NotSupportedException();
if (string.IsNullOrEmpty(mapping.MappingFromPerson.SegmentB)) if (string.IsNullOrEmpty(mapping.MappingFromPerson.DisplayDirectoryName))
throw new NotSupportedException(); throw new NotSupportedException();
if (string.IsNullOrEmpty(mapping.MappingFromPerson.DisplayDirectoryName)) personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks;
throw new NotSupportedException(); if (mapping.MappingFromItem.ResizedFileHolder.DirectoryName is null || !mapping.MappingFromItem.ResizedFileHolder.Exists)
personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks; continue;
if (mapping.MappingFromItem.ResizedFileHolder.DirectoryName is null || !mapping.MappingFromItem.ResizedFileHolder.Exists) directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath);
continue; if (directoryName is null)
directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath); throw new NotSupportedException();
if (directoryName is null) if (!_PersonKeyToCount.TryGetValue(personKey, out count))
throw new NotSupportedException(); continue;
if (!_PersonKeyToPersonContainer.TryGetValue(personKey, out personContainer)) if (!_PersonKeyToPersonContainer.TryGetValue(personKey, out personContainer))
continue; continue;
if (personContainer.PersonDirectory is null || !_Configuration.PersonCharacters.Contains(personContainer.PersonDirectory.Char)) if (personContainer.PersonDirectory is null || !_Configuration.PersonCharacters.Contains(personContainer.PersonDirectory.Char))
continue; continue;
if (i == 1) directory = Path.Combine(a2PeopleSingletonDirectory, personContainer.PersonDirectory.Char.ToString(), personContainer.PersonDirectory.Group, personContainer.DisplayDirectoryName, count.ToString("0000"));
{ if (results.Contains(directory))
if (!personKeyToCount.ContainsKey(personKey)) continue;
personKeyToCount.Add(personKey, 0); results.Add(directory);
personKeyToCount[personKey]++;
}
else if (i == 2)
{
directory = Path.Combine(a2PeopleSingletonDirectory, personContainer.PersonDirectory.Char.ToString(), personContainer.PersonDirectory.Group, personContainer.DisplayDirectoryName, personKeyToCount[personKey].ToString("0000"));
if (results.Contains(directory))
continue;
results.Add(directory);
}
else
throw new NotSupportedException();
}
} }
return results; return results;
} }
@ -1008,7 +1035,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
foreach ((long personKey, string displayDirectoryName) in collection) foreach ((long personKey, string displayDirectoryName) in collection)
{ {
matches = (from l in personContainers where l.Key == personKey && l.ApproximateYears.HasValue select l).ToArray(); matches = (from l in personContainers where l.Key == personKey && l.ApproximateYears.HasValue select l).ToArray();
if (!matches.Any()) if (matches.Length == 0)
continue; continue;
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personKey); personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personKey);
if (!displayDirectoryName.Contains(personKeyFormatted)) if (!displayDirectoryName.Contains(personKeyFormatted))
@ -1230,7 +1257,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
personDirectory = Path.Combine(directory, "No Faces"); personDirectory = Path.Combine(directory, "No Faces");
fileName = Path.Combine(personDirectory, $"{item.ResizedFileHolder.Name}.lnk"); fileName = Path.Combine(personDirectory, $"{item.ResizedFileHolder.Name}.lnk");
collection.Add(new(item.ResizedFileHolder.FullName, personDirectory, item.ImageFileHolder.LastWriteTime.Value, fileName, face.Mapping.MappingFromItem.Id.ToString(), MakeAllHidden: false)); collection.Add(new(item.ResizedFileHolder.FullName, personDirectory, item.ImageFileHolder.LastWriteTime.Value, fileName, face.Mapping.MappingFromItem.Id.ToString(), MakeAllHidden: false));
if (face.Mapping.MappingFromItem.ContainerDateTimes.Any() && !distinct.Contains(item.ResizedFileHolder.DirectoryName)) if (face.Mapping.MappingFromItem.ContainerDateTimes.Length > 0 && !distinct.Contains(item.ResizedFileHolder.DirectoryName))
{ {
distinct.Add(item.ResizedFileHolder.DirectoryName); distinct.Add(item.ResizedFileHolder.DirectoryName);
directoriesAndDateTimes.Add(new(item.ResizedFileHolder.DirectoryName, face.Mapping.MappingFromItem.ContainerDateTimes)); directoriesAndDateTimes.Add(new(item.ResizedFileHolder.DirectoryName, face.Mapping.MappingFromItem.ContainerDateTimes));
@ -1246,7 +1273,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
continue; continue;
if (mapping.By is null or Shared.Models.Stateless.IMapLogic.Sorting || mapping.MappingFromPerson?.ApproximateYears is null) if (mapping.By is null or Shared.Models.Stateless.IMapLogic.Sorting || mapping.MappingFromPerson?.ApproximateYears is null)
{ {
if (mapping.MappingFromItem.ContainerDateTimes.Any() && !distinct.Contains(mapping.MappingFromItem.ResizedFileHolder.DirectoryName)) if (mapping.MappingFromItem.ContainerDateTimes.Length > 0 && !distinct.Contains(mapping.MappingFromItem.ResizedFileHolder.DirectoryName))
{ {
distinct.Add(mapping.MappingFromItem.ResizedFileHolder.DirectoryName); distinct.Add(mapping.MappingFromItem.ResizedFileHolder.DirectoryName);
directoriesAndDateTimes.Add(new(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, mapping.MappingFromItem.ContainerDateTimes)); directoriesAndDateTimes.Add(new(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, mapping.MappingFromItem.ContainerDateTimes));
@ -1270,7 +1297,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
throw new NotSupportedException(); throw new NotSupportedException();
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday); personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday);
personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks; personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks;
if (mapping.MappingFromItem.ContainerDateTimes.Any() && !distinct.Contains(mapping.MappingFromItem.ResizedFileHolder.DirectoryName)) if (mapping.MappingFromItem.ContainerDateTimes.Length > 0 && !distinct.Contains(mapping.MappingFromItem.ResizedFileHolder.DirectoryName))
{ {
distinct.Add(mapping.MappingFromItem.ResizedFileHolder.DirectoryName); distinct.Add(mapping.MappingFromItem.ResizedFileHolder.DirectoryName);
directoriesAndDateTimes.Add(new(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, mapping.MappingFromItem.ContainerDateTimes)); directoriesAndDateTimes.Add(new(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, mapping.MappingFromItem.ContainerDateTimes));
@ -1322,17 +1349,17 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
} }
foreach ((string directory, DateTime[] dateTimes) in directoriesAndDateTimes) foreach ((string directory, DateTime[] dateTimes) in directoriesAndDateTimes)
{ {
if (!dateTimes.Any()) if (dateTimes.Length == 0)
continue; continue;
Directory.SetCreationTime(directory, dateTimes[0]); Directory.SetCreationTime(directory, dateTimes[0]);
Directory.SetLastWriteTime(directory, dateTimes[1]); Directory.SetLastWriteTime(directory, dateTimes[1]);
} }
} }
public Dictionary<int, Dictionary<int, PersonContainer[]>> GetMissing(Dictionary<int, Dictionary<int, Mapping>> idToWholePercentagesToMapping) public Dictionary<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> GetMissing(Dictionary<int, Dictionary<int, Mapping>> idToWholePercentagesToMapping)
{ {
Dictionary<int, Dictionary<int, PersonContainer[]>> results = new(); Dictionary<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> results = new();
foreach (KeyValuePair<int, Dictionary<int, PersonContainer[]>> idToCollection in _IdThenWholePercentagesToPersonContainers) foreach (KeyValuePair<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> idToCollection in _IdThenWholePercentagesToPersonContainers)
{ {
if (idToWholePercentagesToMapping.ContainsKey(idToCollection.Key)) if (idToWholePercentagesToMapping.ContainsKey(idToCollection.Key))
continue; continue;
@ -1344,9 +1371,9 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
public bool IsUsed(bool ignoreXMatches, int id, MappingFromLocation mappingFromLocation) public bool IsUsed(bool ignoreXMatches, int id, MappingFromLocation mappingFromLocation)
{ {
bool result; bool result;
PersonContainer[]? personContainers; ReadOnlyCollection<PersonContainer>? personContainers;
List<int>? wholePercentagesCollection; List<int>? wholePercentagesCollection;
Dictionary<int, PersonContainer[]>? wholePercentagesToPersonContainers; ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers;
result = _SkipCollection.TryGetValue(id, out wholePercentagesCollection) && wholePercentagesCollection.Contains(mappingFromLocation.WholePercentages); result = _SkipCollection.TryGetValue(id, out wholePercentagesCollection) && wholePercentagesCollection.Contains(mappingFromLocation.WholePercentages);
if (!result && _IdThenWholePercentagesToPersonContainers.TryGetValue(id, out wholePercentagesToPersonContainers)) if (!result && _IdThenWholePercentagesToPersonContainers.TryGetValue(id, out wholePercentagesToPersonContainers))
{ {
@ -1360,19 +1387,15 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return result; return result;
} }
public bool InSkipCollection(int id, MappingFromLocation mappingFromLocation) public bool InSkipCollection(int id, MappingFromLocation mappingFromLocation) =>
{ _SkipCollection.TryGetValue(id, out List<int>? wholePercentagesCollection) && wholePercentagesCollection.Contains(mappingFromLocation.WholePercentages);
bool result;
result = _SkipCollection.TryGetValue(id, out List<int>? wholePercentagesCollection) && wholePercentagesCollection.Contains(mappingFromLocation.WholePercentages);
return result;
}
public bool? IsFocusPerson(List<(string Directory, long PersonKey)> jLinkResolvedDirectories, int id, MappingFromLocation mappingFromLocation) public bool? IsFocusPerson(int? skipPersonWithMoreThen, List<(string Directory, long PersonKey)> jLinkResolvedDirectories, int id, MappingFromLocation mappingFromLocation)
{ {
bool? result; bool? result;
PersonContainer[]? personContainers; ReadOnlyCollection<PersonContainer>? personContainers;
Dictionary<int, PersonContainer[]>? wholePercentagesToPersonContainers; ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers;
if (jLinkResolvedDirectories.Count == 0) if (skipPersonWithMoreThen is null && jLinkResolvedDirectories.Count == 0)
result = null; result = null;
else if (!_IdThenWholePercentagesToPersonContainers.TryGetValue(id, out wholePercentagesToPersonContainers)) else if (!_IdThenWholePercentagesToPersonContainers.TryGetValue(id, out wholePercentagesToPersonContainers))
result = null; result = null;
@ -1383,7 +1406,14 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
result = false; result = false;
foreach (PersonContainer personContainer in personContainers) foreach (PersonContainer personContainer in personContainers)
{ {
if (jLinkResolvedDirectories.Any(l => personContainer.Key == l.PersonKey)) if (personContainer.Key is null)
continue;
if (skipPersonWithMoreThen is not null && _PersonKeyToCount.TryGetValue(personContainer.Key.Value, out int count) && count > 2 && count < skipPersonWithMoreThen.Value)
{
result = true;
break;
}
if (jLinkResolvedDirectories.Any(l => personContainer.Key.Value == l.PersonKey))
{ {
result = true; result = true;
break; break;
@ -1393,4 +1423,55 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return result; return result;
} }
private void LookForAbandoned(Property.Models.Configuration propertyConfiguration, List<int> distinctFilteredIds)
{
List<string> renameCollection = new();
foreach (KeyValuePair<int, List<LocationContainer<MetadataExtractor.Directory>>> keyValuePair in _IdToLocationContainers)
{
if (distinctFilteredIds.Contains(keyValuePair.Key))
continue;
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in keyValuePair.Value)
{
if (locationContainer.File.Contains('!'))
continue;
renameCollection.Add(locationContainer.File);
}
}
if (renameCollection.Count > 0)
IDirectory.MoveFiles(renameCollection, propertyConfiguration.ResultContent, "(abd)");
}
public void LookForAbandoned(Property.Models.Configuration propertyConfiguration, string bResultsFullGroupDirectory, Container[] containers, string cResultsFullGroupDirectory, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory)
{
string[] directories;
string? directoryName;
List<int> distinctFilteredIds = IContainer.GetFilteredDistinctIds(propertyConfiguration, containers);
LookForAbandoned(propertyConfiguration, distinctFilteredIds);
Stateless.MapLogic.LookForAbandoned(bResultsFullGroupDirectory, distinctFilteredIds);
directories = Directory.GetDirectories(cResultsFullGroupDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{
directoryName = Path.GetFileName(directory);
if (string.IsNullOrEmpty(directoryName) || (directoryName.Length != 2 && directoryName.Length != 4))
continue;
Stateless.MapLogic.LookForAbandoned(distinctFilteredIds, directory, directoryName);
}
directories = Directory.GetDirectories(dResultsFullGroupDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{
directoryName = Path.GetFileName(directory);
if (string.IsNullOrEmpty(directoryName) || (directoryName.Length != 2 && directoryName.Length != 4))
continue;
Stateless.MapLogic.LookForAbandoned(distinctFilteredIds, directory, directoryName);
}
directories = Directory.GetDirectories(d2ResultsFullGroupDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{
directoryName = Path.GetFileName(directory);
if (string.IsNullOrEmpty(directoryName) || (directoryName.Length != 2 && directoryName.Length != 4))
continue;
Stateless.MapLogic.LookForAbandoned(distinctFilteredIds, directory, directoryName);
}
}
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,4 @@
using System.Collections.ObjectModel;
using System.Drawing; using System.Drawing;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
@ -18,7 +19,7 @@ public class F_PhotoPrism
{ {
string json = File.ReadAllText(fileName); string json = File.ReadAllText(fileName);
JsonElement[]? jsonElements = JsonSerializer.Deserialize<JsonElement[]>(json); JsonElement[]? jsonElements = JsonSerializer.Deserialize<JsonElement[]>(json);
if (jsonElements is null || !jsonElements.Any()) if (jsonElements is null || jsonElements.Length == 0)
results = Array.Empty<JsonProperty>(); results = Array.Empty<JsonProperty>();
else else
{ {
@ -37,7 +38,7 @@ public class F_PhotoPrism
Marker[]? results; Marker[]? results;
string file = Path.Combine(fPhotoPrismSingletonDirectory, "markers.json"); string file = Path.Combine(fPhotoPrismSingletonDirectory, "markers.json");
JsonProperty[] jsonProperties = GetJsonProperty(file); JsonProperty[] jsonProperties = GetJsonProperty(file);
if (!jsonProperties.Any()) if (jsonProperties.Length == 0)
results = null; results = null;
else else
results = JsonSerializer.Deserialize<Marker[]>(jsonProperties.Last().Value); results = JsonSerializer.Deserialize<Marker[]>(jsonProperties.Last().Value);
@ -79,7 +80,7 @@ public class F_PhotoPrism
List<Shared.Models.DatabaseFile>? results; List<Shared.Models.DatabaseFile>? results;
string file = Path.Combine(fPhotoPrismSingletonDirectory, "files.json"); string file = Path.Combine(fPhotoPrismSingletonDirectory, "files.json");
JsonProperty[] jsonProperties = GetJsonProperty(file); JsonProperty[] jsonProperties = GetJsonProperty(file);
if (!jsonProperties.Any()) if (jsonProperties.Length == 0)
results = null; results = null;
else else
{ {
@ -140,7 +141,7 @@ public class F_PhotoPrism
return results; return results;
} }
private static void PopulateSubjects(string mappingDefaultName, string personBirthdayFormat, List<string> subjects, StringBuilder stringBuilder, PersonContainer[] personContainers, (MappingFromPhotoPrism MappingFromPhotoPrism, Shared.Models.Marker Marker, float Percent)[] sortedCollection) private static void PopulateSubjects(string mappingDefaultName, string personBirthdayFormat, List<string> subjects, StringBuilder stringBuilder, ReadOnlyCollection<PersonContainer> personContainers, (MappingFromPhotoPrism MappingFromPhotoPrism, Shared.Models.Marker Marker, float Percent)[] sortedCollection)
{ {
long? personKey; long? personKey;
const int zero = 0; const int zero = 0;
@ -150,7 +151,7 @@ public class F_PhotoPrism
{ {
foreach (PersonContainer personContainer in personContainers) foreach (PersonContainer personContainer in personContainers)
{ {
if (personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any()) if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Birthdays.Length == 0)
continue; continue;
if (IPerson.IsDefaultName(mappingDefaultName, personContainer.DisplayDirectoryName)) if (IPerson.IsDefaultName(mappingDefaultName, personContainer.DisplayDirectoryName))
continue; continue;
@ -181,11 +182,11 @@ public class F_PhotoPrism
List<string> subjects = new(); List<string> subjects = new();
DateTime dateTime = new(ticks); DateTime dateTime = new(ticks);
int dlibLocationWholePercentages; int dlibLocationWholePercentages;
PersonContainer[]? personContainers;
StringBuilder stringBuilder = new(); StringBuilder stringBuilder = new();
RectangleF? dlibPercentagesRectangle; RectangleF? dlibPercentagesRectangle;
ReadOnlyCollection<PersonContainer>? personContainers;
float rectangleIntersectMinimum = rectangleIntersectMinimums.Min(); float rectangleIntersectMinimum = rectangleIntersectMinimums.Min();
Dictionary<int, PersonContainer[]>? wholePercentagesToPersonContainers; ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers;
(MappingFromPhotoPrism MappingFromPhotoPrism, Shared.Models.Marker Marker, float Percent)[] sortedCollection; (MappingFromPhotoPrism MappingFromPhotoPrism, Shared.Models.Marker Marker, float Percent)[] sortedCollection;
List<(MappingFromPhotoPrism MappingFromPhotoPrism, Shared.Models.Marker Marker, float Percent)> collection = new(); List<(MappingFromPhotoPrism MappingFromPhotoPrism, Shared.Models.Marker Marker, float Percent)> collection = new();
foreach (Face face in distinctFilteredFaces) foreach (Face face in distinctFilteredFaces)
@ -220,12 +221,12 @@ public class F_PhotoPrism
collection.Add(new(mappingFromPhotoPrism, marker, percent.Value)); collection.Add(new(mappingFromPhotoPrism, marker, percent.Value));
} }
} }
if (!collection.Any()) if (collection.Count == 0)
continue; continue;
sortedCollection = collection.OrderByDescending(l => l.Percent).ToArray(); sortedCollection = collection.OrderByDescending(l => l.Percent).ToArray();
PopulateSubjects(mappingDefaultName, personBirthdayFormat, subjects, stringBuilder, personContainers, sortedCollection); PopulateSubjects(mappingDefaultName, personBirthdayFormat, subjects, stringBuilder, personContainers, sortedCollection);
} }
if (subjects.Any()) if (subjects.Count > 0)
{ {
directory = Path.Combine(fPhotoPrismContentDirectory, dateTime.ToString("yyyy-MM-dd")); directory = Path.Combine(fPhotoPrismContentDirectory, dateTime.ToString("yyyy-MM-dd"));
if (!Directory.Exists(directory)) if (!Directory.Exists(directory))

View File

@ -97,11 +97,11 @@ public class Configuration : Shared.Models.Properties.IPropertyConfiguration
{ {
if (propertyConfiguration is null) if (propertyConfiguration is null)
throw new NullReferenceException(nameof(propertyConfiguration)); throw new NullReferenceException(nameof(propertyConfiguration));
if (propertyConfiguration.IgnoreExtensions is null || !propertyConfiguration.IgnoreExtensions.Any()) if (propertyConfiguration.IgnoreExtensions is null || propertyConfiguration.IgnoreExtensions.Length == 0)
throw new NullReferenceException(nameof(propertyConfiguration.IgnoreExtensions)); throw new NullReferenceException(nameof(propertyConfiguration.IgnoreExtensions));
if (propertyConfiguration.PropertyContentCollectionFiles is null) if (propertyConfiguration.PropertyContentCollectionFiles is null)
throw new NullReferenceException(nameof(propertyConfiguration.PropertyContentCollectionFiles)); throw new NullReferenceException(nameof(propertyConfiguration.PropertyContentCollectionFiles));
if (propertyConfiguration.ValidImageFormatExtensions is null || !propertyConfiguration.ValidImageFormatExtensions.Any()) if (propertyConfiguration.ValidImageFormatExtensions is null || propertyConfiguration.ValidImageFormatExtensions.Length == 0)
throw new NullReferenceException(nameof(propertyConfiguration.ValidImageFormatExtensions)); throw new NullReferenceException(nameof(propertyConfiguration.ValidImageFormatExtensions));
if (propertyConfiguration is null) if (propertyConfiguration is null)
throw new NullReferenceException(nameof(propertyConfiguration)); throw new NullReferenceException(nameof(propertyConfiguration));

View File

@ -45,7 +45,7 @@ public class SetCreatedDate
Verify(); Verify();
List<string> lines = SetCreatedDateFilesInDirectories(log); List<string> lines = SetCreatedDateFilesInDirectories(log);
File.WriteAllLines($"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv", lines); File.WriteAllLines($"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv", lines);
if (!lines.Any()) if (lines.Count == 0)
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(propertyConfiguration.RootDirectory); _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(propertyConfiguration.RootDirectory);
} }

View File

@ -1,10 +1,11 @@
--- ---
created: "2023-07-21T18:26:38.899Z" created: 2023-07-21T18:26:38.899Z
updated: "2023-07-21T18:26:38.900Z" updated: 2023-07-21T18:26:38.900Z
assigned: "" assigned: ""
progress: 0 progress: 0
type: "kanbn" type: kanbn
completed: "2023-07-21T04:34:47.650Z" completed: 2023-07-21T04:34:47.650Z
column: Done
--- ---
# Family Tree as Markdown Files # Family Tree as Markdown Files

View File

@ -0,0 +1,15 @@
---
created: 2023-07-21T18:26:38.916Z
updated: 2023-07-21T18:26:38.917Z
assigned: ""
progress: 0
status: 4-Done
type: kanbn
column: Done
---
# Run Scan Originals
## Sub-tasks
- [x] run-scan-originals

View File

@ -32,20 +32,21 @@ taskTemplate: '^+^_${overdue ? ''^R'' : ''''}${name}^: ${relations ? (''\n^-^/^g
- [nef-support](tasks/nef-support.md) - [nef-support](tasks/nef-support.md)
- [set-date-taken-when-missing](tasks/set-date-taken-when-missing.md) - [set-date-taken-when-missing](tasks/set-date-taken-when-missing.md)
- [set-focus-person-based-on-number-of-matched](tasks/set-focus-person-based-on-number-of-matched.md) - [set-focus-person-based-on-number-of-matched](tasks/set-focus-person-based-on-number-of-matched.md)
- [move-images-in-distance-directories-to-decade-match-minimum-decade-match-maximum-decade-match-none](tasks/move-images-in-distance-directories-to-decade-match-minimum-decade-match-maximum-decade-match-none.md)
## In Progress ## In Progress
- [merge-kristy-files](tasks/merge-kristy-files.md)
- [look-for-family-from-jlink-in-x-mapped](tasks/look-for-family-from-jlink-in-x-mapped.md) - [look-for-family-from-jlink-in-x-mapped](tasks/look-for-family-from-jlink-in-x-mapped.md)
- [review-what-system-does-when-duplicate-matched-with-x-and-non-x](tasks/review-what-system-does-when-duplicate-matched-with-x-and-non-x.md)
- [move-over-2023-california-pictures](tasks/move-over-2023-california-pictures.md)
## Done ## Done
- [eof-error](tasks/eof-error.md) - [eof-error](tasks/eof-error.md)
- [run-scan-originals](tasks/run-scan-originals.md)
- [shrink-percent](tasks/shrink-percent.md) - [shrink-percent](tasks/shrink-percent.md)
- [merge-kristy-files](tasks/merge-kristy-files.md) - [move-over-2023-california-pictures](tasks/move-over-2023-california-pictures.md)
- [family-tree-as-markdown-files](tasks/family-tree-as-markdown-files.md) - [verify-person-key-collection-fixed-x-issue](tasks/verify-person-key-collection-fixed-x-issue.md)
- [genealogical-data-communication-as-golden](tasks/genealogical-data-communication-as-golden.md) - [genealogical-data-communication-as-golden](tasks/genealogical-data-communication-as-golden.md)
- [review-what-system-does-when-duplicate-matched-with-x-and-non-x](tasks/review-what-system-does-when-duplicate-matched-with-x-and-non-x.md)
- [add-facebook-and-linked-in-txt-to-ged](tasks/add-facebook-and-linked-in-txt-to-ged.md)
- [setup-photo-prism-again-in-wsl-docker](tasks/setup-photo-prism-again-in-wsl-docker.md) - [setup-photo-prism-again-in-wsl-docker](tasks/setup-photo-prism-again-in-wsl-docker.md)
- [rename-files-to-padded-number-string](tasks/rename-files-to-padded-number-string.md) - [rename-files-to-padded-number-string](tasks/rename-files-to-padded-number-string.md)

View File

@ -0,0 +1,11 @@
---
created: 2023-08-05T17:50:34.233Z
updated: 2023-08-05T23:12:26.511Z
assigned: ""
progress: 0
tags: []
started: 2023-08-05T17:50:34.233Z
completed: 2023-08-05T23:12:26.511Z
---
# Add Facebook and LinkedIn *.txt to *.ged

View File

@ -1,6 +1,6 @@
--- ---
created: 2023-07-31T19:08:57.684Z created: 2023-07-31T19:08:57.684Z
updated: 2023-08-01T06:13:54.468Z updated: 2023-08-06T03:40:58.576Z
assigned: "" assigned: ""
progress: 0 progress: 0
tags: [] tags: []

View File

@ -1,12 +1,11 @@
--- ---
created: 2023-07-21T18:26:38.910Z created: 2023-07-21T18:26:38.910Z
updated: 2023-08-05T08:33:35.448Z updated: 2023-08-05T17:43:51.430Z
assigned: "" assigned: ""
progress: 0 progress: 0.5
status: 2-Todo tags: []
type: kanbn started: 2023-07-06T00:00:00.000Z
started: 2023-07-08T21:44:14.665Z completed: 2023-08-03T00:00:00.000Z
completed: 2023-08-05T08:33:35.448Z
--- ---
# Merge Kristy Files # Merge Kristy Files
@ -26,3 +25,4 @@ return new(result, (from l in results orderby l.FileHolder.DirectoryName?.EndsWi
- [x] Set created date - [x] Set created date
- [x] Verify - [x] Verify
- [x] Move to production ... - [x] Move to production ...
- [ ] Cleanup D:/7-Question/- Scans.*

View File

@ -0,0 +1,9 @@
---
created: 2023-08-06T00:25:42.224Z
updated: 2023-08-06T00:25:42.220Z
assigned: ""
progress: 0
tags: []
---
# Move images in Distance directories to {Decade}MatchMinimum {Decade}MatchMaximum {Decade}MatchNone

View File

@ -1,10 +1,11 @@
--- ---
created: 2023-08-05T08:33:59.693Z created: 2023-08-05T08:33:59.693Z
updated: 2023-08-05T08:33:59.689Z updated: 2023-08-05T17:38:11.824Z
assigned: "" assigned: ""
progress: 0 progress: 0
tags: [] tags: []
started: 2023-08-05T08:33:59.693Z started: 2023-08-05T08:33:59.693Z
completed: 2023-08-05T17:38:11.824Z
--- ---
# Move over 2023 California Pictures # Move over 2023 California Pictures

View File

@ -9,13 +9,14 @@ type: "kanbn"
# Rename Files to Padded Number String # Rename Files to Padded Number String
- [?] ~~Go Back to Index for Sort~~
- [?] ~~New file for index to to id~~
- [?] ~~Count backwards~~
- [?] ~~Maybe skip some for scan images~~
- [?] [Set Date Taken When Missing](set-date-taken-when-missing.md)
## Sub-tasks ## Sub-tasks
- [ ] ~~Go Back to Index for Sort~~
- [ ] ~~New file for index to to id~~
- [ ] ~~Count backwards~~
- [ ] ~~Maybe skip some for scan images~~
- [Set Date Taken When Missing](set-date-taken-when-missing.md)
- [x] Rename production with padding names starting with one directory - [x] Rename production with padding names starting with one directory
- [x] Need equivalent to NameWithoutExtensionIsIdFormat method - [x] Need equivalent to NameWithoutExtensionIsIdFormat method
- [x] Verify nothing broke (run from resize original now ... ?) - [x] Verify nothing broke (run from resize original now ... ?)

View File

@ -1,10 +1,13 @@
--- ---
created: 2023-08-05T08:33:05.117Z created: 2023-08-05T08:33:05.117Z
updated: 2023-08-05T08:33:22.874Z updated: 2023-08-06T05:44:59.047Z
assigned: "" assigned: ""
progress: 0 progress: 0
tags: [] tags: []
started: 2023-08-05T00:00:00.000Z started: 2023-08-04T00:00:00.000Z
completed: 2023-08-06T05:44:59.047Z
--- ---
# Review what system does when duplicate matched with X] and non X] # Review what system does when duplicate matched with X] and non X]
AlternateDirectoryDateTime helps but not full proof

View File

@ -1,14 +0,0 @@
---
created: "2023-07-21T18:26:38.916Z"
updated: "2023-07-21T18:26:38.917Z"
assigned: ""
progress: 0
status: "4-Done"
type: "kanbn"
---
# Run Scan Originals
## Sub-tasks
- [x] run-scan-originals

View File

@ -0,0 +1,11 @@
---
created: 2023-08-06T01:04:57.884Z
updated: 2023-08-06T06:55:09.617Z
assigned: ""
progress: 0
tags: []
started: 2023-08-06T01:04:57.884Z
completed: 2023-08-06T06:55:09.617Z
---
# Verify personKeyCollection fixed X] issue

View File

@ -1,3 +1,4 @@
using System.Collections.ObjectModel;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
@ -49,11 +50,11 @@ public class Mapping : Properties.IMapping
_SegmentC = !saveIndividually ? null : sortingContainer.Sorting.DistancePermyriad.ToString(); _SegmentC = !saveIndividually ? null : sortingContainer.Sorting.DistancePermyriad.ToString();
} }
public void UpdateMappingFromPerson(int? approximateYears, string displayDirectoryName, PersonBirthday personBirthday, string segmentB) public void UpdateMappingFromPerson(ReadOnlyCollection<string> locationContainersFiles, int? approximateYears, string displayDirectoryName, PersonBirthday personBirthday, string segmentB)
{ {
_SortingContainer = null; _SortingContainer = null;
_By = Stateless.IMapLogic.Mapping; _By = Stateless.IMapLogic.Mapping;
_MappingFromPerson = new(approximateYears, displayDirectoryName, personBirthday, segmentB); _MappingFromPerson = new(approximateYears, displayDirectoryName, locationContainersFiles, personBirthday, segmentB);
} }
public void UpdateMappingFromPerson(int? approximateYears, string displayDirectoryName, PersonBirthday personBirthday, string segmentB, string segmentC, SortingContainer sortingContainer) public void UpdateMappingFromPerson(int? approximateYears, string displayDirectoryName, PersonBirthday personBirthday, string segmentB, string segmentC, SortingContainer sortingContainer)
@ -61,7 +62,8 @@ public class Mapping : Properties.IMapping
_SegmentC = segmentC; _SegmentC = segmentC;
_By = Stateless.IMapLogic.Sorting; _By = Stateless.IMapLogic.Sorting;
_SortingContainer = sortingContainer; _SortingContainer = sortingContainer;
_MappingFromPerson = new(approximateYears, displayDirectoryName, personBirthday, segmentB); ReadOnlyCollection<string> locationContainersFiles = new(Array.Empty<string>());
_MappingFromPerson = new(approximateYears, displayDirectoryName, locationContainersFiles, personBirthday, segmentB);
} }
} }

View File

@ -1,3 +1,4 @@
using System.Collections.ObjectModel;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
@ -8,14 +9,16 @@ public class MappingFromPerson : Properties.IMappingFromPerson
public int? ApproximateYears { init; get; } public int? ApproximateYears { init; get; }
public string DisplayDirectoryName { init; get; } public string DisplayDirectoryName { init; get; }
public ReadOnlyCollection<string> LocationContainersFiles { init; get; }
public PersonBirthday PersonBirthday { init; get; } public PersonBirthday PersonBirthday { init; get; }
public string SegmentB { init; get; } public string SegmentB { init; get; }
[JsonConstructor] [JsonConstructor]
public MappingFromPerson(int? approximateYears, string displayDirectoryName, PersonBirthday personBirthday, string segmentB) public MappingFromPerson(int? approximateYears, string displayDirectoryName, ReadOnlyCollection<string> locationContainersFiles, PersonBirthday personBirthday, string segmentB)
{ {
ApproximateYears = approximateYears; ApproximateYears = approximateYears;
DisplayDirectoryName = displayDirectoryName; DisplayDirectoryName = displayDirectoryName;
LocationContainersFiles = locationContainersFiles;
PersonBirthday = personBirthday; PersonBirthday = personBirthday;
SegmentB = segmentB; SegmentB = segmentB;
} }

View File

@ -1,8 +1,10 @@
using System.Collections.ObjectModel;
namespace View_by_Distance.Shared.Models.Methods; namespace View_by_Distance.Shared.Models.Methods;
public interface IMapLogic public interface IMapLogic
{ {
(bool, Dictionary<int, PersonContainer[]>?) GetWholePercentagesToPersonContainers(int id); (bool, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>?) GetWholePercentagesToPersonContainers(int id);
} }

View File

@ -1,3 +1,5 @@
using System.Collections.ObjectModel;
namespace View_by_Distance.Shared.Models.Properties; namespace View_by_Distance.Shared.Models.Properties;
public interface IMapping public interface IMapping

View File

@ -1,3 +1,5 @@
using System.Collections.ObjectModel;
namespace View_by_Distance.Shared.Models.Properties; namespace View_by_Distance.Shared.Models.Properties;
public interface IMappingFromPerson public interface IMappingFromPerson
@ -5,6 +7,7 @@ public interface IMappingFromPerson
public int? ApproximateYears { init; get; } public int? ApproximateYears { init; get; }
public string DisplayDirectoryName { init; get; } public string DisplayDirectoryName { init; get; }
public ReadOnlyCollection<string> LocationContainersFiles { init; get; }
public PersonBirthday PersonBirthday { init; get; } public PersonBirthday PersonBirthday { init; get; }
public string SegmentB { init; get; } public string SegmentB { init; get; }

View File

@ -63,7 +63,7 @@ internal abstract class Container
{ {
foreach (Models.Container container in containers) foreach (Models.Container container in containers)
{ {
if (!container.Items.Any()) if (container.Items.Count == 0)
continue; continue;
if (!argZeroIsConfigurationRootDirectory && !container.SourceDirectory.StartsWith(argZero)) if (!argZeroIsConfigurationRootDirectory && !container.SourceDirectory.StartsWith(argZero))
continue; continue;
@ -169,7 +169,7 @@ internal abstract class Container
Dictionary<string, List<Models.Item>> directoryToItems = new(); Dictionary<string, List<Models.Item>> directoryToItems = new();
foreach (string[] files in filesCollection) foreach (string[] files in filesCollection)
{ {
if (!files.Any()) if (files.Length == 0)
continue; continue;
directory = Path.GetDirectoryName(files.First()); directory = Path.GetDirectoryName(files.First());
if (directory is null) if (directory is null)
@ -199,7 +199,7 @@ internal abstract class Container
} }
foreach (KeyValuePair<string, List<Models.Item>> keyValuePair in directoryToItems) foreach (KeyValuePair<string, List<Models.Item>> keyValuePair in directoryToItems)
{ {
if (!keyValuePair.Value.Any()) if (keyValuePair.Value.Count == 0)
continue; continue;
container = new(keyValuePair.Key, keyValuePair.Value); container = new(keyValuePair.Key, keyValuePair.Value);
results.Add(container); results.Add(container);
@ -233,10 +233,10 @@ internal abstract class Container
Models.Item[] filteredItems; Models.Item[] filteredItems;
foreach (Models.Container container in containers) foreach (Models.Container container in containers)
{ {
if (!container.Items.Any()) if (container.Items.Count == 0)
continue; continue;
filteredItems = GetFilterItems(propertyConfiguration, container); filteredItems = GetFilterItems(propertyConfiguration, container);
if (!filteredItems.Any()) if (filteredItems.Length == 0)
continue; continue;
foreach (Models.Item item in filteredItems) foreach (Models.Item item in filteredItems)
{ {
@ -257,7 +257,7 @@ internal abstract class Container
IEnumerable<Models.Item> filteredItems; IEnumerable<Models.Item> filteredItems;
foreach (Models.Container container in containers) foreach (Models.Container container in containers)
{ {
if (!container.Items.Any()) if (container.Items.Count == 0)
continue; continue;
if (!filterItems) if (!filterItems)
filteredItems = container.Items; filteredItems = container.Items;

View File

@ -56,7 +56,7 @@ internal abstract class Face
{ {
Models.Face? result; Models.Face? result;
List<Models.Face> results = GetFaces(jsonFileFullName, maximum: 1); List<Models.Face> results = GetFaces(jsonFileFullName, maximum: 1);
if (!results.Any()) if (results.Count == 0)
throw new Exception(); throw new Exception();
result = results[0]; result = results[0];
return result; return result;

View File

@ -17,7 +17,7 @@ internal abstract class FaceFileSystem
else else
{ {
string[] files = Directory.GetFiles(parentDirectoryName, Path.GetFileName(fullFileName), SearchOption.AllDirectories); string[] files = Directory.GetFiles(parentDirectoryName, Path.GetFileName(fullFileName), SearchOption.AllDirectories);
if (!files.Any()) if (files.Length == 0)
throw new Exception($"File [{fileInfo.Name}] <{fullFileName}> doesn't exist (deep search)!"); throw new Exception($"File [{fileInfo.Name}] <{fullFileName}> doesn't exist (deep search)!");
else else
{ {

View File

@ -30,7 +30,7 @@ internal abstract class FileHolder
next = Directory.GetFiles(path, searchPattern); next = Directory.GetFiles(path, searchPattern);
} }
catch { } catch { }
if (next is not null && next.Any()) if (next is not null && next.Length > 0)
yield return new(path, next); yield return new(path, next);
try try
{ {

View File

@ -37,9 +37,9 @@ public interface IPerson
hour == 17 ? "Dead-Male-No" : hour == 17 ? "Dead-Male-No" :
throw new NotImplementedException(personDisplayDirectoryName); throw new NotImplementedException(personDisplayDirectoryName);
bool TestStatic_IsDefaultName(string mappingDefaultName, string value) => bool TestStatic_IsDefaultName(string mappingDefaultName, string personDisplayDirectoryName) =>
IsDefaultName(mappingDefaultName, value); IsDefaultName(mappingDefaultName, personDisplayDirectoryName);
static bool IsDefaultName(string mappingDefaultName, string value) => static bool IsDefaultName(string mappingDefaultName, string personDisplayDirectoryName) =>
value == mappingDefaultName || (value.Length > 1 && value[0] == 'X' && value[1] == ']'); personDisplayDirectoryName == mappingDefaultName || (personDisplayDirectoryName.Length > 1 && personDisplayDirectoryName[0] == 'X' && personDisplayDirectoryName[1] == ']');
} }

View File

@ -103,7 +103,7 @@ internal abstract class PersonContainer
foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection) foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection)
{ {
orderedPersonBirthdays = (from l in collection where !l.PersonKeyFormatted.Contains(numberSign) orderby l.PersonBirthday.Value.Ticks descending select l.PersonBirthday).ToArray(); orderedPersonBirthdays = (from l in collection where !l.PersonKeyFormatted.Contains(numberSign) orderby l.PersonBirthday.Value.Ticks descending select l.PersonBirthday).ToArray();
if (!orderedPersonBirthdays.Any()) if (orderedPersonBirthdays.Length == 0)
personKey = collection[zero].PersonBirthday.Value.Ticks; personKey = collection[zero].PersonBirthday.Value.Ticks;
else else
{ {
@ -113,7 +113,7 @@ internal abstract class PersonContainer
} }
personKeyDirectory = Path.Combine(personDisplayDirectory, personKeyFormatted); personKeyDirectory = Path.Combine(personDisplayDirectory, personKeyFormatted);
files = Directory.GetFiles(personKeyDirectory, "*", SearchOption.AllDirectories); files = Directory.GetFiles(personKeyDirectory, "*", SearchOption.AllDirectories);
if (!files.Any()) if (files.Length == 0)
continue; continue;
personDisplayDirectoryAllFiles.AddRange(files.Where(l => l.EndsWith(".rel"))); personDisplayDirectoryAllFiles.AddRange(files.Where(l => l.EndsWith(".rel")));
personContainer = new(approximateYears, orderedPersonBirthdays, personDisplayDirectoryAllFiles.ToArray(), personDisplayDirectoryName, personKey, personDirectory); personContainer = new(approximateYears, orderedPersonBirthdays, personDisplayDirectoryAllFiles.ToArray(), personDisplayDirectoryName, personKey, personDirectory);
@ -127,7 +127,7 @@ internal abstract class PersonContainer
string? result; string? result;
if (approximateYears is null) if (approximateYears is null)
throw new NotSupportedException(); throw new NotSupportedException();
if (!collection.Any()) if (collection.Count == 0)
throw new NotSupportedException(); throw new NotSupportedException();
const int zero = 0; const int zero = 0;
int? updateApproximateYears; int? updateApproximateYears;
@ -225,7 +225,7 @@ internal abstract class PersonContainer
{ {
innerGroupDirectoryName = Path.GetFileName(innerGroupDirectory); innerGroupDirectoryName = Path.GetFileName(innerGroupDirectory);
segments = innerGroupDirectoryName.Split('-'); segments = innerGroupDirectoryName.Split('-');
if (!segments.Any()) if (segments.Length == 0)
throw new NotSupportedException("Misplaced directory!"); throw new NotSupportedException("Misplaced directory!");
if (segments.Length != 3) if (segments.Length != 3)
continue; continue;
@ -285,7 +285,7 @@ internal abstract class PersonContainer
_ = Directory.CreateDirectory(a2PeopleSingletonDirectoryChar); _ = Directory.CreateDirectory(a2PeopleSingletonDirectoryChar);
} }
string[] groupDirectories = Directory.GetDirectories(a2PeopleSingletonDirectory, "*", SearchOption.TopDirectoryOnly); string[] groupDirectories = Directory.GetDirectories(a2PeopleSingletonDirectory, "*", SearchOption.TopDirectoryOnly);
if (!groupDirectories.Any()) if (groupDirectories.Length == 0)
results = new(); results = new();
else else
results = GetPersonContainersGroups(personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectories); results = GetPersonContainersGroups(personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectories);

View File

@ -40,10 +40,10 @@ internal abstract class Property
|| (l.Length == 7 && l.Substring(1, 4) == year && l[5] == '.') || (l.Length == 7 && l.Substring(1, 4) == year && l[5] == '.')
select l select l
).ToArray(); ).ToArray();
if (!results.Any()) if (results.Length == 0)
result = null; result = null;
else else
result = !matches.Any(); result = matches.Length == 0;
return new(result, results); return new(result, results);
} }
@ -203,7 +203,7 @@ internal abstract class Property
} }
long threeStandardDeviationHigh; long threeStandardDeviationHigh;
long min; long min;
if (!ticksCollection.Any()) if (ticksCollection.Count == 0)
min = 0; min = 0;
else else
min = ticksCollection.Min(); min = ticksCollection.Min();
@ -263,7 +263,7 @@ internal abstract class Property
bool result = false; bool result = false;
foreach (Models.Container container in containers) foreach (Models.Container container in containers)
{ {
if (!container.Items.Any()) if (container.Items.Count == 0)
continue; continue;
if ((from l in container.Items where l.Any() select true).Any()) if ((from l in container.Items where l.Any() select true).Any())
{ {

View File

@ -97,7 +97,7 @@ internal abstract partial class XDirectory
} }
} }
} }
if (renameCollection.Any()) if (renameCollection.Count > 0)
IDirectory.MoveFiles(renameCollection, "{}", "{abd}"); IDirectory.MoveFiles(renameCollection, "{}", "{abd}");
return renameCollection.Count; return renameCollection.Count;
} }
@ -139,7 +139,7 @@ internal abstract partial class XDirectory
continue; continue;
matches.Add(possible); matches.Add(possible);
} }
if (matches.Count == 1 || (matches.Any() && lengths.Distinct().Count() == 1 && creationTimes.Distinct().Count() == 1)) if (matches.Count == 1 || (matches.Count > 0 && lengths.Distinct().Count() == 1 && creationTimes.Distinct().Count() == 1))
result = matches.First(); result = matches.First();
return result; return result;
} }
@ -167,7 +167,7 @@ internal abstract partial class XDirectory
results.Add(new(file, uniqueFileName, isNotUniqueAndNeedsReview, new(), null)); results.Add(new(file, uniqueFileName, isNotUniqueAndNeedsReview, new(), null));
else else
{ {
if (!collection.Any()) if (collection.Count == 0)
results.Add(new(file, uniqueFileName, isNotUniqueAndNeedsReview, collection, null)); results.Add(new(file, uniqueFileName, isNotUniqueAndNeedsReview, collection, null));
else if (uniqueFileName && collection.Count == 1) else if (uniqueFileName && collection.Count == 1)
results.Add(new(file, uniqueFileName, isNotUniqueAndNeedsReview, collection, collection.First())); results.Add(new(file, uniqueFileName, isNotUniqueAndNeedsReview, collection, collection.First()));

View File

@ -32,7 +32,7 @@ internal abstract class XPath
bool result; bool result;
List<string> results = new(); List<string> results = new();
DeleteEmptyDirectories(rootDirectory, results); DeleteEmptyDirectories(rootDirectory, results);
result = results.Any(); result = results.Count > 0;
return result; return result;
} }
@ -64,7 +64,7 @@ internal abstract class XPath
{ {
DeleteEmptyDirectories(directory, check); DeleteEmptyDirectories(directory, check);
deletedDirectories.AddRange(check); deletedDirectories.AddRange(check);
if (check.Any()) if (check.Count > 0)
DeleteEmptyDirectories(directory, deletedDirectories); DeleteEmptyDirectories(directory, deletedDirectories);
} }
} }