This commit is contained in:
2025-06-29 18:28:04 -07:00
parent 72ab5e737e
commit fb9a4ddd9d
11 changed files with 93 additions and 43 deletions

View File

@ -197,7 +197,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
string[] changesFrom = [nameof(A_Property)];
List<Tuple<string, DateTime>> subFileTuples = [];
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();
if (!item.SourceDirectoryFileHolder.Exists || item.SourceDirectoryFileHolder.CreationTime is null || item.SourceDirectoryFileHolder.LastWriteTime is null || item.Any())
throw new Exception();
@ -339,6 +339,9 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
dlibDotNet.ConstructProgressBar(filteredItems.Count, message);
_ = 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
{
result += FullParallelForWork(metadata,
@ -351,7 +354,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
fileNameToCollection,
record,
container,
filteredItems[i],
item,
containerDateTimes,
isFocusRelativePath);
if (!anyPropertiesChangedForX && (i == 0 || sourceDirectoryChanges.Count > 0))
@ -622,7 +625,25 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
if (string.IsNullOrEmpty(json))
result = null;
else
{
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;
}
@ -723,7 +744,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
List<(string, string, string)> collection = [];
foreach (Item item in distinctValidImageItems)
{
if (item.ExifDirectory?.FilePath.Id is null)
if (item.ExifDirectory?.FilePath?.Id is null)
continue;
if (item.IsNotUniqueAndNeedsReview is null || !item.IsNotUniqueAndNeedsReview.Value)
continue;
@ -736,7 +757,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
}
foreach (Item item in distinctValidImageItems)
{
if (item.ExifDirectory?.FilePath.Id is null)
if (item.ExifDirectory?.FilePath?.Id is null)
continue;
dateTime = IDate.GetDateTimeOriginal(item.ExifDirectory);
if (dateTime is null)
@ -1020,7 +1041,10 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
if (exifDirectory is null)
return;
lock (results)
results.Add(filePair.FilePath.Id.Value, exifDirectory);
{
if (!results.ContainsKey(filePair.FilePath.Id.Value))
results.Add(filePair.FilePath.Id.Value, exifDirectory);
}
}
private bool GetRunToDoCollectionFirst(Models.Configuration configuration, long ticks, string[] checkDirectories)
@ -1121,7 +1145,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
configurationOutputResolutionsHas = true;
if (!runToDoCollectionFirst)
break;
record = GetFilesCollectionThenCopyOrMove(dlibDotNet, ticks, fileSearchFilter, directorySearchFilter, bResultsFullGroupDirectory, outputResolution);
record = GetFilesCollectionThenCopyOrMove(dlibDotNet, metadata, ticks, fileSearchFilter, directorySearchFilter, bResultsFullGroupDirectory, outputResolution);
break;
}
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)
{
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);
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!");
}
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;
int count;
@ -1300,6 +1324,8 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
ReadOnlyCollection<FilePair> filePairs;
int maxDegreeOfParallelism = Environment.ProcessorCount;
Dictionary<int, ExifDirectory> exifDirectoriesById = [];
foreach (KeyValuePair<int, ExifDirectory> keyValuePair in metadata.ExifDirectoriesById)
exifDirectoriesById.Add(keyValuePair.Key, keyValuePair.Value);
string filesCollectionRootDirectory = _Configuration.PropertyConfiguration.RootDirectory;
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
(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);
count = filePathsCollection.Select(l => l.Count).Sum();
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);
_ = Parallel.For(0, filePairs.Count, parallelOptions, (i, state) => ParallelFor(filePairs[i], exifDirectoriesById, dlibDotNet.Tick));
if (exifDirectoriesById.Count == 0)
@ -1438,7 +1464,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
isFocusRelativePath = string.IsNullOrEmpty(_Configuration.FocusDirectory) ? null : container.SourceDirectory.StartsWith(focusRelativePath);
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;
mappingFromItem = IMappingFromItem.GetMappingFromItem(containerDateTimes, item, item.ResizedFileHolder);
if (distinctItems)
@ -1634,11 +1660,11 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable
MappingFromFilterPre mappingFromFilterPre;
MappingFromFilterPost mappingFromFilterPost;
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();
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;
isFocusPerson = null;