Testing
This commit is contained in:
@ -48,7 +48,7 @@ internal abstract class Container
|
|||||||
continue;
|
continue;
|
||||||
foreach (Item item in filteredItems)
|
foreach (Item item in filteredItems)
|
||||||
{
|
{
|
||||||
if (item.ExifDirectory?.FilePath.Id is null || item.ResizedFileHolder is null)
|
if (item.ExifDirectory?.FilePath?.Id is null || item.ResizedFileHolder is null)
|
||||||
continue;
|
continue;
|
||||||
if (results.Contains(item.ExifDirectory.FilePath.Id.Value))
|
if (results.Contains(item.ExifDirectory.FilePath.Id.Value))
|
||||||
continue;
|
continue;
|
||||||
@ -151,7 +151,7 @@ internal abstract class Container
|
|||||||
exifDirectory = Metadata.Models.Stateless.Methods.IMetadata.GetExifDirectory(filePair.FilePath);
|
exifDirectory = Metadata.Models.Stateless.Methods.IMetadata.GetExifDirectory(filePair.FilePath);
|
||||||
ReadOnlyCollection<string> keywords = IMetaBase.GetKeywords(exifDirectory?.ExifBaseDirectories);
|
ReadOnlyCollection<string> keywords = IMetaBase.GetKeywords(exifDirectory?.ExifBaseDirectories);
|
||||||
bool? shouldIgnore = propertyConfiguration.IgnoreRulesKeyWords.Any(keywords.Contains);
|
bool? shouldIgnore = propertyConfiguration.IgnoreRulesKeyWords.Any(keywords.Contains);
|
||||||
bool? fileSizeChanged = exifDirectory is not null ? exifDirectory.FilePath.Length != filePair.FilePath.Length : null;
|
bool? fileSizeChanged = exifDirectory?.FilePath is not null ? exifDirectory.FilePath.Length != filePair.FilePath.Length : null;
|
||||||
bool isValidImageFormatExtension = propertyConfiguration.ValidImageFormatExtensions.Contains(filePair.FilePath.ExtensionLowered);
|
bool isValidImageFormatExtension = propertyConfiguration.ValidImageFormatExtensions.Contains(filePair.FilePath.ExtensionLowered);
|
||||||
bool? isArchive = filePair.FilePath.Id is null || splatNineIdentifiers is null ? null : splatNineIdentifiers.TryGetValue(filePair.FilePath.Id.Value, out Identifier? identifier);
|
bool? isArchive = filePair.FilePath.Id is null || splatNineIdentifiers is null ? null : splatNineIdentifiers.TryGetValue(filePair.FilePath.Id.Value, out Identifier? identifier);
|
||||||
if (exifDirectory is not null && filePair.FilePath.Id is not null && filePair.FilePath.HasIgnoreKeyword is not null && filePair.FilePath.HasDateTimeOriginal is not null)
|
if (exifDirectory is not null && filePair.FilePath.Id is not null && filePair.FilePath.HasIgnoreKeyword is not null && filePair.FilePath.HasDateTimeOriginal is not null)
|
||||||
@ -196,7 +196,7 @@ internal abstract class Container
|
|||||||
RenameFile(filePair, filePair.FilePath, change.Value, filePaths);
|
RenameFile(filePair, filePair.FilePath, change.Value, filePaths);
|
||||||
}
|
}
|
||||||
string relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(filePair.FilePath.FullName, rootDirectoryLength, forceExtensionToLower: true);
|
string relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(filePair.FilePath.FullName, rootDirectoryLength, forceExtensionToLower: true);
|
||||||
bool? lastWriteTimeChanged = exifDirectory is not null ? propertyConfiguration.PropertiesChangedForProperty || exifDirectory.FilePath.LastWriteTicks != filePair.FilePath.LastWriteTicks : null;
|
bool? lastWriteTimeChanged = exifDirectory?.FilePath is not null ? propertyConfiguration.PropertiesChangedForProperty || exifDirectory.FilePath.LastWriteTicks != filePair.FilePath.LastWriteTicks : null;
|
||||||
if (filePair.Match is not null)
|
if (filePair.Match is not null)
|
||||||
sourceDirectoryFileHolder = IFileHolder.Get(filePair.Match);
|
sourceDirectoryFileHolder = IFileHolder.Get(filePair.Match);
|
||||||
else if (!filePair.IsUnique)
|
else if (!filePair.IsUnique)
|
||||||
@ -279,7 +279,7 @@ internal abstract class Container
|
|||||||
continue;
|
continue;
|
||||||
foreach (Item item in filteredItems)
|
foreach (Item item in filteredItems)
|
||||||
{
|
{
|
||||||
if (item.ExifDirectory?.FilePath.Id is null || item.ResizedFileHolder is null)
|
if (item.ExifDirectory?.FilePath?.Id is null || item.ResizedFileHolder is null)
|
||||||
continue;
|
continue;
|
||||||
if (results.Contains(item.FilePath.FileNameFirstSegment))
|
if (results.Contains(item.FilePath.FileNameFirstSegment))
|
||||||
continue;
|
continue;
|
||||||
@ -308,7 +308,7 @@ internal abstract class Container
|
|||||||
}
|
}
|
||||||
foreach (Item item in filteredItems)
|
foreach (Item item in filteredItems)
|
||||||
{
|
{
|
||||||
if (item.ExifDirectory?.FilePath.Id is null || item.ResizedFileHolder is null)
|
if (item.ExifDirectory?.FilePath?.Id is null || item.ResizedFileHolder is null)
|
||||||
continue;
|
continue;
|
||||||
if (distinctItems)
|
if (distinctItems)
|
||||||
{
|
{
|
||||||
@ -397,7 +397,7 @@ internal abstract class Container
|
|||||||
{
|
{
|
||||||
bool result = false;
|
bool result = false;
|
||||||
string checkFile;
|
string checkFile;
|
||||||
FilePath filePath;
|
FilePath? filePath;
|
||||||
string subDirectory;
|
string subDirectory;
|
||||||
string directoryName;
|
string directoryName;
|
||||||
string checkDirectory;
|
string checkDirectory;
|
||||||
@ -408,8 +408,8 @@ internal abstract class Container
|
|||||||
foreach (string directory in directories)
|
foreach (string directory in directories)
|
||||||
{
|
{
|
||||||
fileHolder = IFileHolder.Get(Path.GetFileName(directory));
|
fileHolder = IFileHolder.Get(Path.GetFileName(directory));
|
||||||
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
|
filePath = FilePath.GetNullSafe(propertyConfiguration, fileHolder, index: null);
|
||||||
if (filePath.Id is null)
|
if (filePath?.Id is null)
|
||||||
continue;
|
continue;
|
||||||
if (!fileNamesToFiles.TryGetValue(filePath.Id.Value, out collection))
|
if (!fileNamesToFiles.TryGetValue(filePath.Id.Value, out collection))
|
||||||
throw new Exception();
|
throw new Exception();
|
||||||
|
@ -96,7 +96,7 @@ public partial class DragDropSearch : Form
|
|||||||
List<Item> collection = Program.GetItemCollection(_Configuration, containers);
|
List<Item> collection = Program.GetItemCollection(_Configuration, containers);
|
||||||
foreach (Item item in collection)
|
foreach (Item item in collection)
|
||||||
{
|
{
|
||||||
if (item.ExifDirectory?.FilePath.Id is null)
|
if (item.ExifDirectory?.FilePath?.Id is null)
|
||||||
continue;
|
continue;
|
||||||
if (_IdToItem.ContainsKey(item.ExifDirectory.FilePath.Id.Value))
|
if (_IdToItem.ContainsKey(item.ExifDirectory.FilePath.Id.Value))
|
||||||
continue;
|
continue;
|
||||||
|
@ -129,7 +129,7 @@ public class DuplicateSearch
|
|||||||
containerDateTimes = Container.Models.Stateless.Methods.IContainer.GetContainerDateTimes(validImageItems);
|
containerDateTimes = Container.Models.Stateless.Methods.IContainer.GetContainerDateTimes(validImageItems);
|
||||||
foreach (Item item in validImageItems)
|
foreach (Item item in validImageItems)
|
||||||
{
|
{
|
||||||
if (item.ExifDirectory?.FilePath.Id is null)
|
if (item.ExifDirectory?.FilePath?.Id is null)
|
||||||
{
|
{
|
||||||
if (int.TryParse(item.FilePath.NameWithoutExtension, out int id))
|
if (int.TryParse(item.FilePath.NameWithoutExtension, out int id))
|
||||||
continue;
|
continue;
|
||||||
|
@ -197,7 +197,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
string[] changesFrom = [nameof(A_Property)];
|
string[] changesFrom = [nameof(A_Property)];
|
||||||
List<Tuple<string, DateTime>> subFileTuples = [];
|
List<Tuple<string, DateTime>> subFileTuples = [];
|
||||||
FileHolder resizedFileHolder = _Resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber);
|
FileHolder resizedFileHolder = _Resize.GetResizedFileHolder(cResultsFullGroupDirectory, item, outputResolutionHasNumber);
|
||||||
if (item.ExifDirectory is null || item.ExifDirectory.FilePath.Id is null)
|
if (item.ExifDirectory is null || item.ExifDirectory.FilePath?.Id is null)
|
||||||
throw new Exception();
|
throw new Exception();
|
||||||
if (!item.SourceDirectoryFileHolder.Exists || item.SourceDirectoryFileHolder.CreationTime is null || item.SourceDirectoryFileHolder.LastWriteTime is null || item.Any())
|
if (!item.SourceDirectoryFileHolder.Exists || item.SourceDirectoryFileHolder.CreationTime is null || item.SourceDirectoryFileHolder.LastWriteTime is null || item.Any())
|
||||||
throw new Exception();
|
throw new Exception();
|
||||||
@ -339,6 +339,9 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
dlibDotNet.ConstructProgressBar(filteredItems.Count, message);
|
dlibDotNet.ConstructProgressBar(filteredItems.Count, message);
|
||||||
_ = Parallel.For(0, filteredItems.Count, parallelOptions, (i, state) =>
|
_ = Parallel.For(0, filteredItems.Count, parallelOptions, (i, state) =>
|
||||||
{
|
{
|
||||||
|
Item item = filteredItems[i];
|
||||||
|
if (!item.SourceDirectoryFileHolder.Exists || item.SourceDirectoryFileHolder.CreationTime is null || item.SourceDirectoryFileHolder.LastWriteTime is null || item.Any())
|
||||||
|
return;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
result += FullParallelForWork(metadata,
|
result += FullParallelForWork(metadata,
|
||||||
@ -351,7 +354,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
fileNameToCollection,
|
fileNameToCollection,
|
||||||
record,
|
record,
|
||||||
container,
|
container,
|
||||||
filteredItems[i],
|
item,
|
||||||
containerDateTimes,
|
containerDateTimes,
|
||||||
isFocusRelativePath);
|
isFocusRelativePath);
|
||||||
if (!anyPropertiesChangedForX && (i == 0 || sourceDirectoryChanges.Count > 0))
|
if (!anyPropertiesChangedForX && (i == 0 || sourceDirectoryChanges.Count > 0))
|
||||||
@ -622,7 +625,25 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
if (string.IsNullOrEmpty(json))
|
if (string.IsNullOrEmpty(json))
|
||||||
result = null;
|
result = null;
|
||||||
else
|
else
|
||||||
|
{
|
||||||
result = JsonSerializer.Deserialize(json, ExifDirectorySourceGenerationContext.Default.ExifDirectory);
|
result = JsonSerializer.Deserialize(json, ExifDirectorySourceGenerationContext.Default.ExifDirectory);
|
||||||
|
if (result?.FilePath?.Id is null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
result = Metadata.Models.Stateless.Methods.IMetadata.GetExifDirectory(filePair.FilePath);
|
||||||
|
json = JsonSerializer.Serialize(result, ExifDirectorySourceGenerationContext.Default.ExifDirectory);
|
||||||
|
_ = Shared.Models.Stateless.Methods.IPath.WriteAllText(filePair.Match.FullName, json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
|
||||||
|
}
|
||||||
|
catch (Exception) { result = null; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (result is not null && result.FilePath?.Id is null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ result = Metadata.Models.Stateless.Methods.IMetadata.GetExifDirectory(filePair.FilePath); }
|
||||||
|
catch (Exception) { result = null; }
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -723,7 +744,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
List<(string, string, string)> collection = [];
|
List<(string, string, string)> collection = [];
|
||||||
foreach (Item item in distinctValidImageItems)
|
foreach (Item item in distinctValidImageItems)
|
||||||
{
|
{
|
||||||
if (item.ExifDirectory?.FilePath.Id is null)
|
if (item.ExifDirectory?.FilePath?.Id is null)
|
||||||
continue;
|
continue;
|
||||||
if (item.IsNotUniqueAndNeedsReview is null || !item.IsNotUniqueAndNeedsReview.Value)
|
if (item.IsNotUniqueAndNeedsReview is null || !item.IsNotUniqueAndNeedsReview.Value)
|
||||||
continue;
|
continue;
|
||||||
@ -736,7 +757,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
}
|
}
|
||||||
foreach (Item item in distinctValidImageItems)
|
foreach (Item item in distinctValidImageItems)
|
||||||
{
|
{
|
||||||
if (item.ExifDirectory?.FilePath.Id is null)
|
if (item.ExifDirectory?.FilePath?.Id is null)
|
||||||
continue;
|
continue;
|
||||||
dateTime = IDate.GetDateTimeOriginal(item.ExifDirectory);
|
dateTime = IDate.GetDateTimeOriginal(item.ExifDirectory);
|
||||||
if (dateTime is null)
|
if (dateTime is null)
|
||||||
@ -1020,8 +1041,11 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
if (exifDirectory is null)
|
if (exifDirectory is null)
|
||||||
return;
|
return;
|
||||||
lock (results)
|
lock (results)
|
||||||
|
{
|
||||||
|
if (!results.ContainsKey(filePair.FilePath.Id.Value))
|
||||||
results.Add(filePair.FilePath.Id.Value, exifDirectory);
|
results.Add(filePair.FilePath.Id.Value, exifDirectory);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private bool GetRunToDoCollectionFirst(Models.Configuration configuration, long ticks, string[] checkDirectories)
|
private bool GetRunToDoCollectionFirst(Models.Configuration configuration, long ticks, string[] checkDirectories)
|
||||||
{
|
{
|
||||||
@ -1121,7 +1145,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
configurationOutputResolutionsHas = true;
|
configurationOutputResolutionsHas = true;
|
||||||
if (!runToDoCollectionFirst)
|
if (!runToDoCollectionFirst)
|
||||||
break;
|
break;
|
||||||
record = GetFilesCollectionThenCopyOrMove(dlibDotNet, ticks, fileSearchFilter, directorySearchFilter, bResultsFullGroupDirectory, outputResolution);
|
record = GetFilesCollectionThenCopyOrMove(dlibDotNet, metadata, ticks, fileSearchFilter, directorySearchFilter, bResultsFullGroupDirectory, outputResolution);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fPhotoPrismContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(F_PhotoPrism), _Configuration.PropertyConfiguration.ResultContent);
|
fPhotoPrismContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(F_PhotoPrism), _Configuration.PropertyConfiguration.ResultContent);
|
||||||
@ -1274,7 +1298,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
foreach (Item item in filteredItems)
|
foreach (Item item in filteredItems)
|
||||||
{
|
{
|
||||||
count++;
|
count++;
|
||||||
if (item.ExifDirectory is null || item.ExifDirectory.FilePath.Id is null)
|
if (item.ExifDirectory is null || item.ExifDirectory.FilePath?.Id is null)
|
||||||
{
|
{
|
||||||
items.Add(item);
|
items.Add(item);
|
||||||
continue;
|
continue;
|
||||||
@ -1291,7 +1315,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
throw new Exception($"{items.Count} item(s) of {count} item(s) are not setup!");
|
throw new Exception($"{items.Count} item(s) of {count} item(s) are not setup!");
|
||||||
}
|
}
|
||||||
|
|
||||||
private Record GetFilesCollectionThenCopyOrMove(IDlibDotNet dlibDotNet, long ticks, string fileSearchFilter, string directorySearchFilter, string bResultsFullGroupDirectory, string outputResolution)
|
private Record GetFilesCollectionThenCopyOrMove(IDlibDotNet dlibDotNet, B_Metadata metadata, long ticks, string fileSearchFilter, string directorySearchFilter, string bResultsFullGroupDirectory, string outputResolution)
|
||||||
{
|
{
|
||||||
Record result;
|
Record result;
|
||||||
int count;
|
int count;
|
||||||
@ -1300,6 +1324,8 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
ReadOnlyCollection<FilePair> filePairs;
|
ReadOnlyCollection<FilePair> filePairs;
|
||||||
int maxDegreeOfParallelism = Environment.ProcessorCount;
|
int maxDegreeOfParallelism = Environment.ProcessorCount;
|
||||||
Dictionary<int, ExifDirectory> exifDirectoriesById = [];
|
Dictionary<int, ExifDirectory> exifDirectoriesById = [];
|
||||||
|
foreach (KeyValuePair<int, ExifDirectory> keyValuePair in metadata.ExifDirectoriesById)
|
||||||
|
exifDirectoriesById.Add(keyValuePair.Key, keyValuePair.Value);
|
||||||
string filesCollectionRootDirectory = _Configuration.PropertyConfiguration.RootDirectory;
|
string filesCollectionRootDirectory = _Configuration.PropertyConfiguration.RootDirectory;
|
||||||
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
|
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
|
||||||
(string cResultsFullGroupDirectory, _, _, _) = dlibDotNet.GetResultsFullGroupDirectories(outputResolution);
|
(string cResultsFullGroupDirectory, _, _, _) = dlibDotNet.GetResultsFullGroupDirectories(outputResolution);
|
||||||
@ -1312,7 +1338,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
ReadOnlyCollection<ReadOnlyCollection<FilePath>> filePathsCollection = IDirectory.GetFilePathCollections(_Configuration.PropertyConfiguration, directorySearchFilter, fileSearchFilter, filesCollectionRootDirectory, useIgnoreExtensions: true, useCeilingAverage: false);
|
ReadOnlyCollection<ReadOnlyCollection<FilePath>> filePathsCollection = IDirectory.GetFilePathCollections(_Configuration.PropertyConfiguration, directorySearchFilter, fileSearchFilter, filesCollectionRootDirectory, useIgnoreExtensions: true, useCeilingAverage: false);
|
||||||
count = filePathsCollection.Select(l => l.Count).Sum();
|
count = filePathsCollection.Select(l => l.Count).Sum();
|
||||||
filePairs = IFilePair.GetFilePairs(_Configuration.PropertyConfiguration, directorySearchFilter, extension, jsonGroupDirectory, filePathsCollection);
|
filePairs = IFilePair.GetFilePairs(_Configuration.PropertyConfiguration, directorySearchFilter, extension, jsonGroupDirectory, filePathsCollection);
|
||||||
message = $") Preloading ExifDirectory Dictionary - {(int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds)} total second(s)";
|
message = $") {nameof(DlibDotNet)} - Preloading ExifDirectory Dictionary - {(int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds)} total second(s)";
|
||||||
dlibDotNet.ConstructProgressBar(count, message);
|
dlibDotNet.ConstructProgressBar(count, message);
|
||||||
_ = Parallel.For(0, filePairs.Count, parallelOptions, (i, state) => ParallelFor(filePairs[i], exifDirectoriesById, dlibDotNet.Tick));
|
_ = Parallel.For(0, filePairs.Count, parallelOptions, (i, state) => ParallelFor(filePairs[i], exifDirectoriesById, dlibDotNet.Tick));
|
||||||
if (exifDirectoriesById.Count == 0)
|
if (exifDirectoriesById.Count == 0)
|
||||||
@ -1438,7 +1464,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
isFocusRelativePath = string.IsNullOrEmpty(_Configuration.FocusDirectory) ? null : container.SourceDirectory.StartsWith(focusRelativePath);
|
isFocusRelativePath = string.IsNullOrEmpty(_Configuration.FocusDirectory) ? null : container.SourceDirectory.StartsWith(focusRelativePath);
|
||||||
foreach (Item item in filteredItems)
|
foreach (Item item in filteredItems)
|
||||||
{
|
{
|
||||||
if (item.ExifDirectory?.FilePath.Id is null || item.ResizedFileHolder is null)
|
if (item.ExifDirectory?.FilePath?.Id is null || item.ResizedFileHolder is null)
|
||||||
continue;
|
continue;
|
||||||
mappingFromItem = IMappingFromItem.GetMappingFromItem(containerDateTimes, item, item.ResizedFileHolder);
|
mappingFromItem = IMappingFromItem.GetMappingFromItem(containerDateTimes, item, item.ResizedFileHolder);
|
||||||
if (distinctItems)
|
if (distinctItems)
|
||||||
@ -1634,11 +1660,11 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
|
|||||||
MappingFromFilterPre mappingFromFilterPre;
|
MappingFromFilterPre mappingFromFilterPre;
|
||||||
MappingFromFilterPost mappingFromFilterPost;
|
MappingFromFilterPost mappingFromFilterPost;
|
||||||
bool? isFocusModel = GetIsFocusModel(item.ExifDirectory);
|
bool? isFocusModel = GetIsFocusModel(item.ExifDirectory);
|
||||||
ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers = mapLogic.GetWholePercentagesToPersonContainers(item.ExifDirectory?.FilePath.Id);
|
ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers = mapLogic.GetWholePercentagesToPersonContainers(item.ExifDirectory?.FilePath?.Id);
|
||||||
long[] jLinkResolvedPersonKeys = _JLinkResolvedDirectories.Select(l => l.PersonKey).ToArray();
|
long[] jLinkResolvedPersonKeys = _JLinkResolvedDirectories.Select(l => l.PersonKey).ToArray();
|
||||||
foreach (Shared.Models.Face face in faces)
|
foreach (Shared.Models.Face face in faces)
|
||||||
{
|
{
|
||||||
if (item.ExifDirectory?.FilePath.Id is null || face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
|
if (item.ExifDirectory?.FilePath?.Id is null || face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
|
||||||
{
|
{
|
||||||
canReMap = null;
|
canReMap = null;
|
||||||
isFocusPerson = null;
|
isFocusPerson = null;
|
||||||
|
@ -320,7 +320,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
|||||||
public ReadOnlyCollection<LocationContainer> GetLocationContainers(Item item)
|
public ReadOnlyCollection<LocationContainer> GetLocationContainers(Item item)
|
||||||
{
|
{
|
||||||
LocationContainer[] results;
|
LocationContainer[] results;
|
||||||
if (item.ExifDirectory?.FilePath.Id is null)
|
if (item.ExifDirectory?.FilePath?.Id is null)
|
||||||
results = [];
|
results = [];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -110,7 +110,7 @@ internal abstract class MapLogic
|
|||||||
List<Face> results = [];
|
List<Face> results = [];
|
||||||
foreach (Item item in items)
|
foreach (Item item in items)
|
||||||
{
|
{
|
||||||
if (item.ExifDirectory?.FilePath.Id is null || item.ResizedFileHolder is null)
|
if (item.ExifDirectory?.FilePath?.Id is null || item.ResizedFileHolder is null)
|
||||||
continue;
|
continue;
|
||||||
foreach (Face face in item.Faces)
|
foreach (Face face in item.Faces)
|
||||||
{
|
{
|
||||||
|
@ -50,15 +50,15 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
|
|||||||
else
|
else
|
||||||
throw new Exception();
|
throw new Exception();
|
||||||
}
|
}
|
||||||
List<ExifDirectory> results = [];
|
|
||||||
string jsonGroupDirectory;
|
string jsonGroupDirectory;
|
||||||
const string extension = ".json";
|
const string extension = ".json";
|
||||||
const string fileSearchFilter = "*";
|
const string fileSearchFilter = "*";
|
||||||
string filesCollectionRootDirectory;
|
string filesCollectionRootDirectory;
|
||||||
const string directorySearchFilter = "*";
|
const string directorySearchFilter = "*";
|
||||||
int maxDegreeOfParallelism = Environment.ProcessorCount;
|
|
||||||
filesCollectionRootDirectory = propertyConfiguration.RootDirectory;
|
|
||||||
Dictionary<int, ExifDirectory> exifDirectoriesById = [];
|
Dictionary<int, ExifDirectory> exifDirectoriesById = [];
|
||||||
|
int maxDegreeOfParallelism = Environment.ProcessorCount;
|
||||||
|
Action? tick = dlibDotNet is null ? null : dlibDotNet.Tick;
|
||||||
|
filesCollectionRootDirectory = propertyConfiguration.RootDirectory;
|
||||||
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
|
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
|
||||||
string jsonGroupSingletonDirectory = Path.Combine(bResultsFullGroupDirectory, propertyConfiguration.ResultSingleton);
|
string jsonGroupSingletonDirectory = Path.Combine(bResultsFullGroupDirectory, propertyConfiguration.ResultSingleton);
|
||||||
string jsonGroupCollectionDirectory = Path.Combine(bResultsFullGroupDirectory, propertyConfiguration.ResultCollection);
|
string jsonGroupCollectionDirectory = Path.Combine(bResultsFullGroupDirectory, propertyConfiguration.ResultCollection);
|
||||||
@ -67,16 +67,10 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
|
|||||||
ReadOnlyCollection<ReadOnlyCollection<FilePath>> filePathsCollection = IDirectory.GetFilePathCollections(propertyConfiguration, directorySearchFilter, fileSearchFilter, filesCollectionRootDirectory, useIgnoreExtensions: true, useCeilingAverage: false);
|
ReadOnlyCollection<ReadOnlyCollection<FilePath>> filePathsCollection = IDirectory.GetFilePathCollections(propertyConfiguration, directorySearchFilter, fileSearchFilter, filesCollectionRootDirectory, useIgnoreExtensions: true, useCeilingAverage: false);
|
||||||
ReadOnlyDictionary<int, List<FilePath>> fileNamesToFiles = FilePath.GetFilesKeyValuePairs(filePathsCollection);
|
ReadOnlyDictionary<int, List<FilePath>> fileNamesToFiles = FilePath.GetFilesKeyValuePairs(filePathsCollection);
|
||||||
ReadOnlyCollection<FilePair> filePairs = IFilePair.GetFilePairs(propertyConfiguration, directorySearchFilter, extension, jsonGroupSingletonDirectory, filePathsCollection, fileNamesToFiles);
|
ReadOnlyCollection<FilePair> filePairs = IFilePair.GetFilePairs(propertyConfiguration, directorySearchFilter, extension, jsonGroupSingletonDirectory, filePathsCollection, fileNamesToFiles);
|
||||||
string message = $") Preloading ExifDirectory Dictionary - {(int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds)} total second(s)";
|
string message = $") {nameof(B_Metadata)} - Preloading ExifDirectory Dictionary - {(int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds)} total second(s)";
|
||||||
dlibDotNet?.ConstructProgressBar(filePairs.Count, message);
|
dlibDotNet?.ConstructProgressBar(filePairs.Count, message);
|
||||||
_ = Parallel.For(0, filePairs.Count, parallelOptions, (i, state) => ParallelFor(dlibDotNet, filePairs[i], results));
|
_ = Parallel.For(0, filePairs.Count, parallelOptions, (i, state) => ParallelFor(filePairs[i], exifDirectoriesById, tick));
|
||||||
jsonGroupDirectory = Path.Combine(bResultsFullGroupDirectory, propertyConfiguration.ResultCollection);
|
jsonGroupDirectory = Path.Combine(bResultsFullGroupDirectory, propertyConfiguration.ResultCollection);
|
||||||
foreach (ExifDirectory exifDirectory in results)
|
|
||||||
{
|
|
||||||
if (exifDirectory.FilePath.Id is null || exifDirectoriesById.ContainsKey(exifDirectory.FilePath.Id.Value))
|
|
||||||
continue;
|
|
||||||
exifDirectoriesById.Add(exifDirectory.FilePath.Id.Value, exifDirectory);
|
|
||||||
}
|
|
||||||
ExifDirectoriesById = new(exifDirectoriesById);
|
ExifDirectoriesById = new(exifDirectoriesById);
|
||||||
DateGroupDirectory = bResultsFullGroupDirectory;
|
DateGroupDirectory = bResultsFullGroupDirectory;
|
||||||
SingletonById = fileNamesToFiles;
|
SingletonById = fileNamesToFiles;
|
||||||
@ -86,16 +80,19 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
|
|||||||
Collection = filePathsSingletonCollection[0];
|
Collection = filePathsSingletonCollection[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ParallelFor(IDlibDotNet? dlibDotNet, FilePair filePair, List<ExifDirectory> results)
|
private void ParallelFor(FilePair filePair, Dictionary<int, ExifDirectory> results, Action? tick)
|
||||||
{
|
{
|
||||||
dlibDotNet?.Tick();
|
tick?.Invoke();
|
||||||
if (filePair.FilePath.Id is null)
|
if (filePair.FilePath.Id is null)
|
||||||
return;
|
return;
|
||||||
ExifDirectory? exifDirectory = GetExifDirectory(filePair);
|
ExifDirectory? exifDirectory = GetExifDirectory(filePair);
|
||||||
if (exifDirectory is null)
|
if (exifDirectory is null)
|
||||||
return;
|
return;
|
||||||
lock (results)
|
lock (results)
|
||||||
results.Add(exifDirectory);
|
{
|
||||||
|
if (!results.ContainsKey(filePair.FilePath.Id.Value))
|
||||||
|
results.Add(filePair.FilePath.Id.Value, exifDirectory);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ExifDirectory? GetExifDirectory(FilePair filePair)
|
private static ExifDirectory? GetExifDirectory(FilePair filePair)
|
||||||
@ -105,11 +102,24 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
|
|||||||
result = null;
|
result = null;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string json = File.ReadAllText(filePair.Match.FullName);
|
string json;
|
||||||
|
json = File.ReadAllText(filePair.Match.FullName);
|
||||||
if (string.IsNullOrEmpty(json))
|
if (string.IsNullOrEmpty(json))
|
||||||
result = null;
|
result = null;
|
||||||
else
|
else
|
||||||
|
{
|
||||||
result = JsonSerializer.Deserialize(json, ExifDirectorySourceGenerationContext.Default.ExifDirectory);
|
result = JsonSerializer.Deserialize(json, ExifDirectorySourceGenerationContext.Default.ExifDirectory);
|
||||||
|
if (result?.FilePath?.Id is null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
result = Stateless.Methods.IMetadata.GetExifDirectory(filePair.FilePath);
|
||||||
|
json = JsonSerializer.Serialize(result, ExifDirectorySourceGenerationContext.Default.ExifDirectory);
|
||||||
|
_ = Shared.Models.Stateless.Methods.IPath.WriteAllText(filePair.Match.FullName, json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
|
||||||
|
}
|
||||||
|
catch (Exception) { result = null; }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ namespace View_by_Distance.Shared.Models;
|
|||||||
public record ExifDirectory(AviDirectory[] AviDirectories,
|
public record ExifDirectory(AviDirectory[] AviDirectories,
|
||||||
ExifDirectoryBase[] ExifBaseDirectories,
|
ExifDirectoryBase[] ExifBaseDirectories,
|
||||||
FileMetadataDirectory[] FileMetadataDirectories,
|
FileMetadataDirectory[] FileMetadataDirectories,
|
||||||
FilePath FilePath,
|
FilePath? FilePath,
|
||||||
GifHeaderDirectory[] GifHeaderDirectories,
|
GifHeaderDirectory[] GifHeaderDirectories,
|
||||||
GpsDirectory[] GpsDirectories,
|
GpsDirectory[] GpsDirectories,
|
||||||
int? Height,
|
int? Height,
|
||||||
|
@ -21,6 +21,20 @@ public record FilePath(long CreationTicks,
|
|||||||
int? SortOrder)
|
int? SortOrder)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
public static FilePath? GetNullSafe(Properties.IPropertyConfiguration propertyConfiguration, FileHolder fileHolder, int? index)
|
||||||
|
{
|
||||||
|
FilePath? result;
|
||||||
|
if (fileHolder.CreationTime is null)
|
||||||
|
result = null;
|
||||||
|
else if (fileHolder.LastWriteTime is null)
|
||||||
|
result = null;
|
||||||
|
else if (fileHolder.Length is null)
|
||||||
|
result = null;
|
||||||
|
else
|
||||||
|
result = Get(propertyConfiguration, fileHolder, index);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
public static FilePath Get(Properties.IPropertyConfiguration propertyConfiguration, FileHolder fileHolder, int? index)
|
public static FilePath Get(Properties.IPropertyConfiguration propertyConfiguration, FileHolder fileHolder, int? index)
|
||||||
{
|
{
|
||||||
if (fileHolder.CreationTime is null)
|
if (fileHolder.CreationTime is null)
|
||||||
|
@ -29,7 +29,7 @@ public record MappingFromItem(DateTime[] ContainerDateTimes,
|
|||||||
internal static MappingFromItem GetMappingFromItem(DateTime[] containerDateTimes, Item item, FileHolder? resizedFileHolder)
|
internal static MappingFromItem GetMappingFromItem(DateTime[] containerDateTimes, Item item, FileHolder? resizedFileHolder)
|
||||||
{
|
{
|
||||||
MappingFromItem result;
|
MappingFromItem result;
|
||||||
if (item.ExifDirectory?.FilePath.Id is null)
|
if (item.ExifDirectory?.FilePath?.Id is null)
|
||||||
throw new NotSupportedException();
|
throw new NotSupportedException();
|
||||||
if (resizedFileHolder is null)
|
if (resizedFileHolder is null)
|
||||||
throw new NotSupportedException();
|
throw new NotSupportedException();
|
||||||
|
@ -40,8 +40,8 @@ internal abstract class XDate
|
|||||||
}
|
}
|
||||||
if (results.Count == 0)
|
if (results.Count == 0)
|
||||||
{
|
{
|
||||||
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(exifDirectory.FilePath.Name);
|
string? fileNameWithoutExtension = exifDirectory.FilePath is null ? null : Path.GetFileNameWithoutExtension(exifDirectory.FilePath.Name);
|
||||||
DateTime? dateTime = GetDateTimeFromName(fileNameWithoutExtension);
|
DateTime? dateTime = fileNameWithoutExtension is null ? null : GetDateTimeFromName(fileNameWithoutExtension);
|
||||||
if (dateTime is not null)
|
if (dateTime is not null)
|
||||||
results.Add(dateTime.Value);
|
results.Add(dateTime.Value);
|
||||||
foreach (ExifDirectoryBase exifDirectoryBase in exifDirectory.ExifBaseDirectories)
|
foreach (ExifDirectoryBase exifDirectoryBase in exifDirectory.ExifBaseDirectories)
|
||||||
|
Reference in New Issue
Block a user