FilePath ready to test

This commit is contained in:
Mike Phares 2023-12-24 11:29:36 -07:00
parent af491371a3
commit 7007a9df2e
60 changed files with 960 additions and 857 deletions

14
.vscode/mklink.md vendored Normal file
View File

@ -0,0 +1,14 @@
---
type: "note"
created: "2023-10-20T03:56:21.490Z"
updated: "2023-10-20T03:57:15.006Z"
---
# mklink
```bash
```
```bash
mklink /J "D:\1-Images-A\Images-4083e56a-Results\A2)People\4083e56a\{}\!" "D:\1-Images-A\Images-4083e56a-Results\E)Distance\4083e56a\{}\!"
```

View File

@ -1,3 +1,4 @@
using System.Collections.ObjectModel;
using System.Drawing; using System.Drawing;
using System.Text; using System.Text;
using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models;
@ -21,7 +22,7 @@ public class C2_BlurHasher : IBlurHasher
public void Update(string resultsFullGroupDirectory) public void Update(string resultsFullGroupDirectory)
{ {
_FileGroups.Clear(); _FileGroups.Clear();
Dictionary<string, string[]> keyValuePairs = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_PropertyConfiguration, resultsFullGroupDirectory, [_PropertyConfiguration.ResultContent, _PropertyConfiguration.ResultSingleton]); ReadOnlyDictionary<string, string[]> keyValuePairs = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_PropertyConfiguration, resultsFullGroupDirectory, [_PropertyConfiguration.ResultContent, _PropertyConfiguration.ResultSingleton]);
foreach (KeyValuePair<string, string[]> keyValuePair in keyValuePairs) foreach (KeyValuePair<string, string[]> keyValuePair in keyValuePairs)
_FileGroups.Add(keyValuePair.Key, keyValuePair.Value); _FileGroups.Add(keyValuePair.Key, keyValuePair.Value);
} }
@ -39,17 +40,17 @@ public class C2_BlurHasher : IBlurHasher
return result; return result;
} }
string IBlurHasher.GetFile(FileHolder fileHolder) string IBlurHasher.GetFile(FilePath filePath)
{ {
string result; string result;
if (_FileGroups.Count == 0) if (_FileGroups.Count == 0)
throw new Exception("Call Update first!"); throw new Exception("Call Update first!");
(_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, fileHolder.Name); (_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration, filePath);
result = Path.Combine(_FileGroups[_PropertyConfiguration.ResultSingleton][directoryIndex], $"{fileHolder.Name}.csv"); result = Path.Combine(_FileGroups[_PropertyConfiguration.ResultSingleton][directoryIndex], $"{filePath.Name}.csv");
return result; return result;
} }
string IBlurHasher.EncodeAndSave(FileHolder fileHolder) string IBlurHasher.EncodeAndSave(FilePath filePath, FileHolder fileHolder)
{ {
string result; string result;
if (_FileGroups.Count == 0) if (_FileGroups.Count == 0)
@ -57,7 +58,7 @@ public class C2_BlurHasher : IBlurHasher
int actualByte; int actualByte;
string extension = ".png"; string extension = ".png";
IBlurHasher blurHasher = this; IBlurHasher blurHasher = this;
string file = blurHasher.GetFile(fileHolder); string file = blurHasher.GetFile(filePath);
#pragma warning disable CA1416 #pragma warning disable CA1416
Image image = Image.FromFile(fileHolder.FullName); Image image = Image.FromFile(fileHolder.FullName);
int outputWidth = (int)(image.Width * .25); int outputWidth = (int)(image.Width * .25);
@ -71,7 +72,7 @@ public class C2_BlurHasher : IBlurHasher
string fileNameWithoutExtension = $"{componentsX}x{componentsY}-{outputWidth}x{outputHeight}-{joined}"; string fileNameWithoutExtension = $"{componentsX}x{componentsY}-{outputWidth}x{outputHeight}-{joined}";
string contents = string.Concat(result, Environment.NewLine, fileNameWithoutExtension, Environment.NewLine, extension); string contents = string.Concat(result, Environment.NewLine, fileNameWithoutExtension, Environment.NewLine, extension);
_ = Shared.Models.Stateless.Methods.IPath.WriteAllText(file, contents, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null); _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(file, contents, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
(_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, joined); (_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration, filePath);
file = Path.Combine(_FileGroups[_PropertyConfiguration.ResultContent][directoryIndex], $"{fileNameWithoutExtension}{extension}"); file = Path.Combine(_FileGroups[_PropertyConfiguration.ResultContent][directoryIndex], $"{fileNameWithoutExtension}{extension}");
if (!File.Exists(file)) if (!File.Exists(file))
{ {

View File

@ -6,6 +6,7 @@ using System.Collections.ObjectModel;
using View_by_Distance.Copy.Distinct.Models; using View_by_Distance.Copy.Distinct.Models;
using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Methods; using View_by_Distance.Shared.Models.Methods;
using View_by_Distance.Shared.Models.Stateless.Methods;
namespace View_by_Distance.Copy.Distinct; namespace View_by_Distance.Copy.Distinct;
@ -17,7 +18,7 @@ public class CopyDistinct
private readonly Configuration _Configuration; private readonly Configuration _Configuration;
private readonly IsEnvironment _IsEnvironment; private readonly IsEnvironment _IsEnvironment;
private readonly IConfigurationRoot _ConfigurationRoot; private readonly IConfigurationRoot _ConfigurationRoot;
private readonly IReadOnlyDictionary<string, string[]> _FileGroups; private readonly ReadOnlyDictionary<string, string[]> _FileGroups;
private readonly Property.Models.Configuration _PropertyConfiguration; private readonly Property.Models.Configuration _PropertyConfiguration;
public CopyDistinct(List<string> args, ILogger<Program> logger, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console) public CopyDistinct(List<string> args, ILogger<Program> logger, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console)
@ -63,7 +64,7 @@ public class CopyDistinct
const string directorySearchFilter = "*"; const string directorySearchFilter = "*";
string copyTo = Path.GetFullPath(_AppSettings.CopyTo); string copyTo = Path.GetFullPath(_AppSettings.CopyTo);
bool move = copyTo == _PropertyConfiguration.RootDirectory; bool move = copyTo == _PropertyConfiguration.RootDirectory;
ReadOnlyCollection<string[]> filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); ReadOnlyCollection<string[]> filesCollection = IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage);
bool anyLenFiles = filesCollection.Any(l => l.Any(m => m.EndsWith("len"))); bool anyLenFiles = filesCollection.Any(l => l.Any(m => m.EndsWith("len")));
if (!move) if (!move)
moveBack = false; moveBack = false;
@ -92,13 +93,15 @@ public class CopyDistinct
return (move, new(filesCollection), anyLenFiles, moveBack); return (move, new(filesCollection), anyLenFiles, moveBack);
} }
private static (string[], List<(FileHolder, string?, string)>) GetMoveBackToDoCollection(ReadOnlyCollection<string[]> filesCollection) private static (string[], List<(FilePath, string)>) GetMoveBackToDoCollection(Property.Models.Configuration propertyConfiguration, ReadOnlyCollection<string[]> filesCollection)
{ {
List<(FileHolder, string?, string)> results = []; List<(FilePath, string)> results = [];
string key; string key;
string? value; string? value;
string fileName; string fileName;
FilePath filePath;
string? directory; string? directory;
FileHolder fileHolder;
string destinationFile; string destinationFile;
List<string> distinctFound = []; List<string> distinctFound = [];
List<string> distinctNeeded = []; List<string> distinctNeeded = [];
@ -146,7 +149,9 @@ public class CopyDistinct
directory = Path.GetDirectoryName(value); directory = Path.GetDirectoryName(value);
if (string.IsNullOrEmpty(directory)) if (string.IsNullOrEmpty(directory))
continue; continue;
results.Add(new(new(file), null, value)); fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(file);
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
results.Add(new(filePath, value));
if (!distinctDirectories.Contains(directory)) if (!distinctDirectories.Contains(directory))
distinctDirectories.Add(directory); distinctDirectories.Add(directory);
} }
@ -161,21 +166,21 @@ public class CopyDistinct
string[] distinctDirectories; string[] distinctDirectories;
ConsoleKey? consoleKey = null; ConsoleKey? consoleKey = null;
string message = nameof(CopyDistinct); string message = nameof(CopyDistinct);
List<(FileHolder, string?, string)> toDoCollection; List<(FilePath, string)> toDoCollection;
int count = filesCollection.Select(l => l.Length).Sum(); int count = filesCollection.Select(l => l.Length).Sum();
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
if (moveBack) if (moveBack)
{ {
if (!anyLenFiles) if (!anyLenFiles)
throw new NotSupportedException(); throw new NotSupportedException();
(distinctDirectories, toDoCollection) = GetMoveBackToDoCollection(filesCollection); (distinctDirectories, toDoCollection) = GetMoveBackToDoCollection(_PropertyConfiguration, filesCollection);
} }
else else
{ {
progressBar = new(count, message, options); progressBar = new(count, message, options);
string key = string.IsNullOrEmpty(_AppSettings.ResultDirectoryKey) ? _PropertyConfiguration.ResultAllInOne : _AppSettings.ResultDirectoryKey; string key = string.IsNullOrEmpty(_AppSettings.ResultDirectoryKey) ? _PropertyConfiguration.ResultAllInOne : _AppSettings.ResultDirectoryKey;
string[] directories = _FileGroups[key]; string[] directories = _FileGroups[key];
(distinctDirectories, toDoCollection) = Shared.Models.Stateless.Methods.IDirectory.GetToDoCollection(_PropertyConfiguration, _AppSettings.CopyDuplicates, _AppSettings.IfCanUseId, filesCollection, directories, () => progressBar.Tick()); (distinctDirectories, toDoCollection) = IDirectory.GetToDoCollection(_PropertyConfiguration, _AppSettings.CopyDuplicates, _AppSettings.IfCanUseId, filesCollection, directories, () => progressBar.Tick());
progressBar.Dispose(); progressBar.Dispose();
} }
foreach (string distinctDirectory in distinctDirectories) foreach (string distinctDirectory in distinctDirectories)
@ -212,7 +217,7 @@ public class CopyDistinct
else else
{ {
progressBar = new(count, message, options); progressBar = new(count, message, options);
results.AddRange(Shared.Models.Stateless.Methods.IDirectory.CopyOrMove(toDoCollection, move, moveBack, () => progressBar.Tick())); results.AddRange(IDirectory.CopyOrMove(toDoCollection, move, moveBack, () => progressBar.Tick()));
progressBar.Dispose(); progressBar.Dispose();
if (move || moveBack) if (move || moveBack)
logger?.LogInformation("Done moving"); logger?.LogInformation("Done moving");

View File

@ -11,7 +11,7 @@ namespace View_by_Distance.Distance.Models;
public partial class E_Distance : IDistance<MetadataExtractor.Directory> public partial class E_Distance : IDistance<MetadataExtractor.Directory>
{ {
internal record Record(string File, FaceRecognitionDotNet.FaceEncoding FaceRecognitionDotNetFaceEncoding); internal record Record(FilePath FilePath, FaceRecognitionDotNet.FaceEncoding FaceRecognitionDotNetFaceEncoding);
private readonly List<string> _Moved; private readonly List<string> _Moved;
private readonly List<double?> _Debug; private readonly List<double?> _Debug;
@ -40,11 +40,11 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
_RangeDistanceToleranceAverage = rangeDistanceTolerance.Average(); _RangeDistanceToleranceAverage = rangeDistanceTolerance.Average();
} }
private static void MoveUnableToMatch(string file) private static void MoveUnableToMatch(FilePath filePath)
{ {
string checkFile = $"{file}.unk"; string checkFile = $"{filePath.FullName}.unk";
if (File.Exists(file) && !File.Exists(checkFile)) if (File.Exists(filePath.FullName) && !File.Exists(checkFile))
File.Move(file, checkFile); File.Move(filePath.FullName, checkFile);
} }
private FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, List<Face> intersectFaces) private FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, List<Face> intersectFaces)
@ -150,7 +150,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
return results; return results;
} }
private static FileInfo? CheckFileThenGetFileInfo(string facesFileNameExtension, MappingFromItem mappingFromItem, string file, List<(Face, double?)> checkFaces) private static FileInfo? CheckFileThenGetFileInfo(string facesFileNameExtension, FilePath filePath, MappingFromItem mappingFromItem, string file, List<(Face, double?)> checkFaces)
{ {
FileInfo? result = null; FileInfo? result = null;
string checkFile; string checkFile;
@ -165,7 +165,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
mappedFaceDirectory = Path.GetDirectoryName(file); mappedFaceDirectory = Path.GetDirectoryName(file);
if (mappedFaceDirectory is null) if (mappedFaceDirectory is null)
throw new NotSupportedException(); throw new NotSupportedException();
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(mappingFromItem.Id, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(filePath, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
checkFile = Path.Combine(mappedFaceDirectory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}"); checkFile = Path.Combine(mappedFaceDirectory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}");
if (checkFile == file) if (checkFile == file)
continue; continue;
@ -201,10 +201,9 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
} }
} }
public void LookForMatchFacesAndPossiblyRename(string facesFileNameExtension, MappingFromItem mappingFromItem, List<Face> faces, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers) public void LookForMatchFacesAndPossiblyRename(string facesFileNameExtension, FilePath filePath, MappingFromItem mappingFromItem, List<Face> faces, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers)
{ {
string? json; string? json;
string fileName;
string[] matches; string[] matches;
FileInfo? fileInfo; FileInfo? fileInfo;
List<Face> intersectFaces; List<Face> intersectFaces;
@ -215,10 +214,9 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
checkFaces.Clear(); checkFaces.Clear();
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in locationContainers) foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in locationContainers)
{ {
if (_Renamed.Contains(locationContainer.File)) if (_Renamed.Contains(locationContainer.FilePath.FullName))
continue; continue;
fileName = Path.GetFileName(locationContainer.File); if (locationContainer.FromDistanceContent && _DuplicateMappedFaceFiles.Contains(locationContainer.FilePath.Name))
if (locationContainer.FromDistanceContent && _DuplicateMappedFaceFiles.Contains(fileName))
continue; continue;
checkFaces.Clear(); checkFaces.Clear();
if (locationContainer.Directories.Count == 0) if (locationContainer.Directories.Count == 0)
@ -231,7 +229,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
if (json is null) if (json is null)
{ {
if (_DistanceMoveUnableToMatch) if (_DistanceMoveUnableToMatch)
MoveUnableToMatch(locationContainer.File); MoveUnableToMatch(locationContainer.FilePath);
continue; continue;
} }
if (filteredFaces.Length > 0) if (filteredFaces.Length > 0)
@ -254,42 +252,42 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
if (checkFaces.Count == 0) if (checkFaces.Count == 0)
{ {
if (_DistanceMoveUnableToMatch) if (_DistanceMoveUnableToMatch)
MoveUnableToMatch(locationContainer.File); MoveUnableToMatch(locationContainer.FilePath);
continue; continue;
} }
if (checkFaces.Count != 1) if (checkFaces.Count != 1)
{ {
if (_DistanceMoveUnableToMatch) if (_DistanceMoveUnableToMatch)
MoveUnableToMatch(locationContainer.File); MoveUnableToMatch(locationContainer.FilePath);
continue; continue;
} }
fileInfo = CheckFileThenGetFileInfo(facesFileNameExtension, mappingFromItem, locationContainer.File, checkFaces); fileInfo = CheckFileThenGetFileInfo(facesFileNameExtension, filePath, mappingFromItem, locationContainer.FilePath.FullName, checkFaces);
if (fileInfo is not null) if (fileInfo is not null)
{ {
if (_DistanceRenameToMatch && fileInfo is not null) if (_DistanceRenameToMatch && fileInfo is not null)
{ {
if (fileInfo.Exists) if (fileInfo.Exists)
File.Delete(locationContainer.File); File.Delete(locationContainer.FilePath.FullName);
else else
File.Move(locationContainer.File, fileInfo.FullName); File.Move(locationContainer.FilePath.FullName, fileInfo.FullName);
File.WriteAllText($"{fileInfo.FullName}.old", $"{fileInfo.FullName}{Environment.NewLine}{locationContainer.File}"); File.WriteAllText($"{fileInfo.FullName}.old", $"{fileInfo.FullName}{Environment.NewLine}{locationContainer.FilePath.FullName}");
_Renamed.Add(locationContainer.File); _Renamed.Add(locationContainer.FilePath.FullName);
} }
continue; continue;
} }
if (_AllMappedFaceFileNames.Contains(fileName)) if (_AllMappedFaceFileNames.Contains(locationContainer.FilePath.Name))
{ {
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.FilePath.FullName && Path.GetFileName(l) == locationContainer.FilePath.Name select l).ToArray();
if (locationContainer.FromDistanceContent && matches.Length > 0) if (locationContainer.FromDistanceContent && matches.Length > 0)
AppendMatchingDuplicates(locationContainer.File, matches); AppendMatchingDuplicates(locationContainer.FilePath.FullName, matches);
} }
if (!locationContainer.FromDistanceContent) if (!locationContainer.FromDistanceContent)
continue; continue;
lock (_AllMappedFaceFiles) lock (_AllMappedFaceFiles)
_AllMappedFaceFiles.Add(locationContainer.File); _AllMappedFaceFiles.Add(locationContainer.FilePath.FullName);
lock (_AllMappedFaceFileNames) lock (_AllMappedFaceFileNames)
_AllMappedFaceFileNames.Add(fileName); _AllMappedFaceFileNames.Add(locationContainer.FilePath.Name);
} }
} }
@ -491,13 +489,13 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
List<FaceDistance> faceDistanceEncodings = []; List<FaceDistance> faceDistanceEncodings = [];
foreach (Record record in records) foreach (Record record in records)
{ {
files.Add(record.File); files.Add(record.FilePath.FullName);
faceDistanceEncodings.Add(new(record.FaceRecognitionDotNetFaceEncoding)); faceDistanceEncodings.Add(new(record.FaceRecognitionDotNetFaceEncoding));
} }
foreach (Record record in records) foreach (Record record in records)
{ {
mappedRelations = []; mappedRelations = [];
fileHolder = new(record.File); fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(record.FilePath.FullName);
if (files.Count > 1) if (files.Count > 1)
{ {
faceDistanceEncoding = new(record.FaceRecognitionDotNetFaceEncoding); faceDistanceEncoding = new(record.FaceRecognitionDotNetFaceEncoding);
@ -538,7 +536,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
if (modelsFaceEncoding is null) if (modelsFaceEncoding is null)
throw new NotSupportedException(); throw new NotSupportedException();
faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding); faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding);
records.Add(new(locationContainer.File, faceRecognitionDotNetFaceEncoding)); records.Add(new(locationContainer.FilePath, faceRecognitionDotNetFaceEncoding));
} }
result = GetRelationCollections(faceDistancePermyriad, locationContainerDistanceTake, locationContainerDistanceTolerance, records); result = GetRelationCollections(faceDistancePermyriad, locationContainerDistanceTake, locationContainerDistanceTolerance, records);
return result; return result;

View File

@ -114,7 +114,7 @@ public partial class DragDropSetPropertyItem : Form
bool isValidImageFormatExtension; bool isValidImageFormatExtension;
foreach (string file in files) foreach (string file in files)
{ {
fileHolder = new(file); fileHolder = IFileHolder.Get(file);
isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered); isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered); isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
(dateTimeOriginal, _, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding); (dateTimeOriginal, _, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);

View File

@ -187,11 +187,11 @@ public class DuplicateSearch
mappingFromItem = collection[zero]; mappingFromItem = collection[zero];
if (mappingFromItem is not null) if (mappingFromItem is not null)
{ {
resizedFileHolder = new(mappingFromItem.ResizedFileHolder.FullName.Replace($"0{duplicates}", $"1{duplicates}")); resizedFileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(mappingFromItem.ResizedFileHolder.FullName.Replace($"0{duplicates}", $"1{duplicates}"));
collection[0] = new(mappingFromItem.ContainerDateTimes, item.Property.DateTimeDigitized, item.Property.DateTimeOriginal, mappingFromItem.Id, mappingFromItem.ImageFileHolder, mappingFromItem.IsWrongYear, item.Property.Keywords ?? [], mappingFromItem.MinimumDateTime, item.Property.Model, mappingFromItem.RelativePath, resizedFileHolder); collection[0] = new(mappingFromItem.ContainerDateTimes, item.Property.DateTimeDigitized, item.Property.DateTimeOriginal, mappingFromItem.Id, mappingFromItem.ImageFileHolder, mappingFromItem.IsWrongYear, item.Property.Keywords ?? [], mappingFromItem.MinimumDateTime, item.Property.Model, mappingFromItem.RelativePath, resizedFileHolder);
} }
} }
resizedFileHolder = new(string.Concat(Path.Combine(destinationRoot, directory), item.RelativePath)); resizedFileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(string.Concat(Path.Combine(destinationRoot, directory), item.RelativePath));
mappingFromItem = Shared.Models.Stateless.Methods.IMappingFromItem.GetMappingFromItem(containerDateTimes, item, resizedFileHolder); mappingFromItem = Shared.Models.Stateless.Methods.IMappingFromItem.GetMappingFromItem(containerDateTimes, item, resizedFileHolder);
collection.Add(mappingFromItem); collection.Add(mappingFromItem);
} }

View File

@ -101,7 +101,7 @@ public class D_Face
public void Update(string dResultsFullGroupDirectory) public void Update(string dResultsFullGroupDirectory)
{ {
_FileGroups.Clear(); _FileGroups.Clear();
Dictionary<string, string[]> keyValuePairs = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_PropertyConfiguration, dResultsFullGroupDirectory, [_PropertyConfiguration.ResultCollection, _PropertyConfiguration.ResultContent]); ReadOnlyDictionary<string, string[]> keyValuePairs = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_PropertyConfiguration, dResultsFullGroupDirectory, [_PropertyConfiguration.ResultCollection, _PropertyConfiguration.ResultContent]);
foreach (KeyValuePair<string, string[]> keyValuePair in keyValuePairs) foreach (KeyValuePair<string, string[]> keyValuePair in keyValuePairs)
_FileGroups.Add(keyValuePair.Key, keyValuePair.Value); _FileGroups.Add(keyValuePair.Key, keyValuePair.Value);
} }
@ -302,7 +302,7 @@ public class D_Face
locationContainer.Directories, locationContainer.Directories,
locationContainer.DirectoryNumber, locationContainer.DirectoryNumber,
locationContainer.DisplayDirectoryName, locationContainer.DisplayDirectoryName,
locationContainer.File, locationContainer.FilePath,
locationContainer.FromDistanceContent, locationContainer.FromDistanceContent,
locationContainer.Id, locationContainer.Id,
location, location,
@ -316,7 +316,7 @@ public class D_Face
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, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>>? locationContainers, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection) public List<Shared.Models.Face> GetFaces(string outputResolution, string dResultsFullGroupDirectory, FilePath filePath, 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))
@ -325,7 +325,7 @@ public class D_Face
List<Location>? locations; List<Location>? locations;
string[] changesFrom = [nameof(A_Property), nameof(B_Metadata), nameof(C_Resize)]; string[] changesFrom = [nameof(A_Property), nameof(B_Metadata), nameof(C_Resize)];
List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList(); List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList();
(_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, mappingFromItem.ImageFileHolder.Name); (_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration, filePath);
FileInfo fileInfo = new(Path.Combine(_FileGroups[_PropertyConfiguration.ResultCollection][directoryIndex], $"{mappingFromItem.ImageFileHolder.NameWithoutExtension}{mappingFromItem.ImageFileHolder.ExtensionLowered}.json")); FileInfo fileInfo = new(Path.Combine(_FileGroups[_PropertyConfiguration.ResultCollection][directoryIndex], $"{mappingFromItem.ImageFileHolder.NameWithoutExtension}{mappingFromItem.ImageFileHolder.ExtensionLowered}.json"));
if (_ForceFaceLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete"))) if (_ForceFaceLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete")))
{ {
@ -394,7 +394,7 @@ public class D_Face
return results; return results;
} }
public List<(Shared.Models.Face, FileInfo?, string, bool)> SaveFaces(string f, string dResultsFullGroupDirectory, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, MappingFromItem mappingFromItem, List<Shared.Models.Face> faces) public List<(Shared.Models.Face, FileInfo?, string, bool)> SaveFaces(string f, string dResultsFullGroupDirectory, FilePath filePath, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, MappingFromItem mappingFromItem, List<Shared.Models.Face> faces)
{ {
List<(Shared.Models.Face, FileInfo?, string, bool Save)> results = []; List<(Shared.Models.Face, FileInfo?, string, bool Save)> results = [];
bool save; bool save;
@ -402,7 +402,7 @@ public class D_Face
string deterministicHashCodeKey; string deterministicHashCodeKey;
string[] changesFrom = [nameof(A_Property), nameof(B_Metadata), nameof(C_Resize)]; string[] changesFrom = [nameof(A_Property), nameof(B_Metadata), nameof(C_Resize)];
List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList(); List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList();
(_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, mappingFromItem.ImageFileHolder.Name); (_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration, filePath);
string directory = Path.Combine(_FileGroups[_PropertyConfiguration.ResultContent][directoryIndex], mappingFromItem.ImageFileHolder.NameWithoutExtension); string directory = Path.Combine(_FileGroups[_PropertyConfiguration.ResultContent][directoryIndex], mappingFromItem.ImageFileHolder.NameWithoutExtension);
bool directoryExists = Directory.Exists(directory); bool directoryExists = Directory.Exists(directory);
foreach (Shared.Models.Face face in faces) foreach (Shared.Models.Face face in faces)
@ -413,7 +413,7 @@ public class D_Face
results.Add(new(face, null, string.Empty, save)); results.Add(new(face, null, string.Empty, save));
continue; continue;
} }
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(mappingFromItem.Id, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(filePath, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
fileInfo = new FileInfo(Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{_FileNameExtension}")); fileInfo = new FileInfo(Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{_FileNameExtension}"));
if (!directoryExists) if (!directoryExists)
save = true; save = true;

View File

@ -1,3 +1,4 @@
using System.Collections.ObjectModel;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Drawing.Imaging; using System.Drawing.Imaging;
@ -51,7 +52,7 @@ public class D2_FaceParts
public void Update(string dResultsFullGroupDirectory) public void Update(string dResultsFullGroupDirectory)
{ {
_FileGroups.Clear(); _FileGroups.Clear();
Dictionary<string, string[]> keyValuePairs = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_PropertyConfiguration, dResultsFullGroupDirectory, [_PropertyConfiguration.ResultContent]); ReadOnlyDictionary<string, string[]> keyValuePairs = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_PropertyConfiguration, dResultsFullGroupDirectory, [_PropertyConfiguration.ResultContent]);
foreach (KeyValuePair<string, string[]> keyValuePair in keyValuePairs) foreach (KeyValuePair<string, string[]> keyValuePair in keyValuePairs)
_FileGroups.Add(keyValuePair.Key, keyValuePair.Value); _FileGroups.Add(keyValuePair.Key, keyValuePair.Value);
} }
@ -182,7 +183,7 @@ public class D2_FaceParts
return result; return result;
} }
private void SaveFaceParts(int pointSize, IFileHolder resizedFileHolder, bool saveRotated, List<(Shared.Models.Face, string, string)> collection) private void SaveFaceParts(int pointSize, FileHolder resizedFileHolder, bool saveRotated, List<(Shared.Models.Face, string, string)> collection)
{ {
int x; int x;
int y; int y;
@ -244,7 +245,7 @@ public class D2_FaceParts
#pragma warning restore CA1416 #pragma warning restore CA1416
public void SaveFaceLandmarkImages(Configuration configuration, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, MappingFromItem mappingFromItem, List<Shared.Models.Face> faces, bool saveRotated) public void SaveFaceLandmarkImages(Configuration configuration, FilePath filePath, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, MappingFromItem mappingFromItem, List<Shared.Models.Face> faces, bool saveRotated)
{ {
FileInfo fileInfo; FileInfo fileInfo;
bool check = false; bool check = false;
@ -257,7 +258,7 @@ public class D2_FaceParts
List<(Shared.Models.Face, string, string)> collection = []; List<(Shared.Models.Face, string, string)> collection = [];
string[] changesFrom = [nameof(A_Property), nameof(B_Metadata), nameof(C_Resize), nameof(D_Face)]; string[] changesFrom = [nameof(A_Property), nameof(B_Metadata), nameof(C_Resize), nameof(D_Face)];
List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList(); List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList();
(_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, mappingFromItem.ImageFileHolder.Name); (_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration, filePath);
string directory = Path.Combine(_FileGroups[_PropertyConfiguration.ResultContent][directoryIndex], mappingFromItem.ImageFileHolder.NameWithoutExtension); string directory = Path.Combine(_FileGroups[_PropertyConfiguration.ResultContent][directoryIndex], mappingFromItem.ImageFileHolder.NameWithoutExtension);
bool directoryExists = Directory.Exists(directory); bool directoryExists = Directory.Exists(directory);
foreach (Shared.Models.Face face in faces) foreach (Shared.Models.Face face in faces)
@ -267,7 +268,7 @@ public class D2_FaceParts
collection.Add(new(face, string.Empty, string.Empty)); collection.Add(new(face, string.Empty, string.Empty));
continue; continue;
} }
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(mappingFromItem.Id, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(filePath, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
fileInfo = new FileInfo(Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{_FileNameExtension}")); fileInfo = new FileInfo(Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{_FileNameExtension}"));
if (string.IsNullOrEmpty(fileInfo.DirectoryName)) if (string.IsNullOrEmpty(fileInfo.DirectoryName))
continue; continue;

View File

@ -127,7 +127,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 a2PeopleSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration.PropertyConfiguration, nameof(A2_People), "{}"); string a2PeopleSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration.PropertyConfiguration, nameof(A2_People), "{}");
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(a2PeopleSingletonDirectory, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), _Faces.FileNameExtension)); personContainers = new(IPersonContainer.GetPersonContainers(a2PeopleSingletonDirectory, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), configuration.PropertyConfiguration, _Faces.FileNameExtension));
if (configuration.JLinks.Where(l => !string.IsNullOrEmpty(l)).Any()) if (configuration.JLinks.Where(l => !string.IsNullOrEmpty(l)).Any())
{ {
_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));
@ -237,6 +237,7 @@ public partial class DlibDotNet
private ReadOnlyCollection<int> GetNotNineCollection(ReadOnlyCollection<string[]> filesCollection) private ReadOnlyCollection<int> GetNotNineCollection(ReadOnlyCollection<string[]> filesCollection)
{ {
List<int> results = []; List<int> results = [];
FilePath filePath;
FileHolder fileHolder; FileHolder fileHolder;
foreach (string[] files in filesCollection) foreach (string[] files in filesCollection)
{ {
@ -244,11 +245,11 @@ public partial class DlibDotNet
{ {
if (!file.Contains(" !9")) if (!file.Contains(" !9"))
continue; continue;
fileHolder = new(file); fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(file);
(_, int? id) = IDirectory.GetId(_Configuration.PropertyConfiguration.Offset, fileHolder); filePath = FilePath.Get(_Configuration.PropertyConfiguration, fileHolder, index: null);
if (id is null) if (filePath.Id is null)
continue; continue;
results.Add(id.Value); results.Add(filePath.Id.Value);
} }
} }
return new(results); return new(results);
@ -332,7 +333,7 @@ public partial class DlibDotNet
if (outputResolution.Any(char.IsNumber)) if (outputResolution.Any(char.IsNumber))
continue; continue;
(cResultsFullGroupDirectory, _, _, _) = GetResultsFullGroupDirectories(outputResolution); (cResultsFullGroupDirectory, _, _, _) = GetResultsFullGroupDirectories(outputResolution);
filesCollectionRootDirectory = Path.Combine(cResultsFullGroupDirectory, _Configuration.PropertyConfiguration.ResultContent, _Configuration.PropertyConfiguration.ResultAllInOne); filesCollectionRootDirectory = Path.Combine(cResultsFullGroupDirectory, _Configuration.PropertyConfiguration.ResultContent);
filesCollection = IDirectory.GetFilesCollection(filesCollectionRootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage: true); filesCollection = IDirectory.GetFilesCollection(filesCollectionRootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage: true);
count = filesCollection.Select(l => l.Length).Sum(); count = filesCollection.Select(l => l.Length).Sum();
break; break;
@ -370,6 +371,8 @@ public partial class DlibDotNet
ReadOnlyCollection<Mapping> distinctFilteredMappingCollection = GetMappings(_Configuration.PropertyConfiguration, eDistanceContentDirectory, containers, mapLogic, distinctItems: true); ReadOnlyCollection<Mapping> distinctFilteredMappingCollection = GetMappings(_Configuration.PropertyConfiguration, eDistanceContentDirectory, containers, mapLogic, distinctItems: true);
if (runToDoCollectionFirst) if (runToDoCollectionFirst)
{ {
if (!Directory.Exists(eDistanceContentDirectory))
_ = Directory.CreateDirectory(eDistanceContentDirectory);
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);
} }
@ -462,6 +465,7 @@ public partial class DlibDotNet
Uri uri; Uri uri;
string? line; string? line;
string fileName; string fileName;
FilePath filePath;
Task<byte[]> task; Task<byte[]> task;
string relativePath; string relativePath;
FileHolder fileHolder; FileHolder fileHolder;
@ -487,8 +491,9 @@ public partial class DlibDotNet
extensionLowered = Path.GetExtension(uri.LocalPath); extensionLowered = Path.GetExtension(uri.LocalPath);
relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(sourceDirectoryFile, length, forceExtensionToLower: true); relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(sourceDirectoryFile, length, forceExtensionToLower: true);
isValidImageFormatExtension = _Configuration.PropertyConfiguration.ValidImageFormatExtensions.Contains(extensionLowered); isValidImageFormatExtension = _Configuration.PropertyConfiguration.ValidImageFormatExtensions.Contains(extensionLowered);
fileHolder = new(sourceDirectoryFile); fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(sourceDirectoryFile);
_ = new Item(fileHolder, relativePath, isValidImageFormatExtension); filePath = FilePath.Get(_Configuration.PropertyConfiguration, fileHolder, index: null);
_ = new Item(filePath, fileHolder, relativePath, isValidImageFormatExtension);
// container.Items.Add(item); // container.Items.Add(item);
} }
_Logger?.LogInformation(". . ."); _Logger?.LogInformation(". . .");
@ -774,12 +779,6 @@ public partial class DlibDotNet
_Logger?.LogInformation(string.Concat("Moved <", item.ImageFileHolder.FullName, '>')); _Logger?.LogInformation(string.Concat("Moved <", item.ImageFileHolder.FullName, '>'));
} }
private void LogNameWithoutExtensionIsIdFormatBut(Item item)
{
_Logger?.LogInformation($"Name without extension is Id format but doesn't match id <{item.ImageFileHolder.FullName}>");
File.Move(item.ImageFileHolder.FullName, $"{item.ImageFileHolder.FullName}.rename");
}
private int GetNotMappedCountAndUpdateMappingFromPersonThenSetMapping(MapLogic mapLogic, Item item, bool? isFocusRelativePath, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers, MappingFromItem mappingFromItem, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, List<Shared.Models.Face> faces) private int GetNotMappedCountAndUpdateMappingFromPersonThenSetMapping(MapLogic mapLogic, Item item, bool? isFocusRelativePath, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers, MappingFromItem mappingFromItem, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, List<Shared.Models.Face> faces)
{ {
int result; int result;
@ -801,7 +800,7 @@ public partial class DlibDotNet
bool? isFocusModel = GetIsFocusModel(item.Property); bool? isFocusModel = GetIsFocusModel(item.Property);
long[] jLinkResolvedPersonKeys = _JLinkResolvedDirectories.Select(l => l.PersonKey).ToArray(); long[] jLinkResolvedPersonKeys = _JLinkResolvedDirectories.Select(l => l.PersonKey).ToArray();
ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers; ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers;
ReadOnlyCollection<string> locationContainersFiles = new((from l in locationContainers select l.File).ToArray()); ReadOnlyCollection<string> locationContainersFiles = new((from l in locationContainers select l.FilePath.FullName).ToArray());
foreach (Shared.Models.Face face in faces) foreach (Shared.Models.Face face in faces)
{ {
wholePercentagesToPersonContainers = mapLogic.GetWholePercentagesToPersonContainers(item.Property?.Id); wholePercentagesToPersonContainers = mapLogic.GetWholePercentagesToPersonContainers(item.Property?.Id);
@ -826,7 +825,7 @@ public partial class DlibDotNet
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_Configuration.FaceConfidencePercent, face.Location.Confidence); confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_Configuration.FaceConfidencePercent, face.Location.Confidence);
faceAreaPermyriad = IMapping.GetAreaPermyriad(_Configuration.FaceAreaPermyriad, face.Location, face.OutputResolution); faceAreaPermyriad = IMapping.GetAreaPermyriad(_Configuration.FaceAreaPermyriad, face.Location, face.OutputResolution);
wholePercentRectangle = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); wholePercentRectangle = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
deterministicHashCodeKey = IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); deterministicHashCodeKey = IMapping.GetDeterministicHashCodeKey(item.FilePath, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, eyeα, eyeReview, wholePercentRectangle); mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, eyeα, eyeReview, wholePercentRectangle);
inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation); inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation);
mappingFromFilterPre = new(inSkipCollection, isFocusModel, isFocusRelativePath); mappingFromFilterPre = new(inSkipCollection, isFocusModel, isFocusRelativePath);
@ -834,7 +833,7 @@ public partial class DlibDotNet
isFocusPerson = mapLogic.IsFocusPerson(_Configuration.SkipPersonWithMoreThen, jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation); isFocusPerson = mapLogic.IsFocusPerson(_Configuration.SkipPersonWithMoreThen, jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation);
mappingFromFilterPost = new(canReMap, inSkipCollection, isFocusPerson); mappingFromFilterPost = new(canReMap, inSkipCollection, isFocusPerson);
} }
mapping = new(mappingFromFilterPost, mappingFromFilterPre, mappingFromItem, mappingFromLocation, mappingFromPhotoPrismCollection); mapping = new(item.FilePath, mappingFromFilterPost, mappingFromFilterPre, mappingFromItem, mappingFromLocation, mappingFromPhotoPrismCollection);
notMapped += mapLogic.UpdateMappingFromPerson(wholePercentagesToPersonContainers, mapping); notMapped += mapLogic.UpdateMappingFromPerson(wholePercentagesToPersonContainers, mapping);
face.SetMapping(mapping); face.SetMapping(mapping);
} }
@ -904,7 +903,7 @@ public partial class DlibDotNet
else else
{ {
wholePercentRectangle = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(Shared.Models.Stateless.ILocation.Digits); wholePercentRectangle = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(Shared.Models.Stateless.ILocation.Digits);
deterministicHashCodeKey = IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, Shared.Models.Stateless.ILocation.Digits); deterministicHashCodeKey = IMapping.GetDeterministicHashCodeKey(item.FilePath, Shared.Models.Stateless.ILocation.Digits);
mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, eyeα, eyeReview, wholePercentRectangle); mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, eyeα, eyeReview, wholePercentRectangle);
inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation); inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation);
mappingFromFilterPre = new(inSkipCollection, isFocusModel, isFocusRelativePath); mappingFromFilterPre = new(inSkipCollection, isFocusModel, isFocusRelativePath);
@ -912,7 +911,7 @@ public partial class DlibDotNet
isFocusPerson = mapLogic.IsFocusPerson(_Configuration.SkipPersonWithMoreThen, jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation); isFocusPerson = mapLogic.IsFocusPerson(_Configuration.SkipPersonWithMoreThen, jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation);
mappingFromFilterPost = new(canReMap, inSkipCollection, isFocusPerson); mappingFromFilterPost = new(canReMap, inSkipCollection, isFocusPerson);
} }
result = new(mappingFromFilterPost, mappingFromFilterPre, mappingFromItem, mappingFromLocation, mappingFromPhotoPrismCollection: null); result = new(item.FilePath, mappingFromFilterPost, mappingFromFilterPre, mappingFromItem, mappingFromLocation, mappingFromPhotoPrismCollection: null);
int notMapped = mapLogic.UpdateMappingFromPerson(wholePercentagesToPersonContainers, result); int notMapped = mapLogic.UpdateMappingFromPerson(wholePercentagesToPersonContainers, result);
return (result, notMapped); return (result, notMapped);
} }
@ -940,8 +939,8 @@ public partial class DlibDotNet
DateTime dateTime = DateTime.Now; DateTime dateTime = DateTime.Now;
Shared.Models.Property? property; Shared.Models.Property? property;
List<string> parseExceptions = []; List<string> parseExceptions = [];
List<Tuple<string, DateTime>> subFileTuples = [];
string[] changesFrom = [nameof(A_Property)]; string[] changesFrom = [nameof(A_Property)];
List<Tuple<string, DateTime>> subFileTuples = [];
FileHolder resizedFileHolder = _Resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber); FileHolder resizedFileHolder = _Resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber);
ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers = mapLogic.GetLocationContainers(item); ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers = mapLogic.GetLocationContainers(item);
if (item.Property is null || item.Property.Id is null || !item.SourceDirectoryFileHolder.Exists || item.SourceDirectoryFileHolder.CreationTime is null || item.SourceDirectoryFileHolder.LastWriteTime is null || item.Any()) if (item.Property is null || item.Property.Id is null || !item.SourceDirectoryFileHolder.Exists || item.SourceDirectoryFileHolder.CreationTime is null || item.SourceDirectoryFileHolder.LastWriteTime is null || item.Any())
@ -973,18 +972,12 @@ public partial class DlibDotNet
subFileTuples.Add(new Tuple<string, DateTime>(nameof(A_Property), item.SourceDirectoryFileHolder.LastWriteTime.Value)); subFileTuples.Add(new Tuple<string, DateTime>(nameof(A_Property), item.SourceDirectoryFileHolder.LastWriteTime.Value));
else else
subFileTuples.Add(new Tuple<string, DateTime>(nameof(A_Property), new FileInfo(item.SourceDirectoryFileHolder.FullName).LastWriteTime)); subFileTuples.Add(new Tuple<string, DateTime>(nameof(A_Property), new FileInfo(item.SourceDirectoryFileHolder.FullName).LastWriteTime));
short sortOrderOnlyLengthIndex = IDirectory.GetSortOrderOnlyLengthIndex(_Configuration.PropertyConfiguration.Offset); FilePath filePath = FilePath.Get(_Configuration.PropertyConfiguration, item.ImageFileHolder, index: null);
bool nameWithoutExtensionIsIdFormat = Shared.Models.Stateless.Methods.IProperty.NameWithoutExtensionIsIdFormat(item.ImageFileHolder);
bool nameWithoutExtensionIsPaddedIdFormat = IDirectory.NameWithoutExtensionIsPaddedIdFormat(item.ImageFileHolder, sortOrderOnlyLengthIndex);
if (nameWithoutExtensionIsIdFormat && item.ImageFileHolder.NameWithoutExtension != item.Property.Id.ToString())
LogNameWithoutExtensionIsIdFormatBut(item);
if (nameWithoutExtensionIsPaddedIdFormat && item.ImageFileHolder.NameWithoutExtension.EndsWith(item.Property.Id.Value.ToString()[1..]))
LogNameWithoutExtensionIsIdFormatBut(item);
if (resizedFileHolder.Exists && item.Property.Width is not null && item.Property.Width.Value > 4 && _Configuration.SaveBlurHashForOutputResolutions.Contains(outputResolution)) if (resizedFileHolder.Exists && item.Property.Width is not null && item.Property.Width.Value > 4 && _Configuration.SaveBlurHashForOutputResolutions.Contains(outputResolution))
{ {
string? file = _BlurHasher.GetFile(resizedFileHolder); string? file = _BlurHasher.GetFile(item.FilePath);
if (file is not null && !File.Exists(file)) if (file is not null && !File.Exists(file))
_ = _BlurHasher.EncodeAndSave(resizedFileHolder); _ = _BlurHasher.EncodeAndSave(item.FilePath, resizedFileHolder);
} }
} }
if (property is null || item.Property is null) if (property is null || item.Property is null)
@ -992,7 +985,7 @@ public partial class DlibDotNet
item.SetResizedFileHolder(_Resize.FileNameExtension, resizedFileHolder); item.SetResizedFileHolder(_Resize.FileNameExtension, resizedFileHolder);
MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(containerDateTimes, item, resizedFileHolder); MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(containerDateTimes, item, resizedFileHolder);
Map.Models.Stateless.Methods.IMapLogic.SetCreationTimeMaybeMoveToDecade(_Configuration.PropertyConfiguration, _Configuration.MoveToDecade && _Configuration.LocationContainerDistanceTolerance is null, mappingFromItem, locationContainers); Map.Models.Stateless.Methods.IMapLogic.SetCreationTimeMaybeMoveToDecade(_Configuration.PropertyConfiguration, _Configuration.MoveToDecade && _Configuration.LocationContainerDistanceTolerance is null, mappingFromItem, locationContainers);
ReadOnlyDictionary<string, MetadataExtractorDirectory> metadataExtractorDirectories = metadata.GetMetadataCollection(subFileTuples, parseExceptions, changesFrom, mappingFromItem); ReadOnlyDictionary<string, MetadataExtractorDirectory> metadataExtractorDirectories = metadata.GetMetadataCollection(item.FilePath, subFileTuples, parseExceptions, changesFrom, mappingFromItem);
if (_AppSettings.Places.Count > 0) if (_AppSettings.Places.Count > 0)
{ {
float latitude; float latitude;
@ -1015,7 +1008,7 @@ public partial class DlibDotNet
distance += 1; distance += 1;
} }
} }
Dictionary<string, int[]> outputResolutionToResize = _Resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, item.Property, mappingFromItem); Dictionary<string, int[]> outputResolutionToResize = _Resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, item.FilePath, subFileTuples, parseExceptions, item.Property, mappingFromItem);
if (_Configuration.SaveResizedSubfiles) if (_Configuration.SaveResizedSubfiles)
_Resize.SaveResizedSubfile(_Configuration.PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize); _Resize.SaveResizedSubfile(_Configuration.PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize);
if (!_Configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions.Contains(outputResolution)) if (!_Configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions.Contains(outputResolution))
@ -1027,21 +1020,21 @@ public partial class DlibDotNet
List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection; List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection;
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, item.FilePath, subFileTuples, parseExceptions, property, mappingFromItem, outputResolutionToResize, locationContainers, mappingFromPhotoPrismCollection);
result = GetNotMappedCountAndUpdateMappingFromPersonThenSetMapping(mapLogic, item, isFocusRelativePath, locationContainers, mappingFromItem, mappingFromPhotoPrismCollection, faces); result = GetNotMappedCountAndUpdateMappingFromPersonThenSetMapping(mapLogic, item, isFocusRelativePath, 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, item.FilePath, subFileTuples, parseExceptions, mappingFromItem, faces);
if (_Configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions.Contains(outputResolution)) if (_Configuration.CopyFacesAndSaveFaceLandmarkForOutputResolutions.Contains(outputResolution))
_FaceParts.CopyFacesAndSaveFaceLandmarkImage(facePartsCollectionDirectory, mappingFromItem, faceCollection); _FaceParts.CopyFacesAndSaveFaceLandmarkImage(facePartsCollectionDirectory, mappingFromItem, faceCollection);
if ((_Configuration.DistanceMoveUnableToMatch || _Configuration.DistanceRenameToMatch) if ((_Configuration.DistanceMoveUnableToMatch || _Configuration.DistanceRenameToMatch)
&& _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution) && _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution)
&& locationContainers is not null && faceCollection.All(l => !l.Saved)) && locationContainers is not null && faceCollection.All(l => !l.Saved))
_Distance.LookForMatchFacesAndPossiblyRename(_Faces.FileNameExtension, mappingFromItem, faces, locationContainers); _Distance.LookForMatchFacesAndPossiblyRename(_Faces.FileNameExtension, item.FilePath, mappingFromItem, faces, locationContainers);
(bool review, int[] eyesCollection) = Shared.Models.Stateless.Methods.IFace.GetEyeCollection(_Configuration.EyeThreshold, faces); (bool review, int[] eyesCollection) = Shared.Models.Stateless.Methods.IFace.GetEyeCollection(_Configuration.EyeThreshold, faces);
if (review || _Configuration.SaveFaceLandmarkForOutputResolutions.Contains(outputResolution)) if (review || _Configuration.SaveFaceLandmarkForOutputResolutions.Contains(outputResolution))
{ {
bool saveRotated = false; bool saveRotated = false;
string sourceDirectorySegment = Property.Models.Stateless.IResult.GetRelativePath(_Configuration.PropertyConfiguration, container.SourceDirectory); string sourceDirectorySegment = Property.Models.Stateless.IResult.GetRelativePath(_Configuration.PropertyConfiguration, container.SourceDirectory);
_FaceParts.SaveFaceLandmarkImages(_Configuration.PropertyConfiguration, subFileTuples, parseExceptions, mappingFromItem, faces, saveRotated); _FaceParts.SaveFaceLandmarkImages(_Configuration.PropertyConfiguration, item.FilePath, subFileTuples, parseExceptions, mappingFromItem, faces, saveRotated);
} }
} }
lock (sourceDirectoryChanges) lock (sourceDirectoryChanges)
@ -1233,7 +1226,7 @@ public partial class DlibDotNet
int count = filesCollection.Select(l => l.Length).Sum(); int count = filesCollection.Select(l => l.Length).Sum();
string message = $") Selecting for ## pattern directory - {(int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds)} total second(s)"; string message = $") Selecting for ## pattern directory - {(int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds)} total second(s)";
progressBar = new(count, message, options); progressBar = new(count, message, options);
(string[] distinctDirectories, List<(FileHolder, string?, string)> toDoCollection) = IDirectory.GetToDoCollection(_Configuration.PropertyConfiguration, filesCollection, fileGroups[_Configuration.PropertyConfiguration.ResultContent], () => progressBar.Tick()); (string[] distinctDirectories, List<(FilePath, string)> toDoCollection) = IDirectory.GetToDoCollection(_Configuration.PropertyConfiguration, filesCollection, fileGroups[_Configuration.PropertyConfiguration.ResultContent], () => progressBar.Tick());
progressBar.Dispose(); progressBar.Dispose();
foreach (string distinctDirectory in distinctDirectories) foreach (string distinctDirectory in distinctDirectories)
{ {

View File

@ -200,9 +200,9 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
continue; continue;
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in keyValuePair.Value) foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in keyValuePair.Value)
{ {
if (locationContainer.File.Contains('!')) if (locationContainer.FilePath.FullName.Contains('!'))
continue; continue;
renameCollection.Add(locationContainer.File); renameCollection.Add(locationContainer.FilePath.FullName);
} }
} }
if (renameCollection.Count > 0) if (renameCollection.Count > 0)
@ -259,7 +259,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
readOnlyPersonKeyFormattedCollection = new(personKeyFormattedCollection); readOnlyPersonKeyFormattedCollection = new(personKeyFormattedCollection);
readOnlyPersonKeyFormattedToNewestPersonKeyFormatted = new(personKeyFormattedToNewestPersonKeyFormatted); readOnlyPersonKeyFormattedToNewestPersonKeyFormatted = new(personKeyFormattedToNewestPersonKeyFormatted);
} }
List<Stateless.Record> records = Stateless.DistanceLogic.DeleteEmptyDirectoriesAndGetCollection(configuration, ticks, eDistanceContentDirectory, readOnlyPersonKeyFormattedToNewestPersonKeyFormatted, readOnlyPersonKeyFormattedCollection); List<Stateless.Record> records = Stateless.DistanceLogic.DeleteEmptyDirectoriesAndGetCollection(propertyConfiguration, configuration, ticks, eDistanceContentDirectory, readOnlyPersonKeyFormattedToNewestPersonKeyFormatted, readOnlyPersonKeyFormattedCollection);
ReadOnlyCollection<(Stateless.MapLogic.PersonKeyFormattedIdThenWholePercentages, PersonContainer)> readOnlyPossiblyNewPersonDisplayDirectoryNamesAndPersonContainer; ReadOnlyCollection<(Stateless.MapLogic.PersonKeyFormattedIdThenWholePercentages, PersonContainer)> readOnlyPossiblyNewPersonDisplayDirectoryNamesAndPersonContainer;
ReadOnlyCollection<Stateless.MapLogic.PersonKeyFormattedIdThenWholePercentages> personKeyFormattedIdThenWholePercentagesCollection = Stateless.MapLogic.GetPersonKeyFormattedIdThenWholePercentages(configuration, ticks, records); ReadOnlyCollection<Stateless.MapLogic.PersonKeyFormattedIdThenWholePercentages> personKeyFormattedIdThenWholePercentagesCollection = Stateless.MapLogic.GetPersonKeyFormattedIdThenWholePercentages(configuration, ticks, records);
// //
@ -300,6 +300,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
personContainers, personContainers,
readOnlyPersonKeyToCount)); readOnlyPersonKeyToCount));
locationContainers.AddRange(Stateless.MapLogic.GetLocationContainers(maxDegreeOfParallelism, locationContainers.AddRange(Stateless.MapLogic.GetLocationContainers(maxDegreeOfParallelism,
propertyConfiguration,
configuration, configuration,
ticks, ticks,
personContainers, personContainers,
@ -431,17 +432,17 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
else else
{ {
string checkFile; string checkFile;
string facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.MappingFromItem); string facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.FilePath, mapping.MappingFromItem);
FileHolder faceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}")); FileHolder faceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}"));
if (!faceFileHolder.Exists) if (!faceFileHolder.Exists)
result = null; result = null;
else else
{ {
string shortcutFile = string.Empty; string shortcutFile = string.Empty;
string facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.MappingFromItem); string facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.FilePath, mapping.MappingFromItem);
checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}"); checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}");
FileHolder hiddenFaceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}")); FileHolder hiddenFaceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}"));
FileHolder facePartsFileHolder = new(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}")); FileHolder facePartsFileHolder = IFileHolder.Get(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}"));
result = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, mapping.MappingFromItem.ResizedFileHolder, shortcutFile); result = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, mapping.MappingFromItem.ResizedFileHolder, shortcutFile);
} }
} }
@ -616,8 +617,8 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
if (saveIndividually && question.MappingFromLocation.WholePercentages == mapping.MappingFromLocation.WholePercentages) if (saveIndividually && question.MappingFromLocation.WholePercentages == mapping.MappingFromLocation.WholePercentages)
results.Add(new(Path.Combine(directory, "Maybe"))); results.Add(new(Path.Combine(directory, "Maybe")));
} }
facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.MappingFromItem); facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.FilePath, mapping.MappingFromItem);
faceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}")); faceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}"));
if (!faceFileHolder.Exists) if (!faceFileHolder.Exists)
continue; continue;
if (isByMapping) if (isByMapping)
@ -627,19 +628,19 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
} }
else if (saveIndividually) else if (saveIndividually)
{ {
facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.MappingFromItem); facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.FilePath, mapping.MappingFromItem);
facePartsFileHolder = new(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}")); facePartsFileHolder = IFileHolder.Get(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}"));
(saveContainer, SaveContainer? extraSaveContainer) = Stateless.MapLogic.GetContainers(_Configuration.FacesFileNameExtension, _Configuration.FacePartsFileNameExtension, directory, faceFileHolder, facePartsFileHolder, mapping); (saveContainer, SaveContainer? extraSaveContainer) = Stateless.MapLogic.GetContainers(_Configuration.FacesFileNameExtension, _Configuration.FacePartsFileNameExtension, directory, faceFileHolder, facePartsFileHolder, mapping);
if (extraSaveContainer is not null) if (extraSaveContainer is not null)
results.Add(extraSaveContainer); results.Add(extraSaveContainer);
} }
else else
{ {
facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.MappingFromItem); facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.FilePath, mapping.MappingFromItem);
shortcutFile = Path.Combine(record.PersonDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.lnk"); shortcutFile = Path.Combine(record.PersonDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.lnk");
checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}"); checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}");
hiddenFaceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}")); hiddenFaceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}"));
facePartsFileHolder = new(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}")); facePartsFileHolder = IFileHolder.Get(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}"));
saveContainer = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, mapping.MappingFromItem.ResizedFileHolder, shortcutFile); saveContainer = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, mapping.MappingFromItem.ResizedFileHolder, shortcutFile);
} }
results.Add(saveContainer); results.Add(saveContainer);
@ -747,8 +748,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
key = string.Concat(personKeyFormatted, '\t', segmentB); key = string.Concat(personKeyFormatted, '\t', segmentB);
if (!keyToCount.ContainsKey(key)) if (!keyToCount.ContainsKey(key))
keyToCount.Add(key, new()); keyToCount.Add(key, new());
if (!keyToCount.ContainsKey(key)) _ = keyToCount.TryAdd(key, 0);
keyToCount.Add(key, 0);
keyToCount[key]++; keyToCount[key]++;
if (!_Configuration.SaveIndividually && keyToCount[key] < _Configuration.SortingMaximumPerKey) if (!_Configuration.SaveIndividually && keyToCount[key] < _Configuration.SortingMaximumPerKey)
segmentC = null; segmentC = null;
@ -828,13 +828,13 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
results.Add(new(record.PersonDirectory)); results.Add(new(record.PersonDirectory));
if (_Configuration.SaveIndividually && question.MappingFromLocation.WholePercentages == question.MappingFromLocation.WholePercentages) if (_Configuration.SaveIndividually && question.MappingFromLocation.WholePercentages == question.MappingFromLocation.WholePercentages)
results.Add(new(Path.Combine(directory, "Maybe"))); results.Add(new(Path.Combine(directory, "Maybe")));
facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, question.MappingFromItem); facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, question.FilePath, question.MappingFromItem);
faceFileHolder = new(Path.Combine(facesDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}")); faceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}"));
facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, question.MappingFromItem); facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, question.FilePath, question.MappingFromItem);
shortcutFile = Path.Combine(record.PersonDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}.lnk"); shortcutFile = Path.Combine(record.PersonDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}.lnk");
checkFile = Path.Combine(directory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}"); checkFile = Path.Combine(directory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}");
hiddenFaceFileHolder = new(Path.Combine(facesDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}")); hiddenFaceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}"));
facePartsFileHolder = new(Path.Combine(facePartsDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}")); facePartsFileHolder = IFileHolder.Get(Path.Combine(facePartsDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}"));
saveContainer = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, question.MappingFromItem.ResizedFileHolder, shortcutFile); saveContainer = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, question.MappingFromItem.ResizedFileHolder, shortcutFile);
results.Add(saveContainer); results.Add(saveContainer);
if (!_Configuration.SaveIndividually && isBySorting && question.MappingFromPerson is null) if (!_Configuration.SaveIndividually && isBySorting && question.MappingFromPerson is null)
@ -988,6 +988,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
List<string> results = []; List<string> results = [];
string[] files; string[] files;
List<int>? ids;
string checkDirectory; string checkDirectory;
string[] checkDirectories; string[] checkDirectories;
string personKeyFormatted; string personKeyFormatted;
@ -1019,10 +1020,10 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
(personKeyFormatted, personBirthday) = GetPersonBirthday(windowsShortcut.Path); (personKeyFormatted, personBirthday) = GetPersonBirthday(windowsShortcut.Path);
if (personBirthday is null) if (personBirthday is null)
throw new NotSupportedException(fileNameWithoutExtension); throw new NotSupportedException(fileNameWithoutExtension);
if (!personKeyToIds.ContainsKey(personBirthday.Value.Ticks)) if (!personKeyToIds.TryGetValue(personBirthday.Value.Ticks, out ids))
collection.Add(new(personBirthday.Value.Ticks, Path.Combine(checkDirectory, personKeyFormatted, fileNameWithoutExtension))); collection.Add(new(personBirthday.Value.Ticks, Path.Combine(checkDirectory, personKeyFormatted, fileNameWithoutExtension)));
else else
collection.Add(new(personBirthday.Value.Ticks, Path.Combine(checkDirectory, personKeyFormatted, fileNameWithoutExtension, $"{personKeyToIds[personBirthday.Value.Ticks].Count} Face(s)"))); collection.Add(new(personBirthday.Value.Ticks, Path.Combine(checkDirectory, personKeyFormatted, fileNameWithoutExtension, $"{ids.Count} Face(s)")));
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();
@ -1161,6 +1162,7 @@ public partial 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<int>? ids;
string fileName; string fileName;
string fullName; string fullName;
string directory; string directory;
@ -1215,7 +1217,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
personDirectory = Path.Combine(directory, "Unknown"); personDirectory = Path.Combine(directory, "Unknown");
fileName = Path.Combine(personDirectory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk"); fileName = Path.Combine(personDirectory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk");
collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, mapping.MappingFromLocation?.DeterministicHashCodeKey, MakeAllHidden: false)); collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, mapping.MappingFromLocation?.DeterministicHashCodeKey, MakeAllHidden: false));
facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.MappingFromItem); facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.FilePath, mapping.MappingFromItem);
if (mapping.MappingFromLocation is null) if (mapping.MappingFromLocation is null)
continue; continue;
fullName = Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}"); fullName = Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}");
@ -1235,10 +1237,10 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
directoriesAndDateTimes.Add(new(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, mapping.MappingFromItem.ContainerDateTimes)); directoriesAndDateTimes.Add(new(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, mapping.MappingFromItem.ContainerDateTimes));
} }
directory = Path.Combine(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", personKeyFormatted); directory = Path.Combine(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", personKeyFormatted);
if (!personKeyToIds.ContainsKey(mapping.MappingFromPerson.PersonKey)) if (!personKeyToIds.TryGetValue(mapping.MappingFromPerson.PersonKey, out ids))
personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName); personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName);
else else
personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName, $"{personKeyToIds[mapping.MappingFromPerson.PersonKey].Count} Face(s)"); personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName, $"{ids.Count} Face(s)");
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk"); fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk");
collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, mapping.MappingFromLocation?.DeterministicHashCodeKey, MakeAllHidden: false)); collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, mapping.MappingFromLocation?.DeterministicHashCodeKey, MakeAllHidden: false));
} }

View File

@ -39,24 +39,22 @@ internal abstract class DecadeLogic
string checkDirectory; string checkDirectory;
string? yearDirectory; string? yearDirectory;
string yearDirectoryName; string yearDirectoryName;
string? personNameDirectory;
string personNameDirectoryName; string personNameDirectoryName;
string? personKeyFormattedDirectory; string? personKeyFormattedDirectory;
string? personKeyFormattedDirectoryName; string? personKeyFormattedDirectoryName;
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in locationContainers) foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in locationContainers)
{ {
if (!File.Exists(locationContainer.File)) if (!File.Exists(locationContainer.FilePath.FullName))
continue; continue;
dateTime = mappingFromItem.DateTimeOriginal is null ? mappingFromItem.MinimumDateTime : mappingFromItem.DateTimeOriginal.Value; dateTime = mappingFromItem.DateTimeOriginal is null ? mappingFromItem.MinimumDateTime : mappingFromItem.DateTimeOriginal.Value;
if (locationContainer.CreationDateOnly.Year != dateTime.Year || locationContainer.CreationDateOnly.Month != dateTime.Month || locationContainer.CreationDateOnly.Day != dateTime.Day) if (locationContainer.CreationDateOnly.Year != dateTime.Year || locationContainer.CreationDateOnly.Month != dateTime.Month || locationContainer.CreationDateOnly.Day != dateTime.Day)
File.SetCreationTime(locationContainer.File, dateTime); File.SetCreationTime(locationContainer.FilePath.FullName, dateTime);
if (!moveToDecade) if (!moveToDecade)
continue; continue;
personNameDirectory = Path.GetDirectoryName(locationContainer.File); if (string.IsNullOrEmpty(locationContainer.FilePath.DirectoryName))
if (string.IsNullOrEmpty(personNameDirectory))
continue; continue;
personNameDirectoryName = Path.GetFileName(personNameDirectory); personNameDirectoryName = Path.GetFileName(locationContainer.FilePath.DirectoryName);
yearDirectory = Path.GetDirectoryName(personNameDirectory); yearDirectory = Path.GetDirectoryName(locationContainer.FilePath.DirectoryName);
if (string.IsNullOrEmpty(yearDirectory)) if (string.IsNullOrEmpty(yearDirectory))
continue; continue;
yearDirectoryName = Path.GetFileName(yearDirectory); yearDirectoryName = Path.GetFileName(yearDirectory);
@ -72,7 +70,7 @@ internal abstract class DecadeLogic
checkDirectory = Path.Combine(personKeyFormattedDirectory, halfDecade, personNameDirectoryName); checkDirectory = Path.Combine(personKeyFormattedDirectory, halfDecade, personNameDirectoryName);
if (!Directory.Exists(checkDirectory)) if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory); _ = Directory.CreateDirectory(checkDirectory);
File.Move(locationContainer.File, Path.Combine(checkDirectory, Path.GetFileName(locationContainer.File))); File.Move(locationContainer.FilePath.FullName, Path.Combine(checkDirectory, locationContainer.FilePath.Name));
} }
} }

View File

@ -1,8 +1,10 @@
using Humanizer; using Humanizer;
using ShellProgressBar; using ShellProgressBar;
using System.Buffers;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Diagnostics; using System.Diagnostics;
using System.Globalization; using System.Globalization;
using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Stateless.Methods; using View_by_Distance.Shared.Models.Stateless.Methods;
namespace View_by_Distance.Map.Models.Stateless; namespace View_by_Distance.Map.Models.Stateless;
@ -11,7 +13,7 @@ internal record Record(string PersonKeyFormatted,
int DirectoryNumber, int DirectoryNumber,
string? PersonDisplayDirectoryName, string? PersonDisplayDirectoryName,
bool? IsDefault, bool? IsDefault,
string MappedFaceFile); FilePath MappedFaceFilePath);
internal abstract class DistanceLogic internal abstract class DistanceLogic
{ {
@ -208,31 +210,36 @@ internal abstract class DistanceLogic
} }
} }
private static List<Record> GetRecords(Configuration configuration, bool? isDefault, string[] files, int directoryNumber, string personKeyFormatted, List<string> distinct, string? personDisplayDirectoryName) private static List<Record> GetRecords(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, bool? isDefault, string[] files, int directoryNumber, string personKeyFormatted, List<string> distinct, string? personDisplayDirectoryName)
{ {
List<Record> results = []; List<Record> results = [];
int? id;
string fileName; string fileName;
string checkFile; string checkFile;
FilePath filePath;
FileHolder fileHolder;
int? wholePercentages; int? wholePercentages;
foreach (string mappedFaceFile in files) foreach (string file in files)
{ {
if (mappedFaceFile.EndsWith(".lnk")) if (file.EndsWith(".lnk"))
continue; continue;
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFaceFile); fileHolder = IFileHolder.Get(file);
if (id is null || wholePercentages is null) filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
if (filePath.Id is null)
continue; continue;
fileName = Path.GetFileName(mappedFaceFile); wholePercentages = IMapping.GetWholePercentages(configuration.FacesFileNameExtension, filePath);
if (wholePercentages is null)
continue;
fileName = Path.GetFileName(file);
if (distinct.Contains(fileName)) if (distinct.Contains(fileName))
{ {
checkFile = $"{mappedFaceFile}.dup"; checkFile = $"{file}.dup";
if (File.Exists(checkFile)) if (File.Exists(checkFile))
continue; continue;
File.Move(mappedFaceFile, checkFile); File.Move(file, checkFile);
continue; continue;
} }
distinct.Add(fileName); distinct.Add(fileName);
results.Add(new(personKeyFormatted, directoryNumber, personDisplayDirectoryName, isDefault, mappedFaceFile)); results.Add(new(personKeyFormatted, directoryNumber, personDisplayDirectoryName, isDefault, filePath));
} }
return results; return results;
} }
@ -256,7 +263,7 @@ internal abstract class DistanceLogic
Directory.Move(personKeyDirectory, newestPersonKeyDirectory); Directory.Move(personKeyDirectory, newestPersonKeyDirectory);
} }
internal static List<Record> DeleteEmptyDirectoriesAndGetCollection(Configuration configuration, long ticks, string eDistanceContentDirectory, ReadOnlyDictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, ReadOnlyCollection<string> personKeyFormattedCollection) internal static List<Record> DeleteEmptyDirectoriesAndGetCollection(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, long ticks, string eDistanceContentDirectory, ReadOnlyDictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, ReadOnlyCollection<string> personKeyFormattedCollection)
{ {
List<Record> results = []; List<Record> results = [];
bool check; bool check;
@ -271,9 +278,9 @@ internal abstract class DistanceLogic
ProgressBar progressBar; ProgressBar progressBar;
string[] yearDirectories; string[] yearDirectories;
string personKeyFormatted; string personKeyFormatted;
List<string> distinct = [];
string? personFirstInitial; string? personFirstInitial;
bool isReservedDirectoryName; bool isReservedDirectoryName;
List<string> distinct = [];
string[] personNameDirectories; string[] personNameDirectories;
string? newestPersonKeyFormatted; string? newestPersonKeyFormatted;
string? personDisplayDirectoryName; string? personDisplayDirectoryName;
@ -331,7 +338,7 @@ internal abstract class DistanceLogic
isDefault = null; isDefault = null;
personDisplayDirectoryName = null; personDisplayDirectoryName = null;
files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly); files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly);
results.AddRange(GetRecords(configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName)); results.AddRange(GetRecords(propertyConfiguration, configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName));
files = Directory.GetFiles(yearDirectory, "*.lnk", SearchOption.AllDirectories); files = Directory.GetFiles(yearDirectory, "*.lnk", SearchOption.AllDirectories);
foreach (string file in files) foreach (string file in files)
File.Delete(file); File.Delete(file);
@ -403,7 +410,7 @@ internal abstract class DistanceLogic
else else
{ {
personFirstInitial = personDisplayDirectoryName[..1]; personFirstInitial = personDisplayDirectoryName[..1];
if (personFirstInitial.All(l => char.IsDigit(l))) if (personFirstInitial.All(char.IsDigit))
{ {
foreach (string file in files) foreach (string file in files)
File.Delete(file); File.Delete(file);
@ -419,7 +426,7 @@ internal abstract class DistanceLogic
Directory.Move(personNameDirectory, personFirstInitialDirectory); Directory.Move(personNameDirectory, personFirstInitialDirectory);
files = Directory.GetFiles(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly); files = Directory.GetFiles(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly);
} }
results.AddRange(GetRecords(configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName)); results.AddRange(GetRecords(propertyConfiguration, configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName));
personNameLinkDirectories = Directory.GetDirectories(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly); personNameLinkDirectories = Directory.GetDirectories(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string personNameLinkDirectory in personNameLinkDirectories) foreach (string personNameLinkDirectory in personNameLinkDirectories)
{ {

View File

@ -1,3 +1,4 @@
using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Stateless.Methods; using View_by_Distance.Shared.Models.Stateless.Methods;
namespace View_by_Distance.Map.Models.Stateless; namespace View_by_Distance.Map.Models.Stateless;
@ -7,21 +8,20 @@ internal abstract class LookForAbandonedLogic
internal static void LookForAbandoned(Property.Models.Configuration propertyConfiguration, List<int> distinctFilteredIds, string directory, string directoryName) internal static void LookForAbandoned(Property.Models.Configuration propertyConfiguration, List<int> distinctFilteredIds, string directory, string directoryName)
{ {
string fileNameWithoutExtension; FilePath filePath;
bool nameWithoutExtensionIsIdFormat; FileHolder fileHolder;
string fileNameFirstSegment;
List<string> renameCollection = []; List<string> renameCollection = [];
bool nameWithoutExtensionIsPaddedIdFormat;
short sortOrderOnlyLengthIndex = IDirectory.GetSortOrderOnlyLengthIndex(propertyConfiguration.Offset);
string[] distinctFilteredIdsValues = distinctFilteredIds.Select(l => l.ToString()).ToArray(); string[] distinctFilteredIdsValues = distinctFilteredIds.Select(l => l.ToString()).ToArray();
string[] files = Directory.GetFiles(directory, "*", SearchOption.AllDirectories); string[] files = Directory.GetFiles(directory, "*", SearchOption.AllDirectories);
foreach (string file in files) foreach (string file in files)
{ {
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(file))); fileHolder = IFileHolder.Get(file);
nameWithoutExtensionIsIdFormat = IProperty.NameWithoutExtensionIsIdFormat(fileNameWithoutExtension); filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
nameWithoutExtensionIsPaddedIdFormat = IDirectory.NameWithoutExtensionIsPaddedIdFormat(fileNameWithoutExtension, sortOrderOnlyLengthIndex); fileNameFirstSegment = fileHolder.NameWithoutExtension.Split('.')[0];
if (!nameWithoutExtensionIsIdFormat && !nameWithoutExtensionIsPaddedIdFormat) if (!filePath.IsIntelligentIdFormat && filePath.SortOrder is null)
continue; continue;
if (distinctFilteredIdsValues.Contains(fileNameWithoutExtension)) if (distinctFilteredIdsValues.Contains(fileNameFirstSegment))
continue; continue;
renameCollection.Add(file); renameCollection.Add(file);
} }

View File

@ -17,66 +17,67 @@ internal abstract class MapLogic
string PersonKeyFormatted, string PersonKeyFormatted,
string? PersonDisplayDirectoryName, string? PersonDisplayDirectoryName,
int? DirectoryNumber, int? DirectoryNumber,
string File); FilePath FilePath);
internal record Duplicate(long PersonKey, internal record Duplicate(long PersonKey,
int Id, int Id,
string File, FilePath FilePath,
float? Percent); float? Percent);
internal record PersonKeyFormattedIdThenWholePercentages(string PersonKeyFormatted, internal record PersonKeyFormattedIdThenWholePercentages(string PersonKeyFormatted,
string? PersonDisplayDirectoryName, string? PersonDisplayDirectoryName,
bool? IsDefault, bool? IsDefault,
string MappedFaceFile, FilePath MappedFaceFilePath,
int Id, int Id,
int WholePercentages); int WholePercentages);
internal static void SetSkipCollections(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, Dictionary<int, List<(string, int)>> skipCollection, Dictionary<int, List<(string, int)>> skipNotSkipCollection) internal static void SetSkipCollections(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, Dictionary<int, List<(string, int)>> skipCollection, Dictionary<int, List<(string, int)>> skipNotSkipCollection)
{ {
int? id;
string fileName;
string checkFile; string checkFile;
int? wholePercentages; int? wholePercentages;
List<FilePath> distinct = [];
List<string> distinctFiles = []; List<string> distinctFiles = [];
List<string> distinctFileName = []; List<string> distinctFileName = [];
bool skipNotSkipDirectoriesAny = configuration.SkipNotSkipDirectories.Length > 0; bool skipNotSkipDirectoriesAny = configuration.SkipNotSkipDirectories.Length > 0;
string[] checkDirectories = (from l in configuration.SkipNotSkipDirectories select Path.GetFullPath($"{a2PeopleSingletonDirectory}{l}")).ToArray(); string[] checkDirectories = (from l in configuration.SkipNotSkipDirectories select Path.GetFullPath($"{a2PeopleSingletonDirectory}{l}")).ToArray();
foreach (PersonContainer personContainer in personContainers) foreach (PersonContainer personContainer in personContainers)
{ {
foreach (string personDisplayDirectoryAllFile in personContainer.DisplayDirectoryAllFiles) foreach (FilePath personDisplayDirectoryAllFilePath in personContainer.DisplayDirectoryAllFilePaths)
{ {
if (!personDisplayDirectoryAllFile.EndsWith(configuration.FacesFileNameExtension)) if (personDisplayDirectoryAllFilePath.ExtensionLowered != configuration.FacesFileNameExtension)
continue; continue;
if (distinctFiles.Contains(personDisplayDirectoryAllFile)) if (distinctFiles.Contains(personDisplayDirectoryAllFilePath.FullName))
continue; continue;
distinctFiles.Add(personDisplayDirectoryAllFile); distinctFiles.Add(personDisplayDirectoryAllFilePath.FullName);
distinct.Add(personDisplayDirectoryAllFilePath);
} }
} }
foreach (string distinctFile in distinctFiles) foreach (FilePath filePath in distinct)
{ {
fileName = Path.GetFileName(distinctFile); if (distinctFileName.Contains(filePath.Name))
if (distinctFileName.Contains(fileName))
{ {
checkFile = $"{distinctFile}.dup"; checkFile = $"{filePath.FullName}.dup";
if (File.Exists(checkFile)) if (File.Exists(checkFile))
continue; continue;
File.Move(distinctFile, checkFile); File.Move(filePath.FullName, checkFile);
continue; continue;
} }
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, distinctFile); if (filePath.Id is null)
if (id is null || wholePercentages is null)
continue; continue;
if (!skipNotSkipDirectoriesAny || !checkDirectories.Any(l => distinctFile.StartsWith(l))) wholePercentages = IMapping.GetWholePercentages(configuration.FacesFileNameExtension, filePath);
if (wholePercentages is null)
continue;
if (!skipNotSkipDirectoriesAny || !checkDirectories.Any(l => filePath.FullName.StartsWith(l)))
{ {
if (!skipCollection.ContainsKey(id.Value)) if (!skipCollection.ContainsKey(filePath.Id.Value))
skipCollection.Add(id.Value, []); skipCollection.Add(filePath.Id.Value, []);
skipCollection[id.Value].Add((distinctFile, wholePercentages.Value)); skipCollection[filePath.Id.Value].Add((filePath.FullName, wholePercentages.Value));
} }
else else
{ {
if (!skipNotSkipCollection.ContainsKey(id.Value)) if (!skipNotSkipCollection.ContainsKey(filePath.Id.Value))
skipNotSkipCollection.Add(id.Value, []); skipNotSkipCollection.Add(filePath.Id.Value, []);
skipNotSkipCollection[id.Value].Add((distinctFile, wholePercentages.Value)); skipNotSkipCollection[filePath.Id.Value].Add((filePath.FullName, wholePercentages.Value));
} }
} }
} }
@ -96,8 +97,7 @@ internal abstract class MapLogic
if (personContainer.Birthdays.Length < 1) if (personContainer.Birthdays.Length < 1)
continue; continue;
newestPersonKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personContainer.Key.Value); newestPersonKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personContainer.Key.Value);
if (!personKeyFormattedToNewestPersonKeyFormatted.ContainsKey(personKeyFormatted)) _ = personKeyFormattedToNewestPersonKeyFormatted.TryAdd(personKeyFormatted, newestPersonKeyFormatted);
personKeyFormattedToNewestPersonKeyFormatted.Add(personKeyFormatted, newestPersonKeyFormatted);
} }
} }
} }
@ -184,23 +184,21 @@ internal abstract class MapLogic
private static List<MappedFile> GetDisplayDirectoryAllFiles(string fileNameExtension, string personBirthdayFormat, ReadOnlyCollection<PersonContainer> personContainers) private static List<MappedFile> GetDisplayDirectoryAllFiles(string fileNameExtension, string personBirthdayFormat, ReadOnlyCollection<PersonContainer> personContainers)
{ {
List<MappedFile> results = []; List<MappedFile> results = [];
string fileName;
string personKeyFormatted; string personKeyFormatted;
List<string> distinct = []; List<string> distinct = [];
foreach (PersonContainer personContainer in personContainers) foreach (PersonContainer personContainer in personContainers)
{ {
if (personContainer.Key is null) if (personContainer.Key is null)
continue; continue;
for (int i = personContainer.DisplayDirectoryAllFiles.Length - 1; i > -1; i--) for (int i = personContainer.DisplayDirectoryAllFilePaths.Count - 1; i > -1; i--)
{ {
if (!personContainer.DisplayDirectoryAllFiles[i].EndsWith(fileNameExtension)) if (personContainer.DisplayDirectoryAllFilePaths[i].ExtensionLowered != fileNameExtension)
continue; continue;
fileName = Path.GetFileName(personContainer.DisplayDirectoryAllFiles[i]); if (distinct.Contains(personContainer.DisplayDirectoryAllFilePaths[i].Name))
if (distinct.Contains(fileName))
continue; continue;
distinct.Add(fileName); distinct.Add(personContainer.DisplayDirectoryAllFilePaths[i].Name);
personKeyFormatted = IPersonBirthday.GetFormatted(personBirthdayFormat, personContainer.Key.Value); personKeyFormatted = IPersonBirthday.GetFormatted(personBirthdayFormat, personContainer.Key.Value);
results.Add(new(personContainer.Key.Value, personKeyFormatted, personContainer.DisplayDirectoryName, null, personContainer.DisplayDirectoryAllFiles[i])); results.Add(new(personContainer.Key.Value, personKeyFormatted, personContainer.DisplayDirectoryName, null, personContainer.DisplayDirectoryAllFilePaths[i]));
} }
} }
return results; return results;
@ -213,30 +211,30 @@ internal abstract class MapLogic
{ {
if (duplicate.Percent is null) if (duplicate.Percent is null)
continue; continue;
_ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(duplicate.File), "\"")); _ = Process.Start("explorer.exe", string.Concat("\"", duplicate.FilePath.DirectoryName, "\""));
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, duplicate.PersonKey); personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, duplicate.PersonKey);
} }
foreach ((long personKey, int id, string file, float? percent) in duplicates) foreach ((long personKey, int id, FilePath filePath, float? percent) in duplicates)
{ {
if (percent is not null && percent.Value == 0) if (percent is not null && percent.Value == 0)
continue; continue;
_ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(file), "\"")); _ = Process.Start("explorer.exe", string.Concat("\"", filePath.DirectoryName, "\""));
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personKey); personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personKey);
} }
foreach ((long personKey, int id, string file, float? percent) in duplicates) foreach ((long personKey, int id, FilePath filePath, float? percent) in duplicates)
{ {
if (percent is not null && percent.Value > 0) if (percent is not null && percent.Value > 0)
continue; continue;
_ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(file), "\"")); _ = Process.Start("explorer.exe", string.Concat("\"", filePath.DirectoryName, "\""));
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personKey); personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personKey);
} }
} }
internal static string GetFacesDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string dFacesContentDirectory, MappingFromItem mappingFromItem) internal static string GetFacesDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string dFacesContentDirectory, FilePath filePath, MappingFromItem mappingFromItem)
{ {
string result; string result;
(string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration.ResultAllInOneSubdirectoryLength, mappingFromItem.ImageFileHolder.NameWithoutExtension); (string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath);
result = Path.Combine(dFacesContentDirectory, propertyConfiguration.ResultAllInOne, directoryName, mappingFromItem.ImageFileHolder.NameWithoutExtension); result = Path.Combine(dFacesContentDirectory, directoryName, mappingFromItem.ImageFileHolder.NameWithoutExtension);
return result; return result;
} }
@ -286,8 +284,7 @@ internal abstract class MapLogic
personKeyToPersonContainerCollection.Add(personContainer.Key.Value, []); personKeyToPersonContainerCollection.Add(personContainer.Key.Value, []);
personKeyToPersonContainerCollection[personContainer.Key.Value].Add(personContainer); personKeyToPersonContainerCollection[personContainer.Key.Value].Add(personContainer);
newestPersonKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personContainer.Key.Value); newestPersonKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personContainer.Key.Value);
if (!personKeyFormattedToPersonContainer.ContainsKey(newestPersonKeyFormatted)) _ = personKeyFormattedToPersonContainer.TryAdd(newestPersonKeyFormatted, personContainer);
personKeyFormattedToPersonContainer.Add(newestPersonKeyFormatted, personContainer);
} }
foreach (KeyValuePair<long, List<PersonContainer>> keyValuePair in personKeyToPersonContainerCollection) foreach (KeyValuePair<long, List<PersonContainer>> keyValuePair in personKeyToPersonContainerCollection)
{ {
@ -379,7 +376,7 @@ internal abstract class MapLogic
int? approximateYears = null; int? approximateYears = null;
PersonBirthday personBirthday; PersonBirthday personBirthday;
PersonContainer personContainer; PersonContainer personContainer;
string[] personDisplayDirectoryAllFiles = []; List<FilePath> personDisplayDirectoryAllFilePaths = [];
DateTime incrementDate = new(configuration.PersonBirthdayFirstYear, 1, 1); DateTime incrementDate = new(configuration.PersonBirthdayFirstYear, 1, 1);
long oneHour = new DateTime(1, 1, 1, 1, 0, 0).Ticks - new DateTime(1, 1, 1).Ticks; long oneHour = new DateTime(1, 1, 1, 1, 0, 0).Ticks - new DateTime(1, 1, 1).Ticks;
for (int i = 0; i < int.MaxValue; i++) for (int i = 0; i < int.MaxValue; i++)
@ -409,7 +406,7 @@ internal abstract class MapLogic
if (check) if (check)
continue; continue;
personBirthday = IPersonBirthday.GetPersonBirthday(personKey + (oneHour * 2)); personBirthday = IPersonBirthday.GetPersonBirthday(personKey + (oneHour * 2));
personContainer = new(approximateYears, [personBirthday], personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey); personContainer = new(approximateYears, [personBirthday], new(personDisplayDirectoryAllFilePaths), configuration.MappingDefaultName, personKey);
results.Add(personContainer); results.Add(personContainer);
if (results.Count > 99) if (results.Count > 99)
break; break;
@ -429,13 +426,13 @@ internal abstract class MapLogic
return result; return result;
} }
private static List<MappedFile> GetMappedFiles(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, List<Record> records) private static List<MappedFile> GetMappedFiles(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, List<Record> records)
{ {
List<MappedFile> results = []; List<MappedFile> results = [];
string file;
long personKey; long personKey;
string fileName;
string checkFile; string checkFile;
FilePath filePath;
FileHolder fileHolder;
List<string> distinct = []; List<string> distinct = [];
PersonBirthday? personBirthday; PersonBirthday? personBirthday;
results.AddRange(GetDisplayDirectoryAllFiles(configuration.FacesFileNameExtension, configuration.PersonBirthdayFormat, personContainers)); results.AddRange(GetDisplayDirectoryAllFiles(configuration.FacesFileNameExtension, configuration.PersonBirthdayFormat, personContainers));
@ -444,50 +441,66 @@ internal abstract class MapLogic
personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, record.PersonKeyFormatted); personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, record.PersonKeyFormatted);
if (personBirthday is null) if (personBirthday is null)
continue; continue;
fileName = Path.GetFileName(record.MappedFaceFile); if (distinct.Contains(record.MappedFaceFilePath.Name))
if (distinct.Contains(fileName))
continue; continue;
distinct.Add(fileName); distinct.Add(record.MappedFaceFilePath.Name);
personKey = personBirthday.Value.Ticks; personKey = personBirthday.Value.Ticks;
results.Add(new(personKey, record.PersonKeyFormatted, record.PersonDisplayDirectoryName, record.DirectoryNumber, record.MappedFaceFile)); results.Add(new(personKey, record.PersonKeyFormatted, record.PersonDisplayDirectoryName, record.DirectoryNumber, record.MappedFaceFilePath));
} }
for (int i = results.Count - 1; i > -1; i--) for (int i = results.Count - 1; i > -1; i--)
{ {
file = results[i].File; filePath = results[i].FilePath;
if (file.EndsWith(".old")) if (filePath.Name.EndsWith(".old"))
{ {
results.RemoveAt(i); results.RemoveAt(i);
continue; continue;
} }
if (!file.EndsWith(".dup") && !file.EndsWith(".unk") && !file.EndsWith(".abd")) if (!filePath.Name.EndsWith(".dup") && !filePath.Name.EndsWith(".unk") && !filePath.Name.EndsWith(".abd"))
continue; continue;
if (!File.Exists(file)) if (!File.Exists(filePath.Name))
continue; continue;
checkFile = file[..^4]; checkFile = filePath.FullName[..^4];
if (File.Exists(checkFile)) if (File.Exists(checkFile))
continue; continue;
File.Move(file, checkFile); File.Move(filePath.FullName, checkFile);
results[i] = new(results[i].PersonKey, results[i].PersonKeyFormatted, results[i].PersonDisplayDirectoryName, results[i].DirectoryNumber, file[..^4]); fileHolder = IFileHolder.Get(checkFile);
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
results[i] = new(results[i].PersonKey, results[i].PersonKeyFormatted, results[i].PersonDisplayDirectoryName, results[i].DirectoryNumber, filePath);
} }
return results; return results;
} }
private static void ParallelFor(Configuration configuration, Dictionary<int, List<(string, int)>> skipCollection, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, MappedFile mappedFile) private static void ParallelFor(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, Dictionary<int, List<(string, int)>> skipCollection, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, MappedFile mappedFile)
{ {
int? id;
string checkFile; string checkFile;
DateOnly dateOnly; DateOnly dateOnly;
FilePath filePath;
string[] fileMatches; string[] fileMatches;
FileHolder fileHolder;
int? wholePercentages;
const string lnk = ".lnk"; const string lnk = ".lnk";
int? id, wholePercentages;
string personDisplayDirectoryName; string personDisplayDirectoryName;
const bool fromDistanceContent = true; const bool fromDistanceContent = true;
IReadOnlyList<MetadataExtractor.Directory> directories; IReadOnlyList<MetadataExtractor.Directory> directories;
List<(string File, int WholePercentages)>? wholePercentagesCollection; List<(string File, int WholePercentages)>? wholePercentagesCollection;
if (!mappedFile.File.EndsWith(lnk)) if (!mappedFile.FilePath.Name.EndsWith(lnk))
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFile.File); {
if (mappedFile.FilePath.Id is null)
return;
id = mappedFile.FilePath.Id;
wholePercentages = IMapping.GetWholePercentages(configuration.FacesFileNameExtension, mappedFile.FilePath);
}
else else
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFile.File[..^4]); {
if (id is null || wholePercentages is null) fileHolder = IFileHolder.Get(mappedFile.FilePath.FullName[..^4]);
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
if (filePath.Id is null)
return;
id = filePath.Id;
wholePercentages = IMapping.GetWholePercentages(configuration.FacesFileNameExtension, filePath);
}
if (wholePercentages is null)
return; return;
if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory) && skipCollection.TryGetValue(id.Value, out wholePercentagesCollection)) if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory) && skipCollection.TryGetValue(id.Value, out wholePercentagesCollection))
{ {
@ -503,11 +516,11 @@ internal abstract class MapLogic
continue; continue;
} }
} }
dateOnly = DateOnly.FromDateTime(new FileInfo(mappedFile.File).CreationTime); dateOnly = DateOnly.FromDateTime(new DateTime(mappedFile.FilePath.CreationTicks));
if (mappedFile.File.EndsWith(lnk) || (!configuration.DistanceMoveUnableToMatch && !configuration.DistanceRenameToMatch) || !File.Exists(mappedFile.File)) if (mappedFile.FilePath.Name.EndsWith(lnk) || (!configuration.DistanceMoveUnableToMatch && !configuration.DistanceRenameToMatch) || !File.Exists(mappedFile.FilePath.FullName))
directories = new List<MetadataExtractor.Directory>(); directories = new List<MetadataExtractor.Directory>();
else else
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mappedFile.File); directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mappedFile.FilePath.FullName);
RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value); RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value);
personDisplayDirectoryName = mappedFile.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : mappedFile.PersonDisplayDirectoryName; personDisplayDirectoryName = mappedFile.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : mappedFile.PersonDisplayDirectoryName;
lock (locationContainers) lock (locationContainers)
@ -515,7 +528,7 @@ internal abstract class MapLogic
directories, directories,
mappedFile.DirectoryNumber, mappedFile.DirectoryNumber,
personDisplayDirectoryName, personDisplayDirectoryName,
mappedFile.File, mappedFile.FilePath,
fromDistanceContent, fromDistanceContent,
id.Value, id.Value,
null, null,
@ -529,11 +542,11 @@ internal abstract class MapLogic
string key; string key;
float? percent; float? percent;
float itemPercentagesArea; float itemPercentagesArea;
List<string> delete = []; List<FilePath> delete = [];
List<Duplicate> duplicates = []; List<Duplicate> duplicates = [];
RectangleF? itemPercentagesRectangle; RectangleF? itemPercentagesRectangle;
(string File, int WholePercentages) item; (FilePath FilePath, int WholePercentages) item;
Dictionary<string, (string, int)> distinct = []; Dictionary<string, (FilePath, int)> distinct = [];
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in locationContainers) foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in locationContainers)
{ {
key = string.Concat(locationContainer.PersonKey, locationContainer.Id); key = string.Concat(locationContainer.PersonKey, locationContainer.Id);
@ -549,12 +562,12 @@ internal abstract class MapLogic
itemPercentagesArea = itemPercentagesRectangle.Value.Width * itemPercentagesRectangle.Value.Height; itemPercentagesArea = itemPercentagesRectangle.Value.Width * itemPercentagesRectangle.Value.Height;
percent = ILocation.GetIntersectPercent(itemPercentagesRectangle.Value, itemPercentagesArea, locationContainer.Rectangle.Value); percent = ILocation.GetIntersectPercent(itemPercentagesRectangle.Value, itemPercentagesArea, locationContainer.Rectangle.Value);
} }
delete.Add(item.File); delete.Add(item.FilePath);
delete.Add(locationContainer.File); delete.Add(locationContainer.FilePath);
duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.File, percent)); duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.FilePath, percent));
continue; continue;
} }
distinct.Add(key, new(locationContainer.File, locationContainer.WholePercentages)); distinct.Add(key, new(locationContainer.FilePath, locationContainer.WholePercentages));
} }
if (!configuration.DeletePossibleDuplicates && duplicates.Count > 0) if (!configuration.DeletePossibleDuplicates && duplicates.Count > 0)
OpenPossibleDuplicates(configuration, duplicates); OpenPossibleDuplicates(configuration, duplicates);
@ -562,10 +575,10 @@ internal abstract class MapLogic
{ {
if (delete.Count > 8) if (delete.Count > 8)
throw new Exception("Something maybe wrong!"); throw new Exception("Something maybe wrong!");
foreach (string file in delete) foreach (FilePath filePath in delete)
{ {
if (File.Exists(file)) if (File.Exists(filePath.FullName))
File.Delete(file); File.Delete(filePath.FullName);
} }
} }
} }
@ -584,10 +597,10 @@ internal abstract class MapLogic
else else
{ {
string checkFile = Path.Combine(directory, $"{keyMapping.MappingFromItem.ImageFileHolder.Name}{facePartsFileNameExtension}"); string checkFile = Path.Combine(directory, $"{keyMapping.MappingFromItem.ImageFileHolder.Name}{facePartsFileNameExtension}");
result = new(checkFile, directory, new(facePartsContentCollectionFile)); result = new(checkFile, directory, IFileHolder.Get(facePartsContentCollectionFile));
} }
string facesDirectory = GetFacesDirectory(propertyConfiguration, dFacesContentDirectory, keyMapping.MappingFromItem); string facesDirectory = GetFacesDirectory(propertyConfiguration, dFacesContentDirectory, keyMapping.FilePath, keyMapping.MappingFromItem);
FileHolder faceFileHolder = new(Path.Combine(facesDirectory, $"{keyMapping.MappingFromLocation.DeterministicHashCodeKey}{keyMapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}")); FileHolder faceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{keyMapping.MappingFromLocation.DeterministicHashCodeKey}{keyMapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}"));
if (!faceFileHolder.Exists) if (!faceFileHolder.Exists)
saveContainer = null; saveContainer = null;
else else
@ -714,8 +727,7 @@ internal abstract class MapLogic
} }
if (personContainer.Key is null) if (personContainer.Key is null)
throw new Exception(); throw new Exception();
if (!personKeyToCount.ContainsKey(personContainer.Key.Value)) _ = personKeyToCount.TryAdd(personContainer.Key.Value, 0);
personKeyToCount.Add(personContainer.Key.Value, 0);
personKeyToCount[personContainer.Key.Value]++; personKeyToCount[personContainer.Key.Value]++;
possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Add(new(personKeyFormattedIdThenWholePercentages, personContainer)); possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Add(new(personKeyFormattedIdThenWholePercentages, personContainer));
} }
@ -731,29 +743,30 @@ internal abstract class MapLogic
return results; return results;
} }
internal static ReadOnlyCollection<PersonKeyFormattedIdThenWholePercentages> GetPersonKeyFormattedIdThenWholePercentages(Configuration configuration, long ticks, List<Record> collection) internal static ReadOnlyCollection<PersonKeyFormattedIdThenWholePercentages> GetPersonKeyFormattedIdThenWholePercentages(Configuration configuration, long ticks, List<Record> records)
{ {
List<PersonKeyFormattedIdThenWholePercentages> results = []; List<PersonKeyFormattedIdThenWholePercentages> results = [];
int? id;
int? wholePercentages; int? wholePercentages;
List<int> wholePercentagesCollection; List<int> wholePercentagesCollection;
Dictionary<int, List<int>> idToWholePercentagesCollection = []; Dictionary<int, List<int>> idToWholePercentagesCollection = [];
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 = $") {collection.Count:000} join from ticks Director(ies) - C - {totalSeconds} total second(s)"; string message = $") {records.Count:000} join from ticks Director(ies) - C - {totalSeconds} total second(s)";
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
using ProgressBar progressBar = new(collection.Count, message, options); using ProgressBar progressBar = new(records.Count, message, options);
foreach (Record record in collection) foreach (Record record in records)
{ {
progressBar.Tick(); progressBar.Tick();
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, record.MappedFaceFile); if (record.MappedFaceFilePath.Id is null)
if (id is null || wholePercentages is null)
continue; continue;
if (!idToWholePercentagesCollection.ContainsKey(id.Value)) wholePercentages = IMapping.GetWholePercentages(configuration.FacesFileNameExtension, record.MappedFaceFilePath);
idToWholePercentagesCollection.Add(id.Value, []); if (wholePercentages is null)
wholePercentagesCollection = idToWholePercentagesCollection[id.Value]; continue;
if (!idToWholePercentagesCollection.ContainsKey(record.MappedFaceFilePath.Id.Value))
idToWholePercentagesCollection.Add(record.MappedFaceFilePath.Id.Value, []);
wholePercentagesCollection = idToWholePercentagesCollection[record.MappedFaceFilePath.Id.Value];
wholePercentagesCollection.Add(wholePercentages.Value); wholePercentagesCollection.Add(wholePercentages.Value);
idToWholePercentagesCollection[id.Value].Add(wholePercentages.Value); idToWholePercentagesCollection[record.MappedFaceFilePath.Id.Value].Add(wholePercentages.Value);
results.Add(new(record.PersonKeyFormatted, record.PersonDisplayDirectoryName, record.IsDefault, record.MappedFaceFile, id.Value, wholePercentages.Value)); results.Add(new(record.PersonKeyFormatted, record.PersonDisplayDirectoryName, record.IsDefault, record.MappedFaceFilePath, record.MappedFaceFilePath.Id.Value, wholePercentages.Value));
} }
return new(results); return new(results);
} }
@ -801,16 +814,17 @@ internal abstract class MapLogic
int? approximateYears = null; int? approximateYears = null;
PersonBirthday? personBirthday; PersonBirthday? personBirthday;
PersonContainer personContainer; PersonContainer personContainer;
List<PersonContainer>? collection;
displayDirectoryName = configuration.MappingDefaultName; displayDirectoryName = configuration.MappingDefaultName;
foreach (KeyValuePair<long, int> keyValuePair in personKeyToCount) foreach (KeyValuePair<long, int> keyValuePair in personKeyToCount)
{ {
if (personKeyToPersonContainer.ContainsKey(keyValuePair.Key)) if (personKeyToPersonContainer.ContainsKey(keyValuePair.Key))
continue; continue;
personBirthday = IPersonBirthday.GetPersonBirthday(keyValuePair.Key); personBirthday = IPersonBirthday.GetPersonBirthday(keyValuePair.Key);
if (!personKeyToPersonContainerCollection.ContainsKey(keyValuePair.Key)) if (!personKeyToPersonContainerCollection.TryGetValue(keyValuePair.Key, out collection))
personContainer = new(approximateYears, personBirthday, displayDirectoryName, keyValuePair.Key); personContainer = new(approximateYears, personBirthday, displayDirectoryName, keyValuePair.Key);
else else
personContainer = new(approximateYears, personBirthday, personKeyToPersonContainerCollection[keyValuePair.Key][zero].PersonDirectory, displayDirectoryName, keyValuePair.Key); personContainer = new(approximateYears, personBirthday, collection[zero].PersonDirectory, displayDirectoryName, keyValuePair.Key);
personKeyToPersonContainer.Add(keyValuePair.Key, personContainer); personKeyToPersonContainer.Add(keyValuePair.Key, personContainer);
} }
} }
@ -825,8 +839,8 @@ internal abstract class MapLogic
string checkFile; string checkFile;
const int zero = 0; const int zero = 0;
string personKeyFormatted; string personKeyFormatted;
string[] deleteCollection;
List<string> distinct = []; List<string> distinct = [];
FilePath[] deleteCollection;
PersonBirthday personBirthday; PersonBirthday personBirthday;
string personDisplayDirectory; string personDisplayDirectory;
DateTime dateTime = new(ticks); DateTime dateTime = new(ticks);
@ -837,49 +851,49 @@ internal abstract class MapLogic
continue; continue;
if (a2PeopleSingletonDirectory is null || personContainer.Key is null || personContainer.Birthdays is null || personContainer.PersonDirectory is null || personContainer.Birthdays.Length == 0) if (a2PeopleSingletonDirectory is null || personContainer.Key is null || personContainer.Birthdays is null || personContainer.PersonDirectory is null || personContainer.Birthdays.Length == 0)
continue; continue;
fileName = $"{Path.GetFileName(personKeyFormattedIdThenWholePercentages.MappedFaceFile)}{configuration.FacesHiddenFileNameExtension}"; fileName = $"{Path.GetFileName(personKeyFormattedIdThenWholePercentages.MappedFaceFilePath.FullName)}{configuration.FacesHiddenFileNameExtension}";
personBirthday = personContainer.Birthdays[zero]; personBirthday = personContainer.Birthdays[zero];
personKey = personBirthday.Value.Ticks; personKey = personBirthday.Value.Ticks;
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personBirthday); personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personBirthday);
personDisplayDirectory = Path.Combine(a2PeopleSingletonDirectory, personContainer.PersonDirectory.Char.ToString(), personContainer.PersonDirectory.Group, personContainer.DisplayDirectoryName); personDisplayDirectory = Path.Combine(a2PeopleSingletonDirectory, personContainer.PersonDirectory.Char.ToString(), personContainer.PersonDirectory.Group, personContainer.DisplayDirectoryName);
personKeyFormattedDirectory = Path.GetFullPath(Path.Combine(personDisplayDirectory, personKeyFormatted)); personKeyFormattedDirectory = Path.GetFullPath(Path.Combine(personDisplayDirectory, personKeyFormatted));
deleteCollection = (from l in personContainer.DisplayDirectoryAllFiles where l.StartsWith(personKeyFormattedDirectory) select l).ToArray(); deleteCollection = (from l in personContainer.DisplayDirectoryAllFilePaths where l.FullName.StartsWith(personKeyFormattedDirectory) select l).ToArray();
if (personContainer.DisplayDirectoryAllFiles.Length != 0 && deleteCollection.Length == 0) if (personContainer.DisplayDirectoryAllFilePaths.Count != 0 && deleteCollection.Length == 0)
throw new NotSupportedException(); throw new NotSupportedException();
if (!Directory.Exists(personKeyFormattedDirectory)) if (!Directory.Exists(personKeyFormattedDirectory))
_ = Directory.CreateDirectory(personKeyFormattedDirectory); _ = Directory.CreateDirectory(personKeyFormattedDirectory);
_ = readOnlyPersonKeyToCount.TryGetValue(personKey, out count); _ = readOnlyPersonKeyToCount.TryGetValue(personKey, out count);
_ = Directory.CreateDirectory(Path.Combine(personDisplayDirectory, count.ToString("0000"))); _ = Directory.CreateDirectory(Path.Combine(personDisplayDirectory, count.ToString("0000")));
Directory.SetLastWriteTime(personDisplayDirectory, dateTime.AddMinutes(count)); Directory.SetLastWriteTime(personDisplayDirectory, dateTime.AddMinutes(count));
matches = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(fileName) select true).ToArray(); matches = (from l in personContainer.DisplayDirectoryAllFilePaths where l.FullName.EndsWith(fileName) select true).ToArray();
if (matches.Length > 0) if (matches.Length > 0)
continue; continue;
matches = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(configuration.FacesHiddenFileNameExtension) select true).ToArray(); matches = (from l in personContainer.DisplayDirectoryAllFilePaths where l.FullName.EndsWith(configuration.FacesHiddenFileNameExtension) select true).ToArray();
if (matches.Length > 0) if (matches.Length > 0)
continue; continue;
if (!File.Exists(personKeyFormattedIdThenWholePercentages.MappedFaceFile)) if (!File.Exists(personKeyFormattedIdThenWholePercentages.MappedFaceFilePath.FullName))
continue; continue;
checkFile = Path.Combine(personKeyFormattedDirectory, $"{Path.GetFileName(personKeyFormattedIdThenWholePercentages.MappedFaceFile)}{configuration.FacesHiddenFileNameExtension}"); checkFile = Path.Combine(personKeyFormattedDirectory, $"{Path.GetFileName(personKeyFormattedIdThenWholePercentages.MappedFaceFilePath.FullName)}{configuration.FacesHiddenFileNameExtension}");
if (File.Exists(checkFile)) if (File.Exists(checkFile))
continue; continue;
File.Copy(personKeyFormattedIdThenWholePercentages.MappedFaceFile, checkFile); File.Copy(personKeyFormattedIdThenWholePercentages.MappedFaceFilePath.FullName, checkFile);
foreach (string delete in deleteCollection) foreach (FilePath delete in deleteCollection)
{ {
if (delete.EndsWith(".lnk")) if (delete.ExtensionLowered == ".lnk")
continue; continue;
if (!File.Exists(delete)) if (!File.Exists(delete.FullName))
continue; continue;
File.Delete(delete); File.Delete(delete.FullName);
} }
Directory.SetLastWriteTime(personDisplayDirectory, DateTime.Now); Directory.SetLastWriteTime(personDisplayDirectory, DateTime.Now);
distinct.Add(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted); distinct.Add(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted);
} }
} }
internal static List<LocationContainer<MetadataExtractor.Directory>> GetLocationContainers(int maxDegreeOfParallelism, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, Dictionary<int, List<(string, int)>> skipCollection, List<Record> records) internal static List<LocationContainer<MetadataExtractor.Directory>> GetLocationContainers(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, Dictionary<int, List<(string, int)>> skipCollection, List<Record> records)
{ {
List<LocationContainer<MetadataExtractor.Directory>> results = []; List<LocationContainer<MetadataExtractor.Directory>> results = [];
List<MappedFile> mappedFiles = GetMappedFiles(configuration, personContainers, records); List<MappedFile> mappedFiles = GetMappedFiles(propertyConfiguration, configuration, personContainers, records);
if (mappedFiles.Count > 0 && (configuration.DistanceMoveUnableToMatch || configuration.DistanceRenameToMatch)) if (mappedFiles.Count > 0 && (configuration.DistanceMoveUnableToMatch || configuration.DistanceRenameToMatch))
{ {
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
@ -890,7 +904,7 @@ internal abstract class MapLogic
_ = Parallel.For(0, mappedFiles.Count, parallelOptions, (i, state) => _ = Parallel.For(0, mappedFiles.Count, parallelOptions, (i, state) =>
{ {
progressBar.Tick(); progressBar.Tick();
ParallelFor(configuration, skipCollection, results, mappedFiles[i]); ParallelFor(propertyConfiguration, configuration, skipCollection, results, mappedFiles[i]);
}); });
} }
if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory)) if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory))
@ -904,33 +918,27 @@ internal abstract class MapLogic
internal static int CopyManualFiles(Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, string eDistanceContentTicksDirectory) internal static int CopyManualFiles(Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, string eDistanceContentTicksDirectory)
{ {
int result = 0; int result = 0;
string fileName;
string checkFile; string checkFile;
string? directory;
string dateDirectory; string dateDirectory;
string directoryName; string directoryName;
string checkDirectory; string checkDirectory;
string personKeyFormatted; string personKeyFormatted;
PersonBirthday personBirthday;
List<string> distinct = []; List<string> distinct = [];
PersonBirthday personBirthday;
DateTime dateTime = new(ticks); DateTime dateTime = new(ticks);
string by = nameof(Shared.Models.Stateless.IMapLogic.ManualCopy); string by = nameof(Shared.Models.Stateless.IMapLogic.ManualCopy);
foreach (PersonContainer personContainer in personContainers) foreach (PersonContainer personContainer in personContainers)
{ {
if (personContainer.Key is null) if (personContainer.Key is null)
continue; continue;
for (int i = personContainer.DisplayDirectoryAllFiles.Length - 1; i > -1; i--) for (int i = personContainer.DisplayDirectoryAllFilePaths.Count - 1; i > -1; i--)
{ {
if (!personContainer.DisplayDirectoryAllFiles[i].EndsWith(configuration.FacesFileNameExtension)) if (personContainer.DisplayDirectoryAllFilePaths[i].ExtensionLowered != configuration.FacesFileNameExtension)
continue; continue;
fileName = Path.GetFileName(personContainer.DisplayDirectoryAllFiles[i]); if (distinct.Contains(personContainer.DisplayDirectoryAllFilePaths[i].Name))
if (distinct.Contains(fileName))
continue; continue;
distinct.Add(fileName); distinct.Add(personContainer.DisplayDirectoryAllFilePaths[i].Name);
directory = Path.GetDirectoryName(personContainer.DisplayDirectoryAllFiles[i]); directoryName = Path.GetFileName(personContainer.DisplayDirectoryAllFilePaths[i].DirectoryName);
if (string.IsNullOrEmpty(directory))
continue;
directoryName = Path.GetFileName(directory);
if (directoryName != personContainer.DisplayDirectoryName) if (directoryName != personContainer.DisplayDirectoryName)
continue; continue;
personBirthday = IPersonBirthday.GetPersonBirthday(personContainer.Key.Value); personBirthday = IPersonBirthday.GetPersonBirthday(personContainer.Key.Value);
@ -939,12 +947,13 @@ internal abstract class MapLogic
checkDirectory = Path.Combine(dateDirectory, personContainer.DisplayDirectoryName); checkDirectory = Path.Combine(dateDirectory, personContainer.DisplayDirectoryName);
if (!Directory.Exists(checkDirectory)) if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory); _ = Directory.CreateDirectory(checkDirectory);
checkFile = Path.Combine(dateDirectory, fileName); checkFile = Path.Combine(dateDirectory, personContainer.DisplayDirectoryAllFilePaths[i].Name);
if (File.Exists(checkFile)) if (File.Exists(checkFile))
continue; continue;
File.Move(personContainer.DisplayDirectoryAllFiles[i], checkFile); File.Move(personContainer.DisplayDirectoryAllFilePaths[i].FullName, checkFile);
personContainer.DisplayDirectoryAllFiles[i] = string.Empty; throw new NotImplementedException("readonly null?");
result++; // personContainer.DisplayDirectoryAllFilePaths[i] = null;
// result++;
} }
} }
return result; return result;
@ -961,11 +970,11 @@ internal abstract class MapLogic
return result; return result;
} }
internal static string GetFacePartsDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string d2FacePartsContentDirectory, MappingFromItem mappingFromItem) internal static string GetFacePartsDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string d2FacePartsContentDirectory, FilePath filePath, MappingFromItem mappingFromItem)
{ {
string result; string result;
(string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration.ResultAllInOneSubdirectoryLength, mappingFromItem.ImageFileHolder.NameWithoutExtension); (string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath);
result = Path.Combine(d2FacePartsContentDirectory, propertyConfiguration.ResultAllInOne, directoryName, mappingFromItem.ImageFileHolder.NameWithoutExtension); result = Path.Combine(d2FacePartsContentDirectory, directoryName, mappingFromItem.ImageFileHolder.NameWithoutExtension);
return result; return result;
} }
@ -975,7 +984,7 @@ internal abstract class MapLogic
string shortcutFile; string shortcutFile;
if (sortingContainer?.Source.MappingFromLocation is null) if (sortingContainer?.Source.MappingFromLocation is null)
throw new NullReferenceException(nameof(sortingContainer.Source.MappingFromLocation)); throw new NullReferenceException(nameof(sortingContainer.Source.MappingFromLocation));
FileHolder faceFileHolder = new($"C:/{sortingContainer.Sorting.Id}.{sortingContainer.Sorting.WholePercentages}"); FileHolder faceFileHolder = IFileHolder.Get($"C:/{sortingContainer.Sorting.Id}.{sortingContainer.Sorting.WholePercentages}");
if (keyMapping.MappingFromPerson is not null && keyMapping.MappingFromLocation is not null) if (keyMapping.MappingFromPerson is not null && keyMapping.MappingFromLocation is not null)
shortcutFile = Path.Combine(directory, $"{keyMapping.MappingFromLocation.DeterministicHashCodeKey}{keyMapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.{sortingContainer.Sorting.DistancePermyriad}.lnk"); shortcutFile = Path.Combine(directory, $"{keyMapping.MappingFromLocation.DeterministicHashCodeKey}{keyMapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.{sortingContainer.Sorting.DistancePermyriad}.lnk");
else else

View File

@ -19,7 +19,7 @@ internal abstract class RelationLogic
{ {
if (!locationContainer.FromDistanceContent) if (!locationContainer.FromDistanceContent)
continue; continue;
if (!locationContainer.File.Contains(configuration.LocationContainerDirectoryPattern)) if (!locationContainer.FilePath.FullName.Contains(configuration.LocationContainerDirectoryPattern))
continue; continue;
if (!personKeyTo.TryGetValue(locationContainer.PersonKey, out yearTo)) if (!personKeyTo.TryGetValue(locationContainer.PersonKey, out yearTo))
{ {
@ -312,9 +312,9 @@ internal abstract class RelationLogic
{ {
lines.Clear(); lines.Clear();
if (movedFiles.TryGetValue(relationFileHolder.FullName, out file)) if (movedFiles.TryGetValue(relationFileHolder.FullName, out file))
fileHolder = new(file); fileHolder = IFileHolder.Get(file);
else else
fileHolder = new(relationFileHolder.FullName); fileHolder = IFileHolder.Get(relationFileHolder.FullName);
if (!relationFileHolder.Exists || relationFileHolder.CreationTime is null) if (!relationFileHolder.Exists || relationFileHolder.CreationTime is null)
continue; continue;
if (isCounterPersonYear) if (isCounterPersonYear)
@ -344,9 +344,9 @@ internal abstract class RelationLogic
{ {
relation = relations[i]; relation = relations[i];
if (movedFiles.TryGetValue(relation.File, out file)) if (movedFiles.TryGetValue(relation.File, out file))
fileHolder = new(file); fileHolder = IFileHolder.Get(file);
else else
fileHolder = new(relation.File); fileHolder = IFileHolder.Get(relation.File);
if (!fileHolder.Exists || fileHolder.CreationTime is null) if (!fileHolder.Exists || fileHolder.CreationTime is null)
continue; continue;
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileHolder.NameWithoutExtension); fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileHolder.NameWithoutExtension);

View File

@ -16,7 +16,7 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
private readonly bool _PropertiesChangedForMetadata; private readonly bool _PropertiesChangedForMetadata;
private readonly IPropertyConfiguration _PropertyConfiguration; private readonly IPropertyConfiguration _PropertyConfiguration;
private readonly bool _ForceMetadataLastWriteTimeToCreationTime; private readonly bool _ForceMetadataLastWriteTimeToCreationTime;
private readonly IReadOnlyDictionary<string, string[]> _FileGroups; private readonly ReadOnlyDictionary<string, string[]> _FileGroups;
private readonly JsonSerializerOptions _WriteIndentedJsonSerializerOptions; private readonly JsonSerializerOptions _WriteIndentedJsonSerializerOptions;
public B_Metadata(IPropertyConfiguration propertyConfiguration) public B_Metadata(IPropertyConfiguration propertyConfiguration)
@ -43,12 +43,12 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
return result; return result;
} }
public ReadOnlyDictionary<string, MetadataExtractorDirectory> GetMetadataCollection(List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, string[] changesFrom, MappingFromItem mappingFromItem) public ReadOnlyDictionary<string, MetadataExtractorDirectory> GetMetadataCollection(FilePath filePath, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, string[] changesFrom, MappingFromItem mappingFromItem)
{ {
Dictionary<string, MetadataExtractorDirectory>? results = null; Dictionary<string, MetadataExtractorDirectory>? results = null;
string json = string.Empty; string json = string.Empty;
List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList(); List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList();
(_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, mappingFromItem.ImageFileHolder.Name); (_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration, filePath);
FileInfo fileInfo = new(Path.Combine(_FileGroups[_PropertyConfiguration.ResultSingleton][directoryIndex], $"{mappingFromItem.ImageFileHolder.NameWithoutExtension}{mappingFromItem.ImageFileHolder.ExtensionLowered}.json")); FileInfo fileInfo = new(Path.Combine(_FileGroups[_PropertyConfiguration.ResultSingleton][directoryIndex], $"{mappingFromItem.ImageFileHolder.NameWithoutExtension}{mappingFromItem.ImageFileHolder.ExtensionLowered}.json"));
if (_ForceMetadataLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete"))) if (_ForceMetadataLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete")))
{ {

View File

@ -6,7 +6,6 @@ using System.Text;
using View_by_Distance.Move.By.Id.Models; using View_by_Distance.Move.By.Id.Models;
using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Methods; using View_by_Distance.Shared.Models.Methods;
using View_by_Distance.Shared.Models.Stateless.Methods;
namespace View_by_Distance.Move.By.Id; namespace View_by_Distance.Move.By.Id;
@ -105,31 +104,28 @@ public class MoveById
int? id; int? id;
string? message; string? message;
string[] matches; string[] matches;
FilePath filePath;
FileHolder fileHolder; FileHolder fileHolder;
bool isIgnoreExtension; bool isIgnoreExtension;
const string jpeg = ".jpeg"; const string jpeg = ".jpeg";
bool isValidImageFormatExtension; bool isValidImageFormatExtension;
ASCIIEncoding asciiEncoding = new(); ASCIIEncoding asciiEncoding = new();
bool nameWithoutExtensionIsIdFormat;
bool nameWithoutExtensionIsPaddedIdFormat;
short sortOrderOnlyLengthIndex = IDirectory.GetSortOrderOnlyLengthIndex(_PropertyConfiguration.Offset);
foreach (string file in allFiles) foreach (string file in allFiles)
{ {
progressBar.Tick(); progressBar.Tick();
fileHolder = new(file); fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(file);
filePath = FilePath.Get(_Configuration.PropertyConfiguration, fileHolder, index: null);
if (fileHolder.ExtensionLowered == ".id" || fileHolder.DirectoryName is null) if (fileHolder.ExtensionLowered == ".id" || fileHolder.DirectoryName is null)
continue; continue;
if (allFiles.Contains($"{fileHolder.FullName}.id")) if (allFiles.Contains($"{fileHolder.FullName}.id"))
continue; continue;
isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered); isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
nameWithoutExtensionIsIdFormat = Shared.Models.Stateless.Methods.IProperty.NameWithoutExtensionIsIdFormat(fileHolder);
isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered); isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
nameWithoutExtensionIsPaddedIdFormat = IDirectory.NameWithoutExtensionIsPaddedIdFormat(fileHolder, sortOrderOnlyLengthIndex);
if (!isIgnoreExtension && !isValidImageFormatExtension) if (!isIgnoreExtension && !isValidImageFormatExtension)
{ {
if (fileHolder.ExtensionLowered == jpeg) if (fileHolder.ExtensionLowered == jpeg)
continue; continue;
if (nameWithoutExtensionIsIdFormat || nameWithoutExtensionIsPaddedIdFormat) if (filePath.IsIntelligentIdFormat || filePath.SortOrder is not null)
continue; continue;
} }
(_, _, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding); (_, _, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);

View File

@ -83,7 +83,7 @@ public class OffsetDateTimeOriginal
string[] files = Directory.GetFiles(checkDirectory, "*", SearchOption.TopDirectoryOnly); string[] files = Directory.GetFiles(checkDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string file in files) foreach (string file in files)
{ {
fileHolder = new(file); fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(file);
isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered); isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered); isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
(dateTimeOriginal, dateTimes, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding); (dateTimeOriginal, dateTimes, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
@ -193,8 +193,8 @@ public class OffsetDateTimeOriginal
bool targetIsIgnoreExtension; bool targetIsIgnoreExtension;
DateTime? badDateTimeOriginal; DateTime? badDateTimeOriginal;
DateTime? targetDateTimeOriginal; DateTime? targetDateTimeOriginal;
FileHolder badFileHolder = new(badFiles.First()); FileHolder badFileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(badFiles.First());
FileHolder targetFileHolder = new(targetFiles.First()); FileHolder targetFileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(targetFiles.First());
bool badIsValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(badFileHolder.ExtensionLowered); bool badIsValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(badFileHolder.ExtensionLowered);
bool targetIsValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(targetFileHolder.ExtensionLowered); bool targetIsValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(targetFileHolder.ExtensionLowered);
badIsIgnoreExtension = badIsValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(badFileHolder.ExtensionLowered); badIsIgnoreExtension = badIsValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(badFileHolder.ExtensionLowered);

View File

@ -1,4 +1,5 @@
using ShellProgressBar; using ShellProgressBar;
using System.Collections.ObjectModel;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using View_by_Distance.Property.Models.Stateless; using View_by_Distance.Property.Models.Stateless;
@ -21,7 +22,7 @@ public class A_Property
private readonly Configuration _Configuration; private readonly Configuration _Configuration;
private readonly List<string> _AngleBracketCollection; private readonly List<string> _AngleBracketCollection;
private readonly IPropertyConfiguration _PropertyConfiguration; private readonly IPropertyConfiguration _PropertyConfiguration;
private readonly IReadOnlyDictionary<string, string[]> _FileGroups; private readonly ReadOnlyDictionary<string, string[]> _FileGroups;
public A_Property(int maxDegreeOfParallelism, Configuration propertyConfiguration, string outputExtension, bool reverse, string aResultsFullGroupDirectory) public A_Property(int maxDegreeOfParallelism, Configuration propertyConfiguration, string outputExtension, bool reverse, string aResultsFullGroupDirectory)
{ {
@ -56,7 +57,7 @@ public class A_Property
fileInfo = new(Path.Combine(angleBracket.Replace("<>", _PropertyConfiguration.ResultSingleton), $"{item.ImageFileHolder.NameWithoutExtension}{item.ImageFileHolder.ExtensionLowered}.json")); fileInfo = new(Path.Combine(angleBracket.Replace("<>", _PropertyConfiguration.ResultSingleton), $"{item.ImageFileHolder.NameWithoutExtension}{item.ImageFileHolder.ExtensionLowered}.json"));
else else
{ {
(_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, item.ImageFileHolder.Name); (_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration, item.FilePath);
fileInfo = new(Path.Combine(_FileGroups[_PropertyConfiguration.ResultSingleton][directoryIndex], $"{item.ImageFileHolder.NameWithoutExtension}{item.ImageFileHolder.ExtensionLowered}.json")); fileInfo = new(Path.Combine(_FileGroups[_PropertyConfiguration.ResultSingleton][directoryIndex], $"{item.ImageFileHolder.NameWithoutExtension}{item.ImageFileHolder.ExtensionLowered}.json"));
} }
List<DateTime> dateTimes = (from l in sourceDirectoryFileTuples where l is not null && changesFrom.Contains(l.Item1) select l.Item2).ToList(); List<DateTime> dateTimes = (from l in sourceDirectoryFileTuples where l is not null && changesFrom.Contains(l.Item1) select l.Item2).ToList();
@ -133,7 +134,7 @@ public class A_Property
} }
if (result is null) if (result is null)
{ {
id ??= item.ImageFileHolder.Id; id ??= item.FilePath.Id;
(_, _, result) = Stateless.Property.GetProperty(populateId, metadata, item.ImageFileHolder, result, isIgnoreExtension, item.IsValidImageFormatExtension, id, _ASCIIEncoding); (_, _, result) = Stateless.Property.GetProperty(populateId, metadata, item.ImageFileHolder, result, isIgnoreExtension, item.IsValidImageFormatExtension, id, _ASCIIEncoding);
json = JsonSerializer.Serialize(result, PropertyGenerationContext.Default.Property); json = JsonSerializer.Serialize(result, PropertyGenerationContext.Default.Property);
if (populateId && Shared.Models.Stateless.Methods.IPath.WriteAllText(fileInfo.FullName, json, updateDateWhenMatches: true, compareBeforeWrite: true)) if (populateId && Shared.Models.Stateless.Methods.IPath.WriteAllText(fileInfo.FullName, json, updateDateWhenMatches: true, compareBeforeWrite: true))

View File

@ -12,6 +12,7 @@ public class Configuration
public bool? ForcePropertyLastWriteTimeToCreationTime { get; set; } public bool? ForcePropertyLastWriteTimeToCreationTime { get; set; }
public string[]? IgnoreExtensions { get; set; } public string[]? IgnoreExtensions { get; set; }
public string[]? IgnoreRulesKeyWords { get; set; } public string[]? IgnoreRulesKeyWords { get; set; }
public int? IntMinValueLength { get; set; }
public int? MaxImagesInDirectoryForTopLevelFirstPass { get; set; } public int? MaxImagesInDirectoryForTopLevelFirstPass { get; set; }
public string? ModelName { init; get; } public string? ModelName { init; get; }
public int? NumberOfJitters { init; get; } public int? NumberOfJitters { init; get; }
@ -47,6 +48,7 @@ public class Configuration
if (configuration.ForcePropertyLastWriteTimeToCreationTime is null) throw new NullReferenceException(nameof(configuration.ForcePropertyLastWriteTimeToCreationTime)); if (configuration.ForcePropertyLastWriteTimeToCreationTime is null) throw new NullReferenceException(nameof(configuration.ForcePropertyLastWriteTimeToCreationTime));
if (configuration.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions)); if (configuration.IgnoreExtensions is null) throw new NullReferenceException(nameof(configuration.IgnoreExtensions));
if (configuration.IgnoreRulesKeyWords is null) throw new NullReferenceException(nameof(configuration.IgnoreRulesKeyWords)); if (configuration.IgnoreRulesKeyWords is null) throw new NullReferenceException(nameof(configuration.IgnoreRulesKeyWords));
if (configuration.IntMinValueLength is null) throw new NullReferenceException(nameof(configuration.IntMinValueLength));
if (configuration.MaxImagesInDirectoryForTopLevelFirstPass is null) throw new NullReferenceException(nameof(configuration.MaxImagesInDirectoryForTopLevelFirstPass)); if (configuration.MaxImagesInDirectoryForTopLevelFirstPass is null) throw new NullReferenceException(nameof(configuration.MaxImagesInDirectoryForTopLevelFirstPass));
// if (configuration.ModelName is null) throw new NullReferenceException(nameof(configuration.ModelName)); // if (configuration.ModelName is null) throw new NullReferenceException(nameof(configuration.ModelName));
// if (configuration.NumberOfJitters is null) throw new NullReferenceException(nameof(configuration.NumberOfJitters)); // if (configuration.NumberOfJitters is null) throw new NullReferenceException(nameof(configuration.NumberOfJitters));
@ -71,6 +73,7 @@ public class Configuration
configuration.ForcePropertyLastWriteTimeToCreationTime.Value, configuration.ForcePropertyLastWriteTimeToCreationTime.Value,
configuration.IgnoreExtensions, configuration.IgnoreExtensions,
configuration.IgnoreRulesKeyWords, configuration.IgnoreRulesKeyWords,
configuration.IntMinValueLength.Value,
configuration.MaxImagesInDirectoryForTopLevelFirstPass.Value, configuration.MaxImagesInDirectoryForTopLevelFirstPass.Value,
configuration.ModelName, configuration.ModelName,
configuration.NumberOfJitters, configuration.NumberOfJitters,

View File

@ -15,6 +15,7 @@ public class Configuration : Shared.Models.Properties.IPropertyConfiguration
public bool ForcePropertyLastWriteTimeToCreationTime { init; get; } public bool ForcePropertyLastWriteTimeToCreationTime { init; get; }
public string[] IgnoreExtensions { init; get; } public string[] IgnoreExtensions { init; get; }
public string[] IgnoreRulesKeyWords { init; get; } public string[] IgnoreRulesKeyWords { init; get; }
public int IntMinValueLength { init; get; }
public int MaxImagesInDirectoryForTopLevelFirstPass { init; get; } public int MaxImagesInDirectoryForTopLevelFirstPass { init; get; }
public string? ModelName { init; get; } public string? ModelName { init; get; }
public int? NumberOfJitters { init; get; } public int? NumberOfJitters { init; get; }
@ -39,6 +40,7 @@ public class Configuration : Shared.Models.Properties.IPropertyConfiguration
bool forcePropertyLastWriteTimeToCreationTime, bool forcePropertyLastWriteTimeToCreationTime,
string[] ignoreExtensions, string[] ignoreExtensions,
string[] ignoreRulesKeyWords, string[] ignoreRulesKeyWords,
int intMinValueLength,
int maxImagesInDirectoryForTopLevelFirstPass, int maxImagesInDirectoryForTopLevelFirstPass,
string? modelName, string? modelName,
int? numberOfJitters, int? numberOfJitters,
@ -64,6 +66,7 @@ public class Configuration : Shared.Models.Properties.IPropertyConfiguration
ForcePropertyLastWriteTimeToCreationTime = forcePropertyLastWriteTimeToCreationTime; ForcePropertyLastWriteTimeToCreationTime = forcePropertyLastWriteTimeToCreationTime;
IgnoreExtensions = ignoreExtensions; IgnoreExtensions = ignoreExtensions;
IgnoreRulesKeyWords = ignoreRulesKeyWords; IgnoreRulesKeyWords = ignoreRulesKeyWords;
IntMinValueLength = intMinValueLength;
MaxImagesInDirectoryForTopLevelFirstPass = maxImagesInDirectoryForTopLevelFirstPass; MaxImagesInDirectoryForTopLevelFirstPass = maxImagesInDirectoryForTopLevelFirstPass;
ModelName = modelName; ModelName = modelName;
NumberOfJitters = numberOfJitters; NumberOfJitters = numberOfJitters;

View File

@ -13,11 +13,6 @@ public interface IProperty
static string DateTimeFormat() => static string DateTimeFormat() =>
"yyyy:MM:dd HH:mm:ss"; "yyyy:MM:dd HH:mm:ss";
int TestStatic_GetDeterministicHashCode(byte[] value) =>
GetDeterministicHashCode(value);
static int GetDeterministicHashCode(byte[] value) =>
Property.GetDeterministicHashCode(value);
byte[] TestStatic_GetBytes(string value) => byte[] TestStatic_GetBytes(string value) =>
GetBytes(value); GetBytes(value);
static byte[] GetBytes(string value) => static byte[] GetBytes(string value) =>

View File

@ -139,25 +139,6 @@ internal partial class Property
return results; return results;
} }
internal static int GetDeterministicHashCode(byte[] value)
{
int result;
unchecked
{
int hash1 = (5381 << 16) + 5381;
int hash2 = hash1;
for (int i = 0; i < value.Length; i += 2)
{
hash1 = ((hash1 << 5) + hash1) ^ value[i];
if (i == value.Length - 1)
break;
hash2 = ((hash2 << 5) + hash2) ^ value[i + 1];
}
result = hash1 + (hash2 * 1566083941);
}
return result;
}
#pragma warning disable CA1416 #pragma warning disable CA1416
internal static PropertyItem GetPropertyItem(ConstructorInfo constructorInfo, int id, short type, string value) internal static PropertyItem GetPropertyItem(ConstructorInfo constructorInfo, int id, short type, string value)
@ -260,7 +241,7 @@ internal partial class Property
bytes = new byte[length]; bytes = new byte[length];
Marshal.Copy(intPtr, bytes, 0, length); Marshal.Copy(intPtr, bytes, 0, length);
bitmap.UnlockBits(bitmapData); bitmap.UnlockBits(bitmapData);
id ??= GetDeterministicHashCode(bytes); id ??= Shared.Models.Stateless.Methods.IId.GetDeterministicHashCode(bytes);
} }
dateTimeFormat = IProperty.DateTimeFormat(); dateTimeFormat = IProperty.DateTimeFormat();
if (image.PropertyIdList.Contains((int)IExif.Tags.DateTime)) if (image.PropertyIdList.Contains((int)IExif.Tags.DateTime))

View File

@ -127,17 +127,16 @@ public class Rename
} }
if (records.Count != 0) if (records.Count != 0)
{ {
int intMinValueLength = int.MinValue.ToString().Length;
foreach (Record record in records) foreach (Record record in records)
{ {
if (record.Id is null) if (record.Id is null)
continue; continue;
if (intMinValueLength < record.Id.Value.ToString().Length) if (_PropertyConfiguration.IntMinValueLength < record.Id.Value.ToString().Length)
throw new NotSupportedException(); throw new NotSupportedException();
} }
message = $"{intMinValueLength}) comparing records"; message = $"{_PropertyConfiguration.IntMinValueLength}) comparing records";
progressBar = new(records.Count, message, options); progressBar = new(records.Count, message, options);
toDoCollection.AddRange(GetToDoCollection(progressBar, nefPresent, records, intMinValueLength)); toDoCollection.AddRange(GetToDoCollection(progressBar, nefPresent, records));
progressBar.Dispose(); progressBar.Dispose();
} }
foreach ((FileHolder fileHolder, string directory, string to) in toDoCollection) foreach ((FileHolder fileHolder, string directory, string to) in toDoCollection)
@ -204,7 +203,7 @@ public class Rename
if (distinct.Contains(lines[1])) if (distinct.Contains(lines[1]))
continue; continue;
distinct.Add(lines[1]); distinct.Add(lines[1]);
fileHolder = new(lines[0]); fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(lines[0]);
results.Add(new(fileHolder, directory, lines[1])); results.Add(new(fileHolder, directory, lines[1]));
} }
return results; return results;
@ -216,6 +215,7 @@ public class Rename
int? id; int? id;
string? message; string? message;
string? directory; string? directory;
FilePath filePath;
DateTime[] dateTimes; DateTime[] dateTimes;
FileHolder fileHolder; FileHolder fileHolder;
string[]? ffmpegFiles; string[]? ffmpegFiles;
@ -223,26 +223,22 @@ public class Rename
DateTime? dateTimeOriginal; DateTime? dateTimeOriginal;
bool isValidImageFormatExtension; bool isValidImageFormatExtension;
ASCIIEncoding asciiEncoding = new(); ASCIIEncoding asciiEncoding = new();
bool nameWithoutExtensionIsIdFormat;
bool nameWithoutExtensionIsPaddedIdFormat;
IReadOnlyList<MetadataExtractor.Directory> directories; IReadOnlyList<MetadataExtractor.Directory> directories;
short sortOrderOnlyLengthIndex = IDirectory.GetSortOrderOnlyLengthIndex(_PropertyConfiguration.Offset);
for (int i = 0; i < files.Length; i++) for (int i = 0; i < files.Length; i++)
{ {
progressBar.Tick(); progressBar.Tick();
fileHolder = new(files[i]); fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(files[i]);
if (!fileHolder.Exists) if (!fileHolder.Exists)
continue; continue;
directory = Path.GetDirectoryName(files[i]); directory = Path.GetDirectoryName(files[i]);
if (string.IsNullOrEmpty(directory)) if (string.IsNullOrEmpty(directory))
continue; continue;
filePath = FilePath.Get(_Configuration.PropertyConfiguration, fileHolder, index: i);
if (fileHolder.ExtensionLowered == ".paddedId" || fileHolder.ExtensionLowered == ".lsv" || fileHolder.DirectoryName is null) if (fileHolder.ExtensionLowered == ".paddedId" || fileHolder.ExtensionLowered == ".lsv" || fileHolder.DirectoryName is null)
continue; continue;
if (files.Contains($"{fileHolder.FullName}.paddedId")) if (files.Contains($"{fileHolder.FullName}.paddedId"))
continue; continue;
nameWithoutExtensionIsIdFormat = Shared.Models.Stateless.Methods.IProperty.NameWithoutExtensionIsIdFormat(fileHolder); if (filePath.IsIntelligentIdFormat || filePath.SortOrder is not null)
nameWithoutExtensionIsPaddedIdFormat = IDirectory.NameWithoutExtensionIsPaddedIdFormat(fileHolder, sortOrderOnlyLengthIndex);
if (nameWithoutExtensionIsIdFormat || nameWithoutExtensionIsPaddedIdFormat)
continue; continue;
isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered); isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered); isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
@ -262,7 +258,7 @@ public class Rename
ffmpegFiles = Directory.GetFiles(fileHolder.DirectoryName, $"{fileHolder.Name}-*.jpg", SearchOption.TopDirectoryOnly); ffmpegFiles = Directory.GetFiles(fileHolder.DirectoryName, $"{fileHolder.Name}-*.jpg", SearchOption.TopDirectoryOnly);
if (ffmpegFiles.Length == 0) if (ffmpegFiles.Length == 0)
continue; continue;
fileHolder = new(ffmpegFiles.First()); fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(ffmpegFiles.First());
if (!fileHolder.Name.EndsWith("-0001.jpg")) if (!fileHolder.Name.EndsWith("-0001.jpg"))
throw new Exception(); throw new Exception();
isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered); isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
@ -275,7 +271,7 @@ public class Rename
(dateTimeOriginal, dateTimes, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, metadata, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding); (dateTimeOriginal, dateTimes, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, metadata, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
if (ffmpegFiles is not null) if (ffmpegFiles is not null)
{ {
fileHolder = new(files[i]); fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(files[i]);
foreach (string ffmpegFile in ffmpegFiles) foreach (string ffmpegFile in ffmpegFiles)
File.Delete(ffmpegFile); File.Delete(ffmpegFile);
} }
@ -286,7 +282,7 @@ public class Rename
return results; return results;
} }
private List<(FileHolder, string, string)> GetToDoCollection(ProgressBar progressBar, bool nefPresent, List<Record> records, int intMinValueLength) private List<(FileHolder, string, string)> GetToDoCollection(ProgressBar progressBar, bool nefPresent, List<Record> records)
{ {
List<(FileHolder, string, string)> results = []; List<(FileHolder, string, string)> results = [];
int season; int season;
@ -330,7 +326,7 @@ public class Rename
if (distinct.Contains(checkFile)) if (distinct.Contains(checkFile))
continue; continue;
distinct.Add(checkFile); distinct.Add(checkFile);
results.Add(new(new($"{fileHolder.FullName}.paddedId"), fileHolder.DirectoryName, checkFile)); results.Add(new(Shared.Models.Stateless.Methods.IFileHolder.Get($"{fileHolder.FullName}.paddedId"), fileHolder.DirectoryName, checkFile));
} }
checkFile = Path.Combine(fileHolder.DirectoryName, $"{fileHolder.NameWithoutExtension}{jpg}"); checkFile = Path.Combine(fileHolder.DirectoryName, $"{fileHolder.NameWithoutExtension}{jpg}");
if (File.Exists(checkFile)) if (File.Exists(checkFile))
@ -340,13 +336,13 @@ public class Rename
distinct.Add(checkFile); distinct.Add(checkFile);
results.Add(new(fileHolder, fileHolder.DirectoryName, checkFile)); results.Add(new(fileHolder, fileHolder.DirectoryName, checkFile));
if (nefPresent) if (nefPresent)
results.Add(new(new($"{fileHolder.FullName[..^4]}.tif"), fileHolder.DirectoryName, $"{checkFile[..^4]}.tif")); results.Add(new(Shared.Models.Stateless.Methods.IFileHolder.Get($"{fileHolder.FullName[..^4]}.tif"), fileHolder.DirectoryName, $"{checkFile[..^4]}.tif"));
if (nefPresent) if (nefPresent)
results.Add(new(new($"{fileHolder.FullName[..^4]}.nef"), fileHolder.DirectoryName, $"{checkFile[..^4]}.nef")); results.Add(new(Shared.Models.Stateless.Methods.IFileHolder.Get($"{fileHolder.FullName[..^4]}.nef"), fileHolder.DirectoryName, $"{checkFile[..^4]}.nef"));
if (File.Exists(checkFile)) if (File.Exists(checkFile))
continue; continue;
File.Move(fileHolder.FullName, checkFile); File.Move(fileHolder.FullName, checkFile);
fileHolder = new(checkFile); fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(checkFile);
if (fileHolder.DirectoryName is null) if (fileHolder.DirectoryName is null)
continue; continue;
} }
@ -398,15 +394,15 @@ public class Rename
distinct.Add(checkFile); distinct.Add(checkFile);
results.Add(new(fileHolder, fileHolder.DirectoryName, checkFile)); results.Add(new(fileHolder, fileHolder.DirectoryName, checkFile));
if (nefPresent) if (nefPresent)
results.Add(new(new($"{fileHolder.FullName[..^4]}.tif"), fileHolder.DirectoryName, $"{checkFile[..^4]}.tif")); results.Add(new(Shared.Models.Stateless.Methods.IFileHolder.Get($"{fileHolder.FullName[..^4]}.tif"), fileHolder.DirectoryName, $"{checkFile[..^4]}.tif"));
if (nefPresent) if (nefPresent)
results.Add(new(new($"{fileHolder.FullName[..^4]}.nef"), fileHolder.DirectoryName, $"{checkFile[..^4]}.nef")); results.Add(new(Shared.Models.Stateless.Methods.IFileHolder.Get($"{fileHolder.FullName[..^4]}.nef"), fileHolder.DirectoryName, $"{checkFile[..^4]}.nef"));
} }
else else
{ {
if (record.Id is null) if (record.Id is null)
continue; continue;
paddedId = IDirectory.GetPaddedId(intMinValueLength, record.Index, record.Id.Value); paddedId = IId.GetPaddedId(_PropertyConfiguration, record.Index, record.Id.Value);
checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered; checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered;
checkFile = Path.Combine(seasonDirectory, $"{paddedId}{checkFileExtension}"); checkFile = Path.Combine(seasonDirectory, $"{paddedId}{checkFileExtension}");
if (checkFile == fileHolder.FullName) if (checkFile == fileHolder.FullName)
@ -422,9 +418,9 @@ public class Rename
distinct.Add(checkFile); distinct.Add(checkFile);
results.Add(new(fileHolder, seasonDirectory, checkFile)); results.Add(new(fileHolder, seasonDirectory, checkFile));
if (nefPresent) if (nefPresent)
results.Add(new(new($"{fileHolder.FullName[..^4]}.tif"), seasonDirectory, $"{checkFile[..^4]}.tif")); results.Add(new(Shared.Models.Stateless.Methods.IFileHolder.Get($"{fileHolder.FullName[..^4]}.tif"), seasonDirectory, $"{checkFile[..^4]}.tif"));
if (nefPresent) if (nefPresent)
results.Add(new(new($"{fileHolder.FullName[..^4]}.nef"), seasonDirectory, $"{checkFile[..^4]}.nef")); results.Add(new(Shared.Models.Stateless.Methods.IFileHolder.Get($"{fileHolder.FullName[..^4]}.nef"), seasonDirectory, $"{checkFile[..^4]}.nef"));
} }
} }
return results; return results;

View File

@ -1,3 +1,4 @@
using System.Collections.ObjectModel;
using System.Drawing; using System.Drawing;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.Reflection; using System.Reflection;
@ -75,7 +76,7 @@ public class C_Resize
public void Update(string cResultsFullGroupDirectory) public void Update(string cResultsFullGroupDirectory)
{ {
_FileGroups.Clear(); _FileGroups.Clear();
Dictionary<string, string[]> keyValuePairs = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_PropertyConfiguration, cResultsFullGroupDirectory, [_PropertyConfiguration.ResultSingleton]); ReadOnlyDictionary<string, string[]> keyValuePairs = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_PropertyConfiguration, cResultsFullGroupDirectory, [_PropertyConfiguration.ResultSingleton]);
foreach (KeyValuePair<string, string[]> keyValuePair in keyValuePairs) foreach (KeyValuePair<string, string[]> keyValuePair in keyValuePairs)
_FileGroups.Add(keyValuePair.Key, keyValuePair.Value); _FileGroups.Add(keyValuePair.Key, keyValuePair.Value);
} }
@ -415,32 +416,32 @@ public class C_Resize
return results; return results;
} }
private FileHolder GetResizedFileHolder(string cResultsFullGroupDirectory, Item item, bool outputResolutionHasNumber, string fileName) private FileHolder GetResizedFileHolder(string cResultsFullGroupDirectory, FilePath filePath, bool outputResolutionHasNumber, string fileName)
{ {
FileHolder result; FileHolder result;
if (outputResolutionHasNumber) if (outputResolutionHasNumber)
result = new(Path.Combine(AngleBracketCollection[0].Replace("<>", _PropertyConfiguration.ResultContent), fileName)); result = Shared.Models.Stateless.Methods.IFileHolder.Get(Path.Combine(AngleBracketCollection[0].Replace("<>", _PropertyConfiguration.ResultContent), fileName));
else else
{ {
(string directoryName, _) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, item.ImageFileHolder.Name); (string directoryName, _) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration, filePath);
result = new(Path.Combine(cResultsFullGroupDirectory, _PropertyConfiguration.ResultContent, _PropertyConfiguration.ResultAllInOne, directoryName, fileName)); result = Shared.Models.Stateless.Methods.IFileHolder.Get(Path.Combine(cResultsFullGroupDirectory, _PropertyConfiguration.ResultContent, directoryName, fileName));
} }
return result; return result;
} }
public FileHolder GetResizedFileHolder(string cResultsFullGroupDirectory, Item item, bool outputResolutionHasNumber) => public FileHolder GetResizedFileHolder(string cResultsFullGroupDirectory, Item item, bool outputResolutionHasNumber) =>
GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber, item.ImageFileHolder.Name); GetResizedFileHolder(cResultsFullGroupDirectory, item.FilePath, outputResolutionHasNumber, item.ImageFileHolder.Name);
public FileHolder GetResizedFileHolder(string cResultsFullGroupDirectory, Item item, bool outputResolutionHasNumber, int id) => public FileHolder GetResizedFileHolder(string cResultsFullGroupDirectory, Item item, bool outputResolutionHasNumber, int id) =>
GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber, $"{id}{item.ImageFileHolder.ExtensionLowered}"); GetResizedFileHolder(cResultsFullGroupDirectory, item.FilePath, outputResolutionHasNumber, $"{id}{item.ImageFileHolder.ExtensionLowered}");
public Dictionary<string, int[]> GetResizeKeyValuePairs(Configuration configuration, string cResultsFullGroupDirectory, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, Shared.Models.Property property, MappingFromItem mappingFromItem) public Dictionary<string, int[]> GetResizeKeyValuePairs(Configuration configuration, string cResultsFullGroupDirectory, FilePath filePath, List<Tuple<string, DateTime>> subFileTuples, List<string> parseExceptions, Shared.Models.Property property, MappingFromItem mappingFromItem)
{ {
Dictionary<string, int[]>? results; Dictionary<string, int[]>? results;
string json; string json;
string[] changesFrom = [nameof(A_Property), nameof(B_Metadata)]; string[] changesFrom = [nameof(A_Property), nameof(B_Metadata)];
List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList(); List<DateTime> dateTimes = (from l in subFileTuples where changesFrom.Contains(l.Item1) select l.Item2).ToList();
(_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration.ResultAllInOneSubdirectoryLength, mappingFromItem.ImageFileHolder.Name); (_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration, filePath);
FileInfo fileInfo = new(Path.Combine(_FileGroups[_PropertyConfiguration.ResultSingleton][directoryIndex], $"{mappingFromItem.ImageFileHolder.NameWithoutExtension}{mappingFromItem.ImageFileHolder.ExtensionLowered}.json")); FileInfo fileInfo = new(Path.Combine(_FileGroups[_PropertyConfiguration.ResultSingleton][directoryIndex], $"{mappingFromItem.ImageFileHolder.NameWithoutExtension}{mappingFromItem.ImageFileHolder.ExtensionLowered}.json"));
if (_ForceResizeLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete"))) if (_ForceResizeLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete")))
{ {

View File

@ -21,7 +21,7 @@ public class SetCreatedDate
private readonly Configuration _Configuration; private readonly Configuration _Configuration;
private readonly IsEnvironment _IsEnvironment; private readonly IsEnvironment _IsEnvironment;
private readonly IConfigurationRoot _ConfigurationRoot; private readonly IConfigurationRoot _ConfigurationRoot;
private readonly IReadOnlyDictionary<string, string[]> _FileGroups; private readonly ReadOnlyDictionary<string, string[]> _FileGroups;
private readonly Property.Models.Configuration _PropertyConfiguration; private readonly Property.Models.Configuration _PropertyConfiguration;
public SetCreatedDate(List<string> args, ILogger<Program> logger, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console) public SetCreatedDate(List<string> args, ILogger<Program> logger, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console)
@ -77,7 +77,7 @@ public class SetCreatedDate
foreach (string file in files) foreach (string file in files)
{ {
progressBar.Tick(); progressBar.Tick();
fileHolder = new(file); fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(file);
if (fileHolder.ExtensionLowered == ".id" || fileHolder.ExtensionLowered == ".lsv" || fileHolder.DirectoryName is null) if (fileHolder.ExtensionLowered == ".id" || fileHolder.ExtensionLowered == ".lsv" || fileHolder.DirectoryName is null)
continue; continue;
if (_PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered)) if (_PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered))

View File

@ -1,75 +1,57 @@
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization;
namespace View_by_Distance.Shared.Models; namespace View_by_Distance.Shared.Models;
public class FileHolder : Properties.IFileHolder public record FileHolder(DateTime? CreationTime,
string? DirectoryName,
bool Exists,
string ExtensionLowered,
string FullName,
DateTime? LastWriteTime,
long? Length,
string Name,
string NameWithoutExtension)
{ {
protected readonly DateTime? _CreationTime;
protected readonly string? _DirectoryName;
protected readonly bool _Exists;
protected readonly string _ExtensionLowered;
protected readonly string _FullName;
protected readonly int? _Id;
protected readonly DateTime? _LastWriteTime;
protected readonly long? _Length;
protected readonly string _Name;
protected readonly string _NameWithoutExtension;
public DateTime? CreationTime => _CreationTime;
public string? DirectoryName => _DirectoryName;
public bool Exists => _Exists;
public string ExtensionLowered => _ExtensionLowered;
public string FullName => _FullName;
public int? Id => _Id;
public DateTime? LastWriteTime => _LastWriteTime;
public long? Length => _Length;
public string Name => _Name;
public string NameWithoutExtension => _NameWithoutExtension;
public FileHolder(DateTime? creationTime, string? directoryName, bool exists, string extensionLowered, string fullName, int? id, DateTime? lastWriteTime, long? length, string name, string nameWithoutExtension)
{
_CreationTime = creationTime;
_DirectoryName = directoryName;
_Exists = exists;
_ExtensionLowered = extensionLowered;
_FullName = fullName;
_Id = id;
_LastWriteTime = lastWriteTime;
_Length = length;
_Name = name;
_NameWithoutExtension = nameWithoutExtension;
}
public FileHolder(FileInfo fileInfo, int? id)
{
if (fileInfo.Exists)
{
_CreationTime = fileInfo.CreationTime;
_CreationTime = fileInfo.CreationTime;
_LastWriteTime = fileInfo.LastWriteTime;
_Length = fileInfo.Length;
}
_DirectoryName = fileInfo.DirectoryName;
_Exists = fileInfo.Exists;
_ExtensionLowered = fileInfo.Extension.ToLower();
_Id = id;
_FullName = fileInfo.FullName;
_Name = fileInfo.Name;
_NameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName);
}
public FileHolder(string fileName) :
this(new FileInfo(fileName), null)
{ }
public FileHolder(string fileName, int? id) :
this(new FileInfo(fileName), id)
{ }
public override string ToString() public override string ToString()
{ {
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); string result = JsonSerializer.Serialize(this, FileHolderSourceGenerationContext.Default.FileHolder);
return result;
}
public static FileHolder Get(FileInfo fileInfo)
{
FileHolder result;
if (!fileInfo.Exists)
result = new(null,
fileInfo.DirectoryName,
fileInfo.Exists,
fileInfo.Extension.ToLower(),
fileInfo.FullName,
null,
null,
fileInfo.Name,
Path.GetFileNameWithoutExtension(fileInfo.FullName));
else
{
result = new(fileInfo.CreationTime,
fileInfo.DirectoryName,
fileInfo.Exists,
fileInfo.Extension.ToLower(),
fileInfo.FullName,
fileInfo.LastWriteTime,
fileInfo.Length,
fileInfo.Name,
Path.GetFileNameWithoutExtension(fileInfo.FullName));
}
return result; return result;
} }
} }
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(FileHolder))]
public partial class FileHolderSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -1,3 +1,25 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace View_by_Distance.Shared.Models; namespace View_by_Distance.Shared.Models;
public record FilePair(string Path, bool IsUnique, bool? IsNotUniqueAndNeedsReview, List<string> Collection, string? Match) { } internal record FilePair(string Path,
bool IsUnique,
bool? IsNotUniqueAndNeedsReview,
List<string> Collection,
string? Match)
{
public override string ToString()
{
string result = JsonSerializer.Serialize(this, FilePairSourceGenerationContext.Default.FilePair);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(FilePair))]
internal partial class FilePairSourceGenerationContext : JsonSerializerContext
{
}

86
Shared/Models/FilePath.cs Normal file
View File

@ -0,0 +1,86 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using View_by_Distance.Shared.Models.Stateless.Methods;
namespace View_by_Distance.Shared.Models;
public record FilePath(long CreationTicks,
string DirectoryName,
string ExtensionLowered,
string FileNameFirstSegment,
string FullName,
int? Id,
bool IsIntelligentIdFormat,
long LastWriteTicks,
long Length,
string Name,
string NameWithoutExtension,
int? SortOrder)
{
public override string ToString()
{
string result = JsonSerializer.Serialize(this, FilePathSourceGenerationContext.Default.FilePath);
return result;
}
public static FilePath Get(Properties.IPropertyConfiguration propertyConfiguration, FileHolder fileHolder, int? index)
{
if (fileHolder.CreationTime is null)
throw new NullReferenceException(nameof(fileHolder.CreationTime));
if (fileHolder.LastWriteTime is null)
throw new NullReferenceException(nameof(fileHolder.LastWriteTime));
if (fileHolder.Length is null)
throw new NullReferenceException(nameof(fileHolder.Length));
FilePath result;
int? id;
int? sortOder;
string fileNameFirstSegment = fileHolder.Name.Split('.')[0];
int sortOrderOnlyLengthIndex = propertyConfiguration.Offset.ToString().Length;
string fileDirectoryName = fileHolder.DirectoryName ?? throw new NullReferenceException();
bool fileNameFirstSegmentIsIntelligentIdFormat = IId.NameWithoutExtensionIsIntelligentIdFormat(propertyConfiguration, fileNameFirstSegment);
bool fileNameFirstSegmentIsPaddedIntelligentIdFormat = IId.NameWithoutExtensionIsPaddedIntelligentIdFormat(propertyConfiguration, sortOrderOnlyLengthIndex, fileNameFirstSegment);
bool fileNameFirstSegmentIsIdFormat = !fileNameFirstSegmentIsPaddedIntelligentIdFormat && !fileNameFirstSegmentIsIntelligentIdFormat && IId.NameWithoutExtensionIsIdFormat(propertyConfiguration, fileHolder);
if (!fileNameFirstSegmentIsIdFormat && !fileNameFirstSegmentIsIntelligentIdFormat && !fileNameFirstSegmentIsPaddedIntelligentIdFormat)
(id, sortOder) = (null, null);
else if (fileNameFirstSegmentIsIntelligentIdFormat)
(id, sortOder) = (IId.GetId(propertyConfiguration, fileNameFirstSegment), null);
else if (fileNameFirstSegmentIsPaddedIntelligentIdFormat)
{
if (!int.TryParse(fileNameFirstSegment[..sortOrderOnlyLengthIndex], out int absoluteValueOfSortOrder))
(id, sortOder) = (null, null);
else
(id, sortOder) = (IId.GetId(propertyConfiguration, fileNameFirstSegment[sortOrderOnlyLengthIndex..]), absoluteValueOfSortOrder);
}
else if (fileNameFirstSegmentIsIdFormat)
{
if (index is null)
throw new NullReferenceException(nameof(index));
if (!int.TryParse(fileNameFirstSegment, out int valueOfFileNameFirstSegment))
throw new NotSupportedException();
(id, sortOder) = (valueOfFileNameFirstSegment, propertyConfiguration.Offset + index);
}
else
throw new NotSupportedException();
result = new(fileHolder.CreationTime.Value.Ticks,
fileDirectoryName,
fileHolder.ExtensionLowered,
fileNameFirstSegment,
fileHolder.FullName,
id,
fileNameFirstSegmentIsIntelligentIdFormat,
fileHolder.LastWriteTime.Value.Ticks,
fileHolder.Length.Value,
fileHolder.Name,
fileHolder.NameWithoutExtension,
sortOder);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(FilePath))]
public partial class FilePathSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -8,6 +8,7 @@ public class Item : Properties.IItem
protected List<Face> _Faces; protected List<Face> _Faces;
protected readonly bool? _FileSizeChanged; protected readonly bool? _FileSizeChanged;
protected readonly FilePath _FilePath;
protected readonly FileHolder _ImageFileHolder; protected readonly FileHolder _ImageFileHolder;
protected bool? _IsNotUniqueAndNeedsReview; protected bool? _IsNotUniqueAndNeedsReview;
protected bool _IsUniqueFileName; protected bool _IsUniqueFileName;
@ -20,6 +21,7 @@ public class Item : Properties.IItem
protected readonly FileHolder _SourceDirectoryFileHolder; protected readonly FileHolder _SourceDirectoryFileHolder;
public List<Face> Faces => _Faces; public List<Face> Faces => _Faces;
public bool? FileSizeChanged => _FileSizeChanged; public bool? FileSizeChanged => _FileSizeChanged;
public FilePath FilePath => _FilePath;
public FileHolder ImageFileHolder => _ImageFileHolder; public FileHolder ImageFileHolder => _ImageFileHolder;
public bool? IsNotUniqueAndNeedsReview => _IsNotUniqueAndNeedsReview; public bool? IsNotUniqueAndNeedsReview => _IsNotUniqueAndNeedsReview;
public bool IsUniqueFileName => _IsUniqueFileName; public bool IsUniqueFileName => _IsUniqueFileName;
@ -32,9 +34,10 @@ public class Item : Properties.IItem
public FileHolder SourceDirectoryFileHolder => _SourceDirectoryFileHolder; public FileHolder SourceDirectoryFileHolder => _SourceDirectoryFileHolder;
[JsonConstructor] [JsonConstructor]
public Item(List<Face> faces, bool? fileSizeChanged, FileHolder imageFileHolder, bool? isNotUniqueAndNeedsReview, bool isUniqueFileName, bool isValidImageFormatExtension, bool? lastWriteTimeChanged, bool? moved, Property? property, string relativePath, FileHolder? resizedFileHolder, FileHolder sourceDirectoryFileHolder) public Item(List<Face> faces, FilePath filePath, bool? fileSizeChanged, FileHolder imageFileHolder, bool? isNotUniqueAndNeedsReview, bool isUniqueFileName, bool isValidImageFormatExtension, bool? lastWriteTimeChanged, bool? moved, Property? property, string relativePath, FileHolder? resizedFileHolder, FileHolder sourceDirectoryFileHolder)
{ {
_Faces = faces; _Faces = faces;
_FilePath = filePath;
_FileSizeChanged = fileSizeChanged; _FileSizeChanged = fileSizeChanged;
_ImageFileHolder = imageFileHolder; _ImageFileHolder = imageFileHolder;
_IsNotUniqueAndNeedsReview = isNotUniqueAndNeedsReview; _IsNotUniqueAndNeedsReview = isNotUniqueAndNeedsReview;
@ -48,8 +51,8 @@ public class Item : Properties.IItem
_SourceDirectoryFileHolder = sourceDirectoryFileHolder; _SourceDirectoryFileHolder = sourceDirectoryFileHolder;
} }
public Item(FileHolder sourceDirectoryFileHolder, string relativePath, FileHolder imageFileInfo, bool? isNotUniqueAndNeedsReview, bool isUniqueFileName, bool isValidImageFormatExtension, Property? property, bool? abandoned, bool? fileSizeChanged, bool? lastWriteTimeChanged) : public Item(FilePath filePath, FileHolder sourceDirectoryFileHolder, string relativePath, FileHolder imageFileInfo, bool? isNotUniqueAndNeedsReview, bool isUniqueFileName, bool isValidImageFormatExtension, Property? property, bool? abandoned, bool? fileSizeChanged, bool? lastWriteTimeChanged) :
this([], fileSizeChanged, imageFileInfo, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, lastWriteTimeChanged, null, property, relativePath, null, sourceDirectoryFileHolder) this([], filePath, fileSizeChanged, imageFileInfo, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, lastWriteTimeChanged, null, property, relativePath, null, sourceDirectoryFileHolder)
{ {
if (relativePath.EndsWith(".json")) if (relativePath.EndsWith(".json"))
throw new ArgumentException("Can not be a *.json file!"); throw new ArgumentException("Can not be a *.json file!");
@ -57,8 +60,8 @@ public class Item : Properties.IItem
throw new ArgumentException("Can not be a *.json file!"); throw new ArgumentException("Can not be a *.json file!");
} }
public Item(FileHolder sourceDirectoryFileHolder, string relativePath, bool isValidImageFormatExtension) : public Item(FilePath filePath, FileHolder sourceDirectoryFileHolder, string relativePath, bool isValidImageFormatExtension) :
this(sourceDirectoryFileHolder, relativePath, sourceDirectoryFileHolder, null, false, isValidImageFormatExtension, null, null, null, null) this(filePath, sourceDirectoryFileHolder, relativePath, sourceDirectoryFileHolder, null, false, isValidImageFormatExtension, null, null, null, null)
{ } { }
public override string ToString() public override string ToString()

View File

@ -6,7 +6,7 @@ public record LocationContainer<T>(DateOnly CreationDateOnly,
IReadOnlyList<T> Directories, IReadOnlyList<T> Directories,
int? DirectoryNumber, int? DirectoryNumber,
string DisplayDirectoryName, string DisplayDirectoryName,
string File, FilePath FilePath,
bool FromDistanceContent, bool FromDistanceContent,
int Id, int Id,
Location? Location, Location? Location,

View File

@ -11,6 +11,7 @@ public class Mapping : Properties.IMapping
public string? _SegmentC; public string? _SegmentC;
protected SortingContainer? _SortingContainer; protected SortingContainer? _SortingContainer;
public int? By => _By; public int? By => _By;
public FilePath FilePath { init; get; }
public MappingFromFilterPost MappingFromFilterPost { init; get; } public MappingFromFilterPost MappingFromFilterPost { init; get; }
public MappingFromFilterPre MappingFromFilterPre { init; get; } public MappingFromFilterPre MappingFromFilterPre { init; get; }
public MappingFromItem MappingFromItem { init; get; } public MappingFromItem MappingFromItem { init; get; }
@ -21,9 +22,10 @@ public class Mapping : Properties.IMapping
public SortingContainer? SortingContainer => _SortingContainer; public SortingContainer? SortingContainer => _SortingContainer;
[JsonConstructor] [JsonConstructor]
public Mapping(int? by, MappingFromFilterPost mappingFromFilterPost, MappingFromFilterPre mappingFromFilterPre, MappingFromItem mappingFromItem, MappingFromLocation? mappingFromLocation, MappingFromPerson? mappingFromPerson, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, string? segmentC, SortingContainer? sortingContainer) public Mapping(int? by, FilePath filePath, MappingFromFilterPost mappingFromFilterPost, MappingFromFilterPre mappingFromFilterPre, MappingFromItem mappingFromItem, MappingFromLocation? mappingFromLocation, MappingFromPerson? mappingFromPerson, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, string? segmentC, SortingContainer? sortingContainer)
{ {
_By = by; _By = by;
FilePath = filePath;
_SegmentC = segmentC; _SegmentC = segmentC;
MappingFromFilterPost = mappingFromFilterPost; MappingFromFilterPost = mappingFromFilterPost;
MappingFromFilterPre = mappingFromFilterPre; MappingFromFilterPre = mappingFromFilterPre;
@ -34,8 +36,8 @@ public class Mapping : Properties.IMapping
_SortingContainer = sortingContainer; _SortingContainer = sortingContainer;
} }
public Mapping(MappingFromFilterPost mappingFromFilterPost, MappingFromFilterPre mappingFromFilterPre, MappingFromItem mappingFromItem, MappingFromLocation? mappingFromLocation, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection) : public Mapping(FilePath filePath, MappingFromFilterPost mappingFromFilterPost, MappingFromFilterPre mappingFromFilterPre, MappingFromItem mappingFromItem, MappingFromLocation? mappingFromLocation, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection) :
this(null, mappingFromFilterPost, mappingFromFilterPre, mappingFromItem, mappingFromLocation, null, mappingFromPhotoPrismCollection, null, null) this(null, filePath, mappingFromFilterPost, mappingFromFilterPre, mappingFromItem, mappingFromLocation, null, mappingFromPhotoPrismCollection, null, null)
{ } { }
public override string ToString() public override string ToString()

View File

@ -3,9 +3,9 @@ namespace View_by_Distance.Shared.Models.Methods;
public interface IBlurHasher public interface IBlurHasher
{ {
string GetFile(FilePath filePath);
string Encode(FileHolder fileHolder); string Encode(FileHolder fileHolder);
string GetFile(FileHolder fileHolder);
string EncodeAndSave(FileHolder fileHolder);
void Update(string resultsFullGroupDirectory); void Update(string resultsFullGroupDirectory);
string EncodeAndSave(FilePath filePath, FileHolder fileHolder);
} }

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,18 +9,18 @@ public class PersonContainer : Properties.IPersonContainer
public int? ApproximateYears { init; get; } public int? ApproximateYears { init; get; }
public PersonBirthday[]? Birthdays { init; get; } public PersonBirthday[]? Birthdays { init; get; }
public string[] DisplayDirectoryAllFiles { init; get; } public ReadOnlyCollection<FilePath> DisplayDirectoryAllFilePaths { init; get; }
public string DisplayDirectoryName { init; get; } public string DisplayDirectoryName { init; get; }
public long? Key { init; get; } public long? Key { init; get; }
public bool? KeyIsMaxBirthday { init; get; } public bool? KeyIsMaxBirthday { init; get; }
public PersonDirectory? PersonDirectory { init; get; } public PersonDirectory? PersonDirectory { init; get; }
[JsonConstructor] [JsonConstructor]
public PersonContainer(int? approximateYears, PersonBirthday[]? birthdays, string[] displayDirectoryAllFiles, string displayDirectoryName, long? key, PersonDirectory? personDirectory) public PersonContainer(int? approximateYears, PersonBirthday[]? birthdays, ReadOnlyCollection<FilePath> displayDirectoryAllFiles, string displayDirectoryName, long? key, PersonDirectory? personDirectory)
{ {
ApproximateYears = approximateYears; ApproximateYears = approximateYears;
Birthdays = birthdays; Birthdays = birthdays;
DisplayDirectoryAllFiles = displayDirectoryAllFiles; DisplayDirectoryAllFilePaths = displayDirectoryAllFiles;
DisplayDirectoryName = displayDirectoryName; DisplayDirectoryName = displayDirectoryName;
Key = key; Key = key;
PersonDirectory = personDirectory; PersonDirectory = personDirectory;
@ -27,22 +28,22 @@ public class PersonContainer : Properties.IPersonContainer
} }
public PersonContainer(char[] personCharacters, PersonBirthday birthday, string displayDirectoryName, PersonDirectory personDirectory) : public PersonContainer(char[] personCharacters, PersonBirthday birthday, string displayDirectoryName, PersonDirectory personDirectory) :
this(Stateless.Methods.IAge.GetApproximateYears(personCharacters, displayDirectoryName), [birthday], [], displayDirectoryName, birthday.Value.Ticks, personDirectory) this(Stateless.Methods.IAge.GetApproximateYears(personCharacters, displayDirectoryName), [birthday], new([]), displayDirectoryName, birthday.Value.Ticks, personDirectory)
{ } { }
public PersonContainer(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) : public PersonContainer(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) :
this(approximateYears, [birthdays], [], displayDirectoryName, key, null) this(approximateYears, [birthdays], new([]), displayDirectoryName, key, null)
{ } { }
public PersonContainer(int? approximateYears, PersonBirthday birthdays, PersonDirectory? personDirectory, string displayDirectoryName, long key) : public PersonContainer(int? approximateYears, PersonBirthday birthdays, PersonDirectory? personDirectory, string displayDirectoryName, long key) :
this(approximateYears, [birthdays], [], displayDirectoryName, key, personDirectory) this(approximateYears, [birthdays], new([]), displayDirectoryName, key, personDirectory)
{ } { }
public PersonContainer(int? approximateYears, string[] displayDirectoryAllFiles, string displayDirectoryName, PersonDirectory? personDirectory) : public PersonContainer(int? approximateYears, ReadOnlyCollection<FilePath> displayDirectoryAllFiles, string displayDirectoryName, PersonDirectory? personDirectory) :
this(approximateYears, null, displayDirectoryAllFiles, displayDirectoryName, null, personDirectory) this(approximateYears, null, displayDirectoryAllFiles, displayDirectoryName, null, personDirectory)
{ } { }
public PersonContainer(int? approximateYears, PersonBirthday[]? birthdays, string[] displayDirectoryAllFiles, string displayDirectoryName, long? key) : public PersonContainer(int? approximateYears, PersonBirthday[]? birthdays, ReadOnlyCollection<FilePath> displayDirectoryAllFiles, string displayDirectoryName, long? key) :
this(approximateYears, birthdays, displayDirectoryAllFiles, displayDirectoryName, key, null) this(approximateYears, birthdays, displayDirectoryAllFiles, displayDirectoryName, key, null)
{ } { }

View File

@ -1,16 +0,0 @@
namespace View_by_Distance.Shared.Models.Properties;
public interface IFileHolder
{
public DateTime? CreationTime { get; }
public string? DirectoryName { get; }
public bool Exists { get; }
public string ExtensionLowered { get; }
public string FullName { get; }
public DateTime? LastWriteTime { get; }
public long? Length { get; }
public string Name { get; }
public string NameWithoutExtension { get; }
}

View File

@ -5,6 +5,7 @@ public interface IItem
public bool? FileSizeChanged { get; } public bool? FileSizeChanged { get; }
public List<Face> Faces { get; } public List<Face> Faces { get; }
public FilePath FilePath { get; }
public FileHolder ImageFileHolder { get; } public FileHolder ImageFileHolder { get; }
public bool? IsNotUniqueAndNeedsReview { get; } public bool? IsNotUniqueAndNeedsReview { get; }
public bool IsUniqueFileName { get; } public bool IsUniqueFileName { get; }

View File

@ -4,6 +4,7 @@ public interface IMapping
{ {
public int? By { get; } public int? By { get; }
public FilePath FilePath { init; get; }
public MappingFromFilterPost MappingFromFilterPost { init; get; } public MappingFromFilterPost MappingFromFilterPost { init; get; }
public MappingFromFilterPre MappingFromFilterPre { init; get; } public MappingFromFilterPre MappingFromFilterPre { init; get; }
public MappingFromLocation? MappingFromLocation { init; get; } public MappingFromLocation? MappingFromLocation { init; get; }

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 IPersonContainer public interface IPersonContainer
@ -5,7 +7,7 @@ public interface IPersonContainer
public int? ApproximateYears { init; get; } public int? ApproximateYears { init; get; }
public PersonBirthday[]? Birthdays { init; get; } public PersonBirthday[]? Birthdays { init; get; }
public string[] DisplayDirectoryAllFiles { init; get; } public ReadOnlyCollection<FilePath> DisplayDirectoryAllFilePaths { init; get; }
public string DisplayDirectoryName { init; get; } public string DisplayDirectoryName { init; get; }
public long? Key { init; get; } public long? Key { init; get; }
public bool? KeyIsMaxBirthday { init; get; } public bool? KeyIsMaxBirthday { init; get; }

View File

@ -6,6 +6,7 @@ public interface IPropertyConfiguration
public string DateGroup { init; get; } public string DateGroup { init; get; }
public string[] IgnoreExtensions { init; get; } public string[] IgnoreExtensions { init; get; }
public string[] IgnoreRulesKeyWords { init; get; } public string[] IgnoreRulesKeyWords { init; get; }
public int IntMinValueLength { init; get; }
public string PersonBirthdayFormat { init; get; } public string PersonBirthdayFormat { init; get; }
public bool PropertiesChangedForProperty { init; get; } public bool PropertiesChangedForProperty { init; get; }
public string[] PropertyContentCollectionFiles { init; get; } public string[] PropertyContentCollectionFiles { init; get; }

View File

@ -33,7 +33,7 @@ public class SaveContainer
{ } { }
public SaveContainer(string directory, string locationContainersFile) : public SaveContainer(string directory, string locationContainersFile) :
this(string.Empty, directory, null, null, null, false, new(locationContainersFile), Path.Combine(directory, $"{Path.GetFileName(locationContainersFile)}.lnk")) this(string.Empty, directory, null, null, null, false, Stateless.Methods.IFileHolder.Get(locationContainersFile), Path.Combine(directory, $"{Path.GetFileName(locationContainersFile)}.lnk"))
{ } { }
public SaveContainer(string directory, FileHolder? faceFileHolder, FileHolder? resizedFileHolder, string shortcutFile) : public SaveContainer(string directory, FileHolder? faceFileHolder, FileHolder? resizedFileHolder, string shortcutFile) :

View File

@ -6,7 +6,7 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
internal abstract class Container internal abstract class Container
{ {
private record FilePair(string Path, string? Directory, bool IsUnique, List<string> Collection, Models.Item Item) { } private record FilePair(bool IsUnique, List<string> Collection, FilePath FilePath, Models.Item Item) { }
internal static DateTime[] GetContainerDateTimes(IEnumerable<Models.Item> items) internal static DateTime[] GetContainerDateTimes(IEnumerable<Models.Item> items)
{ {
@ -45,15 +45,15 @@ internal abstract class Container
List<Models.FilePair>? filePairs = null; List<Models.FilePair>? filePairs = null;
ReadOnlyCollection<string[]>? jsonFilesCollection = null; ReadOnlyCollection<string[]>? jsonFilesCollection = null;
IReadOnlyDictionary<string, List<string>>? compareFileNamesToFiles = null; IReadOnlyDictionary<string, List<string>>? compareFileNamesToFiles = null;
IReadOnlyDictionary<string, List<string>> fileNamesToFiles = IDirectory.GetFilesKeyValuePairs(filesCollection); IReadOnlyDictionary<string, List<string>> fileNamesToFiles = XDirectory.GetFilesKeyValuePairs(filesCollection);
for (int i = 0; i < int.MaxValue; i++) for (int i = 0; i < int.MaxValue; i++)
{ {
renamed = 0; renamed = 0;
jsonFilesCollection = IDirectory.GetFilesCollection(aPropertySingletonDirectory, directorySearchFilter, extension, useCeilingAverage); jsonFilesCollection = IDirectory.GetFilesCollection(aPropertySingletonDirectory, directorySearchFilter, extension, useCeilingAverage);
compareFileNamesToFiles = IDirectory.GetFilesKeyValuePairs(jsonFilesCollection); compareFileNamesToFiles = XDirectory.GetFilesKeyValuePairs(jsonFilesCollection);
renamed += IDirectory.LookForAbandoned(jsonFilesCollection, fileNamesToFiles, extension); renamed += XDirectory.LookForAbandoned(jsonFilesCollection, fileNamesToFiles, extension);
filePairs = IDirectory.GetFiles(filesCollection, fileNamesToFiles, extension, compareFileNamesToFiles); filePairs = XDirectory.GetFiles(filesCollection, fileNamesToFiles, extension, compareFileNamesToFiles);
renamed += IDirectory.MaybeMove(propertyConfiguration.RootDirectory, propertyConfiguration.ResultAllInOne, propertyConfiguration.ResultAllInOneSubdirectoryLength, filePairs, aPropertySingletonDirectory, extension); renamed += XDirectory.MaybeMove(propertyConfiguration, filePairs, aPropertySingletonDirectory, extension);
if (renamed == 0) if (renamed == 0)
break; break;
} }
@ -80,33 +80,33 @@ internal abstract class Container
private static void ParallelFor(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string extension, int rootDirectoryLength, Models.FilePair filePair, List<FilePair> results) private static void ParallelFor(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string extension, int rootDirectoryLength, Models.FilePair filePair, List<FilePair> results)
{ {
string fileName;
bool abandoned = false; bool abandoned = false;
Models.FileHolder sourceDirectoryFileHolder; Models.FileHolder sourceDirectoryFileHolder;
Models.Property? property = GetProperty(filePair); Models.Property? property = GetProperty(filePair);
Models.FileHolder imageFileInfo = new(filePair.Path); Models.FileHolder imageFileInfo = IFileHolder.Get(filePair.Path);
bool? fileSizeChanged = property is not null ? property.FileSize != imageFileInfo.Length : null; FilePath filePath = FilePath.Get(propertyConfiguration, imageFileInfo, index: null);
bool? fileSizeChanged = property is not null ? property.FileSize != filePath.Length : null;
bool isValidImageFormatExtension = propertyConfiguration.ValidImageFormatExtensions.Contains(filePath.ExtensionLowered);
string relativePath = IPath.GetRelativePath(filePair.Path, rootDirectoryLength, forceExtensionToLower: true); string relativePath = IPath.GetRelativePath(filePair.Path, rootDirectoryLength, forceExtensionToLower: true);
bool isValidImageFormatExtension = propertyConfiguration.ValidImageFormatExtensions.Contains(imageFileInfo.ExtensionLowered); bool? lastWriteTimeChanged = property is not null ? propertyConfiguration.PropertiesChangedForProperty || property.LastWriteTime.Ticks != filePath.LastWriteTicks : null;
bool? lastWriteTimeChanged = property is not null ? propertyConfiguration.PropertiesChangedForProperty || property.LastWriteTime != imageFileInfo.LastWriteTime : null;
if (filePair.Match is not null) if (filePair.Match is not null)
sourceDirectoryFileHolder = new(filePair.Match); sourceDirectoryFileHolder = IFileHolder.Get(filePair.Match);
else if (!filePair.IsUnique) else if (!filePair.IsUnique)
sourceDirectoryFileHolder = new(Path.GetFullPath(string.Concat(aPropertySingletonDirectory, relativePath, extension))); sourceDirectoryFileHolder = IFileHolder.Get(Path.GetFullPath(string.Concat(aPropertySingletonDirectory, relativePath, extension)));
else else
{ {
fileName = Path.GetFileName(filePair.Path); string fileName = Path.GetFileName(filePair.Path);
(string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration.ResultAllInOneSubdirectoryLength, fileName); (string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath);
sourceDirectoryFileHolder = new(Path.Combine(aPropertySingletonDirectory, propertyConfiguration.ResultAllInOne, directoryName, $"{fileName}{extension}")); sourceDirectoryFileHolder = IFileHolder.Get(Path.Combine(aPropertySingletonDirectory, directoryName, $"{fileName}{extension}"));
} }
if (imageFileInfo.LastWriteTime is not null && sourceDirectoryFileHolder.CreationTime is not null && sourceDirectoryFileHolder.LastWriteTime is not null && imageFileInfo.LastWriteTime.Value != sourceDirectoryFileHolder.CreationTime.Value) if (sourceDirectoryFileHolder.CreationTime is not null && sourceDirectoryFileHolder.LastWriteTime is not null && filePath.LastWriteTicks != sourceDirectoryFileHolder.CreationTime.Value.Ticks)
{ {
File.SetCreationTime(sourceDirectoryFileHolder.FullName, imageFileInfo.LastWriteTime.Value); File.SetCreationTime(sourceDirectoryFileHolder.FullName, new(filePath.LastWriteTicks));
File.SetLastWriteTime(sourceDirectoryFileHolder.FullName, sourceDirectoryFileHolder.LastWriteTime.Value); File.SetLastWriteTime(sourceDirectoryFileHolder.FullName, sourceDirectoryFileHolder.LastWriteTime.Value);
} }
Models.Item item = new(sourceDirectoryFileHolder, relativePath, imageFileInfo, filePair.IsNotUniqueAndNeedsReview, filePair.IsUnique, isValidImageFormatExtension, property, abandoned, fileSizeChanged, lastWriteTimeChanged); Models.Item item = new(filePath, sourceDirectoryFileHolder, relativePath, imageFileInfo, filePair.IsNotUniqueAndNeedsReview, filePair.IsUnique, isValidImageFormatExtension, property, abandoned, fileSizeChanged, lastWriteTimeChanged);
lock (results) lock (results)
results.Add(new(filePair.Path, imageFileInfo.DirectoryName, filePair.IsUnique, filePair.Collection, item)); results.Add(new(filePair.IsUnique, filePair.Collection, filePath, item));
} }
private static List<FilePair> GetFilePairs(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, string extension, List<Models.FilePair> filePairs) private static List<FilePair> GetFilePairs(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, string extension, List<Models.FilePair> filePairs)
@ -148,12 +148,10 @@ internal abstract class Container
List<FilePair> collection = GetFilePairs(propertyConfiguration, aPropertySingletonDirectory, filesCollectionDirectory, extension, filePairs); List<FilePair> collection = GetFilePairs(propertyConfiguration, aPropertySingletonDirectory, filesCollectionDirectory, extension, filePairs);
foreach (FilePair filePair in collection) foreach (FilePair filePair in collection)
{ {
if (filePair.Directory is null) if (!directoryToItems.TryGetValue(filePair.FilePath.DirectoryName, out items))
continue;
if (!directoryToItems.TryGetValue(filePair.Directory, out items))
{ {
directoryToItems.Add(filePair.Directory, []); directoryToItems.Add(filePair.FilePath.DirectoryName, []);
if (!directoryToItems.TryGetValue(filePair.Directory, out items)) if (!directoryToItems.TryGetValue(filePair.FilePath.DirectoryName, out items))
throw new Exception(); throw new Exception();
} }
items.Add(filePair.Item); items.Add(filePair.Item);

View File

@ -7,14 +7,14 @@ internal abstract class FileHolder
{ {
List<Models.FileHolder> results = []; List<Models.FileHolder> results = [];
foreach ((string _, string[] files) in collection) foreach ((string _, string[] files) in collection)
results.AddRange(files.Select(l => new Models.FileHolder(l))); results.AddRange(files.Select(l => IFileHolder.Get(l)));
return results; return results;
} }
internal static IEnumerable<Models.FileHolder> GetFileHolders(IEnumerable<(string, string)> collection) internal static IEnumerable<Models.FileHolder> GetFileHolders(IEnumerable<(string, string)> collection)
{ {
foreach ((string _, string file) in collection) foreach ((string _, string file) in collection)
yield return new(file); yield return IFileHolder.Get(file);
} }
internal static IEnumerable<(string, string[])> GetFiles(string root, string searchPattern) internal static IEnumerable<(string, string[])> GetFiles(string root, string searchPattern)

View File

@ -15,11 +15,6 @@ public interface IContainer
static Models.Item[] GetFilterItems(Properties.IPropertyConfiguration propertyConfiguration, Models.Container container) => static Models.Item[] GetFilterItems(Properties.IPropertyConfiguration propertyConfiguration, Models.Container container) =>
Container.GetFilterItems(propertyConfiguration, container); Container.GetFilterItems(propertyConfiguration, container);
List<FilePair> TestStatic_GetFilePairs(Properties.IPropertyConfiguration propertyConfiguration, string directorySearchFilter, string extension, string aPropertySingletonDirectory, ReadOnlyCollection<string[]> filesCollection) =>
Container.GetFilePairs(propertyConfiguration, directorySearchFilter, extension, aPropertySingletonDirectory, filesCollection);
static List<FilePair> GetFilePairs(Properties.IPropertyConfiguration propertyConfiguration, string directorySearchFilter, string extension, string aPropertySingletonDirectory, ReadOnlyCollection<string[]> filesCollection) =>
Container.GetFilePairs(propertyConfiguration, directorySearchFilter, extension, aPropertySingletonDirectory, filesCollection);
(int, Models.Container[]) TestStatic_GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory) => (int, Models.Container[]) TestStatic_GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory) =>
GetContainers(propertyConfiguration, aPropertySingletonDirectory); GetContainers(propertyConfiguration, aPropertySingletonDirectory);
static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory) => static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory) =>

View File

@ -5,11 +5,6 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
public interface IDirectory public interface IDirectory
{ {
short TestStatic_GetSortOrderOnlyLengthIndex(int offset) =>
GetSortOrderOnlyLengthIndex(offset);
static short GetSortOrderOnlyLengthIndex(int offset) =>
(short)(offset.ToString().Length + 3);
char TestStatic_GetDirectory(string fileName) => char TestStatic_GetDirectory(string fileName) =>
GetDirectory(fileName); GetDirectory(fileName);
static char GetDirectory(string fileName) => static char GetDirectory(string fileName) =>
@ -20,77 +15,29 @@ public interface IDirectory
static int GetDirectory(char directory) => static int GetDirectory(char directory) =>
directory == '-' ? 10 : int.TryParse(directory.ToString(), out int value) ? value : 11; directory == '-' ? 10 : int.TryParse(directory.ToString(), out int value) ? value : 11;
string TestStatic_GetPaddedId(int intMinValueLength, int index, int id) =>
GetPaddedId(intMinValueLength, index, id);
static string GetPaddedId(int intMinValueLength, int index, int id) =>
id > -1 ? $"{index}070{id.ToString().PadLeft(intMinValueLength, '0')}" : $"{index}030{id.ToString()[1..].PadLeft(intMinValueLength, '0')}";
bool TestStatic_NameWithoutExtensionIsPaddedIdFormat(string fileNameWithoutExtension, short sortOrderOnlyLengthIndex) =>
NameWithoutExtensionIsPaddedIdFormat(fileNameWithoutExtension, sortOrderOnlyLengthIndex);
static bool NameWithoutExtensionIsPaddedIdFormat(string fileNameWithoutExtension, short sortOrderOnlyLengthIndex) =>
fileNameWithoutExtension.Length > sortOrderOnlyLengthIndex
&& fileNameWithoutExtension[sortOrderOnlyLengthIndex] == '0'
&& fileNameWithoutExtension[sortOrderOnlyLengthIndex - 3] == '0'
&& fileNameWithoutExtension.All(l => char.IsNumber(l));
bool TestStatic_NameWithoutExtensionIsPaddedIdFormat(Models.FileHolder fileHolder, short sortOrderOnlyLengthIndex) =>
NameWithoutExtensionIsPaddedIdFormat(fileHolder, sortOrderOnlyLengthIndex);
static bool NameWithoutExtensionIsPaddedIdFormat(Models.FileHolder fileHolder, short sortOrderOnlyLengthIndex) =>
NameWithoutExtensionIsPaddedIdFormat(fileHolder.NameWithoutExtension, sortOrderOnlyLengthIndex);
ReadOnlyCollection<string[]> TestStatic_GetFilesCollection(string directory, string directorySearchFilter, string fileSearchFilter, bool useCeilingAverage) => ReadOnlyCollection<string[]> TestStatic_GetFilesCollection(string directory, string directorySearchFilter, string fileSearchFilter, bool useCeilingAverage) =>
GetFilesCollection(directory, directorySearchFilter, fileSearchFilter, useCeilingAverage); GetFilesCollection(directory, directorySearchFilter, fileSearchFilter, useCeilingAverage);
static ReadOnlyCollection<string[]> GetFilesCollection(string directory, string directorySearchFilter, string fileSearchFilter, bool useCeilingAverage) => static ReadOnlyCollection<string[]> GetFilesCollection(string directory, string directorySearchFilter, string fileSearchFilter, bool useCeilingAverage) =>
XDirectory.GetFilesCollection(directory, directorySearchFilter, fileSearchFilter, useCeilingAverage); XDirectory.GetFilesCollection(directory, directorySearchFilter, fileSearchFilter, useCeilingAverage);
IReadOnlyDictionary<string, List<string>> TestStatic_GetFilesKeyValuePairs(ReadOnlyCollection<string[]> filesCollection) =>
GetFilesKeyValuePairs(filesCollection);
static IReadOnlyDictionary<string, List<string>> GetFilesKeyValuePairs(ReadOnlyCollection<string[]> filesCollection) =>
XDirectory.GetFilesKeyValuePairs(filesCollection);
int TestStatic_LookForAbandoned(ReadOnlyCollection<string[]> jsonFilesCollection, IReadOnlyDictionary<string, List<string>> fileNamesToFiles, string extension) =>
LookForAbandoned(jsonFilesCollection, fileNamesToFiles, extension);
static int LookForAbandoned(ReadOnlyCollection<string[]> jsonFilesCollection, IReadOnlyDictionary<string, List<string>> fileNamesToFiles, string extension) =>
XDirectory.LookForAbandoned(jsonFilesCollection, fileNamesToFiles, extension);
int TestStatic_MaybeMove(string directory, string resultAllInOne, int resultAllInOneSubdirectoryLength, List<FilePair> filePairs, string jsonGroupDirectory, string extension) =>
MaybeMove(directory, resultAllInOne, resultAllInOneSubdirectoryLength, filePairs, jsonGroupDirectory, extension);
static int MaybeMove(string directory, string resultAllInOne, int resultAllInOneSubdirectoryLength, List<FilePair> filePairs, string jsonGroupDirectory, string extension) =>
XDirectory.MaybeMove(directory, resultAllInOne, resultAllInOneSubdirectoryLength, filePairs, jsonGroupDirectory, extension);
List<FilePair> TestStatic_GetFiles(ReadOnlyCollection<string[]> filesCollection, IReadOnlyDictionary<string, List<string>> fileNamesToFiles, string extension, IReadOnlyDictionary<string, List<string>> compareFileNamesToFiles) =>
GetFiles(filesCollection, fileNamesToFiles, extension, compareFileNamesToFiles);
static List<FilePair> GetFiles(ReadOnlyCollection<string[]> filesCollection, IReadOnlyDictionary<string, List<string>> fileNamesToFiles, string extension, IReadOnlyDictionary<string, List<string>> compareFileNamesToFiles) =>
XDirectory.GetFiles(filesCollection, fileNamesToFiles, extension, compareFileNamesToFiles);
void TestStatic_MoveFiles(List<string> files, string find, string replace) => void TestStatic_MoveFiles(List<string> files, string find, string replace) =>
MoveFiles(files, find, replace); MoveFiles(files, find, replace);
static void MoveFiles(List<string> files, string find, string replace) => static void MoveFiles(List<string> files, string find, string replace) =>
XDirectory.MoveFiles(files, find, replace); XDirectory.MoveFiles(files, find, replace);
(string[], List<(Models.FileHolder, string?, string)>) TestStatic_GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<string[]> filesCollection, string[] directories, Action? tick) => (string[], List<(FilePath, string)>) TestStatic_GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<string[]> filesCollection, string[] directories, Action? tick) =>
GetToDoCollection(propertyConfiguration, filesCollection, directories, tick); GetToDoCollection(propertyConfiguration, filesCollection, directories, tick);
static (string[], List<(Models.FileHolder, string?, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<string[]> filesCollection, string[] directories, Action? tick) => static (string[], List<(FilePath, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<string[]> filesCollection, string[] directories, Action? tick) =>
XDirectory.GetToDoCollection(propertyConfiguration, copyDuplicates: false, ifCanUseId: true, filesCollection, directories, tick); XDirectory.GetToDoCollection(propertyConfiguration, copyDuplicates: false, ifCanUseId: true, filesCollection, directories, tick);
(string[], List<(Models.FileHolder, string?, string)>) TestStatic_GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, ReadOnlyCollection<string[]> filesCollection, string[] directories, Action? tick) => (string[], List<(FilePath, string)>) TestStatic_GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, ReadOnlyCollection<string[]> filesCollection, string[] directories, Action? tick) =>
GetToDoCollection(propertyConfiguration, copyDuplicates, ifCanUseId, filesCollection, directories, tick); GetToDoCollection(propertyConfiguration, copyDuplicates, ifCanUseId, filesCollection, directories, tick);
static (string[], List<(Models.FileHolder, string?, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, ReadOnlyCollection<string[]> filesCollection, string[] directories, Action? tick) => static (string[], List<(FilePath, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, ReadOnlyCollection<string[]> filesCollection, string[] directories, Action? tick) =>
XDirectory.GetToDoCollection(propertyConfiguration, copyDuplicates, ifCanUseId, filesCollection, directories, tick); XDirectory.GetToDoCollection(propertyConfiguration, copyDuplicates, ifCanUseId, filesCollection, directories, tick);
List<string> TestStatic_CopyOrMove(List<(Models.FileHolder, string?, string)> toDoCollection, bool move, bool moveBack, Action? tick) => List<string> TestStatic_CopyOrMove(List<(FilePath, string)> toDoCollection, bool move, bool moveBack, Action? tick) =>
CopyOrMove(toDoCollection, move, moveBack, tick); CopyOrMove(toDoCollection, move, moveBack, tick);
static List<string> CopyOrMove(List<(Models.FileHolder, string?, string)> toDoCollection, bool move, bool moveBack, Action? tick) => static List<string> CopyOrMove(List<(FilePath, string)> toDoCollection, bool move, bool moveBack, Action? tick) =>
XDirectory.CopyOrMove(toDoCollection, move, moveBack, tick); XDirectory.CopyOrMove(toDoCollection, move, moveBack, tick);
(bool, int?) TestStatic_GetId(short sortOrderOnlyLengthIndex, Models.FileHolder fileHolder) =>
GetId(sortOrderOnlyLengthIndex, fileHolder);
static (bool, int?) GetId(short sortOrderOnlyLengthIndex, Models.FileHolder fileHolder) =>
XDirectory.GetId(sortOrderOnlyLengthIndex, fileHolder);
(bool, int?) TestStatic_GetId(int offset, Models.FileHolder fileHolder) =>
GetId(offset, fileHolder);
static (bool, int?) GetId(int offset, Models.FileHolder fileHolder) =>
XDirectory.GetId(GetSortOrderOnlyLengthIndex(offset), fileHolder);
} }

View File

@ -21,6 +21,24 @@ public interface IFileHolder
Models.FileHolder TestStatic_Refresh(Models.FileHolder fileHolder) => Models.FileHolder TestStatic_Refresh(Models.FileHolder fileHolder) =>
Refresh(fileHolder); Refresh(fileHolder);
static Models.FileHolder Refresh(Models.FileHolder fileHolder) => static Models.FileHolder Refresh(Models.FileHolder fileHolder) =>
new(fileHolder.FullName); Get(fileHolder.FullName);
Models.FileHolder TestStatic_Get(string fileName) =>
Get(fileName);
static Models.FileHolder Get(string fileName) =>
Models.FileHolder.Get(new FileInfo(fileName));
Models.FileHolder TestStatic_Get(FilePath filePath) =>
Get(filePath);
static Models.FileHolder Get(FilePath filePath) =>
new(new(filePath.CreationTicks),
filePath.DirectoryName,
true,
filePath.ExtensionLowered,
filePath.FullName,
new(filePath.LastWriteTicks),
filePath.Length,
filePath.Name,
filePath.NameWithoutExtension);
} }

View File

@ -0,0 +1,43 @@
namespace View_by_Distance.Shared.Models.Stateless.Methods;
public interface IId
{ // ...
string TestStatic_GetIntelligentId(Properties.IPropertyConfiguration propertyConfiguration, long id, bool ignore) =>
GetIntelligentId(propertyConfiguration, id, ignore);
static string GetIntelligentId(Properties.IPropertyConfiguration propertyConfiguration, long id, bool ignore) =>
Id.GetIntelligentId(propertyConfiguration, id, ignore);
int TestStatic_GetId(Properties.IPropertyConfiguration propertyConfiguration, string intelligentId) =>
GetId(propertyConfiguration, intelligentId);
static int GetId(Properties.IPropertyConfiguration propertyConfiguration, string intelligentId) =>
Id.GetId(propertyConfiguration, intelligentId);
string TestStatic_GetPaddedId(Properties.IPropertyConfiguration propertyConfiguration, int index, int id) =>
GetPaddedId(propertyConfiguration, index, id);
static string GetPaddedId(Properties.IPropertyConfiguration propertyConfiguration, int index, int id) =>
Id.GetPaddedId(propertyConfiguration, index, id);
bool TestStatic_NameWithoutExtensionIsIntelligentIdFormat(Properties.IPropertyConfiguration propertyConfiguration, string fileNameFirstSegment) =>
NameWithoutExtensionIsIntelligentIdFormat(propertyConfiguration, fileNameFirstSegment);
static bool NameWithoutExtensionIsIntelligentIdFormat(Properties.IPropertyConfiguration propertyConfiguration, string fileNameFirstSegment) =>
fileNameFirstSegment.Length - 1 == propertyConfiguration.IntMinValueLength && fileNameFirstSegment[^1] is '1' or '2' or '8' or '9' && fileNameFirstSegment.All(char.IsNumber);
bool TestStatic_NameWithoutExtensionIsPaddedIntelligentIdFormat(Properties.IPropertyConfiguration propertyConfiguration, int sortOrderOnlyLengthIndex, string fileNameFirstSegment) =>
NameWithoutExtensionIsPaddedIntelligentIdFormat(propertyConfiguration, sortOrderOnlyLengthIndex, fileNameFirstSegment);
static bool NameWithoutExtensionIsPaddedIntelligentIdFormat(Properties.IPropertyConfiguration propertyConfiguration, int sortOrderOnlyLengthIndex, string fileNameFirstSegment) =>
fileNameFirstSegment.Length == propertyConfiguration.IntMinValueLength + sortOrderOnlyLengthIndex + 1
&& fileNameFirstSegment[^1] is '1' or '2' or '8' or '9'
&& fileNameFirstSegment.All(char.IsNumber);
bool TestStatic_NameWithoutExtensionIsIdFormat(Properties.IPropertyConfiguration propertyConfiguration, Models.FileHolder fileHolder) =>
NameWithoutExtensionIsIdFormat(propertyConfiguration, fileHolder);
static bool NameWithoutExtensionIsIdFormat(Properties.IPropertyConfiguration propertyConfiguration, Models.FileHolder fileHolder) =>
Id.NameWithoutExtensionIsIdFormat(propertyConfiguration, fileHolder.NameWithoutExtension.Split('.')[0]);
int TestStatic_GetDeterministicHashCode(byte[] value) =>
GetDeterministicHashCode(value);
static int GetDeterministicHashCode(byte[] value) =>
Id.GetDeterministicHashCode(value);
}

View File

@ -3,11 +3,6 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
public interface IMapping public interface IMapping
{ // ... { // ...
(string?, string?, string?, bool?) TestStatic_GetSegments(string facesFileNameExtension, string fileName)
=> GetSegments(facesFileNameExtension, fileName);
static (string?, string?, string?, bool?) GetSegments(string facesFileNameExtension, string fileName)
=> Mapping.GetSegments(facesFileNameExtension, fileName);
int TestStatic_GetAreaPermyriad(int faceAreaPermyriad, int height, Models.Location location, int width) int TestStatic_GetAreaPermyriad(int faceAreaPermyriad, int height, Models.Location location, int width)
=> GetAreaPermyriad(faceAreaPermyriad, height, location, width); => GetAreaPermyriad(faceAreaPermyriad, height, location, width);
static int GetAreaPermyriad(int faceAreaPermyriad, int height, Models.Location location, int width) static int GetAreaPermyriad(int faceAreaPermyriad, int height, Models.Location location, int width)
@ -23,19 +18,19 @@ public interface IMapping
static int GetAreaPermyriad(int faceAreaPermyriad, Models.Location location, Models.OutputResolution outputResolution) static int GetAreaPermyriad(int faceAreaPermyriad, Models.Location location, Models.OutputResolution outputResolution)
=> Mapping.GetAreaPermyriad(faceAreaPermyriad, location.Bottom, outputResolution.Height, location.Left, location.Right, location.Top, outputResolution.Width); => Mapping.GetAreaPermyriad(faceAreaPermyriad, location.Bottom, outputResolution.Height, location.Left, location.Right, location.Top, outputResolution.Width);
string TestStatic_GetDeterministicHashCodeKey(int id, Models.Location location, int locationDigits, Models.OutputResolution outputResolution) string TestStatic_GetDeterministicHashCodeKey(FilePath filePath, Models.Location location, int locationDigits, Models.OutputResolution outputResolution)
=> GetDeterministicHashCodeKey(id, location, locationDigits, outputResolution); => GetDeterministicHashCodeKey(filePath, location, locationDigits, outputResolution);
static string GetDeterministicHashCodeKey(int id, Models.Location location, int locationDigits, Models.OutputResolution outputResolution) static string GetDeterministicHashCodeKey(FilePath filePath, Models.Location location, int locationDigits, Models.OutputResolution outputResolution)
=> $"{id}.{ILocation.GetLeftPadded(locationDigits, ILocation.GetWholePercentages(location, locationDigits, outputResolution))}"; => filePath.IsIntelligentIdFormat ? $"{filePath.FileNameFirstSegment}.{ILocation.GetLeftPadded(locationDigits, ILocation.GetWholePercentages(location, locationDigits, outputResolution))}" : throw new NotImplementedException();
string TestStatic_GetDeterministicHashCodeKey(int id, int locationDigits) string TestStatic_GetDeterministicHashCodeKey(FilePath filePath, int locationDigits)
=> GetDeterministicHashCodeKey(id, locationDigits); => GetDeterministicHashCodeKey(filePath, locationDigits);
static string GetDeterministicHashCodeKey(int id, int locationDigits) static string GetDeterministicHashCodeKey(FilePath filePath, int locationDigits)
=> $"{id}.{ILocation.GetLeftPadded(locationDigits, ILocation.GetWholePercentages(locationDigits))}"; => filePath.IsIntelligentIdFormat ? $"{filePath.FileNameFirstSegment}.{ILocation.GetLeftPadded(locationDigits, ILocation.GetWholePercentages(locationDigits))}" : throw new NotImplementedException();
(int?, int?) TestStatic_GetConverted(string facesFileNameExtension, string file) => int? TestStatic_GetWholePercentages(string facesFileNameExtension, FilePath filePath) =>
GetConverted(facesFileNameExtension, file); GetWholePercentages(facesFileNameExtension, filePath);
static (int?, int?) GetConverted(string facesFileNameExtension, string file) => static int? GetWholePercentages(string facesFileNameExtension, FilePath filePath) =>
Mapping.GetConverted(facesFileNameExtension, file); Mapping.GetWholePercentages(facesFileNameExtension, filePath);
} }

View File

@ -1,3 +1,4 @@
using System.Collections.ObjectModel;
using View_by_Distance.Shared.Models.Properties; using View_by_Distance.Shared.Models.Properties;
namespace View_by_Distance.Shared.Models.Stateless.Methods; namespace View_by_Distance.Shared.Models.Stateless.Methods;
@ -61,14 +62,14 @@ public interface IPath
static string GetDirectory(string sourceDirectory, int level, string directoryName) => static string GetDirectory(string sourceDirectory, int level, string directoryName) =>
XPath.GetDirectory(sourceDirectory, level, directoryName); XPath.GetDirectory(sourceDirectory, level, directoryName);
(string, int) TestStatic_GetDirectoryNameAndIndex(int resultAllInOneSubdirectoryLength, string fileName) => (string, int) TestStatic_GetDirectoryNameAndIndex(IPropertyConfiguration propertyConfiguration, FilePath filePath) =>
GetDirectoryNameAndIndex(resultAllInOneSubdirectoryLength, fileName); GetDirectoryNameAndIndex(propertyConfiguration, filePath);
static (string, int) GetDirectoryNameAndIndex(int resultAllInOneSubdirectoryLength, string fileName) => static (string, int) GetDirectoryNameAndIndex(IPropertyConfiguration propertyConfiguration, FilePath filePath) =>
XPath.GetDirectoryNameAndIndex(resultAllInOneSubdirectoryLength, fileName); XPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath);
Dictionary<string, string[]> TestStatic_GetKeyValuePairs(IPropertyConfiguration propertyConfiguration, string? resultsFullGroupDirectory, string[]? directories) => ReadOnlyDictionary<string, string[]> TestStatic_GetKeyValuePairs(IPropertyConfiguration propertyConfiguration, string? resultsFullGroupDirectory, string[]? jsonGroups) =>
GetKeyValuePairs(propertyConfiguration, resultsFullGroupDirectory, directories); GetKeyValuePairs(propertyConfiguration, resultsFullGroupDirectory, jsonGroups);
static Dictionary<string, string[]> GetKeyValuePairs(IPropertyConfiguration propertyConfiguration, string? resultsFullGroupDirectory, string[]? directories) => static ReadOnlyDictionary<string, string[]> GetKeyValuePairs(IPropertyConfiguration propertyConfiguration, string? resultsFullGroupDirectory, string[]? jsonGroups) =>
XPath.GetKeyValuePairs(propertyConfiguration, resultsFullGroupDirectory, directories); XPath.GetKeyValuePairs(propertyConfiguration, resultsFullGroupDirectory, jsonGroups);
} }

View File

@ -10,10 +10,10 @@ public interface IPersonContainer
static List<long> GetPersonKeys(IEnumerable<Models.PersonContainer> personContainers) => static List<long> GetPersonKeys(IEnumerable<Models.PersonContainer> personContainers) =>
PersonContainer.GetPersonKeys(personContainers); PersonContainer.GetPersonKeys(personContainers);
List<Models.PersonContainer> TestStatic_GetPersonContainers(string a2PeopleSingletonDirectory, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) => List<Models.PersonContainer> TestStatic_GetPersonContainers(string a2PeopleSingletonDirectory, string personBirthdayFormat, char[] personCharacters, Properties.IPropertyConfiguration propertyConfiguration, string facesFileNameExtension) =>
GetPersonContainers(a2PeopleSingletonDirectory, personBirthdayFormat, personCharacters, facesFileNameExtension); GetPersonContainers(a2PeopleSingletonDirectory, personBirthdayFormat, personCharacters, propertyConfiguration, facesFileNameExtension);
static List<Models.PersonContainer> GetPersonContainers(string a2PeopleSingletonDirectory, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) => static List<Models.PersonContainer> GetPersonContainers(string a2PeopleSingletonDirectory, string personBirthdayFormat, char[] personCharacters, Properties.IPropertyConfiguration propertyConfiguration, string facesFileNameExtension) =>
PersonContainer.GetPersonContainers(a2PeopleSingletonDirectory, personBirthdayFormat, personCharacters, facesFileNameExtension); PersonContainer.GetPersonContainers(a2PeopleSingletonDirectory, personBirthdayFormat, personCharacters, propertyConfiguration, facesFileNameExtension);
string? TestStatic_VerifyAge(char numberSign, string personDisplayDirectory, string? minusOne, string personDisplayDirectoryName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection) => string? TestStatic_VerifyAge(char numberSign, string personDisplayDirectory, string? minusOne, string personDisplayDirectoryName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection) =>
VerifyAge(numberSign, personDisplayDirectory, minusOne, personDisplayDirectoryName, approximateYears, collection); VerifyAge(numberSign, personDisplayDirectory, minusOne, personDisplayDirectoryName, approximateYears, collection);

View File

@ -38,16 +38,6 @@ public interface IProperty
static (bool?, string[]) IsWrongYear(Models.FileHolder fileHolder, DateTime? dateTimeOriginal, List<DateTime> dateTimes) => static (bool?, string[]) IsWrongYear(Models.FileHolder fileHolder, DateTime? dateTimeOriginal, List<DateTime> dateTimes) =>
Property.IsWrongYear(fileHolder, dateTimeOriginal, dateTimes); Property.IsWrongYear(fileHolder, dateTimeOriginal, dateTimes);
bool TestStatic_NameWithoutExtensionIsIdFormat(string fileNameWithoutExtension) =>
NameWithoutExtensionIsIdFormat(fileNameWithoutExtension);
static bool NameWithoutExtensionIsIdFormat(string fileNameWithoutExtension) =>
Property.NameWithoutExtensionIsIdFormat(fileNameWithoutExtension);
bool TestStatic_NameWithoutExtensionIsIdFormat(Models.FileHolder fileHolder) =>
NameWithoutExtensionIsIdFormat(fileHolder);
static bool NameWithoutExtensionIsIdFormat(Models.FileHolder fileHolder) =>
NameWithoutExtensionIsIdFormat(fileHolder.NameWithoutExtension);
List<DateTime> TestStatic_GetDateTimes(Models.Property property) => List<DateTime> TestStatic_GetDateTimes(Models.Property property) =>
GetDateTimes(property); GetDateTimes(property);
static List<DateTime> GetDateTimes(Models.Property property) => static List<DateTime> GetDateTimes(Models.Property property) =>

View File

@ -0,0 +1,95 @@
using System.Text;
namespace View_by_Distance.Shared.Models.Stateless.Methods;
internal abstract class Id
{
internal static bool NameWithoutExtensionIsIdFormat(Properties.IPropertyConfiguration propertyConfiguration, string fileNameWithoutExtension)
{
bool result;
if (fileNameWithoutExtension.Length < 5 || fileNameWithoutExtension.Length > propertyConfiguration.IntMinValueLength)
result = false;
else
{
bool skipOneAllAreNumbers = fileNameWithoutExtension[1..].All(char.IsNumber);
result = (skipOneAllAreNumbers && fileNameWithoutExtension[0] == '-') || (skipOneAllAreNumbers && char.IsNumber(fileNameWithoutExtension[0]));
}
return result;
}
internal static int GetId(Properties.IPropertyConfiguration propertyConfiguration, string intelligentId)
{
int result;
StringBuilder results = new();
if (propertyConfiguration.IntMinValueLength < (propertyConfiguration.ResultAllInOneSubdirectoryLength + 2))
throw new NotSupportedException();
for (int i = intelligentId.Length - (propertyConfiguration.ResultAllInOneSubdirectoryLength + 2); i > -1; i--)
_ = results.Append(intelligentId[i]);
_ = results.Append(intelligentId[^3]).Append(intelligentId[^2]);
result = int.Parse(results.ToString());
if (intelligentId[^1] is '1' or '2')
result *= -1;
else if (intelligentId[^1] is not '9' and not '8')
throw new NotSupportedException();
return result;
}
internal static string GetIntelligentId(Properties.IPropertyConfiguration propertyConfiguration, long id, bool ignore)
{
string result;
StringBuilder stringBuilder = new();
if (propertyConfiguration.IntMinValueLength < (propertyConfiguration.ResultAllInOneSubdirectoryLength + 2))
throw new NotSupportedException();
int key;
string value;
List<char> resultAllInOneSubdirectoryChars = [];
if (id > -1)
{
key = ignore ? 8 : 9;
value = id.ToString().PadLeft(propertyConfiguration.IntMinValueLength, '0');
}
else
{
key = ignore ? 2 : 1;
value = id.ToString()[1..].PadLeft(propertyConfiguration.IntMinValueLength, '0');
}
for (int i = value.Length - propertyConfiguration.ResultAllInOneSubdirectoryLength - 1; i > -1; i--)
_ = stringBuilder.Append(value[i]);
for (int i = value.Length - propertyConfiguration.ResultAllInOneSubdirectoryLength; i < value.Length; i++)
resultAllInOneSubdirectoryChars.Add(value[i]);
result = $"{stringBuilder}{string.Join(string.Empty, resultAllInOneSubdirectoryChars)}{key}";
return result;
}
internal static string GetPaddedId(Properties.IPropertyConfiguration propertyConfiguration, int index, int id)
{
string result;
string intelligentId = GetIntelligentId(propertyConfiguration, id, ignore: false);
int check = GetId(propertyConfiguration, intelligentId);
if (check != id)
throw new NotSupportedException();
result = $"{propertyConfiguration.Offset + index}{intelligentId}";
return result;
}
internal static int GetDeterministicHashCode(byte[] value)
{
int result;
unchecked
{
int hash1 = (5381 << 16) + 5381;
int hash2 = hash1;
for (int i = 0; i < value.Length; i += 2)
{
hash1 = ((hash1 << 5) + hash1) ^ value[i];
if (i == value.Length - 1)
break;
hash2 = ((hash2 << 5) + hash2) ^ value[i + 1];
}
result = hash1 + (hash2 * 1566083941);
}
return result;
}
}

View File

@ -3,66 +3,48 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
internal abstract class Mapping internal abstract class Mapping
{ {
internal static (string?, string?, string?, bool?) GetSegments(string facesFileNameExtension, string fileName) internal static (string?, string?, bool?) GetSegments(string facesFileNameExtension, FilePath filePath)
{ {
string[] segments = fileName.Split('.');
string? id;
string? extensionLowered; string? extensionLowered;
string? wholePercentages; string? wholePercentages;
bool? needsFacesFileNameExtension; bool? needsFacesFileNameExtension;
string[] segments = filePath.Name.Split('.');
if (segments.Length < 4 || $".{segments[3]}" != facesFileNameExtension) if (segments.Length < 4 || $".{segments[3]}" != facesFileNameExtension)
{ {
id = null;
extensionLowered = null; extensionLowered = null;
wholePercentages = null; wholePercentages = null;
needsFacesFileNameExtension = null; needsFacesFileNameExtension = null;
} }
else else
{ {
id = segments[0];
extensionLowered = $".{segments[2]}"; extensionLowered = $".{segments[2]}";
wholePercentages = segments[1]; wholePercentages = segments[1];
needsFacesFileNameExtension = segments.Length == 3; needsFacesFileNameExtension = segments.Length == 3;
} }
return new(id, wholePercentages, extensionLowered, needsFacesFileNameExtension); return new(wholePercentages, extensionLowered, needsFacesFileNameExtension);
} }
private static (int?, int?) GetConvertedFromSegments(string facesFileNameExtension, string fileName) private static int? GetConvertedFromSegments(string facesFileNameExtension, FilePath filePath)
{ {
int? id; int? result;
int? wholePercentages; (string? WholePercentages, string? ExtensionLowered, bool? Check) segments = GetSegments(facesFileNameExtension, filePath);
(string? Id, string? WholePercentages, string? ExtensionLowered, bool? Check) segments = GetSegments(facesFileNameExtension, fileName); if (string.IsNullOrEmpty(segments.WholePercentages) || string.IsNullOrEmpty(segments.ExtensionLowered) || segments.Check is null)
if (string.IsNullOrEmpty(segments.Id) || string.IsNullOrEmpty(segments.WholePercentages) || string.IsNullOrEmpty(segments.ExtensionLowered) || segments.Check is null) result = null;
{ else if (!int.TryParse(segments.WholePercentages, out int wholePercentages))
id = null; result = null;
wholePercentages = null;
}
else if (!int.TryParse(segments.Id, out int idValue) || !int.TryParse(segments.WholePercentages, out int wholePercentagesValue))
{
id = null;
wholePercentages = null;
}
else else
{ result = wholePercentages;
id = idValue; return result;
wholePercentages = wholePercentagesValue;
}
return new(id, wholePercentages);
} }
internal static (int?, int?) GetConverted(string facesFileNameExtension, string file) internal static int? GetWholePercentages(string facesFileNameExtension, FilePath filePath)
{ {
int? id;
int? wholePercentages; int? wholePercentages;
string fileName = Path.GetFileName(file); if (filePath.Name.Length < 2 || filePath.Name[1..].Contains('-'))
if (fileName.Length >= 2 && !fileName[1..].Contains('-'))
(id, wholePercentages) = GetConvertedFromSegments(facesFileNameExtension, fileName);
else
{
id = null;
wholePercentages = null; wholePercentages = null;
} else
return new(id, wholePercentages); wholePercentages = GetConvertedFromSegments(facesFileNameExtension, filePath);
return wholePercentages;
} }
internal static int GetAreaPermyriad(int faceAreaPermyriad, int bottom, int height, int left, int right, int top, int width) internal static int GetAreaPermyriad(int faceAreaPermyriad, int bottom, int height, int left, int right, int top, int width)

View File

@ -3,17 +3,24 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
internal abstract class PersonContainer internal abstract class PersonContainer
{ {
private static List<string> GetFiles(string personDisplayDirectory) private static List<FilePath> GetFilePaths(Properties.IPropertyConfiguration propertyConfiguration, string personDisplayDirectory)
{ {
List<string> results = []; List<FilePath> results = [];
string[] files; string[] files;
string extension;
string checkFile; string checkFile;
FilePath filePath;
string directoryName; string directoryName;
List<string> distinct = []; List<string> distinct = [];
Models.FileHolder fileHolder;
string fileNameWithoutExtension; string fileNameWithoutExtension;
string personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory); string personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory);
results.AddRange(Directory.GetFiles(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly)); files = Directory.GetFiles(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string file in files)
{
fileHolder = IFileHolder.Get(file);
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
results.Add(filePath);
}
string[] directories = Directory.GetDirectories(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly); string[] directories = Directory.GetDirectories(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories) foreach (string directory in directories)
{ {
@ -21,10 +28,11 @@ internal abstract class PersonContainer
files = Directory.GetFiles(directory, "*", SearchOption.TopDirectoryOnly); files = Directory.GetFiles(directory, "*", SearchOption.TopDirectoryOnly);
foreach (string file in files) foreach (string file in files)
{ {
extension = Path.GetExtension(file); fileHolder = IFileHolder.Get(file);
if (extension is not ".json" and not ".pged") filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
if (filePath.ExtensionLowered is not ".json" and not ".pged")
{ {
results.Add(file); results.Add(filePath);
continue; continue;
} }
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file); fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file);
@ -38,11 +46,13 @@ internal abstract class PersonContainer
} }
else if (fileNameWithoutExtension != directoryName) else if (fileNameWithoutExtension != directoryName)
{ {
checkFile = Path.Combine(directory, $"{fileNameWithoutExtension}{extension}"); checkFile = Path.Combine(directory, $"{fileNameWithoutExtension}{filePath.ExtensionLowered}");
if (!File.Exists(checkFile)) if (!File.Exists(checkFile))
{ {
File.Move(file, checkFile); File.Move(file, checkFile);
results.Add(checkFile); fileHolder = IFileHolder.Get(checkFile);
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
results.Add(filePath);
} }
else else
{ {
@ -53,26 +63,31 @@ internal abstract class PersonContainer
} }
continue; continue;
} }
results.Add(file); results.Add(filePath);
} }
} }
return results; return results;
} }
private static List<string> GetFiles(string facesFileNameExtension, string personDisplayDirectory) private static List<FilePath> GetFilePaths(string facesFileNameExtension, Properties.IPropertyConfiguration propertyConfiguration, string personDisplayDirectory)
{ {
List<string> results; List<FilePath> results;
int? id;
string checkFile; string checkFile;
FilePath filePath;
int? wholePercentages; int? wholePercentages;
string? checkDirectory; string? checkDirectory;
Models.FileHolder fileHolder;
string[] files = Directory.GetFiles(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly); string[] files = Directory.GetFiles(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string file in files) foreach (string file in files)
{ {
if (file.EndsWith(".lnk")) if (file.EndsWith(".lnk"))
continue; continue;
(id, wholePercentages) = IMapping.GetConverted(facesFileNameExtension, file); fileHolder = IFileHolder.Get(file);
if (id is not null && wholePercentages is not null) filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
if (filePath.Id is null )
continue;
wholePercentages = IMapping.GetWholePercentages(facesFileNameExtension, filePath);
if (wholePercentages is null)
continue; continue;
checkDirectory = Path.GetDirectoryName(file); checkDirectory = Path.GetDirectoryName(file);
if (string.IsNullOrEmpty(checkDirectory)) if (string.IsNullOrEmpty(checkDirectory))
@ -86,20 +101,22 @@ internal abstract class PersonContainer
else else
File.Move(file, checkFile); File.Move(file, checkFile);
} }
results = GetFiles(personDisplayDirectory); results = GetFilePaths(propertyConfiguration, personDisplayDirectory);
return results; return results;
} }
private static List<Models.PersonContainer> GetPersonContainersCollections(string facesFileNameExtension, PersonDirectory personDirectory, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection) private static List<Models.PersonContainer> GetPersonContainersCollections(string facesFileNameExtension, Properties.IPropertyConfiguration propertyConfiguration, PersonDirectory personDirectory, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection)
{ {
List<Models.PersonContainer> results = []; List<Models.PersonContainer> results = [];
long personKey; long personKey;
string[] files; string[] files;
FilePath filePath;
const int zero = 0; const int zero = 0;
string personKeyDirectory; string personKeyDirectory;
Models.FileHolder fileHolder;
Models.PersonContainer personContainer; Models.PersonContainer personContainer;
Models.PersonBirthday[] orderedPersonBirthdays; Models.PersonBirthday[] orderedPersonBirthdays;
List<string> personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory); List<FilePath> personDisplayDirectoryAllFilePaths = GetFilePaths(facesFileNameExtension, propertyConfiguration, personDisplayDirectory);
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();
@ -115,8 +132,15 @@ internal abstract class PersonContainer
files = Directory.GetFiles(personKeyDirectory, "*", SearchOption.AllDirectories); files = Directory.GetFiles(personKeyDirectory, "*", SearchOption.AllDirectories);
if (files.Length == 0) if (files.Length == 0)
continue; continue;
personDisplayDirectoryAllFiles.AddRange(files.Where(l => l.EndsWith(".rel"))); foreach (string file in files)
personContainer = new(approximateYears, orderedPersonBirthdays, personDisplayDirectoryAllFiles.ToArray(), personDisplayDirectoryName, personKey, personDirectory); {
if (!file.EndsWith(".rel"))
continue;
fileHolder = IFileHolder.Get(file);
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
personDisplayDirectoryAllFilePaths.Add(filePath);
}
personContainer = new(approximateYears, orderedPersonBirthdays, new(personDisplayDirectoryAllFilePaths), personDisplayDirectoryName, personKey, personDirectory);
results.Add(personContainer); results.Add(personContainer);
} }
return results; return results;
@ -153,7 +177,7 @@ internal abstract class PersonContainer
return result; return result;
} }
private static (List<string?>, List<Models.PersonContainer>) GetPersonContainersGroup(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, PersonDirectory personDirectory, string[] personDisplayDirectories) private static (List<string?>, List<Models.PersonContainer>) GetPersonContainersGroup(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Properties.IPropertyConfiguration propertyConfiguration, PersonDirectory personDirectory, string[] personDisplayDirectories)
{ {
List<Models.PersonContainer> results = []; List<Models.PersonContainer> results = [];
string? minusOne; string? minusOne;
@ -163,9 +187,9 @@ internal abstract class PersonContainer
string[] personKeyDirectories; string[] personKeyDirectories;
string? personDisplayDirectoryName; string? personDisplayDirectoryName;
Models.PersonContainer personContainer; Models.PersonContainer personContainer;
List<string> personDisplayDirectoryAllFiles;
List<Models.PersonContainer> personContainers; List<Models.PersonContainer> personContainers;
List<(string, Models.PersonBirthday)> collection; List<(string, Models.PersonBirthday)> collection;
List<FilePath> personDisplayDirectoryAllFilePaths;
foreach (string personDisplayDirectory in personDisplayDirectories) foreach (string personDisplayDirectory in personDisplayDirectories)
{ {
personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory); personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory);
@ -185,20 +209,20 @@ internal abstract class PersonContainer
continue; continue;
if (collection.Count > 0) if (collection.Count > 0)
{ {
personContainers = GetPersonContainersCollections(facesFileNameExtension, personDirectory, numberSign, personDisplayDirectory, personDisplayDirectoryName, approximateYears, collection); personContainers = GetPersonContainersCollections(facesFileNameExtension, propertyConfiguration, personDirectory, numberSign, personDisplayDirectory, personDisplayDirectoryName, approximateYears, collection);
results.AddRange(personContainers); results.AddRange(personContainers);
} }
else else
{ {
personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory); personDisplayDirectoryAllFilePaths = GetFilePaths(facesFileNameExtension, propertyConfiguration, personDisplayDirectory);
personContainer = new(approximateYears, personDisplayDirectoryAllFiles.ToArray(), personDisplayDirectoryName, personDirectory); personContainer = new(approximateYears, new(personDisplayDirectoryAllFilePaths), personDisplayDirectoryName, personDirectory);
results.Add(personContainer); results.Add(personContainer);
} }
} }
return new(changes, results); return new(changes, results);
} }
private static (List<string?>, List<Models.PersonContainer>) GetPersonContainersInnerGroups(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string groupDirectory, string groupDirectoryName) private static (List<string?>, List<Models.PersonContainer>) GetPersonContainersInnerGroups(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Properties.IPropertyConfiguration propertyConfiguration, string groupDirectory, string groupDirectoryName)
{ {
List<Models.PersonContainer> results = []; List<Models.PersonContainer> results = [];
string[] segments; string[] segments;
@ -215,7 +239,7 @@ internal abstract class PersonContainer
if (@char == exclamationPoint) if (@char == exclamationPoint)
{ {
personDirectory = new(@char, "Ignore", 'U', 'U', 'U'); personDirectory = new(@char, "Ignore", 'U', 'U', 'U');
(changes, collection) = GetPersonContainersGroup(personBirthdayFormat, facesFileNameExtension, personCharacters, personDirectory, innerGroupDirectories); (changes, collection) = GetPersonContainersGroup(personBirthdayFormat, facesFileNameExtension, personCharacters, propertyConfiguration, personDirectory, innerGroupDirectories);
allChanges.AddRange(changes); allChanges.AddRange(changes);
results.AddRange(collection); results.AddRange(collection);
} }
@ -237,7 +261,7 @@ internal abstract class PersonContainer
continue; continue;
personDirectory = new(@char, innerGroupDirectoryName, segments[zero][zero], segments[1][zero], segments[2][zero]); personDirectory = new(@char, innerGroupDirectoryName, segments[zero][zero], segments[1][zero], segments[2][zero]);
personDisplayDirectories = Directory.GetDirectories(innerGroupDirectory, "*", SearchOption.TopDirectoryOnly); personDisplayDirectories = Directory.GetDirectories(innerGroupDirectory, "*", SearchOption.TopDirectoryOnly);
(changes, collection) = GetPersonContainersGroup(personBirthdayFormat, facesFileNameExtension, personCharacters, personDirectory, personDisplayDirectories); (changes, collection) = GetPersonContainersGroup(personBirthdayFormat, facesFileNameExtension, personCharacters, propertyConfiguration, personDirectory, personDisplayDirectories);
allChanges.AddRange(changes); allChanges.AddRange(changes);
results.AddRange(collection); results.AddRange(collection);
} }
@ -245,7 +269,7 @@ internal abstract class PersonContainer
return new(allChanges, results); return new(allChanges, results);
} }
private static List<Models.PersonContainer> GetPersonContainersGroups(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string[] groupDirectories) private static List<Models.PersonContainer> GetPersonContainersGroups(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Properties.IPropertyConfiguration propertyConfiguration, string[] groupDirectories)
{ {
List<Models.PersonContainer> results; List<Models.PersonContainer> results;
List<string?> changes; List<string?> changes;
@ -260,7 +284,7 @@ internal abstract class PersonContainer
groupDirectoryName = Path.GetFileName(groupDirectory); groupDirectoryName = Path.GetFileName(groupDirectory);
if (personCharacters[i] != groupDirectoryName.First()) if (personCharacters[i] != groupDirectoryName.First())
continue; continue;
(changes, collection) = GetPersonContainersInnerGroups(personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectory, groupDirectoryName); (changes, collection) = GetPersonContainersInnerGroups(personBirthdayFormat, facesFileNameExtension, personCharacters, propertyConfiguration, groupDirectory, groupDirectoryName);
allChanges.AddRange(changes); allChanges.AddRange(changes);
personContainers.AddRange(collection); personContainers.AddRange(collection);
} }
@ -271,7 +295,7 @@ internal abstract class PersonContainer
return results; return results;
} }
internal static List<Models.PersonContainer> GetPersonContainers(string a2PeopleSingletonDirectory, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) internal static List<Models.PersonContainer> GetPersonContainers(string a2PeopleSingletonDirectory, string personBirthdayFormat, char[] personCharacters, Properties.IPropertyConfiguration propertyConfiguration, string facesFileNameExtension)
{ {
List<Models.PersonContainer> results; List<Models.PersonContainer> results;
if (!Directory.Exists(a2PeopleSingletonDirectory)) if (!Directory.Exists(a2PeopleSingletonDirectory))
@ -287,7 +311,7 @@ internal abstract class PersonContainer
if (groupDirectories.Length == 0) if (groupDirectories.Length == 0)
results = []; results = [];
else else
results = GetPersonContainersGroups(personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectories); results = GetPersonContainersGroups(personBirthdayFormat, facesFileNameExtension, personCharacters, propertyConfiguration, groupDirectories);
return results; return results;
} }

View File

@ -274,18 +274,4 @@ internal abstract class Property
return result; return result;
} }
internal static bool NameWithoutExtensionIsIdFormat(string fileNameWithoutExtension)
{
bool result;
int intMinValueLength = int.MinValue.ToString().Length;
if (fileNameWithoutExtension.Length < 5 || fileNameWithoutExtension.Length > intMinValueLength)
result = false;
else
{
bool skipOneAllAreNumbers = fileNameWithoutExtension[1..].All(l => char.IsNumber(l));
result = (skipOneAllAreNumbers && fileNameWithoutExtension[0] == '-') || (skipOneAllAreNumbers && char.IsNumber(fileNameWithoutExtension[0]));
}
return result;
}
} }

View File

@ -5,8 +5,6 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
internal abstract partial class XDirectory internal abstract partial class XDirectory
{ {
private record SortedRecord(Models.FileHolder FileHolder, bool NameWithoutExtensionIsIdFormat, int? Id);
private static int GetCeilingAverage(List<string[]> fileCollection) private static int GetCeilingAverage(List<string[]> fileCollection)
{ {
List<int> counts = []; List<int> counts = [];
@ -39,6 +37,8 @@ internal abstract partial class XDirectory
fileSearchFilter = string.Concat('*', fileSearchFilter); fileSearchFilter = string.Concat('*', fileSearchFilter);
if (!directorySearchFilter.Contains('*')) if (!directorySearchFilter.Contains('*'))
directorySearchFilter = string.Concat('*', directorySearchFilter); directorySearchFilter = string.Concat('*', directorySearchFilter);
if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory);
results.Add(Directory.GetFiles(directory, fileSearchFilter, SearchOption.TopDirectoryOnly)); results.Add(Directory.GetFiles(directory, fileSearchFilter, SearchOption.TopDirectoryOnly));
string[] directories = Directory.GetDirectories(directory, directorySearchFilter, SearchOption.TopDirectoryOnly); string[] directories = Directory.GetDirectories(directory, directorySearchFilter, SearchOption.TopDirectoryOnly);
foreach (string innerDirectory in directories) foreach (string innerDirectory in directories)
@ -185,46 +185,28 @@ internal abstract partial class XDirectory
return results; return results;
} }
private static void IsUniqueLoop(string resultAllInOne, string resultAllInOneDirectory, int resultAllInOneSubdirectoryLength, FilePair item, List<(string, string)> rename) private static void IsNotUniqueLoop(Properties.IPropertyConfiguration propertyConfiguration, string jsonGroupDirectory, string extension, FilePair filePair, List<(string, string)> rename)
{ {
string fileName; int length = propertyConfiguration.RootDirectory.Length;
string directoryName; foreach (string path in filePair.Collection)
foreach (string path in item.Collection)
{ {
if (path.Contains(resultAllInOne)) if (filePair.Match is null || path != filePair.Match)
continue; continue;
fileName = Path.GetFileName(path); rename.Add(new(path, string.Concat(jsonGroupDirectory, filePair.Path[length..], extension)));
(directoryName, _) = IPath.GetDirectoryNameAndIndex(resultAllInOneSubdirectoryLength, fileName);
rename.Add(new(path, Path.Combine(resultAllInOneDirectory, directoryName, fileName)));
} }
} }
private static void IsNotUniqueLoop(string directory, string resultAllInOne, string jsonGroupDirectory, string extension, FilePair item, List<(string, string)> rename) internal static int MaybeMove(Properties.IPropertyConfiguration propertyConfiguration, List<FilePair> filePairs, string jsonGroupDirectory, string extension)
{
int length = directory.Length;
foreach (string path in item.Collection)
{
if (!path.Contains(resultAllInOne))
continue;
if (item.Match is null || path != item.Match)
continue;
rename.Add(new(path, string.Concat(jsonGroupDirectory, item.Path[length..], extension)));
}
}
internal static int MaybeMove(string directory, string resultAllInOne, int resultAllInOneSubdirectoryLength, List<FilePair> filePairs, string jsonGroupDirectory, string extension)
{ {
FileInfo? toFileInfo; FileInfo? toFileInfo;
FileInfo fromFileInfo; FileInfo fromFileInfo;
string checkDirectory; string checkDirectory;
List<(string, string)> rename = []; List<(string, string)> rename = [];
string resultAllInOneDirectory = Path.Combine(jsonGroupDirectory, resultAllInOne); foreach (FilePair filePair in filePairs)
foreach (FilePair item in filePairs)
{ {
if (item.IsUnique) if (filePair.IsUnique)
IsUniqueLoop(resultAllInOne, resultAllInOneDirectory, resultAllInOneSubdirectoryLength, item, rename); continue;
else IsNotUniqueLoop(propertyConfiguration, jsonGroupDirectory, extension, filePair, rename);
IsNotUniqueLoop(directory, resultAllInOne, jsonGroupDirectory, extension, item, rename);
} }
foreach ((string from, string to) in rename) foreach ((string from, string to) in rename)
{ {
@ -283,153 +265,109 @@ internal abstract partial class XDirectory
} }
} }
internal static (bool, int?) GetId(short sortOrderOnlyLengthIndex, Models.FileHolder fileHolder) private static FilePath[] GetSortedRecords(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection<string[]> filesCollection)
{ {
int? id; List<FilePath> results = [];
short? multiplier; FilePath filePath;
char negativeMarker;
int absoluteValueOfId;
bool nameWithoutExtensionIsIdFormat = IProperty.NameWithoutExtensionIsIdFormat(fileHolder);
bool nameWithoutExtensionIsPaddedIdFormat = IDirectory.NameWithoutExtensionIsPaddedIdFormat(fileHolder, sortOrderOnlyLengthIndex);
if (!nameWithoutExtensionIsIdFormat && !nameWithoutExtensionIsPaddedIdFormat)
id = null;
else if (nameWithoutExtensionIsIdFormat)
{
if (!int.TryParse(fileHolder.NameWithoutExtension, out absoluteValueOfId))
id = null;
else
id = absoluteValueOfId;
}
else
{
negativeMarker = fileHolder.NameWithoutExtension[sortOrderOnlyLengthIndex - 2];
if (negativeMarker == '7')
multiplier = 1;
else if (negativeMarker == '3')
multiplier = -1;
else
multiplier = null;
if (!int.TryParse(fileHolder.NameWithoutExtension[sortOrderOnlyLengthIndex..], out absoluteValueOfId))
id = null;
else
{
id = absoluteValueOfId * multiplier;
if (id is null || !fileHolder.NameWithoutExtension.EndsWith(id.Value.ToString()[1..]))
id = null;
}
}
return (nameWithoutExtensionIsIdFormat, id);
}
private static SortedRecord[] GetSortedRecords(int offset, ReadOnlyCollection<string[]> filesCollection)
{
List<SortedRecord> results = [];
int? id;
Models.FileHolder fileHolder; Models.FileHolder fileHolder;
bool nameWithoutExtensionIsIdFormat;
short sortOrderOnlyLengthIndex = IDirectory.GetSortOrderOnlyLengthIndex(offset);
foreach (string[] files in filesCollection) foreach (string[] files in filesCollection)
{ {
foreach (string file in files) foreach (string file in files)
{ {
fileHolder = new(file); fileHolder = IFileHolder.Get(file);
(nameWithoutExtensionIsIdFormat, id) = GetId(sortOrderOnlyLengthIndex, fileHolder); filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
results.Add(new(fileHolder, nameWithoutExtensionIsIdFormat, id)); results.Add(filePath);
} }
} }
return (from l in results orderby l.FileHolder.CreationTime, l.FileHolder.FullName.Length descending select l).ToArray(); return (from l in results orderby l.CreationTicks, l.FullName.Length descending select l).ToArray();
} }
internal static (string[], List<(Models.FileHolder, string?, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, ReadOnlyCollection<string[]> filesCollection, string[] directories, Action? tick) internal static (string[], List<(FilePath, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, ReadOnlyCollection<string[]> filesCollection, string[] directories, Action? tick)
{ {
List<(Models.FileHolder, string?, string)> results = []; List<(FilePath, string)> results = [];
string paddedId; string paddedId;
string checkFile; string checkFile;
string directory; string directory;
FileInfo fileInfo; FileInfo fileInfo;
FilePath filePath;
int directoryIndex; int directoryIndex;
bool ignore = false;
string paddedIdFile; string paddedIdFile;
bool wrapped = false; bool wrapped = false;
string directoryName; string intelligentId;
bool paddedCheck = false; bool paddedCheck = false;
string fileDirectoryName; string fileDirectoryName;
SortedRecord sortedRecord;
string? alternateCheckFile;
string? alternateDirectory;
Models.FileHolder fileHolder;
List<int> distinctIds = []; List<int> distinctIds = [];
List<string> distinct = []; List<string> distinct = [];
Models.FileHolder fileHolder;
List<string> distinctDirectories = []; List<string> distinctDirectories = [];
int intMinValueLength = int.MinValue.ToString().Length; FilePath[] sortedRecords = GetSortedRecords(propertyConfiguration, filesCollection);
SortedRecord[] sortedRecords = GetSortedRecords(propertyConfiguration.Offset, filesCollection);
string? alternateResultAllInOne = !propertyConfiguration.ResultAllInOne.Contains(' ') ? null : propertyConfiguration.ResultAllInOne.Replace(' ', '-');
for (int i = 0; i < sortedRecords.Length; i++) for (int i = 0; i < sortedRecords.Length; i++)
{ {
tick?.Invoke(); tick?.Invoke();
sortedRecord = sortedRecords[i]; filePath = sortedRecords[i];
fileHolder = sortedRecord.FileHolder; if (filePath.Name.EndsWith("len") || filePath.ExtensionLowered == ".id" || filePath.ExtensionLowered == ".lsv" || filePath.DirectoryName is null)
if (fileHolder.Name.EndsWith("len") || fileHolder.ExtensionLowered == ".id" || fileHolder.ExtensionLowered == ".lsv" || fileHolder.DirectoryName is null)
continue; continue;
(directoryName, directoryIndex) = IPath.GetDirectoryNameAndIndex(propertyConfiguration.ResultAllInOneSubdirectoryLength, fileHolder.NameWithoutExtension); (_, directoryIndex) = IPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath);
fileDirectoryName = Path.GetFileName(fileHolder.DirectoryName); fileDirectoryName = Path.GetFileName(filePath.DirectoryName);
if (fileDirectoryName.Length < propertyConfiguration.ResultAllInOneSubdirectoryLength + 3 || !fileHolder.Name.StartsWith(fileDirectoryName)) if (fileDirectoryName.Length < propertyConfiguration.ResultAllInOneSubdirectoryLength + 3 || !filePath.Name.StartsWith(fileDirectoryName))
{ {
if (wrapped) if (wrapped)
continue; continue;
directory = directories[directoryIndex]; directory = directories[directoryIndex];
if (alternateResultAllInOne is null)
alternateDirectory = null;
else
alternateDirectory = Path.Combine(Path.GetDirectoryName(Path.GetDirectoryName(directory)) ?? directory, alternateResultAllInOne, directoryName);
} }
else else
{ {
if (!wrapped) if (!wrapped)
wrapped = true; wrapped = true;
alternateDirectory = null;
directory = Path.Combine(directories[directoryIndex], fileDirectoryName); directory = Path.Combine(directories[directoryIndex], fileDirectoryName);
} }
if (ifCanUseId && sortedRecord.NameWithoutExtensionIsIdFormat && sortedRecord.Id is not null && fileHolder.DirectoryName is not null) if (ifCanUseId && filePath.IsIntelligentIdFormat && filePath.Id is not null && filePath.DirectoryName is not null)
{ {
paddedId = IDirectory.GetPaddedId(intMinValueLength, propertyConfiguration.Offset + i, sortedRecord.Id.Value); paddedId = IId.GetPaddedId(propertyConfiguration, i, filePath.Id.Value);
paddedIdFile = Path.Combine(fileHolder.DirectoryName, $"{paddedId}{fileHolder.ExtensionLowered}"); paddedIdFile = Path.Combine(filePath.DirectoryName, $"{paddedId}{filePath.ExtensionLowered}");
if (!File.Exists(paddedIdFile)) if (!File.Exists(paddedIdFile))
{ {
File.Move(fileHolder.FullName, paddedIdFile); File.Move(filePath.FullName, paddedIdFile);
fileHolder = new(paddedIdFile); fileInfo = new(paddedIdFile);
fileHolder = Models.FileHolder.Get(fileInfo);
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
if (!paddedCheck) if (!paddedCheck)
paddedCheck = true; paddedCheck = true;
} }
} }
if (ifCanUseId) if (filePath.IsIntelligentIdFormat || !ifCanUseId)
checkFile = Path.Combine(directory, $"{sortedRecord.Id}{fileHolder.ExtensionLowered}"); checkFile = Path.Combine(directory, $"{filePath.NameWithoutExtension}{filePath.ExtensionLowered}");
else else
checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}{fileHolder.ExtensionLowered}");
if ((sortedRecord.Id is not null && distinctIds.Contains(sortedRecord.Id.Value)) || distinct.Contains(checkFile))
{ {
if (string.IsNullOrEmpty(fileHolder.DirectoryName)) if (filePath.Id is null)
throw new NullReferenceException(nameof(filePath.Id));
intelligentId = IId.GetIntelligentId(propertyConfiguration, filePath.Id.Value, ignore);
checkFile = Path.Combine(directory, $"{intelligentId}{filePath.ExtensionLowered}");
}
if ((filePath.Id is not null && distinctIds.Contains(filePath.Id.Value)) || distinct.Contains(checkFile))
{
if (string.IsNullOrEmpty(filePath.DirectoryName))
continue; continue;
if (!copyDuplicates) if (!copyDuplicates)
continue; continue;
alternateDirectory = null;
for (int j = 1; j < int.MaxValue; j++) for (int j = 1; j < int.MaxValue; j++)
{ {
fileInfo = new(checkFile); fileInfo = new(checkFile);
if (!fileInfo.Exists || fileHolder.Length == fileInfo.Length && fileHolder.LastWriteTime == fileInfo.LastWriteTime) if (!fileInfo.Exists || filePath.Length == fileInfo.Length && filePath.LastWriteTicks == fileInfo.LastWriteTime.Ticks)
checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}.{j}dup{fileHolder.ExtensionLowered}"); checkFile = Path.Combine(directory, $"{filePath.NameWithoutExtension}.{j}dup{filePath.ExtensionLowered}");
else else
checkFile = Path.Combine(directory, $"{fileHolder.NameWithoutExtension}.{j}why{fileHolder.ExtensionLowered}"); checkFile = Path.Combine(directory, $"{filePath.NameWithoutExtension}.{j}why{filePath.ExtensionLowered}");
if (sortedRecord.Id is not null) if (filePath.Id is not null)
{ {
if (distinctIds.Contains(sortedRecord.Id.Value)) if (distinctIds.Contains(filePath.Id.Value))
continue; continue;
distinctIds.Add(sortedRecord.Id.Value); distinctIds.Add(filePath.Id.Value);
} }
if (distinct.Contains(checkFile)) if (distinct.Contains(checkFile))
continue; continue;
alternateCheckFile = null;
distinct.Add(checkFile); distinct.Add(checkFile);
results.Add(new(fileHolder, alternateCheckFile, checkFile)); results.Add(new(filePath, checkFile));
if (!distinctDirectories.Contains(directory)) if (!distinctDirectories.Contains(directory))
distinctDirectories.Add(directory); distinctDirectories.Add(directory);
break; break;
@ -437,17 +375,9 @@ internal abstract partial class XDirectory
continue; continue;
} }
distinct.Add(checkFile); distinct.Add(checkFile);
if (sortedRecord.Id is not null) if (filePath.Id is not null)
distinctIds.Add(sortedRecord.Id.Value); distinctIds.Add(filePath.Id.Value);
if (string.IsNullOrEmpty(alternateDirectory)) results.Add(new(filePath, checkFile));
alternateCheckFile = null;
else
{
alternateCheckFile = Path.Combine(alternateDirectory, $"{sortedRecord.Id}{fileHolder.ExtensionLowered}.tsv");
if (!distinctDirectories.Contains(alternateDirectory))
distinctDirectories.Add(alternateDirectory);
}
results.Add(new(fileHolder, alternateCheckFile, checkFile));
if (!distinctDirectories.Contains(directory)) if (!distinctDirectories.Contains(directory))
distinctDirectories.Add(directory); distinctDirectories.Add(directory);
} }
@ -456,30 +386,28 @@ internal abstract partial class XDirectory
return (distinctDirectories.ToArray(), results); return (distinctDirectories.ToArray(), results);
} }
internal static List<string> CopyOrMove(List<(Models.FileHolder, string?, string)> toDoCollection, bool move, bool moveBack, Action? tick) internal static List<string> CopyOrMove(List<(FilePath, string)> toDoCollection, bool move, bool moveBack, Action? tick)
{ {
List<string> results = []; List<string> results = [];
FileInfo fileInfo; FileInfo fileInfo;
foreach ((Models.FileHolder fileHolder, string? alternateFile, string to) in toDoCollection) foreach ((FilePath filePath, string to) in toDoCollection)
{ {
tick?.Invoke(); tick?.Invoke();
fileInfo = new(to); fileInfo = new(to);
if (!fileInfo.Exists && alternateFile is not null)
_ = XPath.WriteAllText(alternateFile, fileHolder.FullName, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
if (fileInfo.Exists) if (fileInfo.Exists)
{ {
if (fileHolder.Length != fileInfo.Length || fileHolder.LastWriteTime != fileInfo.LastWriteTime) if (filePath.Length != fileInfo.Length || filePath.LastWriteTicks != fileInfo.LastWriteTime.Ticks)
fileInfo.Delete(); fileInfo.Delete();
else else
continue; continue;
} }
results.Add(fileHolder.NameWithoutExtension); results.Add(filePath.NameWithoutExtension);
try try
{ {
if (move || moveBack) if (move || moveBack)
File.Move(fileHolder.FullName, to); File.Move(filePath.FullName, to);
else else
File.Copy(fileHolder.FullName, to); File.Copy(filePath.FullName, to);
} }
catch (Exception) { } catch (Exception) { }
} }

View File

@ -1,3 +1,4 @@
using System.Collections.ObjectModel;
using View_by_Distance.Shared.Models.Properties; using View_by_Distance.Shared.Models.Properties;
namespace View_by_Distance.Shared.Models.Stateless.Methods; namespace View_by_Distance.Shared.Models.Stateless.Methods;
@ -283,24 +284,35 @@ internal abstract class XPath
return (result, converted); return (result, converted);
} }
internal static Dictionary<string, string[]> GetKeyValuePairs(IPropertyConfiguration propertyConfiguration, string? resultsFullGroupDirectory, string[]? directories) internal static (string, int) GetDirectoryNameAndIndex(IPropertyConfiguration propertyConfiguration, FilePath filePath)
{
int converted;
string result;
if (filePath.Id is not null)
(result, converted) = GetDirectoryNameAndIndex(propertyConfiguration.ResultAllInOneSubdirectoryLength, filePath.Id.Value.ToString());
else
(result, converted) = GetDirectoryNameAndIndex(propertyConfiguration.ResultAllInOneSubdirectoryLength, filePath.FileNameFirstSegment);
return (result, converted);
}
internal static ReadOnlyDictionary<string, string[]> GetKeyValuePairs(IPropertyConfiguration propertyConfiguration, string? resultsFullGroupDirectory, string[]? jsonGroups)
{ {
Dictionary<string, string[]> results = []; Dictionary<string, string[]> results = [];
int converted = int.Parse($"1{new string('0', propertyConfiguration.ResultAllInOneSubdirectoryLength)}");
string directory; string directory;
string checkDirectory; string checkDirectory;
int converted = int.Parse($"1{new string('0', propertyConfiguration.ResultAllInOneSubdirectoryLength)}");
int plusOne = converted + 1; int plusOne = converted + 1;
List<string> collection = []; List<string> collection = [];
if (directories is not null) if (jsonGroups is not null)
{ {
foreach (string key in directories) foreach (string jsonGroup in jsonGroups)
{ {
if (resultsFullGroupDirectory is null) if (resultsFullGroupDirectory is null)
continue; continue;
collection.Clear(); collection.Clear();
for (int i = 0; i < plusOne; i++) for (int i = 0; i < plusOne; i++)
{ {
if (string.IsNullOrEmpty(key)) if (string.IsNullOrEmpty(jsonGroup))
{ {
if (i == converted) if (i == converted)
checkDirectory = Path.GetFullPath(Path.Combine(resultsFullGroupDirectory, new('-', propertyConfiguration.ResultAllInOneSubdirectoryLength))); checkDirectory = Path.GetFullPath(Path.Combine(resultsFullGroupDirectory, new('-', propertyConfiguration.ResultAllInOneSubdirectoryLength)));
@ -309,7 +321,7 @@ internal abstract class XPath
} }
else else
{ {
directory = Path.Combine(resultsFullGroupDirectory, key, propertyConfiguration.ResultAllInOne); directory = Path.Combine(resultsFullGroupDirectory, jsonGroup);
if (i == converted) if (i == converted)
checkDirectory = Path.GetFullPath(Path.Combine(directory, new('-', propertyConfiguration.ResultAllInOneSubdirectoryLength))); checkDirectory = Path.GetFullPath(Path.Combine(directory, new('-', propertyConfiguration.ResultAllInOneSubdirectoryLength)));
else else
@ -319,13 +331,13 @@ internal abstract class XPath
_ = Directory.CreateDirectory(checkDirectory); _ = Directory.CreateDirectory(checkDirectory);
collection.Add(checkDirectory); collection.Add(checkDirectory);
} }
if (!string.IsNullOrEmpty(key)) if (!string.IsNullOrEmpty(jsonGroup))
results.Add(key, collection.ToArray()); results.Add(jsonGroup, collection.ToArray());
else else
results.Add(propertyConfiguration.ResultAllInOne, collection.ToArray()); results.Add(propertyConfiguration.ResultAllInOne, collection.ToArray());
} }
} }
return results; return new(results);
} }
} }

View File

@ -86,7 +86,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodGetApproximateYears() public void TestMethodGetApproximateYears()
{ {
string personDisplayDirectory = "D:/1-Images-A/Images-dd514b88-Results/A2)People/dd514b88/{}/^/Sydney Dupray^9"; string personDisplayDirectory = "D:/1-Images-A/Images-4083e56a-Results/A2)People/4083e56a/{}/^/Sydney Dupray^9";
if (Directory.Exists(Directory.GetDirectoryRoot(personDisplayDirectory)) && Directory.Exists(personDisplayDirectory)) if (Directory.Exists(Directory.GetDirectoryRoot(personDisplayDirectory)) && Directory.Exists(personDisplayDirectory))
{ {
char numberSign = '#'; char numberSign = '#';
@ -189,7 +189,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodRenameAbandoned() public void TestMethodRenameAbandoned()
{ {
string directory = "D:/1-Images-A/Images-dd514b88-Results/A2)People/dd514b88/{}/!/Abandoned"; string directory = "D:/1-Images-A/Images-4083e56a-Results/A2)People/4083e56a/{}/!/Abandoned";
if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
string checkFile; string checkFile;
@ -209,7 +209,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodRenameDelete() public void TestMethodRenameDelete()
{ {
string directory = "D:/1-Images-A/Images-dd514b88-Results/A)Property/dd514b88/{}"; string directory = "D:/1-Images-A/Images-4083e56a-Results/A)Property/4083e56a/{}";
if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
string checkFile; string checkFile;
@ -229,7 +229,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodRenameOld() public void TestMethodRenameOld()
{ {
string directory = "D:/1-Images-A/Images-dd514b88-Results/E)Distance/dd514b88/()"; string directory = "D:/1-Images-A/Images-4083e56a-Results/E)Distance/4083e56a/()";
if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
string checkFile; string checkFile;
@ -250,7 +250,7 @@ public partial class UnitTestHardCoded
public void TestMethodRenameDup() public void TestMethodRenameDup()
{ {
string directory; string directory;
directory = "D:/1-Images-A/Images-dd514b88-Results/E)Distance/dd514b88/()"; directory = "D:/1-Images-A/Images-4083e56a-Results/E)Distance/4083e56a/()";
if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
string checkFile; string checkFile;
@ -264,7 +264,7 @@ public partial class UnitTestHardCoded
} }
Assert.IsTrue(true); Assert.IsTrue(true);
} }
directory = "D:/1-Images-A/Images-dd514b88-Results/A2)People/dd514b88/{}/!"; directory = "D:/1-Images-A/Images-4083e56a-Results/A2)People/4083e56a/{}/!";
if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
string checkFile; string checkFile;
@ -284,9 +284,9 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodRename() public void TestMethodRename()
{ {
// string directory = "D:/2-Images-B/Not-Copy-Copy-dd514b88"; // string directory = "D:/2-Images-B/Not-Copy-Copy-4083e56a";
string directory = "D:/1-Images-A/Images-dd514b88"; string directory = "D:/1-Images-A/Images-4083e56a";
// string directory = "D:/2-Images-B/Not-Copy-Copy-dd514b88"; // string directory = "D:/2-Images-B/Not-Copy-Copy-4083e56a";
if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
string[] directories = Directory.GetDirectories(directory, "*;*", SearchOption.AllDirectories); string[] directories = Directory.GetDirectories(directory, "*;*", SearchOption.AllDirectories);
@ -303,7 +303,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodRenameForUnkown() public void TestMethodRenameForUnkown()
{ {
string directory = "D:/1-Images-A/Images-dd514b88-Results/E)Distance/dd514b88/(RectInt-2023-06-19-less-0.99)"; string directory = "D:/1-Images-A/Images-4083e56a-Results/E)Distance/4083e56a/(RectInt-2023-06-19-less-0.99)";
if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
string[] files = Directory.GetFiles(directory, "*.unk", SearchOption.AllDirectories); string[] files = Directory.GetFiles(directory, "*.unk", SearchOption.AllDirectories);
@ -316,7 +316,7 @@ public partial class UnitTestHardCoded
[TestMethod] [TestMethod]
public void TestMethodRenameForTicks() public void TestMethodRenameForTicks()
{ {
string directory = "D:/1-Images-A/Images-dd514b88-Results/A2)People/dd514b88/([])/ged"; string directory = "D:/1-Images-A/Images-4083e56a-Results/A2)People/4083e56a/([])/ged";
if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory)) if (Directory.Exists(Path.GetPathRoot(directory)) && Directory.Exists(directory))
{ {
string checkName; string checkName;

View File

@ -154,11 +154,11 @@ public class UnitTestResize
_ = resize.ToString(); _ = resize.ToString();
bool isUniqueFileName = false; bool isUniqueFileName = false;
bool? isNotUniqueAndNeedsReview = null; bool? isNotUniqueAndNeedsReview = null;
FileHolder sourceDirectoryFileHolder = new(".json"); FileHolder sourceDirectoryFileHolder = IFileHolder.Get(".json");
string sourceDirectory = Path.GetFullPath(Path.Combine(_PropertyConfiguration.RootDirectory, sourceDirectoryName)); string sourceDirectory = Path.GetFullPath(Path.Combine(_PropertyConfiguration.RootDirectory, sourceDirectoryName));
FileHolder fileHolder = new(Path.Combine(sourceDirectory, sourceFileName)); FileHolder fileHolder = IFileHolder.Get(Path.Combine(sourceDirectory, sourceFileName));
(_, int? id) = IDirectory.GetId(_PropertyConfiguration.Offset, fileHolder); FilePath filePath = FilePath.Get(_PropertyConfiguration, fileHolder, index: null);
Assert.IsNotNull(id); Assert.IsNotNull(filePath.Id);
string relativePath = IPath.GetRelativePath(fileHolder.FullName, length); string relativePath = IPath.GetRelativePath(fileHolder.FullName, length);
string propertyLogicSourceDirectory = Path.GetFullPath(Path.Combine(aPropertySingletonDirectory, sourceDirectoryName)); string propertyLogicSourceDirectory = Path.GetFullPath(Path.Combine(aPropertySingletonDirectory, sourceDirectoryName));
propertyLogic.SetAngleBracketCollection(aResultsFullGroupDirectory, propertyLogicSourceDirectory); propertyLogic.SetAngleBracketCollection(aResultsFullGroupDirectory, propertyLogicSourceDirectory);
@ -166,7 +166,7 @@ public class UnitTestResize
resize.SetAngleBracketCollection(cResultsFullGroupDirectory, sourceDirectory); resize.SetAngleBracketCollection(cResultsFullGroupDirectory, sourceDirectory);
resize.Update(cResultsFullGroupDirectory); resize.Update(cResultsFullGroupDirectory);
blurHasher.Update(cResultsFullGroupDirectory); blurHasher.Update(cResultsFullGroupDirectory);
item = new(sourceDirectoryFileHolder, relativePath, fileHolder, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, property, false, false, false); item = new(filePath, sourceDirectoryFileHolder, relativePath, fileHolder, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, property, false, false, false);
Assert.IsNotNull(item.ImageFileHolder); Assert.IsNotNull(item.ImageFileHolder);
if (item.Property is null) if (item.Property is null)
{ {
@ -175,15 +175,15 @@ public class UnitTestResize
} }
if (property is null || item.Property is null) if (property is null || item.Property is null)
throw new NullReferenceException(nameof(property)); throw new NullReferenceException(nameof(property));
resizedFileHolder = resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber, id.Value); resizedFileHolder = resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber, filePath.Id.Value);
item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder); item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder);
MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item); MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item);
Dictionary<string, int[]> outputResolutionToResize = resize.GetResizeKeyValuePairs(_PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, item.Property, mappingFromItem); Dictionary<string, int[]> outputResolutionToResize = resize.GetResizeKeyValuePairs(_PropertyConfiguration, cResultsFullGroupDirectory, item.FilePath, subFileTuples, parseExceptions, item.Property, mappingFromItem);
Assert.IsNotNull(mappingFromItem.ResizedFileHolder); Assert.IsNotNull(mappingFromItem.ResizedFileHolder);
resize.SaveResizedSubfile(_PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize); resize.SaveResizedSubfile(_PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize);
string blurHash = blurHasher.Encode(resizedFileHolder); string blurHash = blurHasher.Encode(resizedFileHolder);
Assert.IsNotNull(blurHash); Assert.IsNotNull(blurHash);
ReadOnlyDictionary<string, MetadataExtractorDirectory> metadataExtractorDirectories = metadata.GetMetadataCollection(subFileTuples, parseExceptions, changesFrom, mappingFromItem); ReadOnlyDictionary<string, MetadataExtractorDirectory> metadataExtractorDirectories = metadata.GetMetadataCollection(item.FilePath, subFileTuples, parseExceptions, changesFrom, mappingFromItem);
string json = JsonSerializer.Serialize(metadataExtractorDirectories, ReadOnlyDictionaryStringMetadataExtractorDirectorySourceGenerationContext.Default.ReadOnlyDictionaryStringMetadataExtractorDirectory); string json = JsonSerializer.Serialize(metadataExtractorDirectories, ReadOnlyDictionaryStringMetadataExtractorDirectorySourceGenerationContext.Default.ReadOnlyDictionaryStringMetadataExtractorDirectory);
File.WriteAllText("../../../.json", json); File.WriteAllText("../../../.json", json);
MetadataExtractor.GeoLocation? geoLocation = Metadata.Models.Stateless.Methods.IMetadata.GeoLocation(metadataExtractorDirectories); MetadataExtractor.GeoLocation? geoLocation = Metadata.Models.Stateless.Methods.IMetadata.GeoLocation(metadataExtractorDirectories);

View File

@ -227,11 +227,11 @@ public class UnitTestFace
_ = resize.ToString(); _ = resize.ToString();
bool isUniqueFileName = false; bool isUniqueFileName = false;
bool? isNotUniqueAndNeedsReview = null; bool? isNotUniqueAndNeedsReview = null;
FileHolder sourceDirectoryFileHolder = new(".json"); FileHolder sourceDirectoryFileHolder = IFileHolder.Get(".json");
string sourceDirectory = Path.GetFullPath(Path.Combine(_PropertyConfiguration.RootDirectory, sourceDirectoryName)); string sourceDirectory = Path.GetFullPath(Path.Combine(_PropertyConfiguration.RootDirectory, sourceDirectoryName));
FileHolder fileHolder = new(Path.Combine(sourceDirectory, sourceFileName)); FileHolder fileHolder = IFileHolder.Get(Path.Combine(sourceDirectory, sourceFileName));
(_, int? id) = IDirectory.GetId(_PropertyConfiguration.Offset, fileHolder); FilePath filePath = FilePath.Get(_PropertyConfiguration, fileHolder, index: null);
Assert.IsNotNull(id); Assert.IsNotNull(filePath.Id);
string relativePath = IPath.GetRelativePath(fileHolder.FullName, length); string relativePath = IPath.GetRelativePath(fileHolder.FullName, length);
string propertyLogicSourceDirectory = Path.GetFullPath(Path.Combine(aPropertySingletonDirectory, sourceDirectoryName)); string propertyLogicSourceDirectory = Path.GetFullPath(Path.Combine(aPropertySingletonDirectory, sourceDirectoryName));
propertyLogic.SetAngleBracketCollection(aResultsFullGroupDirectory, propertyLogicSourceDirectory); propertyLogic.SetAngleBracketCollection(aResultsFullGroupDirectory, propertyLogicSourceDirectory);
@ -239,7 +239,7 @@ public class UnitTestFace
resize.SetAngleBracketCollection(cResultsFullGroupDirectory, sourceDirectory); resize.SetAngleBracketCollection(cResultsFullGroupDirectory, sourceDirectory);
resize.Update(cResultsFullGroupDirectory); resize.Update(cResultsFullGroupDirectory);
blurHasher.Update(cResultsFullGroupDirectory); blurHasher.Update(cResultsFullGroupDirectory);
item = new(sourceDirectoryFileHolder, relativePath, fileHolder, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, property, false, false, false); item = new(filePath, sourceDirectoryFileHolder, relativePath, fileHolder, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, property, false, false, false);
Assert.IsNotNull(item.ImageFileHolder); Assert.IsNotNull(item.ImageFileHolder);
if (item.Property is null) if (item.Property is null)
{ {
@ -248,16 +248,16 @@ public class UnitTestFace
} }
if (property is null || item.Property is null) if (property is null || item.Property is null)
throw new NullReferenceException(nameof(property)); throw new NullReferenceException(nameof(property));
resizedFileHolder = resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber, id.Value); resizedFileHolder = resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber, filePath.Id.Value);
item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder); item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder);
MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item); MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item);
IReadOnlyList<MetadataExtractor.Directory> directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(resizedFileHolder.FullName); IReadOnlyList<MetadataExtractor.Directory> directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(resizedFileHolder.FullName);
Dictionary<string, int[]> outputResolutionToResize = resize.GetResizeKeyValuePairs(_PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, item.Property, mappingFromItem); Dictionary<string, int[]> outputResolutionToResize = resize.GetResizeKeyValuePairs(_PropertyConfiguration, cResultsFullGroupDirectory, item.FilePath, subFileTuples, parseExceptions, item.Property, mappingFromItem);
Assert.IsNotNull(mappingFromItem.ResizedFileHolder); Assert.IsNotNull(mappingFromItem.ResizedFileHolder);
resize.SaveResizedSubfile(_PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize); resize.SaveResizedSubfile(_PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize);
string blurHash = blurHasher.Encode(resizedFileHolder); string blurHash = blurHasher.Encode(resizedFileHolder);
Assert.IsNotNull(blurHash); Assert.IsNotNull(blurHash);
ReadOnlyDictionary<string, MetadataExtractorDirectory>? metadataExtractorDirectories = metadata.GetMetadataCollection(subFileTuples, parseExceptions, changesFrom, mappingFromItem); ReadOnlyDictionary<string, MetadataExtractorDirectory>? metadataExtractorDirectories = metadata.GetMetadataCollection(item.FilePath, subFileTuples, parseExceptions, changesFrom, mappingFromItem);
string json = JsonSerializer.Serialize(metadataExtractorDirectories, ReadOnlyDictionaryStringMetadataExtractorDirectorySourceGenerationContext.Default.ReadOnlyDictionaryStringMetadataExtractorDirectory); string json = JsonSerializer.Serialize(metadataExtractorDirectories, ReadOnlyDictionaryStringMetadataExtractorDirectorySourceGenerationContext.Default.ReadOnlyDictionaryStringMetadataExtractorDirectory);
File.WriteAllText("../../../.json", json); File.WriteAllText("../../../.json", json);
Image image = FaceRecognition.LoadImageFile(mappingFromItem.ResizedFileHolder.FullName); Image image = FaceRecognition.LoadImageFile(mappingFromItem.ResizedFileHolder.FullName);