This commit is contained in:
2025-06-30 16:33:14 -07:00
parent c7ded16e50
commit 5d11335eda
38 changed files with 901 additions and 960 deletions

View File

@ -14,10 +14,7 @@ namespace View_by_Distance.Metadata.Models;
public class B_Metadata : IMetadata<MetadataExtractor.Directory>
{
public string DateGroupDirectory { get; init; }
public ReadOnlyCollection<FilePath> Collection { get; private set; }
public ReadOnlyDictionary<int, List<FilePath>> SingletonById { get; private set; }
public ReadOnlyDictionary<int, ExifDirectory> ExifDirectoriesById { get; private set; }
private readonly Dictionary<int, ExifDirectory> _ExifDirectoriesById;
// First
// Set DateGroupDirectory
@ -50,52 +47,49 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
else
throw new Exception();
}
List<ExifDirectory> results = [];
string jsonGroupDirectory;
const string extension = ".json";
const string fileSearchFilter = "*";
string filesCollectionRootDirectory;
const string directorySearchFilter = "*";
int maxDegreeOfParallelism = Environment.ProcessorCount;
filesCollectionRootDirectory = propertyConfiguration.RootDirectory;
Dictionary<int, ExifDirectory> exifDirectoriesById = [];
int maxDegreeOfParallelism = Environment.ProcessorCount;
Action? tick = dlibDotNet is null ? null : dlibDotNet.Tick;
filesCollectionRootDirectory = propertyConfiguration.RootDirectory;
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
string jsonGroupSingletonDirectory = Path.Combine(bResultsFullGroupDirectory, propertyConfiguration.ResultSingleton);
string jsonGroupCollectionDirectory = Path.Combine(bResultsFullGroupDirectory, propertyConfiguration.ResultCollection);
ReadOnlyCollection<string> directories = new([jsonGroupSingletonDirectory, jsonGroupCollectionDirectory]);
Shared.Models.Stateless.Methods.IPath.CreateDirectories(directories);
ReadOnlyCollection<ReadOnlyCollection<FilePath>> filePathsCollection = IDirectory.GetFilePathCollections(propertyConfiguration, directorySearchFilter, fileSearchFilter, filesCollectionRootDirectory, useIgnoreExtensions: true, useCeilingAverage: false);
ReadOnlyDictionary<int, List<FilePath>> fileNamesToFiles = FilePath.GetFilesKeyValuePairs(filePathsCollection);
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)";
ReadOnlyCollection<FilePair> filePairs = IFilePair.GetFilePairs(propertyConfiguration, directorySearchFilter, extension, jsonGroupSingletonDirectory, filePathsCollection);
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);
_ = Parallel.For(0, filePairs.Count, parallelOptions, (i, state) => ParallelFor(dlibDotNet, filePairs[i], results));
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);
DateGroupDirectory = bResultsFullGroupDirectory;
SingletonById = fileNamesToFiles;
filesCollectionRootDirectory = jsonGroupCollectionDirectory;
ReadOnlyCollection<ReadOnlyCollection<FilePath>> filePathsSingletonCollection = IDirectory.GetFilePathCollections(propertyConfiguration, directorySearchFilter, fileSearchFilter, filesCollectionRootDirectory,
useIgnoreExtensions: false, useCeilingAverage: false);
Collection = filePathsSingletonCollection[0];
_ = Parallel.For(0, filePairs.Count, parallelOptions, (i, state) => ParallelFor(filePairs[i], exifDirectoriesById, tick));
_ExifDirectoriesById = exifDirectoriesById;
}
private void ParallelFor(IDlibDotNet? dlibDotNet, FilePair filePair, List<ExifDirectory> results)
public ReadOnlyDictionary<int, ExifDirectory> GetKeyValuePairsAndClear()
{
dlibDotNet?.Tick();
Dictionary<int, ExifDirectory> results = [];
foreach (KeyValuePair<int, ExifDirectory> keyValuePair in _ExifDirectoriesById)
results.Add(keyValuePair.Key, keyValuePair.Value);
_ExifDirectoriesById.Clear();
return results.AsReadOnly();
}
private void ParallelFor(FilePair filePair, Dictionary<int, ExifDirectory> results, Action? tick)
{
tick?.Invoke();
if (filePair.FilePath.Id is null)
return;
ExifDirectory? exifDirectory = GetExifDirectory(filePair);
if (exifDirectory is null)
return;
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)
@ -105,11 +99,24 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
result = null;
else
{
string json = File.ReadAllText(filePair.Match.FullName);
string json;
json = File.ReadAllText(filePair.Match.FullName);
if (string.IsNullOrEmpty(json))
result = null;
else
{
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;
}
@ -203,7 +210,7 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
DateTime? result = null;
DateTime? dateTime;
DateTime checkDateTime;
string dateTimeFormat = Stateless.Methods.IMetadata.DateTimeFormat();
string dateTimeFormat = IMetaBase.DateTimeFormat();
MetadataExtractor.Formats.Exif.ExifDirectoryBase? exifDirectoryBase = directories.OfType<MetadataExtractor.Formats.Exif.ExifDirectoryBase>().FirstOrDefault();
results.Add(new DateTime(filePath.CreationTicks));
results.Add(new DateTime(filePath.LastWriteTicks));
@ -213,7 +220,7 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
results.Add(checkDateTime);
else
{
dateTime = Stateless.Methods.IMetadata.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTime));
dateTime = IMetaBase.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTime));
if (dateTime is not null)
results.Add(dateTime.Value);
}
@ -221,7 +228,7 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
results.Add(checkDateTime);
else
{
dateTime = Stateless.Methods.IMetadata.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTimeDigitized));
dateTime = IMetaBase.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTimeDigitized));
if (dateTime is not null)
results.Add(dateTime.Value);
}
@ -232,7 +239,7 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
}
else
{
dateTime = Stateless.Methods.IMetadata.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTimeOriginal));
dateTime = IMetaBase.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(MetadataExtractor.Formats.Exif.ExifDirectoryBase.TagDateTimeOriginal));
if (dateTime is not null)
{
result ??= dateTime.Value;
@ -250,7 +257,7 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
}
else
{
dateTime = Stateless.Methods.IMetadata.GetDateTime(dateTimeFormat, aviDirectory.GetString(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal));
dateTime = IMetaBase.GetDateTime(dateTimeFormat, aviDirectory.GetString(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal));
if (dateTime is not null)
{
result ??= dateTime.Value;
@ -268,7 +275,7 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
}
else
{
dateTime = Stateless.Methods.IMetadata.GetDateTime(dateTimeFormat, quickTimeMovieHeaderDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated));
dateTime = IMetaBase.GetDateTime(dateTimeFormat, quickTimeMovieHeaderDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated));
if (dateTime is not null)
{
result ??= dateTime.Value;
@ -286,7 +293,7 @@ public class B_Metadata : IMetadata<MetadataExtractor.Directory>
}
else
{
dateTime = Stateless.Methods.IMetadata.GetDateTime(dateTimeFormat, quickTimeTrackHeaderDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated));
dateTime = IMetaBase.GetDateTime(dateTimeFormat, quickTimeTrackHeaderDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated));
if (dateTime is not null)
{
result ??= dateTime.Value;