Keyword to work with Amazon

This commit is contained in:
2024-02-04 09:38:40 -07:00
parent 4081a73b9d
commit 1200780eee
38 changed files with 325 additions and 287 deletions

View File

@ -85,10 +85,12 @@ csharp_using_directive_placement = outside_namespace
dotnet_code_quality_unused_parameters = all dotnet_code_quality_unused_parameters = all
dotnet_code_quality_unused_parameters = non_public # IDE0060: Remove unused parameter dotnet_code_quality_unused_parameters = non_public # IDE0060: Remove unused parameter
dotnet_code_quality.CAXXXX.api_surface = private, internal dotnet_code_quality.CAXXXX.api_surface = private, internal
dotnet_diagnostic.CA1511.severity = warning # CA1511: Use 'ArgumentException.ThrowIfNullOrEmpty' instead of explicitly throwing a new exception instance
dotnet_diagnostic.CA1825.severity = warning # CA1823: Avoid zero-length array allocations dotnet_diagnostic.CA1825.severity = warning # CA1823: Avoid zero-length array allocations
dotnet_diagnostic.CA1829.severity = warning # CA1829: Use Length/Count property instead of Count() when available dotnet_diagnostic.CA1829.severity = warning # CA1829: Use Length/Count property instead of Count() when available
dotnet_diagnostic.CA1834.severity = warning # CA1834: Consider using 'StringBuilder.Append(char)' when applicable dotnet_diagnostic.CA1834.severity = warning # CA1834: Consider using 'StringBuilder.Append(char)' when applicable
dotnet_diagnostic.CA1860.severity = warning # CA1860: Prefer comparing 'Count' to 0 rather than using 'Any()', both for clarity and for performance dotnet_diagnostic.CA1860.severity = warning # CA1860: Prefer comparing 'Count' to 0 rather than using 'Any()', both for clarity and for performance
dotnet_diagnostic.CA1862.severity = warning # CA1862: Prefer using 'string.Equals(string, StringComparison)' to perform a case-insensitive comparison, but keep in mind that this might cause subtle changes in behavior, so make sure to conduct thorough testing after applying the suggestion, or if culturally sensitive comparison is not required, consider using 'StringComparison.OrdinalIgnoreCase'
dotnet_diagnostic.CA1869.severity = none # CA1869: Avoid creating a new 'JsonSerializerOptions' instance for every serialization operation. Cache and reuse instances instead. dotnet_diagnostic.CA1869.severity = none # CA1869: Avoid creating a new 'JsonSerializerOptions' instance for every serialization operation. Cache and reuse instances instead.
dotnet_diagnostic.CA2254.severity = none # CA2254: The logging message template should not vary between calls to 'LoggerExtensions.LogInformation(ILogger, string?, params object?[])' dotnet_diagnostic.CA2254.severity = none # CA2254: The logging message template should not vary between calls to 'LoggerExtensions.LogInformation(ILogger, string?, params object?[])'
dotnet_diagnostic.IDE0001.severity = warning # IDE0001: Simplify name dotnet_diagnostic.IDE0001.severity = warning # IDE0001: Simplify name
@ -99,7 +101,9 @@ dotnet_diagnostic.IDE0028.severity = warning # IDE0028: Collection initializatio
dotnet_diagnostic.IDE0031.severity = warning # Use null propagation (IDE0031) dotnet_diagnostic.IDE0031.severity = warning # Use null propagation (IDE0031)
dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed
dotnet_diagnostic.IDE0049.severity = warning # Use language keywords instead of framework type names for type references (IDE0049) dotnet_diagnostic.IDE0049.severity = warning # Use language keywords instead of framework type names for type references (IDE0049)
dotnet_diagnostic.IDE0058.severity = warning # IDE0058: Expression value is never used
dotnet_diagnostic.IDE0060.severity = warning # IDE0060: Remove unused parameter dotnet_diagnostic.IDE0060.severity = warning # IDE0060: Remove unused parameter
dotnet_diagnostic.IDE0074.severity = warning # IDE0074: Use compound assignment
dotnet_diagnostic.IDE0200.severity = warning # IDE0200: Lambda expression can be removed [Map] dotnet_diagnostic.IDE0200.severity = warning # IDE0200: Lambda expression can be removed [Map]
dotnet_diagnostic.IDE0290.severity = none # Use primary constructor [Distance]csharp(IDE0290) dotnet_diagnostic.IDE0290.severity = none # Use primary constructor [Distance]csharp(IDE0290)
dotnet_diagnostic.IDE0300.severity = warning # IDE0300: Collection initialization can be simplified dotnet_diagnostic.IDE0300.severity = warning # IDE0300: Collection initialization can be simplified

View File

@ -193,15 +193,11 @@ public class DateGroup
if (item.Property is not null) if (item.Property is not null)
dateTimes = item.Property.GetDateTimes(); dateTimes = item.Property.GetDateTimes();
else else
{ dateTimes = [new(item.FilePath.LastWriteTicks)];
if (item.ImageFileHolder.LastWriteTime is null)
throw new Exception();
dateTimes = [item.ImageFileHolder.LastWriteTime.Value];
}
if (item.Property is not null && item.Property.DateTimeOriginal is not null) if (item.Property is not null && item.Property.DateTimeOriginal is not null)
dateTime = item.Property.DateTimeOriginal.Value; dateTime = item.Property.DateTimeOriginal.Value;
else if (item.ImageFileHolder.LastWriteTime is not null && item.Property is null) else if (item.Property is null)
dateTime = item.ImageFileHolder.LastWriteTime.Value; dateTime = new(item.FilePath.LastWriteTicks);
else else
dateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property); dateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property);
day = dateTime.ToString("MM-dd"); day = dateTime.ToString("MM-dd");
@ -213,7 +209,7 @@ public class DateGroup
} }
else else
{ {
(isWrongYear, _) = Shared.Models.Stateless.Methods.IProperty.IsWrongYear(item.ImageFileHolder, item.Property.DateTimeOriginal, dateTimes); (isWrongYear, _) = Shared.Models.Stateless.Methods.IProperty.IsWrongYear(item.FilePath, item.Property.DateTimeOriginal, dateTimes);
if (isWrongYear is null) if (isWrongYear is null)
flag = '#'; flag = '#';
else if (isWrongYear.Value) else if (isWrongYear.Value)
@ -283,18 +279,16 @@ public class DateGroup
} }
} }
if (!_Configuration.ByHash || item.Property?.Id is null) if (!_Configuration.ByHash || item.Property?.Id is null)
fileName = item.ImageFileHolder.Name; fileName = item.FilePath.Name;
else else
fileName = $"{item.Property.Id.Value}{item.ImageFileHolder.ExtensionLowered}"; fileName = $"{item.Property.Id.Value}{item.FilePath.ExtensionLowered}";
destinationCollection.Add(destinationDirectory); destinationCollection.Add(destinationDirectory);
destinationCollection.AddRange(directoryNames); destinationCollection.AddRange(directoryNames);
destinationCollection.Add(fileName); destinationCollection.Add(fileName);
if (item.ImageFileHolder.LastWriteTime is null) if (item.Property is null)
continue; results.Add(new(item, item.FilePath.LastWriteTicks, dateTime.Ticks, destinationCollection.ToArray()));
if (item.Property is not null)
results.Add(new(item, item.Property.LastWriteTime.Ticks, dateTime.Ticks, destinationCollection.ToArray()));
else else
results.Add(new(item, item.ImageFileHolder.LastWriteTime.Value.Ticks, dateTime.Ticks, destinationCollection.ToArray())); results.Add(new(item, item.Property.LastWriteTime.Ticks, dateTime.Ticks, destinationCollection.ToArray()));
} }
return results; return results;
} }
@ -313,7 +307,7 @@ public class DateGroup
List<Item> results = []; List<Item> results = [];
foreach (Item item in container.Items) foreach (Item item in container.Items)
{ {
if (item.ImageFileHolder is not null) if (item.FilePath is not null)
results.Add(item); results.Add(item);
} }
return results.ToArray(); return results.ToArray();
@ -422,13 +416,13 @@ public class DateGroup
continue; continue;
} }
} }
File.Move(item.ImageFileHolder.FullName, fullFileName); File.Move(item.FilePath.FullName, fullFileName);
moved += 1; moved += 1;
if (hasDuplicate) if (hasDuplicate)
{ {
try try
{ {
windowsShortcut = new() { Path = item.ImageFileHolder.DirectoryName, Description = item.ImageFileHolder.Name }; windowsShortcut = new() { Path = item.FilePath.DirectoryName, Description = item.FilePath.Name };
windowsShortcut.Save(string.Concat(fullFileName, ".lnk")); windowsShortcut.Save(string.Concat(fullFileName, ".lnk"));
windowsShortcut.Dispose(); windowsShortcut.Dispose();
} }
@ -447,11 +441,11 @@ public class DateGroup
foreach ((Item item, long lastWriteTimeTicks, long minimumDateTimeTicks, string[] destination) in fileMoveCollectionAll) foreach ((Item item, long lastWriteTimeTicks, long minimumDateTimeTicks, string[] destination) in fileMoveCollectionAll)
{ {
fullFileName = Path.Combine(destination); fullFileName = Path.Combine(destination);
if (File.Exists(item.ImageFileHolder.FullName)) if (File.Exists(item.FilePath.FullName))
continue; continue;
if (!File.Exists(fullFileName)) if (!File.Exists(fullFileName))
continue; continue;
File.Move(fullFileName, item.ImageFileHolder.FullName); File.Move(fullFileName, item.FilePath.FullName);
moved += 1; moved += 1;
} }
_Logger?.LogInformation($"Done moving back {moved} file(s)"); _Logger?.LogInformation($"Done moving back {moved} file(s)");
@ -493,8 +487,8 @@ public class DateGroup
relativePathDirectory = Path.GetDirectoryName(item.RelativePath); relativePathDirectory = Path.GetDirectoryName(item.RelativePath);
if (string.IsNullOrEmpty(relativePathDirectory)) if (string.IsNullOrEmpty(relativePathDirectory))
continue; continue;
if (item.ImageFileHolder.LastWriteTime is not null && item.Property is null) if (item.Property is null)
dateTime = item.ImageFileHolder.LastWriteTime.Value; dateTime = new(item.FilePath.LastWriteTicks);
else if (item.Property is not null && item.Property.DateTimeOriginal is not null) else if (item.Property is not null && item.Property.DateTimeOriginal is not null)
dateTime = item.Property.DateTimeOriginal.Value; dateTime = item.Property.DateTimeOriginal.Value;
else else

View File

@ -166,7 +166,7 @@ public partial class E_Distance : IDistance
if (mappedFaceDirectory is null) if (mappedFaceDirectory is null)
throw new NotSupportedException(); throw new NotSupportedException();
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(filePath, 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.FilePath.ExtensionLowered}{facesFileNameExtension}");
if (checkFile == file) if (checkFile == file)
continue; continue;
result = new FileInfo(checkFile); result = new FileInfo(checkFile);

View File

@ -160,10 +160,10 @@ public partial class DragDropSearch : Form
LoadData(); LoadData();
if (int.TryParse(segments[0], out int id) && _IdToItem.TryGetValue(id, out Item? item)) if (int.TryParse(segments[0], out int id) && _IdToItem.TryGetValue(id, out Item? item))
{ {
Text = item.ImageFileHolder.Name; Text = item.FilePath.Name;
_TextBox.Text = item.ImageFileHolder.FullName; _TextBox.Text = item.FilePath.FullName;
if (!string.IsNullOrEmpty(item.ImageFileHolder.DirectoryName)) if (!string.IsNullOrEmpty(item.FilePath.DirectoryName))
_ = Process.Start("explorer.exe", string.Concat("\"", item.ImageFileHolder.DirectoryName, "\"")); _ = Process.Start("explorer.exe", string.Concat("\"", item.FilePath.DirectoryName, "\""));
} }
} }
} }

View File

@ -19,9 +19,8 @@ public class Program
List<Item> results = []; List<Item> results = [];
foreach (Item item in container.Items) foreach (Item item in container.Items)
{ {
if (item.ImageFileHolder is not null if (item.IsValidImageFormatExtension
&& item.IsValidImageFormatExtension && !configuration.IgnoreExtensions.Contains(item.FilePath.ExtensionLowered))
&& !configuration.IgnoreExtensions.Contains(item.ImageFileHolder.ExtensionLowered))
results.Add(item); results.Add(item);
} }
return results.ToArray(); return results.ToArray();

View File

@ -116,7 +116,7 @@ public partial class DragDropSetPropertyItem : Form
fileHolder = IFileHolder.Get(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, _PropertyConfiguration.PopulatePropertyId, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
if (message is not null) if (message is not null)
throw new Exception(message); throw new Exception(message);
if (id is null) if (id is null)
@ -165,7 +165,7 @@ public partial class DragDropSetPropertyItem : Form
bitmap.SetPropertyItem(propertyItem); bitmap.SetPropertyItem(propertyItem);
bitmap.Save(checkFile); bitmap.Save(checkFile);
bitmap.Dispose(); bitmap.Dispose();
(_, _, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, record.FileHolder, record.IsIgnoreExtension, record.IsValidImageFormatExtension, asciiEncoding); (_, _, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration, _PropertyConfiguration.PopulatePropertyId, record.FileHolder, record.IsIgnoreExtension, record.IsValidImageFormatExtension, asciiEncoding);
if (id is null || id.Value != record.Id) if (id is null || id.Value != record.Id)
throw new NotSupportedException(); throw new NotSupportedException();
File.Delete(record.FileHolder.FullName); File.Delete(record.FileHolder.FullName);

View File

@ -60,10 +60,10 @@ public class DuplicateSearch
File.WriteAllText(Path.Combine(alongSideDirectory, $"{directoryName}-{ticks}.json"), json); File.WriteAllText(Path.Combine(alongSideDirectory, $"{directoryName}-{ticks}.json"), json);
} }
private static void Move(ILogger<Program>? logger, long ticks, string destinationRoot, List<(FileHolder ImageFileHolder, string Destination)> collection) private static void Move(ILogger<Program>? logger, long ticks, string destinationRoot, List<(FilePath FilePath, string Destination)> collection)
{ {
StringBuilder stringBuilder = new(); StringBuilder stringBuilder = new();
foreach ((FileHolder fileHolder, string destination) in collection) foreach ((FilePath fileHolder, string destination) in collection)
{ {
_ = stringBuilder.AppendLine(fileHolder.FullName); _ = stringBuilder.AppendLine(fileHolder.FullName);
_ = stringBuilder.AppendLine(destination); _ = stringBuilder.AppendLine(destination);
@ -77,12 +77,12 @@ public class DuplicateSearch
break; break;
} }
logger?.LogInformation(". . ."); logger?.LogInformation(". . .");
foreach ((FileHolder fileHolder, string destination) in collection) foreach ((FilePath filePath, string destination) in collection)
{ {
try try
{ File.Move(fileHolder.FullName, destination); } { File.Move(filePath.FullName, destination); }
catch (Exception exception) catch (Exception exception)
{ logger?.LogError(exception, $"Failed to move <{fileHolder.FullName}>"); } { logger?.LogError(exception, $"Failed to move <{filePath.FullName}>"); }
} }
logger?.LogInformation($"{collection.Count} file(s) moved"); logger?.LogInformation($"{collection.Count} file(s) moved");
for (int y = 0; y < int.MaxValue; y++) for (int y = 0; y < int.MaxValue; y++)
@ -91,14 +91,14 @@ public class DuplicateSearch
if (System.Console.ReadKey().Key != ConsoleKey.Y) if (System.Console.ReadKey().Key != ConsoleKey.Y)
continue; continue;
logger?.LogInformation(". . ."); logger?.LogInformation(". . .");
foreach ((FileHolder fileHolder, string destination) in collection) foreach ((FilePath filePath, string destination) in collection)
{ {
if (!File.Exists(destination)) if (!File.Exists(destination))
continue; continue;
if (File.Exists(fileHolder.FullName)) if (File.Exists(filePath.FullName))
continue; continue;
try try
{ File.Move(destination, fileHolder.FullName); } { File.Move(destination, filePath.FullName); }
catch (Exception exception) catch (Exception exception)
{ logger?.LogError(exception, $"Failed to move <{destination}>"); } { logger?.LogError(exception, $"Failed to move <{destination}>"); }
} }
@ -119,7 +119,7 @@ public class DuplicateSearch
if (System.Console.ReadKey().Key != ConsoleKey.Y) if (System.Console.ReadKey().Key != ConsoleKey.Y)
continue; continue;
logger?.LogInformation(". . ."); logger?.LogInformation(". . .");
List<(FileHolder ImageFileHolder, string Destination)> collection = GetCollectionAndCreateDirectories(idToCollection); List<(FilePath FilePath, string Destination)> collection = GetCollectionAndCreateDirectories(idToCollection);
Move(logger, ticks, destinationRoot, collection); Move(logger, ticks, destinationRoot, collection);
} }
} }
@ -170,7 +170,7 @@ public class DuplicateSearch
{ {
if (item.Property?.Id is null) if (item.Property?.Id is null)
{ {
if (int.TryParse(item.ImageFileHolder.NameWithoutExtension, out int id)) if (int.TryParse(item.FilePath.NameWithoutExtension, out int id))
continue; continue;
continue; continue;
} }
@ -188,7 +188,7 @@ public class DuplicateSearch
if (mappingFromItem is not null) if (mappingFromItem is not null)
{ {
resizedFileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(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.FilePath, mappingFromItem.IsWrongYear, item.Property.Keywords ?? [], mappingFromItem.MinimumDateTime, item.Property.Model, mappingFromItem.RelativePath, resizedFileHolder);
} }
} }
resizedFileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(string.Concat(Path.Combine(destinationRoot, directory), item.RelativePath)); resizedFileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(string.Concat(Path.Combine(destinationRoot, directory), item.RelativePath));
@ -199,9 +199,9 @@ public class DuplicateSearch
return results; return results;
} }
private static List<(FileHolder ImageFileHolder, string Destination)> GetCollectionAndCreateDirectories(Dictionary<int, List<MappingFromItem?>> idToCollection) private static List<(FilePath FilePath, string Destination)> GetCollectionAndCreateDirectories(Dictionary<int, List<MappingFromItem?>> idToCollection)
{ {
List<(FileHolder ImageFileHolder, string Destination)> results = []; List<(FilePath FilePath, string Destination)> results = [];
List<string> collection = []; List<string> collection = [];
foreach (KeyValuePair<int, List<MappingFromItem?>> keyValuePair in idToCollection) foreach (KeyValuePair<int, List<MappingFromItem?>> keyValuePair in idToCollection)
{ {
@ -209,10 +209,10 @@ public class DuplicateSearch
{ {
if (mappingFromItem?.ResizedFileHolder.DirectoryName is null) if (mappingFromItem?.ResizedFileHolder.DirectoryName is null)
continue; continue;
if (!mappingFromItem.ImageFileHolder.Exists || mappingFromItem.ResizedFileHolder.Exists) if (mappingFromItem.ResizedFileHolder.Exists)
continue; continue;
collection.Add(mappingFromItem.ResizedFileHolder.DirectoryName); collection.Add(mappingFromItem.ResizedFileHolder.DirectoryName);
results.Add(new(mappingFromItem.ImageFileHolder, mappingFromItem.ResizedFileHolder.FullName)); results.Add(new(mappingFromItem.FilePath, mappingFromItem.ResizedFileHolder.FullName));
} }
} }
foreach (string directory in collection.Distinct()) foreach (string directory in collection.Distinct())

View File

@ -326,7 +326,7 @@ public class D_Face
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, filePath); (_, 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.FilePath.NameWithoutExtension}{mappingFromItem.FilePath.ExtensionLowered}.json"));
if (_ForceFaceLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete"))) if (_ForceFaceLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete")))
{ {
File.Move(Path.ChangeExtension(fileInfo.FullName, ".delete"), fileInfo.FullName); File.Move(Path.ChangeExtension(fileInfo.FullName, ".delete"), fileInfo.FullName);
@ -403,7 +403,7 @@ public class D_Face
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, filePath); (_, 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.FilePath.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)
{ {
@ -414,7 +414,7 @@ public class D_Face
continue; continue;
} }
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(filePath, 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.FilePath.ExtensionLowered}{_FileNameExtension}"));
if (!directoryExists) if (!directoryExists)
save = true; save = true;
else if (_OverrideForFaceImages) else if (_OverrideForFaceImages)
@ -423,7 +423,7 @@ public class D_Face
save = true; save = true;
else if (_CheckDFaceAndUpWriteDates && dateTimes.Count > 0 && dateTimes.Max() > fileInfo.LastWriteTime) else if (_CheckDFaceAndUpWriteDates && dateTimes.Count > 0 && dateTimes.Max() > fileInfo.LastWriteTime)
save = true; save = true;
results.Add(new(face, fileInfo, Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{_HiddenFileNameExtension}"), save)); results.Add(new(face, fileInfo, Path.Combine(directory, $"{deterministicHashCodeKey}{mappingFromItem.FilePath.ExtensionLowered}{_HiddenFileNameExtension}"), save));
} }
if (results.Any(l => l.Save)) if (results.Any(l => l.Save))
{ {

View File

@ -75,12 +75,12 @@ public class D2_FaceParts
bool angleBracketCollectionAny = _AngleBracketCollection.Count != 0; bool angleBracketCollectionAny = _AngleBracketCollection.Count != 0;
if (!angleBracketCollectionAny) if (!angleBracketCollectionAny)
{ {
if (item.ImageFileHolder.DirectoryName is null) if (item.FilePath.DirectoryName is null)
throw new NullReferenceException(nameof(item.ImageFileHolder.DirectoryName)); throw new NullReferenceException(nameof(item.FilePath.DirectoryName));
SetAngleBracketCollection(configuration, dResultsFullGroupDirectory, item.ImageFileHolder.DirectoryName); SetAngleBracketCollection(configuration, dResultsFullGroupDirectory, item.FilePath.DirectoryName);
} }
if (includeNameWithoutExtension) if (includeNameWithoutExtension)
result = Path.Combine(_AngleBracketCollection[0].Replace("<>", _PropertyConfiguration.ResultContent), item.ImageFileHolder.NameWithoutExtension); result = Path.Combine(_AngleBracketCollection[0].Replace("<>", _PropertyConfiguration.ResultContent), item.FilePath.NameWithoutExtension);
else else
{ {
result = _AngleBracketCollection[0].Replace("<>", $"[{_PropertyConfiguration.ResultContent}]"); result = _AngleBracketCollection[0].Replace("<>", $"[{_PropertyConfiguration.ResultContent}]");
@ -259,7 +259,7 @@ public class D2_FaceParts
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, filePath); (_, 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.FilePath.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)
{ {
@ -269,10 +269,10 @@ public class D2_FaceParts
continue; continue;
} }
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(filePath, 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.FilePath.ExtensionLowered}{_FileNameExtension}"));
if (string.IsNullOrEmpty(fileInfo.DirectoryName)) if (string.IsNullOrEmpty(fileInfo.DirectoryName))
continue; continue;
rotatedFileInfo = new FileInfo(Path.Combine(fileInfo.DirectoryName, $"{deterministicHashCodeKey} - R{mappingFromItem.ImageFileHolder.ExtensionLowered}{_FileNameExtension}")); rotatedFileInfo = new FileInfo(Path.Combine(fileInfo.DirectoryName, $"{deterministicHashCodeKey} - R{mappingFromItem.FilePath.ExtensionLowered}{_FileNameExtension}"));
collection.Add(new(face, fileInfo.FullName, rotatedFileInfo.FullName)); collection.Add(new(face, fileInfo.FullName, rotatedFileInfo.FullName));
if (check) if (check)
continue; continue;
@ -363,7 +363,7 @@ public class D2_FaceParts
public void CopyFacesAndSaveFaceLandmarkImage(string facePartsCollectionDirectory, MappingFromItem mappingFromItem, List<(Shared.Models.Face Face, FileInfo?, string, bool)> faceCollection) public void CopyFacesAndSaveFaceLandmarkImage(string facePartsCollectionDirectory, MappingFromItem mappingFromItem, List<(Shared.Models.Face Face, FileInfo?, string, bool)> faceCollection)
{ {
bool hasNotMapped = GetNotMapped(facePartsCollectionDirectory, faceCollection); bool hasNotMapped = GetNotMapped(facePartsCollectionDirectory, faceCollection);
string fileName = Path.Combine(facePartsCollectionDirectory, $"{mappingFromItem.ImageFileHolder.Name}{_FileNameExtension}"); string fileName = Path.Combine(facePartsCollectionDirectory, $"{mappingFromItem.FilePath.Name}{_FileNameExtension}");
bool save = faceCollection.Any(l => l.Face.FaceEncoding is not null && l.Face.Location is not null && l.Face.OutputResolution is not null && l.Face.FaceParts is not null && l.Face.FaceParts.Count != 0); bool save = faceCollection.Any(l => l.Face.FaceEncoding is not null && l.Face.Location is not null && l.Face.OutputResolution is not null && l.Face.FaceParts is not null && l.Face.FaceParts.Count != 0);
FileInfo fileInfo = new(fileName); FileInfo fileInfo = new(fileName);
if (save && (!fileInfo.Exists || new TimeSpan(DateTime.Now.Ticks - fileInfo.LastWriteTime.Ticks).TotalDays > 10)) if (save && (!fileInfo.Exists || new TimeSpan(DateTime.Now.Ticks - fileInfo.LastWriteTime.Ticks).TotalDays > 10))

View File

@ -392,7 +392,7 @@ public partial class DlibDotNet
&& _Exceptions.Count == 0) && _Exceptions.Count == 0)
MapLogic(ticks, readOnlyContainers, fPhotoPrismContentDirectory, mapLogic, outputResolution, new(personKeyToIds), distinctFilteredFaces, distinctFilteredMappingCollection); MapLogic(ticks, readOnlyContainers, fPhotoPrismContentDirectory, mapLogic, outputResolution, new(personKeyToIds), distinctFilteredFaces, distinctFilteredMappingCollection);
if (runToDoCollectionFirst && _Configuration.SaveRandomForOutputResolutions.Contains(outputResolution) && personKeyToIds.Count > 0 && distinctFilteredMappingCollection.Count > 0) if (runToDoCollectionFirst && _Configuration.SaveRandomForOutputResolutions.Contains(outputResolution) && personKeyToIds.Count > 0 && distinctFilteredMappingCollection.Count > 0)
_Random.Random(_Configuration.PropertyConfiguration, _Configuration.RadomUseBirthdayMinimum, _Configuration.ValidKeyWordsToIgnoreInRandom, outputResolution, personKeyToIds, notNineCollection, distinctFilteredMappingCollection); _Random.Random(_Configuration.PropertyConfiguration, _Configuration.RadomUseBirthdayMinimum, _Configuration.ValidKeyWordsToIgnoreInRandom, personKeyToIds, notNineCollection, distinctFilteredMappingCollection);
if (_IsEnvironment.Development) if (_IsEnvironment.Development)
continue; continue;
if (!_IsEnvironment.Development) if (!_IsEnvironment.Development)
@ -598,7 +598,9 @@ public partial class DlibDotNet
private static void SaveDistinctIds(Property.Models.Configuration propertyConfiguration, string bResultsFullGroupDirectory, ReadOnlyCollection<Container> readOnlyContainers) private static void SaveDistinctIds(Property.Models.Configuration propertyConfiguration, string bResultsFullGroupDirectory, ReadOnlyCollection<Container> readOnlyContainers)
{ {
string paddedId;
List<int> distinct = []; List<int> distinct = [];
List<Identifier> identifiers = [];
string bMetadataCollectionDirectory = Path.Combine(bResultsFullGroupDirectory, propertyConfiguration.ResultCollection); string bMetadataCollectionDirectory = Path.Combine(bResultsFullGroupDirectory, propertyConfiguration.ResultCollection);
if (!Directory.Exists(bMetadataCollectionDirectory)) if (!Directory.Exists(bMetadataCollectionDirectory))
_ = Directory.CreateDirectory(bMetadataCollectionDirectory); _ = Directory.CreateDirectory(bMetadataCollectionDirectory);
@ -610,13 +612,16 @@ public partial class DlibDotNet
{ {
if (item.Property?.Id is null) if (item.Property?.Id is null)
continue; continue;
if (item.Property.Id != item.FilePath.Id)
throw new NotSupportedException();
if (distinct.Contains(item.Property.Id.Value)) if (distinct.Contains(item.Property.Id.Value))
continue; continue;
distinct.Add(item.Property.Id.Value); distinct.Add(item.Property.Id.Value);
paddedId = IId.GetPaddedId(propertyConfiguration, item.Property.Id.Value, item.FilePath.IsIgnore, index: null);
identifiers.Add(new(item.Property.Id.Value, paddedId));
} }
} }
distinct.Sort(); string json = JsonSerializer.Serialize(identifiers.OrderBy(l => l.PaddedId).ToArray(), IdentifierCollectionSourceGenerationContext.Default.IdentifierArray);
string json = JsonSerializer.Serialize(distinct);
_ = Shared.Models.Stateless.Methods.IPath.WriteAllText(Path.Combine(bMetadataCollectionDirectory, ".json"), json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null); _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(Path.Combine(bMetadataCollectionDirectory, ".json"), json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
} }
@ -710,13 +715,13 @@ public partial class DlibDotNet
List<(string, string, string)> collection = []; List<(string, string, string)> collection = [];
foreach (Item item in distinctFilteredItems) foreach (Item item in distinctFilteredItems)
{ {
if (item.Property?.Id is null || item.ImageFileHolder.LastWriteTime is null) if (item.Property?.Id is null)
continue; continue;
if (item.IsNotUniqueAndNeedsReview is null || !item.IsNotUniqueAndNeedsReview.Value) if (item.IsNotUniqueAndNeedsReview is null || !item.IsNotUniqueAndNeedsReview.Value)
continue; continue;
directory = Path.Combine($"{eDistanceContentDirectory[..^1]}{nameof(item.IsNotUniqueAndNeedsReview)})", item.ImageFileHolder.NameWithoutExtension); directory = Path.Combine($"{eDistanceContentDirectory[..^1]}{nameof(item.IsNotUniqueAndNeedsReview)})", item.FilePath.NameWithoutExtension);
fileName = Path.Combine(directory, $"{item.ImageFileHolder.Length} {item.ImageFileHolder.LastWriteTime.Value.Ticks}.lnk"); fileName = Path.Combine(directory, $"{item.FilePath.Length} {item.FilePath.LastWriteTicks}.lnk");
collection.Add((item.ImageFileHolder.FullName, directory, fileName)); collection.Add((item.FilePath.FullName, directory, fileName));
if (distinct.Contains(directory)) if (distinct.Contains(directory))
continue; continue;
distinct.Add(directory); distinct.Add(directory);
@ -726,14 +731,14 @@ public partial class DlibDotNet
if (item.Property?.Id is null || item.Property.DateTimeOriginal is null) if (item.Property?.Id is null || item.Property.DateTimeOriginal is null)
continue; continue;
dateTimes = item.Property.GetDateTimes(); dateTimes = item.Property.GetDateTimes();
(isWrongYear, _) = Shared.Models.Stateless.Methods.IProperty.IsWrongYear(item.ImageFileHolder, item.Property.DateTimeOriginal, dateTimes); (isWrongYear, _) = Shared.Models.Stateless.Methods.IProperty.IsWrongYear(item.FilePath, item.Property.DateTimeOriginal, dateTimes);
if (isWrongYear is null || !isWrongYear.Value) if (isWrongYear is null || !isWrongYear.Value)
continue; continue;
// Remove-Item -LiteralPath "\\?\D:\Tmp\a\EX-Z70 " // Remove-Item -LiteralPath "\\?\D:\Tmp\a\EX-Z70 "
model = string.IsNullOrEmpty(item.Property.Model) ? "Unknown" : CameraRegex().Replace(item.Property.Model.Trim(), "_"); model = string.IsNullOrEmpty(item.Property.Model) ? "Unknown" : CameraRegex().Replace(item.Property.Model.Trim(), "_");
directory = Path.Combine($"{eDistanceContentDirectory[..^1]}{nameof(Item)})", item.Property.DateTimeOriginal.Value.Year.ToString(), model); directory = Path.Combine($"{eDistanceContentDirectory[..^1]}{nameof(Item)})", item.Property.DateTimeOriginal.Value.Year.ToString(), model);
fileName = item.IsNotUniqueAndNeedsReview is not null && item.IsNotUniqueAndNeedsReview.Value ? Path.Combine(directory, $"{item.ImageFileHolder.Name} {item.ImageFileHolder.Length}.lnk") : Path.Combine(directory, $"{item.ImageFileHolder.Name}.lnk"); fileName = item.IsNotUniqueAndNeedsReview is not null && item.IsNotUniqueAndNeedsReview.Value ? Path.Combine(directory, $"{item.FilePath.Name} {item.FilePath.Length}.lnk") : Path.Combine(directory, $"{item.FilePath.Name}.lnk");
collection.Add((item.ImageFileHolder.FullName, directory, fileName)); collection.Add((item.FilePath.FullName, directory, fileName));
if (distinct.Contains(directory)) if (distinct.Contains(directory))
continue; continue;
distinct.Add(directory); distinct.Add(directory);
@ -804,13 +809,13 @@ public partial class DlibDotNet
private void LogItemPropertyIsNull(Item item) private void LogItemPropertyIsNull(Item item)
{ {
if (!item.SourceDirectoryFileHolder.Exists) if (!item.SourceDirectoryFileHolder.Exists)
_Logger?.LogInformation(string.Concat("NoJson <", item.ImageFileHolder.FullName, '>')); _Logger?.LogInformation(string.Concat("NoJson <", item.FilePath.FullName, '>'));
else if (item.FileSizeChanged.HasValue && item.FileSizeChanged.Value) else if (item.FileSizeChanged.HasValue && item.FileSizeChanged.Value)
_Logger?.LogInformation(string.Concat("FileSizeChanged <", item.ImageFileHolder.FullName, '>')); _Logger?.LogInformation(string.Concat("FileSizeChanged <", item.FilePath.FullName, '>'));
else if (item.LastWriteTimeChanged.HasValue && item.LastWriteTimeChanged.Value) else if (item.LastWriteTimeChanged.HasValue && item.LastWriteTimeChanged.Value)
_Logger?.LogInformation(string.Concat("LastWriteTimeChanged <", item.ImageFileHolder.FullName, '>')); _Logger?.LogInformation(string.Concat("LastWriteTimeChanged <", item.FilePath.FullName, '>'));
else if (item.Moved.HasValue && item.Moved.Value) else if (item.Moved.HasValue && item.Moved.Value)
_Logger?.LogInformation(string.Concat("Moved <", item.ImageFileHolder.FullName, '>')); _Logger?.LogInformation(string.Concat("Moved <", item.FilePath.FullName, '>'));
} }
private int GetNotMappedCountAndUpdateMappingFromPersonThenSetMapping(MapLogic mapLogic, Item item, bool? isFocusRelativePath, ReadOnlyCollection<LocationContainer> locationContainers, MappingFromItem mappingFromItem, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, List<Shared.Models.Face> faces) private int GetNotMappedCountAndUpdateMappingFromPersonThenSetMapping(MapLogic mapLogic, Item item, bool? isFocusRelativePath, ReadOnlyCollection<LocationContainer> locationContainers, MappingFromItem mappingFromItem, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, List<Shared.Models.Face> faces)
@ -987,7 +992,6 @@ 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));
FilePath filePath = FilePath.Get(_Configuration.PropertyConfiguration, item.ImageFileHolder, index: null);
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(item.FilePath); string? file = _BlurHasher.GetFile(item.FilePath);

View File

@ -0,0 +1,27 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace View_by_Distance.Instance.Models;
internal record Identifier(int Id, string PaddedId)
{
public override string ToString()
{
string result = JsonSerializer.Serialize(this, IdentifierSourceGenerationContext.Default.Identifier);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(Identifier))]
internal partial class IdentifierSourceGenerationContext : JsonSerializerContext
{
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(Identifier[]))]
internal partial class IdentifierCollectionSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -33,7 +33,7 @@ internal class F_Random
List<string>? relativePaths; List<string>? relativePaths;
foreach (Shared.Models.Mapping mapping in mappingCollection) foreach (Shared.Models.Mapping mapping in mappingCollection)
{ {
if (mapping.MappingFromItem.ImageFileHolder.DirectoryName is null || mapping.MappingFromPerson is null) if (mapping.MappingFromItem.FilePath.DirectoryName is null || mapping.MappingFromPerson is null)
continue; continue;
if (!idToPersonKeys.TryGetValue(mapping.MappingFromItem.Id, out personKeys)) if (!idToPersonKeys.TryGetValue(mapping.MappingFromItem.Id, out personKeys))
continue; continue;
@ -54,7 +54,7 @@ internal class F_Random
return new(results); return new(results);
} }
internal void Random(Property.Models.Configuration configuration, int radomUseBirthdayMinimum, string[] validKeyWordsToIgnoreInRandom, string outputResolution, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<int>? notNineCollection, ReadOnlyCollection<Shared.Models.Mapping> mappingCollection) internal void Random(Property.Models.Configuration configuration, int radomUseBirthdayMinimum, string[] validKeyWordsToIgnoreInRandom, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<int>? notNineCollection, ReadOnlyCollection<Shared.Models.Mapping> mappingCollection)
{ {
string key; string key;
string json; string json;
@ -75,7 +75,7 @@ internal class F_Random
{ {
if (distinctCollection.Contains(mapping.MappingFromItem.Id)) if (distinctCollection.Contains(mapping.MappingFromItem.Id))
continue; continue;
if (mapping.MappingFromItem.ImageFileHolder.DirectoryName is null) if (mapping.MappingFromItem.FilePath.DirectoryName is null)
continue; continue;
if (notNineCollection is not null && notNineCollection.Contains(mapping.MappingFromItem.Id)) if (notNineCollection is not null && notNineCollection.Contains(mapping.MappingFromItem.Id))
continue; continue;

View File

@ -160,17 +160,17 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
(season, _) = IProperty.GetSeason(dateTime.DayOfYear); (season, _) = IProperty.GetSeason(dateTime.DayOfYear);
weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
directory = Path.Combine($"{eDistanceContentDirectory}---", "Date Shortcuts", $"{dateTime.Year}.{season}-MM{dateTime.Month:00}-WW{weekOfYear}"); directory = Path.Combine($"{eDistanceContentDirectory}---", "Date Shortcuts", $"{dateTime.Year}.{season}-MM{dateTime.Month:00}-WW{weekOfYear}");
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk"); fileName = Path.Combine(directory, $"{mapping.MappingFromItem.FilePath.Name}.lnk");
results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, dateTime, fileName, description, MakeAllHidden: false)); results.Add(new(mapping.MappingFromItem.FilePath.FullName, directory, dateTime, fileName, description, MakeAllHidden: false));
if (mapping.MappingFromItem.ImageFileHolder.DirectoryName is null) if (mapping.MappingFromItem.FilePath.DirectoryName is null)
continue; continue;
directoryName = Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName); directoryName = Path.GetFileName(mapping.MappingFromItem.FilePath.DirectoryName);
if (!string.IsNullOrEmpty(mapping.MappingFromItem.Model) && !string.IsNullOrEmpty(mapping.MappingFromItem.Model.Trim())) if (!string.IsNullOrEmpty(mapping.MappingFromItem.Model) && !string.IsNullOrEmpty(mapping.MappingFromItem.Model.Trim()))
{ {
// Remove-Item -LiteralPath "\\?\D:\Tmp\a\EX-Z70 " // Remove-Item -LiteralPath "\\?\D:\Tmp\a\EX-Z70 "
directory = Path.Combine($"{eDistanceContentDirectory}---", "Model Shortcuts", FileSystemSafe().Replace(mapping.MappingFromItem.Model.Trim(), "_"), directoryName); directory = Path.Combine($"{eDistanceContentDirectory}---", "Model Shortcuts", FileSystemSafe().Replace(mapping.MappingFromItem.Model.Trim(), "_"), directoryName);
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk"); fileName = Path.Combine(directory, $"{mapping.MappingFromItem.FilePath.Name}.lnk");
results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, dateTime, fileName, description, MakeAllHidden: false)); results.Add(new(mapping.MappingFromItem.FilePath.FullName, directory, dateTime, fileName, description, MakeAllHidden: false));
} }
if (mapping.MappingFromPerson is null) if (mapping.MappingFromPerson is null)
continue; continue;
@ -180,13 +180,13 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
continue; continue;
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonKey); personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonKey);
directory = Path.Combine($"{eDistanceContentDirectory}---", "Person Key Shortcuts", personKeyFormatted, directoryName); directory = Path.Combine($"{eDistanceContentDirectory}---", "Person Key Shortcuts", personKeyFormatted, directoryName);
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk"); fileName = Path.Combine(directory, $"{mapping.MappingFromItem.FilePath.Name}.lnk");
results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, description, MakeAllHidden: false)); results.Add(new(mapping.MappingFromItem.FilePath.FullName, directory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, description, MakeAllHidden: false));
if (IPerson.IsDefaultName(mapping.MappingFromPerson)) if (IPerson.IsDefaultName(mapping.MappingFromPerson))
continue; continue;
directory = Path.Combine($"{eDistanceContentDirectory}---", "Name Shortcuts", mapping.MappingFromPerson.DisplayDirectoryName, directoryName); directory = Path.Combine($"{eDistanceContentDirectory}---", "Name Shortcuts", mapping.MappingFromPerson.DisplayDirectoryName, directoryName);
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk"); fileName = Path.Combine(directory, $"{mapping.MappingFromItem.FilePath.Name}.lnk");
results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, description, MakeAllHidden: false)); results.Add(new(mapping.MappingFromItem.FilePath.FullName, directory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, description, MakeAllHidden: false));
} }
return results; return results;
} }
@ -436,16 +436,16 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
{ {
string checkFile; string checkFile;
string facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.FilePath, mapping.MappingFromItem); string facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.FilePath, mapping.MappingFromItem);
FileHolder faceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}")); FileHolder faceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.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.FilePath, 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.FilePath.ExtensionLowered}");
FileHolder hiddenFaceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}")); FileHolder hiddenFaceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}"));
FileHolder facePartsFileHolder = IFileHolder.Get(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}")); FileHolder facePartsFileHolder = IFileHolder.Get(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.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);
} }
} }
@ -621,18 +621,18 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
results.Add(new(Path.Combine(directory, "Maybe"))); results.Add(new(Path.Combine(directory, "Maybe")));
} }
facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.FilePath, mapping.MappingFromItem); facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.FilePath, mapping.MappingFromItem);
faceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}")); faceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.ExtensionLowered}{_Configuration.FacesFileNameExtension}"));
if (!faceFileHolder.Exists) if (!faceFileHolder.Exists)
continue; continue;
if (isByMapping) if (isByMapping)
{ {
checkFile = Path.Combine(record.PersonDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}"); checkFile = Path.Combine(record.PersonDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.ExtensionLowered}");
saveContainer = new(checkFile, directory, faceFileHolder); saveContainer = new(checkFile, directory, faceFileHolder);
} }
else if (saveIndividually) else if (saveIndividually)
{ {
facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.FilePath, mapping.MappingFromItem); facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.FilePath, mapping.MappingFromItem);
facePartsFileHolder = IFileHolder.Get(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}")); facePartsFileHolder = IFileHolder.Get(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.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);
@ -640,10 +640,10 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
else else
{ {
facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.FilePath, 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.FilePath.ExtensionLowered}.lnk");
checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}"); checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.ExtensionLowered}");
hiddenFaceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}")); hiddenFaceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}"));
facePartsFileHolder = IFileHolder.Get(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}")); facePartsFileHolder = IFileHolder.Get(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.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);
@ -832,12 +832,12 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
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.FilePath, question.MappingFromItem); facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, question.FilePath, question.MappingFromItem);
faceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}")); faceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.FilePath.ExtensionLowered}{_Configuration.FacesFileNameExtension}"));
facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, question.FilePath, 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.FilePath.ExtensionLowered}.lnk");
checkFile = Path.Combine(directory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}"); checkFile = Path.Combine(directory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.FilePath.ExtensionLowered}");
hiddenFaceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}")); hiddenFaceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.FilePath.ExtensionLowered}{_Configuration.FacesHiddenFileNameExtension}"));
facePartsFileHolder = IFileHolder.Get(Path.Combine(facePartsDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}")); facePartsFileHolder = IFileHolder.Get(Path.Combine(facePartsDirectory, $"{question.MappingFromLocation.DeterministicHashCodeKey}{question.MappingFromItem.FilePath.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)
@ -1044,11 +1044,11 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
return results; return results;
} }
private (int, FileHolder, int, string, string, string, string)[] GetCollectionForSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleContentDirectory, ReadOnlyCollection<PersonContainer> personContainers, ReadOnlyCollection<Mapping> mappingCollection, ReadOnlyDictionary<long, List<int>> personKeyToIds) private (int, FilePath, int, string, string, string, string)[] GetCollectionForSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleContentDirectory, ReadOnlyCollection<PersonContainer> personContainers, ReadOnlyCollection<Mapping> mappingCollection, ReadOnlyDictionary<long, List<int>> personKeyToIds)
{ {
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
(int, FileHolder, int, string, string, string, string)[] results; (int, FilePath, int, string, string, string, string)[] results;
int count = 0; int count = 0;
int group = 65; int group = 65;
string checkFile; string checkFile;
@ -1059,7 +1059,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
List<int> distinctCollection = []; List<int> distinctCollection = [];
bool usePersonKeyAndDeterministicHashCodeKey = false; bool usePersonKeyAndDeterministicHashCodeKey = false;
List<string> personKeyFormattedCollection = GetPersonKeyFormattedCollection(jLinks, a2PeopleContentDirectory, personContainers, personKeyToIds); List<string> personKeyFormattedCollection = GetPersonKeyFormattedCollection(jLinks, a2PeopleContentDirectory, personContainers, personKeyToIds);
List<(int Id, FileHolder ImageFileHolder, int ApproximateYears, string PersonKeyFormatted, string CheckFile, string Directory, string PersonDirectory)> collection = []; List<(int Id, FilePath FilePath, int ApproximateYears, string PersonKeyFormatted, string CheckFile, string Directory, string PersonDirectory)> collection = [];
foreach (Mapping mapping in mappingCollection) foreach (Mapping mapping in mappingCollection)
{ {
if (distinctCollection.Contains(mapping.MappingFromItem.Id)) if (distinctCollection.Contains(mapping.MappingFromItem.Id))
@ -1089,15 +1089,15 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
} }
directory = Path.Combine(_EDistanceContentTicksDirectory, ((char)group).ToString()); directory = Path.Combine(_EDistanceContentTicksDirectory, ((char)group).ToString());
personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName); personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName);
checkFile = Path.Combine(directory, $"{mapping.MappingFromItem.Id}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}"); checkFile = Path.Combine(directory, $"{mapping.MappingFromItem.Id}{mapping.MappingFromItem.FilePath.ExtensionLowered}");
} }
else else
{ {
directory = Path.Combine(_EDistanceContentTicksDirectory, "Images", personKeyFormatted); directory = Path.Combine(_EDistanceContentTicksDirectory, "Images", personKeyFormatted);
personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName); personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName);
checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}"); checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.ExtensionLowered}");
} }
collection.Add(new(mapping.MappingFromItem.Id, mapping.MappingFromItem.ImageFileHolder, mapping.MappingFromPerson.ApproximateYears.Value, personKeyFormatted, directory, personDirectory, checkFile)); collection.Add(new(mapping.MappingFromItem.Id, mapping.MappingFromItem.FilePath, mapping.MappingFromPerson.ApproximateYears.Value, personKeyFormatted, directory, personDirectory, checkFile));
distinctCollection.Add(mapping.MappingFromItem.Id); distinctCollection.Add(mapping.MappingFromItem.Id);
count += 1; count += 1;
} }
@ -1109,14 +1109,16 @@ 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));
FileHolder fileHolder;
SaveContainer? saveContainer; SaveContainer? saveContainer;
List<SaveContainer> saveContainers = []; List<SaveContainer> saveContainers = [];
(int, FileHolder, int, string, string, string, string)[] collection = GetCollectionForSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory, personContainers, mappingCollection, personKeyToIds); (int, FilePath, int, string, string, string, string)[] collection = GetCollectionForSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory, personContainers, mappingCollection, personKeyToIds);
foreach ((int id, FileHolder imageFileHolder, int approximateYears, string personKeyFormatted, string directory, string personDirectory, string checkFile) in collection) foreach ((int id, FilePath filePath, int approximateYears, string personKeyFormatted, string directory, string personDirectory, string checkFile) in collection)
{ {
fileHolder = FileHolder.Get(filePath);
saveContainer = new(personDirectory); saveContainer = new(personDirectory);
saveContainers.Add(saveContainer); saveContainers.Add(saveContainer);
saveContainer = new(imageFileHolder, checkFile, directory); saveContainer = new(fileHolder, checkFile, directory);
saveContainers.Add(saveContainer); saveContainers.Add(saveContainer);
} }
SaveContainers(null, saveContainers); SaveContainers(null, saveContainers);
@ -1189,12 +1191,12 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
directoryName = Path.GetDirectoryName(face.Mapping.MappingFromItem.RelativePath); directoryName = Path.GetDirectoryName(face.Mapping.MappingFromItem.RelativePath);
if (directoryName is null) if (directoryName is null)
throw new NotSupportedException(); throw new NotSupportedException();
if (item.ResizedFileHolder?.DirectoryName is null || !item.ResizedFileHolder.Exists || item.ImageFileHolder.LastWriteTime is null) if (item.ResizedFileHolder?.DirectoryName is null || !item.ResizedFileHolder.Exists)
continue; continue;
directory = Path.Combine(item.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", _PropertyConfiguration.ResultAllInOne); directory = Path.Combine(item.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", _PropertyConfiguration.ResultAllInOne);
personDirectory = Path.Combine(directory, "No Faces"); personDirectory = Path.Combine(directory, "No Faces");
fileName = Path.Combine(personDirectory, $"{item.ResizedFileHolder.Name}.lnk"); fileName = Path.Combine(personDirectory, $"{item.ResizedFileHolder.Name}.lnk");
collection.Add(new(item.ResizedFileHolder.FullName, personDirectory, item.ImageFileHolder.LastWriteTime.Value, fileName, face.Mapping.MappingFromItem.Id.ToString(), MakeAllHidden: false)); collection.Add(new(item.ResizedFileHolder.FullName, personDirectory, new(item.FilePath.LastWriteTicks), fileName, face.Mapping.MappingFromItem.Id.ToString(), MakeAllHidden: false));
if (face.Mapping.MappingFromItem.ContainerDateTimes.Length > 0 && !distinct.Contains(item.ResizedFileHolder.DirectoryName)) if (face.Mapping.MappingFromItem.ContainerDateTimes.Length > 0 && !distinct.Contains(item.ResizedFileHolder.DirectoryName))
{ {
distinct.Add(item.ResizedFileHolder.DirectoryName); distinct.Add(item.ResizedFileHolder.DirectoryName);
@ -1223,7 +1225,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.FilePath, 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.FilePath.ExtensionLowered}{_Configuration.FacesFileNameExtension}");
fileName = Path.Combine(personDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ResizedFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}.lnk"); fileName = Path.Combine(personDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ResizedFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}.lnk");
collection.Add(new(fullName, personDirectory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, mapping.MappingFromLocation.DeterministicHashCodeKey, MakeAllHidden: true)); collection.Add(new(fullName, personDirectory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, mapping.MappingFromLocation.DeterministicHashCodeKey, MakeAllHidden: true));
} }

View File

@ -235,7 +235,7 @@ internal abstract class MapLogic
{ {
string result; string result;
(string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath); (string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath);
result = Path.Combine(dFacesContentDirectory, directoryName, mappingFromItem.ImageFileHolder.NameWithoutExtension); result = Path.Combine(dFacesContentDirectory, directoryName, mappingFromItem.FilePath.NameWithoutExtension);
return result; return result;
} }
@ -605,16 +605,16 @@ internal abstract class MapLogic
result = null; result = null;
else else
{ {
string checkFile = Path.Combine(directory, $"{keyMapping.MappingFromItem.ImageFileHolder.Name}{facePartsFileNameExtension}"); string checkFile = Path.Combine(directory, $"{keyMapping.MappingFromItem.FilePath.Name}{facePartsFileNameExtension}");
result = new(checkFile, directory, IFileHolder.Get(facePartsContentCollectionFile)); result = new(checkFile, directory, IFileHolder.Get(facePartsContentCollectionFile));
} }
string facesDirectory = GetFacesDirectory(propertyConfiguration, dFacesContentDirectory, keyMapping.FilePath, keyMapping.MappingFromItem); string facesDirectory = GetFacesDirectory(propertyConfiguration, dFacesContentDirectory, keyMapping.FilePath, keyMapping.MappingFromItem);
FileHolder faceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{keyMapping.MappingFromLocation.DeterministicHashCodeKey}{keyMapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}")); FileHolder faceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{keyMapping.MappingFromLocation.DeterministicHashCodeKey}{keyMapping.MappingFromItem.FilePath.ExtensionLowered}{facesFileNameExtension}"));
if (!faceFileHolder.Exists) if (!faceFileHolder.Exists)
saveContainer = null; saveContainer = null;
else else
{ {
string checkFile = Path.Combine(directory, $"{keyMapping.MappingFromLocation.DeterministicHashCodeKey}{keyMapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}"); string checkFile = Path.Combine(directory, $"{keyMapping.MappingFromLocation.DeterministicHashCodeKey}{keyMapping.MappingFromItem.FilePath.ExtensionLowered}{facesFileNameExtension}");
saveContainer = new(checkFile, directory, faceFileHolder); saveContainer = new(checkFile, directory, faceFileHolder);
} }
} }
@ -975,7 +975,7 @@ internal abstract class MapLogic
if (directoryName is null) if (directoryName is null)
result = null; result = null;
else else
result = Path.Combine($"{d2FacePartsContentCollectionDirectory}{directoryName}", $"{mappingFromItem.ImageFileHolder.Name}{extension}"); result = Path.Combine($"{d2FacePartsContentCollectionDirectory}{directoryName}", $"{mappingFromItem.FilePath.Name}{extension}");
return result; return result;
} }
@ -983,7 +983,7 @@ internal abstract class MapLogic
{ {
string result; string result;
(string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath); (string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath);
result = Path.Combine(d2FacePartsContentDirectory, directoryName, mappingFromItem.ImageFileHolder.NameWithoutExtension); result = Path.Combine(d2FacePartsContentDirectory, directoryName, mappingFromItem.FilePath.NameWithoutExtension);
return result; return result;
} }
@ -995,9 +995,9 @@ internal abstract class MapLogic
throw new NullReferenceException(nameof(sortingContainer.Source.MappingFromLocation)); throw new NullReferenceException(nameof(sortingContainer.Source.MappingFromLocation));
FileHolder faceFileHolder = IFileHolder.Get($"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.FilePath.ExtensionLowered}.{sortingContainer.Sorting.DistancePermyriad}.lnk");
else else
shortcutFile = Path.Combine(directory, $"{sortingContainer.Source.MappingFromLocation.DeterministicHashCodeKey}{sortingContainer.Source.MappingFromItem.ImageFileHolder.ExtensionLowered}.{sortingContainer.Sorting.DistancePermyriad}.lnk"); shortcutFile = Path.Combine(directory, $"{sortingContainer.Source.MappingFromLocation.DeterministicHashCodeKey}{sortingContainer.Source.MappingFromItem.FilePath.ExtensionLowered}.{sortingContainer.Sorting.DistancePermyriad}.lnk");
result = new(directory, faceFileHolder, sortingContainer.Source.MappingFromItem.ResizedFileHolder, shortcutFile); result = new(directory, faceFileHolder, sortingContainer.Source.MappingFromItem.ResizedFileHolder, shortcutFile);
return result; return result;
} }
@ -1008,9 +1008,9 @@ internal abstract class MapLogic
SaveContainer? saveContainer; SaveContainer? saveContainer;
if (mapping.MappingFromLocation is null) if (mapping.MappingFromLocation is null)
throw new NullReferenceException(nameof(mapping.MappingFromLocation)); throw new NullReferenceException(nameof(mapping.MappingFromLocation));
checkFile = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}{facePartsFileNameExtension}"); checkFile = Path.Combine(directory, $"{mapping.MappingFromItem.FilePath.Name}{facePartsFileNameExtension}");
saveContainer = !facePartsFileHolder.Exists ? null : new(checkFile, directory, facePartsFileHolder); saveContainer = !facePartsFileHolder.Exists ? null : new(checkFile, directory, facePartsFileHolder);
checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}"); checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.ExtensionLowered}{facesFileNameExtension}");
return (new(checkFile, directory, faceFileHolder), saveContainer); return (new(checkFile, directory, faceFileHolder), saveContainer);
} }

View File

@ -48,7 +48,7 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
ExifDirectory? result = null; ExifDirectory? result = null;
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, filePath); (_, 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.FilePath.NameWithoutExtension}{mappingFromItem.FilePath.ExtensionLowered}.json"));
if (_ForceMetadataLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete"))) if (_ForceMetadataLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete")))
{ {
File.Move(Path.ChangeExtension(fileInfo.FullName, ".delete"), fileInfo.FullName); File.Move(Path.ChangeExtension(fileInfo.FullName, ".delete"), fileInfo.FullName);
@ -104,7 +104,7 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
return result; return result;
} }
(DateTime?, DateTime?[]) IMetadata<MetadataExtractor.Directory>.GetDateTimes(FileHolder fileHolder, IReadOnlyList<MetadataExtractor.Directory> directories) (DateTime?, DateTime?[]) IMetadata<MetadataExtractor.Directory>.GetDateTimes(FilePath filePath, IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
List<DateTime?> results = []; List<DateTime?> results = [];
DateTime? result = null; DateTime? result = null;
@ -112,8 +112,8 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
DateTime checkDateTime; DateTime checkDateTime;
string dateTimeFormat = Property.Models.Stateless.IProperty.DateTimeFormat(); string dateTimeFormat = Property.Models.Stateless.IProperty.DateTimeFormat();
MetadataExtractor.Formats.Exif.ExifDirectoryBase? exifDirectoryBase = directories.OfType<MetadataExtractor.Formats.Exif.ExifDirectoryBase>().FirstOrDefault(); MetadataExtractor.Formats.Exif.ExifDirectoryBase? exifDirectoryBase = directories.OfType<MetadataExtractor.Formats.Exif.ExifDirectoryBase>().FirstOrDefault();
results.Add(fileHolder.CreationTime); results.Add(new DateTime(filePath.CreationTicks));
results.Add(fileHolder.LastWriteTime); results.Add(new DateTime(filePath.LastWriteTicks));
if (exifDirectoryBase is not null) if (exifDirectoryBase is not null)
{ {
if (exifDirectoryBase.TryGetDateTime(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTime, out checkDateTime)) if (exifDirectoryBase.TryGetDateTime(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTime, out checkDateTime))

View File

@ -128,7 +128,7 @@ public class MoveById
if (filePath.IsIntelligentIdFormat || filePath.SortOrder is not null) 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, _PropertyConfiguration.PopulatePropertyId, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
if (id is null) if (id is null)
continue; continue;
matches = (from l in allFiles where l.Contains($"{id}{fileHolder.ExtensionLowered}") select l).ToArray(); matches = (from l in allFiles where l.Contains($"{id}{fileHolder.ExtensionLowered}") select l).ToArray();

View File

@ -85,7 +85,7 @@ public class OffsetDateTimeOriginal
fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(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, _PropertyConfiguration.PopulatePropertyId, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
if (message is not null) if (message is not null)
throw new Exception(message); throw new Exception(message);
if (id is null || dateTimeOriginal is null) if (id is null || dateTimeOriginal is null)
@ -141,7 +141,7 @@ public class OffsetDateTimeOriginal
bitmap.SetPropertyItem(propertyItem); bitmap.SetPropertyItem(propertyItem);
bitmap.Save(checkFile); bitmap.Save(checkFile);
bitmap.Dispose(); bitmap.Dispose();
(_, _, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, record.FileHolder, record.IsIgnoreExtension, record.IsValidImageFormatExtension, asciiEncoding); (_, _, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration, _PropertyConfiguration.PopulatePropertyId, record.FileHolder, record.IsIgnoreExtension, record.IsValidImageFormatExtension, asciiEncoding);
if (message is not null) if (message is not null)
throw new Exception(message); throw new Exception(message);
if (id is null || id.Value != record.Id) if (id is null || id.Value != record.Id)
@ -200,12 +200,12 @@ public class OffsetDateTimeOriginal
targetIsIgnoreExtension = targetIsValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(targetFileHolder.ExtensionLowered); targetIsIgnoreExtension = targetIsValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(targetFileHolder.ExtensionLowered);
DateTime minimumDateTime = DateTime.ParseExact(Path.GetFileName(minimumDirectory.First()), format, CultureInfo.InvariantCulture, DateTimeStyles.None); DateTime minimumDateTime = DateTime.ParseExact(Path.GetFileName(minimumDirectory.First()), format, CultureInfo.InvariantCulture, DateTimeStyles.None);
DateTime maximumDateTime = DateTime.ParseExact(Path.GetFileName(maximumDirectory.First()), format, CultureInfo.InvariantCulture, DateTimeStyles.None).AddHours(23); DateTime maximumDateTime = DateTime.ParseExact(Path.GetFileName(maximumDirectory.First()), format, CultureInfo.InvariantCulture, DateTimeStyles.None).AddHours(23);
(badDateTimeOriginal, badDateTimes, badId, badMessage) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, badFileHolder, badIsIgnoreExtension, badIsValidImageFormatExtension, asciiEncoding); (badDateTimeOriginal, badDateTimes, badId, badMessage) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration, _PropertyConfiguration.PopulatePropertyId, badFileHolder, badIsIgnoreExtension, badIsValidImageFormatExtension, asciiEncoding);
if (badMessage is not null) if (badMessage is not null)
throw new Exception(badMessage); throw new Exception(badMessage);
if (badDateTimes.Length == 0 || badId is null) if (badDateTimes.Length == 0 || badId is null)
throw new Exception(badMessage); throw new Exception(badMessage);
(targetDateTimeOriginal, targetDateTimes, targetId, targetMessage) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, targetFileHolder, targetIsIgnoreExtension, targetIsValidImageFormatExtension, asciiEncoding); (targetDateTimeOriginal, targetDateTimes, targetId, targetMessage) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration, _PropertyConfiguration.PopulatePropertyId, targetFileHolder, targetIsIgnoreExtension, targetIsValidImageFormatExtension, asciiEncoding);
if (targetMessage is not null) if (targetMessage is not null)
throw new Exception(targetMessage); throw new Exception(targetMessage);
if (targetDateTimes.Length == 0 || targetId is null) if (targetDateTimes.Length == 0 || targetId is null)

View File

@ -54,11 +54,11 @@ public class A_Property
string angleBracket = _AngleBracketCollection[0]; string angleBracket = _AngleBracketCollection[0];
bool populateId = _Configuration.PopulatePropertyId; bool populateId = _Configuration.PopulatePropertyId;
if (!item.IsUniqueFileName) if (!item.IsUniqueFileName)
fileInfo = new(Path.Combine(angleBracket.Replace("<>", _PropertyConfiguration.ResultSingleton), $"{item.ImageFileHolder.NameWithoutExtension}{item.ImageFileHolder.ExtensionLowered}.json")); fileInfo = new(Path.Combine(angleBracket.Replace("<>", _PropertyConfiguration.ResultSingleton), $"{item.FilePath.NameWithoutExtension}{item.FilePath.ExtensionLowered}.json"));
else else
{ {
(_, int directoryIndex) = Shared.Models.Stateless.Methods.IPath.GetDirectoryNameAndIndex(_PropertyConfiguration, item.FilePath); (_, 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.FilePath.NameWithoutExtension}{item.FilePath.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();
if (_Configuration.ForcePropertyLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete"))) if (_Configuration.ForcePropertyLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete")))
@ -99,19 +99,19 @@ public class A_Property
id = result?.Id; id = result?.Id;
result = null; result = null;
} }
if (!isIgnoreExtension && item.IsValidImageFormatExtension && populateId && result is not null && result.LastWriteTime != item.ImageFileHolder.LastWriteTime) if (!isIgnoreExtension && item.IsValidImageFormatExtension && populateId && result is not null && result.LastWriteTime.Ticks != item.FilePath.LastWriteTicks)
{ {
id = null; id = null;
result = null; result = null;
} }
if (!isIgnoreExtension && item.IsValidImageFormatExtension && result?.Width is not null && result.Height is not null && result.Width.Value == result.Height.Value && item.ImageFileHolder.Exists) if (!isIgnoreExtension && item.IsValidImageFormatExtension && result?.Width is not null && result.Height is not null && result.Width.Value == result.Height.Value)
{ {
id = result.Id; id = result.Id;
result = null; result = null;
if (result?.Width is not null && result.Height is not null && result.Width.Value != result.Height.Value) if (result?.Width is not null && result.Height is not null && result.Width.Value != result.Height.Value)
throw new Exception("Was square!"); throw new Exception("Was square!");
} }
if (!isIgnoreExtension && item.IsValidImageFormatExtension && result is not null && result.FileSize != item.ImageFileHolder.Length) if (!isIgnoreExtension && item.IsValidImageFormatExtension && result is not null && result.FileSize != item.FilePath.Length)
{ {
id = result.Id; id = result.Id;
result = null; result = null;
@ -135,7 +135,7 @@ public class A_Property
if (result is null) if (result is null)
{ {
id ??= item.FilePath.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.FilePath, 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))
{ {
@ -183,10 +183,10 @@ public class A_Property
{ {
Shared.Models.Property property; Shared.Models.Property property;
List<string> parseExceptions = []; List<string> parseExceptions = [];
bool isIgnoreExtension = item.IsValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(item.ImageFileHolder.ExtensionLowered); bool isIgnoreExtension = item.IsValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(item.FilePath.ExtensionLowered);
string filteredSourceDirectoryFileExtensionLowered = Path.Combine(sourceDirectory, $"{item.ImageFileHolder.NameWithoutExtension}{item.ImageFileHolder.ExtensionLowered}"); string filteredSourceDirectoryFileExtensionLowered = Path.Combine(sourceDirectory, $"{item.FilePath.NameWithoutExtension}{item.FilePath.ExtensionLowered}");
if (item.IsValidImageFormatExtension && item.ImageFileHolder.FullName.Length == filteredSourceDirectoryFileExtensionLowered.Length && item.ImageFileHolder.FullName != filteredSourceDirectoryFileExtensionLowered) if (item.IsValidImageFormatExtension && item.FilePath.FullName.Length == filteredSourceDirectoryFileExtensionLowered.Length && item.FilePath.FullName != filteredSourceDirectoryFileExtensionLowered)
File.Move(item.ImageFileHolder.FullName, filteredSourceDirectoryFileExtensionLowered); File.Move(item.FilePath.FullName, filteredSourceDirectoryFileExtensionLowered);
if (item.FileSizeChanged is null || item.FileSizeChanged.Value || item.LastWriteTimeChanged is null || item.LastWriteTimeChanged.Value || item.Property is null) if (item.FileSizeChanged is null || item.FileSizeChanged.Value || item.LastWriteTimeChanged is null || item.LastWriteTimeChanged.Value || item.Property is null)
{ {
property = GetImageProperty(metadata, item, sourceDirectoryFileTuples, parseExceptions, isIgnoreExtension); property = GetImageProperty(metadata, item, sourceDirectoryFileTuples, parseExceptions, isIgnoreExtension);
@ -277,11 +277,11 @@ public class A_Property
bool angleBracketCollectionAny = _AngleBracketCollection.Count != 0; bool angleBracketCollectionAny = _AngleBracketCollection.Count != 0;
if (!angleBracketCollectionAny) if (!angleBracketCollectionAny)
{ {
if (item.ImageFileHolder.DirectoryName is null) if (item.FilePath.DirectoryName is null)
throw new NullReferenceException(nameof(item.ImageFileHolder.DirectoryName)); throw new NullReferenceException(nameof(item.FilePath.DirectoryName));
SetAngleBracketCollection(item.ImageFileHolder.DirectoryName, !item.IsUniqueFileName); SetAngleBracketCollection(item.FilePath.DirectoryName, !item.IsUniqueFileName);
} }
bool isIgnoreExtension = item.IsValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(item.ImageFileHolder.ExtensionLowered); bool isIgnoreExtension = item.IsValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(item.FilePath.ExtensionLowered);
result = GetImageProperty(metadata, item, sourceDirectoryFileTuples, parseExceptions, isIgnoreExtension); result = GetImageProperty(metadata, item, sourceDirectoryFileTuples, parseExceptions, isIgnoreExtension);
if (!angleBracketCollectionAny) if (!angleBracketCollectionAny)
_AngleBracketCollection.Clear(); _AngleBracketCollection.Clear();

View File

@ -1,7 +1,9 @@
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
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.Properties;
namespace View_by_Distance.Property.Models.Stateless; namespace View_by_Distance.Property.Models.Stateless;
@ -28,19 +30,29 @@ public interface IProperty
static PropertyItem GetPropertyItem(ConstructorInfo constructorInfo, int id, short type, string value) => static PropertyItem GetPropertyItem(ConstructorInfo constructorInfo, int id, short type, string value) =>
Property.GetPropertyItem(constructorInfo, id, type, value); Property.GetPropertyItem(constructorInfo, id, type, value);
(string?, DateTime[], Shared.Models.Property) TestStatic_GetProperty(bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, Shared.Models.FileHolder fileHolder, Shared.Models.Property? property, bool isIgnoreExtension, bool isValidImageFormatExtension, int? id, ASCIIEncoding asciiEncoding) => (string?, DateTime[], Shared.Models.Property) TestStatic_GetProperty(bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, FilePath filePath, Shared.Models.Property? property, bool isIgnoreExtension, bool isValidImageFormatExtension, int? id, ASCIIEncoding asciiEncoding) =>
GetProperty(populateId, metadata, fileHolder, property, isIgnoreExtension, isValidImageFormatExtension, id, asciiEncoding); GetProperty(populateId, metadata, filePath, property, isIgnoreExtension, isValidImageFormatExtension, id, asciiEncoding);
static (string?, DateTime[], Shared.Models.Property) GetProperty(bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, Shared.Models.FileHolder fileHolder, Shared.Models.Property? property, bool isIgnoreExtension, bool isValidImageFormatExtension, int? id, ASCIIEncoding asciiEncoding) => static (string?, DateTime[], Shared.Models.Property) GetProperty(bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, FilePath filePath, Shared.Models.Property? property, bool isIgnoreExtension, bool isValidImageFormatExtension, int? id, ASCIIEncoding asciiEncoding) =>
Property.GetProperty(populateId, metadata, fileHolder, property, isIgnoreExtension, isValidImageFormatExtension, id, asciiEncoding); Property.GetProperty(populateId, metadata, filePath, property, isIgnoreExtension, isValidImageFormatExtension, id, asciiEncoding);
(DateTime?, DateTime[], int?, string?) TestStatic_Get(bool populateId, Shared.Models.FileHolder fileHolder, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding) => (DateTime?, DateTime[], int?, string?) TestStatic_Get(IPropertyConfiguration propertyConfiguration, bool populateId, FileHolder fileHolder, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding) =>
Get(populateId, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding); Get(propertyConfiguration, populateId, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
static (DateTime?, DateTime[], int?, string?) Get(bool populateId, Shared.Models.FileHolder fileHolder, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding) => static (DateTime?, DateTime[], int?, string?) Get(IPropertyConfiguration propertyConfiguration, bool populateId, FileHolder fileHolder, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding) =>
Property.Get(populateId, null, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding); Property.Get(populateId, null, FilePath.Get(propertyConfiguration, fileHolder, index: null), isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
(DateTime?, DateTime[], int?, string?) TestStatic_Get(bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, Shared.Models.FileHolder fileHolder, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding) => (DateTime?, DateTime[], int?, string?) TestStatic_Get(bool populateId, FilePath filePath, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding) =>
Get(populateId, metadata, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding); Get(populateId, filePath, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
static (DateTime?, DateTime[], int?, string?) Get(bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, Shared.Models.FileHolder fileHolder, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding) => static (DateTime?, DateTime[], int?, string?) Get(bool populateId, FilePath filePath, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding) =>
Property.Get(populateId, metadata, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding); Property.Get(populateId, null, filePath, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
(DateTime?, DateTime[], int?, string?) TestStatic_Get(bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, FilePath filePath, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding) =>
Get(populateId, metadata, filePath, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
static (DateTime?, DateTime[], int?, string?) Get(bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, FilePath filePath, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding) =>
Property.Get(populateId, metadata, filePath, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
(DateTime?, DateTime[], int?, string?) TestStatic_Get(IPropertyConfiguration propertyConfiguration, bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, FileHolder fileHolder, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding) =>
Get(propertyConfiguration, populateId, metadata, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
static (DateTime?, DateTime[], int?, string?) Get(IPropertyConfiguration propertyConfiguration, bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, FileHolder fileHolder, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding) =>
Property.Get(populateId, metadata, FilePath.Get(propertyConfiguration, fileHolder, index: null), isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
} }

View File

@ -47,10 +47,10 @@ internal partial class Property
return results; return results;
} }
private static List<DateTime> GetDateTimes(FileHolder fileHolder, DateTime?[] dateTimes) private static List<DateTime> GetDateTimes(FilePath filePath, DateTime?[] dateTimes)
{ {
List<DateTime> results = []; List<DateTime> results = [];
string[] digits = Digit().Split(fileHolder.FullName); string[] digits = Digit().Split(filePath.FullName);
foreach (string digit in digits) foreach (string digit in digits)
{ {
if (digit.Length != 4 || digit[..2] is not "19" and not "20" || !int.TryParse(digit, out int year)) if (digit.Length != 4 || digit[..2] is not "19" and not "20" || !int.TryParse(digit, out int year))
@ -75,7 +75,7 @@ internal partial class Property
return results; return results;
} }
internal static DateTime? GetDateTimeFromName(FileHolder fileHolder) internal static DateTime? GetDateTimeFromName(FilePath filePath)
{ {
DateTime? result = null; DateTime? result = null;
int length; int length;
@ -90,7 +90,7 @@ internal partial class Property
[string.Empty, "yyyyMMdd_", ticksExample], [string.Empty, "yyyyMMdd_", ticksExample],
[string.Empty, "yyyy-MM-dd_", ticksExample], [string.Empty, "yyyy-MM-dd_", ticksExample],
[string.Empty, "yyyy-MM-dd.", ticksExample], [string.Empty, "yyyy-MM-dd.", ticksExample],
[string.Empty, "yyyy-MM-dd.", $"{ticksExample}.{fileHolder.Length}"], [string.Empty, "yyyy-MM-dd.", $"{ticksExample}.{filePath.Length}"],
[string.Empty, "yyyy-MM-dd HH.mm.ss", string.Empty], [string.Empty, "yyyy-MM-dd HH.mm.ss", string.Empty],
[string.Empty, "yyyyMMdd_HHmmss", "_LLS"], [string.Empty, "yyyyMMdd_HHmmss", "_LLS"],
[string.Empty, "yyyyMMdd_HHmmss", "_HDR"], [string.Empty, "yyyyMMdd_HHmmss", "_HDR"],
@ -106,17 +106,17 @@ internal partial class Property
if (dateFormat.Length != 3) if (dateFormat.Length != 3)
throw new Exception(); throw new Exception();
fullFormat = string.Join(string.Empty, dateFormat); fullFormat = string.Join(string.Empty, dateFormat);
if (fileHolder.NameWithoutExtension.Length != fullFormat.Length) if (filePath.NameWithoutExtension.Length != fullFormat.Length)
continue; continue;
format = dateFormat[1]; format = dateFormat[1];
length = dateFormat[0].Length + dateFormat[1].Length; length = dateFormat[0].Length + dateFormat[1].Length;
for (int i = dateFormat[0].Length; i < length; i++) for (int i = dateFormat[0].Length; i < length; i++)
_ = value.Append(fileHolder.NameWithoutExtension[i]); _ = value.Append(filePath.NameWithoutExtension[i]);
if (value.Length != format.Length) if (value.Length != format.Length)
continue; continue;
if (DateTime.TryParseExact(value.ToString(), format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime checkDateTime)) if (DateTime.TryParseExact(value.ToString(), format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime checkDateTime))
{ {
if (fileHolder.NameWithoutExtension.Length < ticksExample.Length || !long.TryParse(fileHolder.NameWithoutExtension[^ticksExample.Length..], out long ticks)) if (filePath.NameWithoutExtension.Length < ticksExample.Length || !long.TryParse(filePath.NameWithoutExtension[^ticksExample.Length..], out long ticks))
result = checkDateTime; result = checkDateTime;
else else
result = new DateTime(ticks); result = new DateTime(ticks);
@ -183,12 +183,11 @@ internal partial class Property
#pragma warning disable CA1416 #pragma warning disable CA1416
internal static (string?, DateTime[], Shared.Models.Property) GetProperty(bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, FileHolder fileHolder, Shared.Models.Property? property, bool isIgnoreExtension, bool isValidImageFormatExtension, int? id, ASCIIEncoding asciiEncoding) internal static (string?, DateTime[], Shared.Models.Property) GetProperty(bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, FilePath filePath, Shared.Models.Property? property, bool isIgnoreExtension, bool isValidImageFormatExtension, int? id, ASCIIEncoding asciiEncoding)
{ {
Shared.Models.Property result; Shared.Models.Property result;
byte[] bytes; byte[] bytes;
string value; string value;
long fileLength;
string? message; string? message;
int? width = null; int? width = null;
int? height = null; int? height = null;
@ -206,27 +205,27 @@ internal partial class Property
DateTime? dateTimeOriginal = null; DateTime? dateTimeOriginal = null;
DateTime? dateTimeDigitized = null; DateTime? dateTimeDigitized = null;
DateTime? dateTimeOriginalByLogic = null; DateTime? dateTimeOriginalByLogic = null;
DateTime? dateTimeFromName = GetDateTimeFromName(fileHolder); DateTime? dateTimeFromName = GetDateTimeFromName(filePath);
if (!isValidImageFormatExtension && fileHolder.Exists && metadata is not null) if (!isValidImageFormatExtension && metadata is not null)
{ {
try try
{ {
IReadOnlyList<MetadataExtractor.Directory> directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(fileHolder.FullName); IReadOnlyList<MetadataExtractor.Directory> directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(filePath.FullName);
(dateTimeOriginalByLogic, DateTime?[] metadataDateTimes) = metadata.GetDateTimes(fileHolder, directories); (dateTimeOriginalByLogic, DateTime?[] metadataDateTimes) = metadata.GetDateTimes(filePath, directories);
dateTimesByLogic = GetDateTimes(metadataDateTimes); dateTimesByLogic = GetDateTimes(metadataDateTimes);
message = null; message = null;
} }
catch (Exception) catch (Exception)
{ {
dateTimesByLogic = []; dateTimesByLogic = [];
message = string.Concat(new StackFrame().GetMethod()?.Name, " <", fileHolder.FullName, ">"); message = string.Concat(new StackFrame().GetMethod()?.Name, " <", filePath.FullName, ">");
} }
} }
else if (!isIgnoreExtension && isValidImageFormatExtension && fileHolder.Exists) else if (!isIgnoreExtension && isValidImageFormatExtension)
{ {
try try
{ {
using Image image = Image.FromFile(fileHolder.FullName); using Image image = Image.FromFile(filePath.FullName);
width = image.Width; width = image.Width;
height = image.Height; height = image.Height;
if (populateId && id is null) if (populateId && id is null)
@ -320,51 +319,41 @@ internal partial class Property
} }
} }
message = null; message = null;
dateTimes = [fileHolder.LastWriteTime, fileHolder.CreationTime, dateTime, dateTimeDigitized, dateTimeOriginal, gpsDateStamp]; dateTimes = [new(filePath.LastWriteTicks), new(filePath.CreationTicks), dateTime, dateTimeDigitized, dateTimeOriginal, gpsDateStamp];
} }
catch (Exception) catch (Exception)
{ {
dateTimes = []; dateTimes = [];
message = string.Concat(new StackFrame().GetMethod()?.Name, " <", fileHolder.FullName, ">"); message = string.Concat(new StackFrame().GetMethod()?.Name, " <", filePath.FullName, ">");
} }
if (metadata is not null && dateTimeOriginal is null) if (metadata is not null && dateTimeOriginal is null)
{ {
try try
{ {
IReadOnlyList<MetadataExtractor.Directory> directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(fileHolder.FullName); IReadOnlyList<MetadataExtractor.Directory> directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(filePath.FullName);
(dateTimeOriginalByLogic, DateTime?[] metadataDateTimes) = metadata.GetDateTimes(fileHolder, directories); (dateTimeOriginalByLogic, DateTime?[] metadataDateTimes) = metadata.GetDateTimes(filePath, directories);
dateTimesByLogic = GetDateTimes(dateTimes, metadataDateTimes); dateTimesByLogic = GetDateTimes(dateTimes, metadataDateTimes);
message = null; message = null;
} }
catch (Exception) { message = string.Concat(new StackFrame().GetMethod()?.Name, " <", fileHolder.FullName, ">"); } catch (Exception) { message = string.Concat(new StackFrame().GetMethod()?.Name, " <", filePath.FullName, ">"); }
} }
if (dateTimeFromName is null) if (dateTimeFromName is null)
(dateTimeOriginalByLogic, dateTimesByLogic) = (dateTimeOriginal, GetDateTimes(fileHolder, dateTimes)); (dateTimeOriginalByLogic, dateTimesByLogic) = (dateTimeOriginal, GetDateTimes(filePath, dateTimes));
else else
(dateTimeOriginalByLogic, dateTimesByLogic) = (dateTimeOriginal, GetDateTimes(dateTimeFromName.Value, dateTimes)); (dateTimeOriginalByLogic, dateTimesByLogic) = (dateTimeOriginal, GetDateTimes(dateTimeFromName.Value, dateTimes));
} }
else else
(message, dateTimeOriginalByLogic, dateTimesByLogic) = (null, null, []); (message, dateTimeOriginalByLogic, dateTimesByLogic) = (null, null, []);
if (fileHolder.Length is null) if (property is not null)
fileLength = 0; result = new(property.CreationTime, dateTime, dateTimeDigitized, dateTimeFromName, dateTimeOriginalByLogic, filePath.Length, gpsDateStamp, height, id, keywords, property.LastWriteTime, make, model, orientation?.ToString(), width);
else else
fileLength = fileHolder.Length.Value; result = new(new(filePath.CreationTicks), dateTime, dateTimeDigitized, dateTimeFromName, dateTimeOriginalByLogic, filePath.Length, gpsDateStamp, height, id, keywords, new(filePath.LastWriteTicks), make, model, orientation?.ToString(), width);
if (fileHolder.CreationTime is null && property?.CreationTime is null)
throw new NullReferenceException(nameof(fileHolder.CreationTime));
if (fileHolder.LastWriteTime is null && property?.LastWriteTime is null)
throw new NullReferenceException(nameof(fileHolder.LastWriteTime));
if (fileHolder.CreationTime is not null && fileHolder.LastWriteTime is not null)
result = new(fileHolder.CreationTime.Value, dateTime, dateTimeDigitized, dateTimeFromName, dateTimeOriginalByLogic, fileLength, gpsDateStamp, height, id, keywords, fileHolder.LastWriteTime.Value, make, model, orientation?.ToString(), width);
else if (property is not null)
result = new(property.CreationTime, dateTime, dateTimeDigitized, dateTimeFromName, dateTimeOriginalByLogic, fileLength, gpsDateStamp, height, id, keywords, property.LastWriteTime, make, model, orientation?.ToString(), width);
else
throw new NullReferenceException(nameof(property));
return (message, dateTimesByLogic.ToArray(), result); return (message, dateTimesByLogic.ToArray(), result);
} }
#pragma warning restore CA1416 #pragma warning restore CA1416
internal static (DateTime?, DateTime[], int?, string?) Get(bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, FileHolder fileHolder, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding) internal static (DateTime?, DateTime[], int?, string?) Get(bool populateId, IMetadata<MetadataExtractor.Directory>? metadata, FilePath filePath, bool isIgnoreExtension, bool isValidImageFormatExtension, ASCIIEncoding asciiEncoding)
{ {
int? id = null; int? id = null;
string? message; string? message;
@ -373,7 +362,7 @@ internal partial class Property
if (isIgnoreExtension || !isValidImageFormatExtension) if (isIgnoreExtension || !isValidImageFormatExtension)
(message, dateTimes, property) = (null, [], null); (message, dateTimes, property) = (null, [], null);
else else
(message, dateTimes, property) = GetProperty(populateId, metadata, fileHolder, property, isIgnoreExtension, isValidImageFormatExtension, id, asciiEncoding); (message, dateTimes, property) = GetProperty(populateId, metadata, filePath, property, isIgnoreExtension, isValidImageFormatExtension, id, asciiEncoding);
return new(property?.DateTimeOriginal, dateTimes, property?.Id, message); return new(property?.DateTimeOriginal, dateTimes, property?.Id, message);
} }

View File

@ -268,7 +268,7 @@ public class Rename
if (fileHolder.DirectoryName is null) if (fileHolder.DirectoryName is null)
continue; continue;
} }
(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, _PropertyConfiguration.PopulatePropertyId, metadata, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
if (ffmpegFiles is not null) if (ffmpegFiles is not null)
{ {
fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(files[i]); fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(files[i]);
@ -402,7 +402,7 @@ public class Rename
{ {
if (record.Id is null) if (record.Id is null)
continue; continue;
paddedId = IId.GetPaddedId(_PropertyConfiguration, record.Id.Value, record.Index); paddedId = IId.GetPaddedId(_PropertyConfiguration, record.Id.Value, ignore: null, record.Index);
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)

View File

@ -193,7 +193,7 @@ public class C_Resize
{ {
Bitmap bitmap; Bitmap bitmap;
int outputResolutionWidth = resize[_OutputResolutionWidthIndex]; int outputResolutionWidth = resize[_OutputResolutionWidthIndex];
using Bitmap temp = new(mappingFromItem.ImageFileHolder.FullName, useIcm: false); using Bitmap temp = new(mappingFromItem.FilePath.FullName, useIcm: false);
int outputResolutionHeight = resize[_OutputResolutionHeightIndex]; int outputResolutionHeight = resize[_OutputResolutionHeightIndex];
PropertyItem[] propertyItems = temp.PropertyItems; PropertyItem[] propertyItems = temp.PropertyItems;
int outputResolutionOrientation = resize[_OutputResolutionOrientationIndex]; int outputResolutionOrientation = resize[_OutputResolutionOrientationIndex];
@ -236,7 +236,7 @@ public class C_Resize
private void SaveResizedSubfile5(MappingFromItem mappingFromItem, int[] resize, byte[] bytes) private void SaveResizedSubfile5(MappingFromItem mappingFromItem, int[] resize, byte[] bytes)
{ {
Bitmap bitmap; Bitmap bitmap;
using Bitmap temp = new(mappingFromItem.ImageFileHolder.FullName, useIcm: false); using Bitmap temp = new(mappingFromItem.FilePath.FullName, useIcm: false);
PropertyItem[] propertyItems = temp.PropertyItems; PropertyItem[] propertyItems = temp.PropertyItems;
int tempResolutionWidth = resize[_TempResolutionWidth]; int tempResolutionWidth = resize[_TempResolutionWidth];
int tempResolutionHeight = resize[_TempResolutionHeight]; int tempResolutionHeight = resize[_TempResolutionHeight];
@ -337,7 +337,7 @@ public class C_Resize
{ {
// if (fileInfo.Exists) // if (fileInfo.Exists)
// File.Delete(fileInfo.FullName); // File.Delete(fileInfo.FullName);
// File.Copy(mappingFromItem.ImageFileHolder.FullName, fileInfo.FullName); // File.Copy(mappingFromItem.FilePath.FullName, fileInfo.FullName);
// item.SetResizedFileHolder(_FileNameExtension, Shared.Models.Stateless.Methods.IFileHolder.Refresh(mappingFromItem.ResizedFileHolder)); // item.SetResizedFileHolder(_FileNameExtension, Shared.Models.Stateless.Methods.IFileHolder.Refresh(mappingFromItem.ResizedFileHolder));
// subFileTuples.Add(new Tuple<string, DateTime>(nameof(C_Resize), DateTime.Now)); // subFileTuples.Add(new Tuple<string, DateTime>(nameof(C_Resize), DateTime.Now));
} }
@ -429,10 +429,10 @@ public class C_Resize
} }
public FileHolder GetResizedFileHolder(string cResultsFullGroupDirectory, Item item, bool outputResolutionHasNumber) => public FileHolder GetResizedFileHolder(string cResultsFullGroupDirectory, Item item, bool outputResolutionHasNumber) =>
GetResizedFileHolder(cResultsFullGroupDirectory, item.FilePath, outputResolutionHasNumber, item.ImageFileHolder.Name); GetResizedFileHolder(cResultsFullGroupDirectory, item.FilePath, outputResolutionHasNumber, item.FilePath.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.FilePath, outputResolutionHasNumber, $"{id}{item.ImageFileHolder.ExtensionLowered}"); GetResizedFileHolder(cResultsFullGroupDirectory, item.FilePath, outputResolutionHasNumber, $"{id}{item.FilePath.ExtensionLowered}");
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) 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)
{ {
@ -441,7 +441,7 @@ public class C_Resize
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, filePath); (_, 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.FilePath.NameWithoutExtension}{mappingFromItem.FilePath.ExtensionLowered}.json"));
if (_ForceResizeLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete"))) if (_ForceResizeLastWriteTimeToCreationTime && !fileInfo.Exists && File.Exists(Path.ChangeExtension(fileInfo.FullName, ".delete")))
{ {
File.Move(Path.ChangeExtension(fileInfo.FullName, ".delete"), fileInfo.FullName); File.Move(Path.ChangeExtension(fileInfo.FullName, ".delete"), fileInfo.FullName);

View File

@ -86,7 +86,7 @@ public class SetCreatedDate
isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered); isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
if (isIgnoreExtension || !isValidImageFormatExtension) if (isIgnoreExtension || !isValidImageFormatExtension)
continue; continue;
(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, _PropertyConfiguration.PopulatePropertyId, metadata, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
if (dateTimeOriginal is null) if (dateTimeOriginal is null)
results.Add(new(fileHolder, false, dateTimes.Min())); results.Add(new(fileHolder, false, dateTimes.Min()));
else else

View File

@ -48,6 +48,21 @@ public record FileHolder(DateTime? CreationTime,
return result; return result;
} }
public static FileHolder Get(FilePath filePath)
{
FileHolder result;
result = new(new(filePath.CreationTicks),
filePath.DirectoryName,
true,
filePath.ExtensionLowered,
filePath.FullName,
new(filePath.LastWriteTicks),
filePath.Length,
filePath.Name,
Path.GetFileNameWithoutExtension(filePath.FullName));
return result;
}
} }
[JsonSourceGenerationOptions(WriteIndented = true)] [JsonSourceGenerationOptions(WriteIndented = true)]

View File

@ -10,6 +10,7 @@ public record FilePath(long CreationTicks,
string FileNameFirstSegment, string FileNameFirstSegment,
string FullName, string FullName,
int? Id, int? Id,
bool? IsIgnore,
bool IsIntelligentIdFormat, bool IsIntelligentIdFormat,
long LastWriteTicks, long LastWriteTicks,
long Length, long Length,
@ -38,14 +39,15 @@ public record FilePath(long CreationTicks,
string fileNameFirstSegment = fileHolder.Name.Split('.')[0]; string fileNameFirstSegment = fileHolder.Name.Split('.')[0];
int sortOrderOnlyLengthIndex = propertyConfiguration.Offset.ToString().Length; int sortOrderOnlyLengthIndex = propertyConfiguration.Offset.ToString().Length;
string fileDirectoryName = fileHolder.DirectoryName ?? throw new NullReferenceException(); string fileDirectoryName = fileHolder.DirectoryName ?? throw new NullReferenceException();
bool fileNameFirstSegmentIsIntelligentIdFormat = IId.NameWithoutExtensionIsIntelligentIdFormat(propertyConfiguration, fileNameFirstSegment); bool isIntelligentIdFormat = IId.NameWithoutExtensionIsIntelligentIdFormat(propertyConfiguration, fileNameFirstSegment);
bool fileNameFirstSegmentIsPaddedIntelligentIdFormat = IId.NameWithoutExtensionIsPaddedIntelligentIdFormat(propertyConfiguration, sortOrderOnlyLengthIndex, fileNameFirstSegment); bool isPaddedIntelligentIdFormat = IId.NameWithoutExtensionIsPaddedIntelligentIdFormat(propertyConfiguration, sortOrderOnlyLengthIndex, fileNameFirstSegment);
bool fileNameFirstSegmentIsIdFormat = !fileNameFirstSegmentIsPaddedIntelligentIdFormat && !fileNameFirstSegmentIsIntelligentIdFormat && IId.NameWithoutExtensionIsIdFormat(propertyConfiguration, fileHolder); bool fileNameFirstSegmentIsIdFormat = !isPaddedIntelligentIdFormat && !isIntelligentIdFormat && IId.NameWithoutExtensionIsIdFormat(propertyConfiguration, fileHolder);
if (!fileNameFirstSegmentIsIdFormat && !fileNameFirstSegmentIsIntelligentIdFormat && !fileNameFirstSegmentIsPaddedIntelligentIdFormat) bool? isIgnore = !isIntelligentIdFormat && !isPaddedIntelligentIdFormat ? null : fileNameFirstSegment[^1] is '2' or '8';
if (!fileNameFirstSegmentIsIdFormat && !isIntelligentIdFormat && !isPaddedIntelligentIdFormat)
(id, sortOder) = (null, null); (id, sortOder) = (null, null);
else if (fileNameFirstSegmentIsIntelligentIdFormat) else if (isIntelligentIdFormat)
(id, sortOder) = (IId.GetId(propertyConfiguration, fileNameFirstSegment), null); (id, sortOder) = (IId.GetId(propertyConfiguration, fileNameFirstSegment), null);
else if (fileNameFirstSegmentIsPaddedIntelligentIdFormat) else if (isPaddedIntelligentIdFormat)
{ {
if (!int.TryParse(fileNameFirstSegment[..sortOrderOnlyLengthIndex], out int absoluteValueOfSortOrder)) if (!int.TryParse(fileNameFirstSegment[..sortOrderOnlyLengthIndex], out int absoluteValueOfSortOrder))
(id, sortOder) = (null, null); (id, sortOder) = (null, null);
@ -68,7 +70,8 @@ public record FilePath(long CreationTicks,
fileNameFirstSegment, fileNameFirstSegment,
fileHolder.FullName, fileHolder.FullName,
id, id,
fileNameFirstSegmentIsIntelligentIdFormat, isIgnore,
isIntelligentIdFormat,
fileHolder.LastWriteTime.Value.Ticks, fileHolder.LastWriteTime.Value.Ticks,
fileHolder.Length.Value, fileHolder.Length.Value,
fileHolder.Name, fileHolder.Name,

View File

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

View File

@ -7,7 +7,7 @@ public record MappingFromItem(DateTime[] ContainerDateTimes,
DateTime? DateTimeDigitized, DateTime? DateTimeDigitized,
DateTime? DateTimeOriginal, DateTime? DateTimeOriginal,
int Id, int Id,
FileHolder ImageFileHolder, FilePath FilePath,
bool? IsWrongYear, bool? IsWrongYear,
string[] Keywords, string[] Keywords,
DateTime MinimumDateTime, DateTime MinimumDateTime,
@ -34,8 +34,8 @@ public record MappingFromItem(DateTime[] ContainerDateTimes,
throw new NotSupportedException(); throw new NotSupportedException();
List<DateTime> dateTimes = item.Property.GetDateTimes(); List<DateTime> dateTimes = item.Property.GetDateTimes();
DateTime minimumDateTime = Stateless.Methods.IProperty.GetMinimumDateTime(item.Property); DateTime minimumDateTime = Stateless.Methods.IProperty.GetMinimumDateTime(item.Property);
(bool? isWrongYear, _) = Stateless.Methods.IProperty.IsWrongYear(item.ImageFileHolder, item.Property.DateTimeOriginal, dateTimes); (bool? isWrongYear, _) = Stateless.Methods.IProperty.IsWrongYear(item.FilePath, item.Property.DateTimeOriginal, dateTimes);
result = new(containerDateTimes, item.Property.DateTimeDigitized, item.Property.DateTimeOriginal, item.Property.Id.Value, item.ImageFileHolder, isWrongYear, item.Property.Keywords ?? [], minimumDateTime, item.Property.Model, item.RelativePath, resizedFileHolder); result = new(containerDateTimes, item.Property.DateTimeDigitized, item.Property.DateTimeOriginal, item.Property.Id.Value, item.FilePath, isWrongYear, item.Property.Keywords ?? [], minimumDateTime, item.Property.Model, item.RelativePath, resizedFileHolder);
return result; return result;
} }

View File

@ -3,6 +3,6 @@ namespace View_by_Distance.Shared.Models.Methods;
public interface IMetadata<T> public interface IMetadata<T>
{ {
(DateTime?, DateTime?[]) GetDateTimes(FileHolder fileHolder, IReadOnlyList<T> directories); (DateTime?, DateTime?[]) GetDateTimes(FilePath filePath, IReadOnlyList<T> directories);
} }

View File

@ -6,7 +6,6 @@ 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 FilePath FilePath { get; }
public FileHolder ImageFileHolder { get; }
public bool? IsNotUniqueAndNeedsReview { get; } public bool? IsNotUniqueAndNeedsReview { get; }
public bool IsUniqueFileName { get; } public bool IsUniqueFileName { get; }
public bool IsValidImageFormatExtension { get; } public bool IsValidImageFormatExtension { get; }

View File

@ -11,17 +11,9 @@ internal abstract class Container
internal static DateTime[] GetContainerDateTimes(IEnumerable<Models.Item> items) internal static DateTime[] GetContainerDateTimes(IEnumerable<Models.Item> items)
{ {
DateTime[] results; DateTime[] results;
DateTime? containerMinimumDateTime; long containerMinimumTicks = (from l in items select l.FilePath.LastWriteTicks).Min();
DateTime? containerMaximumDateTime; long containerMaximumTicks = (from l in items select l.FilePath.LastWriteTicks).Max();
containerMinimumDateTime = (from l in items select l.ImageFileHolder.LastWriteTime).Min(); results = [new(containerMinimumTicks), new(containerMaximumTicks)];
if (containerMinimumDateTime is null)
containerMaximumDateTime = null;
else
containerMaximumDateTime = (from l in items select l.ImageFileHolder.LastWriteTime).Max();
if (containerMinimumDateTime is null || containerMaximumDateTime is null)
results = [];
else
results = [containerMinimumDateTime.Value, containerMaximumDateTime.Value];
return results; return results;
} }
@ -30,9 +22,8 @@ internal abstract class Container
List<Models.Item> results = []; List<Models.Item> results = [];
foreach (Models.Item item in container.Items) foreach (Models.Item item in container.Items)
{ {
if (item.ImageFileHolder is not null if (item.IsValidImageFormatExtension
&& item.IsValidImageFormatExtension && !propertyConfiguration.IgnoreExtensions.Contains(item.FilePath.ExtensionLowered))
&& !propertyConfiguration.IgnoreExtensions.Contains(item.ImageFileHolder.ExtensionLowered))
results.Add(item); results.Add(item);
} }
return results.ToArray(); return results.ToArray();
@ -87,12 +78,23 @@ internal abstract class Container
FilePath filePath = FilePath.Get(propertyConfiguration, imageFileInfo, index: null); FilePath filePath = FilePath.Get(propertyConfiguration, imageFileInfo, index: null);
bool? fileSizeChanged = property is not null ? property.FileSize != filePath.Length : null; bool? fileSizeChanged = property is not null ? property.FileSize != filePath.Length : null;
bool isValidImageFormatExtension = propertyConfiguration.ValidImageFormatExtensions.Contains(filePath.ExtensionLowered); bool isValidImageFormatExtension = propertyConfiguration.ValidImageFormatExtensions.Contains(filePath.ExtensionLowered);
if (property is not null && property.Keywords is not null && !IId.IsIgnore(filePath) && propertyConfiguration.IgnoreRulesKeyWords.Any(l => property.Keywords.Contains(l))) if (property is not null && property.Keywords is not null)
{ {
if (filePath.DirectoryName.Contains("Results") && filePath.DirectoryName.Contains("Resize")) if (filePath.IsIgnore is null)
File.Delete(filePath.FullName); throw new NullReferenceException();
else bool shouldIgnore = propertyConfiguration.IgnoreRulesKeyWords.Any(l => property.Keywords.Contains(l));
throw new NotSupportedException($"Rename File! <{filePath.FileNameFirstSegment}>"); if (shouldIgnore)
{
if (shouldIgnore)
{ }
}
if (filePath.IsIgnore.Value != shouldIgnore)
{
if (filePath.DirectoryName.Contains("Results") && filePath.DirectoryName.Contains("Resize"))
File.Delete(filePath.FullName);
else
throw new NotSupportedException($"Rename File! <{filePath.FileNameFirstSegment}>");
}
} }
string relativePath = IPath.GetRelativePath(filePair.Path, rootDirectoryLength, forceExtensionToLower: true); string relativePath = IPath.GetRelativePath(filePair.Path, rootDirectoryLength, forceExtensionToLower: true);
bool? lastWriteTimeChanged = property is not null ? propertyConfiguration.PropertiesChangedForProperty || property.LastWriteTime.Ticks != filePath.LastWriteTicks : null; bool? lastWriteTimeChanged = property is not null ? propertyConfiguration.PropertiesChangedForProperty || property.LastWriteTime.Ticks != filePath.LastWriteTicks : null;
@ -111,17 +113,19 @@ internal abstract class Container
File.SetCreationTime(sourceDirectoryFileHolder.FullName, new(filePath.LastWriteTicks)); 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(filePath, sourceDirectoryFileHolder, relativePath, imageFileInfo, filePair.IsNotUniqueAndNeedsReview, filePair.IsUnique, isValidImageFormatExtension, property, abandoned, fileSizeChanged, lastWriteTimeChanged); Models.Item item = new(filePath, sourceDirectoryFileHolder, relativePath, filePair.IsNotUniqueAndNeedsReview, filePair.IsUnique, isValidImageFormatExtension, property, abandoned, fileSizeChanged, lastWriteTimeChanged);
lock (results) lock (results)
results.Add(new(filePair.IsUnique, filePair.Collection, filePath, 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, ReadOnlyCollection<string[]> filesCollection, string directorySearchFilter)
{ {
List<FilePair> results = []; List<FilePair> results = [];
const string extension = ".json";
int maxDegreeOfParallelism = Environment.ProcessorCount; int maxDegreeOfParallelism = Environment.ProcessorCount;
int filesCollectionDirectoryLength = filesCollectionDirectory.Length; int filesCollectionDirectoryLength = filesCollectionDirectory.Length;
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism }; ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
List<Models.FilePair> filePairs = GetFilePairs(propertyConfiguration, directorySearchFilter, extension, aPropertySingletonDirectory, filesCollection);
_ = Parallel.For(0, filePairs.Count, parallelOptions, (i, state) => ParallelFor(propertyConfiguration, aPropertySingletonDirectory, extension, filesCollectionDirectoryLength, filePairs[i], results)); _ = Parallel.For(0, filePairs.Count, parallelOptions, (i, state) => ParallelFor(propertyConfiguration, aPropertySingletonDirectory, extension, filesCollectionDirectoryLength, filePairs[i], results));
return results; return results;
} }
@ -133,7 +137,6 @@ internal abstract class Container
List<Models.Item>? items; List<Models.Item>? items;
Models.Container container; Models.Container container;
List<string> directories = []; List<string> directories = [];
const string extension = ".json";
Dictionary<string, List<Models.Item>> directoryToItems = []; Dictionary<string, List<Models.Item>> directoryToItems = [];
foreach (string[] files in filesCollection) foreach (string[] files in filesCollection)
{ {
@ -151,9 +154,8 @@ internal abstract class Container
throw new Exception(); throw new Exception();
} }
} }
List<Models.FilePair> filePairs = GetFilePairs(propertyConfiguration, directorySearchFilter, extension, aPropertySingletonDirectory, filesCollection); List<FilePair> filePairs = GetFilePairs(propertyConfiguration, aPropertySingletonDirectory, filesCollectionDirectory, filesCollection, directorySearchFilter);
List<FilePair> collection = GetFilePairs(propertyConfiguration, aPropertySingletonDirectory, filesCollectionDirectory, extension, filePairs); foreach (FilePair filePair in filePairs)
foreach (FilePair filePair in collection)
{ {
if (!directoryToItems.TryGetValue(filePair.FilePath.DirectoryName, out items)) if (!directoryToItems.TryGetValue(filePair.FilePath.DirectoryName, out items))
{ {
@ -170,7 +172,7 @@ internal abstract class Container
container = new(keyValuePair.Key, keyValuePair.Value); container = new(keyValuePair.Key, keyValuePair.Value);
results.Add(container); results.Add(container);
} }
return (collection.Count, results.ToArray()); return (filePairs.Count, results.ToArray());
} }
internal static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, ReadOnlyCollection<string[]> filesCollection) internal static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, ReadOnlyCollection<string[]> filesCollection)

View File

@ -3,9 +3,9 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
public interface IId public interface IId
{ // ... { // ...
string TestStatic_GetIntelligentId(Properties.IPropertyConfiguration propertyConfiguration, long id, bool ignore) => string TestStatic_GetIntelligentId(Properties.IPropertyConfiguration propertyConfiguration, long id, bool? ignore) =>
GetIntelligentId(propertyConfiguration, id, ignore); GetIntelligentId(propertyConfiguration, id, ignore);
static string GetIntelligentId(Properties.IPropertyConfiguration propertyConfiguration, long id, bool ignore) => static string GetIntelligentId(Properties.IPropertyConfiguration propertyConfiguration, long id, bool? ignore) =>
Id.GetIntelligentId(propertyConfiguration, id, ignore); Id.GetIntelligentId(propertyConfiguration, id, ignore);
int TestStatic_GetId(Properties.IPropertyConfiguration propertyConfiguration, string intelligentId) => int TestStatic_GetId(Properties.IPropertyConfiguration propertyConfiguration, string intelligentId) =>
@ -13,15 +13,10 @@ public interface IId
static int GetId(Properties.IPropertyConfiguration propertyConfiguration, string intelligentId) => static int GetId(Properties.IPropertyConfiguration propertyConfiguration, string intelligentId) =>
Id.GetId(propertyConfiguration, intelligentId); Id.GetId(propertyConfiguration, intelligentId);
string TestStatic_GetPaddedId(Properties.IPropertyConfiguration propertyConfiguration, int id, int? index) => string TestStatic_GetPaddedId(Properties.IPropertyConfiguration propertyConfiguration, int id, bool? ignore, int? index) =>
GetPaddedId(propertyConfiguration, id, index); GetPaddedId(propertyConfiguration, id, ignore, index);
static string GetPaddedId(Properties.IPropertyConfiguration propertyConfiguration, int id, int? index) => static string GetPaddedId(Properties.IPropertyConfiguration propertyConfiguration, int id, bool? ignore, int? index) =>
Id.GetPaddedId(propertyConfiguration, id, index); Id.GetPaddedId(propertyConfiguration, id, ignore, index);
bool TestStatic_IsIgnore(FilePath filePath) =>
IsIgnore(filePath);
static bool IsIgnore(FilePath filePath) =>
filePath.FileNameFirstSegment[^1] is '2' or '8';
string TestStatic_GetIgnoreFullPath(FilePath filePath, Models.FileHolder fileHolder) => string TestStatic_GetIgnoreFullPath(FilePath filePath, Models.FileHolder fileHolder) =>
GetIgnoreFullPath(filePath, fileHolder); GetIgnoreFullPath(filePath, fileHolder);

View File

@ -33,10 +33,10 @@ public interface IProperty
static (bool?, string[]) IsWrongYear(string[] segments, string year) => static (bool?, string[]) IsWrongYear(string[] segments, string year) =>
Property.IsWrongYear(segments, year); Property.IsWrongYear(segments, year);
(bool?, string[]) TestStatic_IsWrongYear(Models.FileHolder fileHolder, DateTime? dateTimeOriginal, List<DateTime> dateTimes) => (bool?, string[]) TestStatic_IsWrongYear(FilePath filePath, DateTime? dateTimeOriginal, List<DateTime> dateTimes) =>
IsWrongYear(fileHolder, dateTimeOriginal, dateTimes); IsWrongYear(filePath, dateTimeOriginal, dateTimes);
static (bool?, string[]) IsWrongYear(Models.FileHolder fileHolder, DateTime? dateTimeOriginal, List<DateTime> dateTimes) => static (bool?, string[]) IsWrongYear(FilePath filePath, DateTime? dateTimeOriginal, List<DateTime> dateTimes) =>
Property.IsWrongYear(fileHolder, dateTimeOriginal, dateTimes); Property.IsWrongYear(filePath, dateTimeOriginal, dateTimes);
List<DateTime> TestStatic_GetDateTimes(Models.Property property) => List<DateTime> TestStatic_GetDateTimes(Models.Property property) =>
GetDateTimes(property); GetDateTimes(property);

View File

@ -35,7 +35,7 @@ internal abstract class Id
return result; return result;
} }
internal static string GetIntelligentId(Properties.IPropertyConfiguration propertyConfiguration, long id, bool ignore) internal static string GetIntelligentId(Properties.IPropertyConfiguration propertyConfiguration, long id, bool? ignore)
{ {
string result; string result;
StringBuilder stringBuilder = new(); StringBuilder stringBuilder = new();
@ -46,12 +46,12 @@ internal abstract class Id
List<char> resultAllInOneSubdirectoryChars = []; List<char> resultAllInOneSubdirectoryChars = [];
if (id > -1) if (id > -1)
{ {
key = ignore ? 8 : 9; key = ignore is not null && ignore.Value ? 8 : 9;
value = id.ToString().PadLeft(propertyConfiguration.IntMinValueLength, '0'); value = id.ToString().PadLeft(propertyConfiguration.IntMinValueLength, '0');
} }
else else
{ {
key = ignore ? 2 : 1; key = ignore is not null && ignore.Value ? 2 : 1;
value = id.ToString()[1..].PadLeft(propertyConfiguration.IntMinValueLength, '0'); value = id.ToString()[1..].PadLeft(propertyConfiguration.IntMinValueLength, '0');
} }
for (int i = value.Length - propertyConfiguration.ResultAllInOneSubdirectoryLength - 1; i > -1; i--) for (int i = value.Length - propertyConfiguration.ResultAllInOneSubdirectoryLength - 1; i > -1; i--)
@ -62,14 +62,14 @@ internal abstract class Id
return result; return result;
} }
internal static string GetPaddedId(Properties.IPropertyConfiguration propertyConfiguration, int id, int? index) internal static string GetPaddedId(Properties.IPropertyConfiguration propertyConfiguration, int id, bool? ignore, int? index)
{ {
string result; string result;
if (propertyConfiguration.Offset < 0) if (propertyConfiguration.Offset < 0)
result = Guid.NewGuid().ToString(); result = Guid.NewGuid().ToString();
else else
{ {
string intelligentId = GetIntelligentId(propertyConfiguration, id, ignore: false); string intelligentId = GetIntelligentId(propertyConfiguration, id, ignore);
int check = GetId(propertyConfiguration, intelligentId); int check = GetId(propertyConfiguration, intelligentId);
if (check != id) if (check != id)
throw new NotSupportedException(); throw new NotSupportedException();

View File

@ -10,11 +10,11 @@ internal abstract class Item
foreach (Models.Item item in itemsA) foreach (Models.Item item in itemsA)
{ {
results.Add(item); results.Add(item);
collection.Add(item.ImageFileHolder.FullName); collection.Add(item.FilePath.FullName);
} }
foreach (Models.Item item in itemsB) foreach (Models.Item item in itemsB)
{ {
if (collection.Contains(item.ImageFileHolder.FullName)) if (collection.Contains(item.FilePath.FullName))
continue; continue;
results.Add(item); results.Add(item);
} }

View File

@ -47,7 +47,7 @@ internal abstract class Property
return new(result, results); return new(result, results);
} }
internal static (bool?, string[]) IsWrongYear(Models.FileHolder fileHolder, DateTime? dateTimeOriginal, List<DateTime> dateTimes) internal static (bool?, string[]) IsWrongYear(FilePath filePath, DateTime? dateTimeOriginal, List<DateTime> dateTimes)
{ {
string[] results = []; string[] results = [];
bool? result = null; bool? result = null;
@ -55,8 +55,8 @@ internal abstract class Property
string directoryName; string directoryName;
string[] directorySegments; string[] directorySegments;
List<DateTime> collection = []; List<DateTime> collection = [];
string? check = Path.GetFullPath(fileHolder.FullName); string? check = Path.GetFullPath(filePath.FullName);
string? pathRoot = Path.GetPathRoot(fileHolder.FullName); string? pathRoot = Path.GetPathRoot(filePath.FullName);
if (string.IsNullOrEmpty(pathRoot)) if (string.IsNullOrEmpty(pathRoot))
throw new Exception(); throw new Exception();
if (dateTimeOriginal is not null) if (dateTimeOriginal is not null)

View File

@ -291,7 +291,6 @@ internal abstract partial class XDirectory
FileInfo fileInfo; FileInfo fileInfo;
FilePath filePath; FilePath filePath;
int directoryIndex; int directoryIndex;
bool ignore = false;
string paddedIdFile; string paddedIdFile;
bool wrapped = false; bool wrapped = false;
string intelligentId; string intelligentId;
@ -324,7 +323,7 @@ internal abstract partial class XDirectory
} }
if (ifCanUseId && filePath.IsIntelligentIdFormat && filePath.Id is not null && filePath.DirectoryName is not null) if (ifCanUseId && filePath.IsIntelligentIdFormat && filePath.Id is not null && filePath.DirectoryName is not null)
{ {
paddedId = IId.GetPaddedId(propertyConfiguration, filePath.Id.Value, i); paddedId = IId.GetPaddedId(propertyConfiguration, filePath.Id.Value, filePath.IsIgnore, i);
paddedIdFile = Path.Combine(filePath.DirectoryName, $"{paddedId}{filePath.ExtensionLowered}"); paddedIdFile = Path.Combine(filePath.DirectoryName, $"{paddedId}{filePath.ExtensionLowered}");
if (!File.Exists(paddedIdFile)) if (!File.Exists(paddedIdFile))
{ {
@ -342,7 +341,7 @@ internal abstract partial class XDirectory
{ {
if (filePath.Id is null) if (filePath.Id is null)
throw new NullReferenceException(nameof(filePath.Id)); throw new NullReferenceException(nameof(filePath.Id));
intelligentId = IId.GetIntelligentId(propertyConfiguration, filePath.Id.Value, ignore); intelligentId = IId.GetIntelligentId(propertyConfiguration, filePath.Id.Value, filePath.IsIgnore);
checkFile = Path.Combine(directory, $"{intelligentId}{filePath.ExtensionLowered}"); checkFile = Path.Combine(directory, $"{intelligentId}{filePath.ExtensionLowered}");
} }
if ((filePath.Id is not null && distinctIds.Contains(filePath.Id.Value)) || distinct.Contains(checkFile)) if ((filePath.Id is not null && distinctIds.Contains(filePath.Id.Value)) || distinct.Contains(checkFile))
@ -396,10 +395,9 @@ internal abstract partial class XDirectory
fileInfo = new(to); fileInfo = new(to);
if (fileInfo.Exists) if (fileInfo.Exists)
{ {
if (filePath.Length != fileInfo.Length || filePath.LastWriteTicks != fileInfo.LastWriteTime.Ticks) if (filePath.Length == fileInfo.Length && filePath.LastWriteTicks == fileInfo.LastWriteTime.Ticks)
fileInfo.Delete();
else
continue; continue;
fileInfo.Delete();
} }
results.Add(filePath.NameWithoutExtension); results.Add(filePath.NameWithoutExtension);
try try

View File

@ -165,8 +165,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(filePath, sourceDirectoryFileHolder, relativePath, fileHolder, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, property, false, false, false); item = new(filePath, sourceDirectoryFileHolder, relativePath, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, property, false, false, false);
Assert.IsNotNull(item.ImageFileHolder);
if (item.Property is null) if (item.Property is null)
{ {
property = propertyLogic.GetProperty(metadata, item, subFileTuples, parseExceptions); property = propertyLogic.GetProperty(metadata, item, subFileTuples, parseExceptions);

View File

@ -238,8 +238,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(filePath, sourceDirectoryFileHolder, relativePath, fileHolder, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, property, false, false, false); item = new(filePath, sourceDirectoryFileHolder, relativePath, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, property, false, false, false);
Assert.IsNotNull(item.ImageFileHolder);
if (item.Property is null) if (item.Property is null)
{ {
property = propertyLogic.GetProperty(metadata, item, subFileTuples, parseExceptions); property = propertyLogic.GetProperty(metadata, item, subFileTuples, parseExceptions);