55 lines
3.5 KiB
C#

using System.Collections.ObjectModel;
using View_by_Distance.Metadata.Models;
using View_by_Distance.Metadata.Models.Stateless;
using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Properties;
using View_by_Distance.Shared.Models.Stateless;
namespace View_by_Distance.Face.Models.Stateless;
internal static class Face
{
private static void ExifDirectoriesParallelFor(ResultSettings resultSettings, MetadataSettings metadataSettings, List<ExifDirectory> results, FileInfo fileInfo)
{
FileHolder fileHolder = FileHolder.Get(fileInfo, id: null);
const PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName? personKeyFormattedAndKeyTicksAndDisplayDirectoryName = null;
FilePath filePath = FilePath.Get(resultSettings, metadataSettings, fileHolder, index: null);
Stream stream = File.OpenRead(filePath.FullName);
ExifDirectory exifDirectory = IMetadata.GetExifDirectory(filePath, stream, personKeyFormattedAndKeyTicksAndDisplayDirectoryName);
stream.Dispose();
results.Add(exifDirectory);
}
internal static ReadOnlyCollection<ExifDirectory> GetExifDirectories(ResultSettings resultSettings, MetadataSettings metadataSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, long ticks, string outputResolution)
{
List<ExifDirectory> results = [];
FileInfo fileInfo;
int maxDegreeOfParallelism = compareSettings.MaxDegreeOfParallelism;
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
long? skipOlderThan = distanceSettings.SkipOlderThanDays < 1 ? null : new DateTime(ticks).AddDays(-distanceSettings.SkipOlderThanDays).Ticks;
string resultsFullGroupDirectory = Path.GetFullPath(IResult.GetResultsFullGroupDirectory(resultSettings,
nameof(D_Face),
outputResolution,
includeResizeGroup: true,
includeModel: true,
includePredictorModel: true));
string contentDirectory = Path.Combine(resultsFullGroupDirectory, resultSettings.ResultContent);
if (!Directory.Exists(contentDirectory))
_ = Directory.CreateDirectory(contentDirectory);
string collectionDirectory = Path.Combine(resultsFullGroupDirectory, resultSettings.ResultCollection);
if (!Directory.Exists(collectionDirectory))
_ = Directory.CreateDirectory(collectionDirectory);
string[] files = Directory.GetFiles(contentDirectory, $"*{compareSettings.FacesFileNameExtension}", SearchOption.AllDirectories);
compare.ConstructProgressBar(files.Length, $"{nameof(D_Face)}.{nameof(GetExifDirectories)}");
_ = Parallel.For(0, files.Length, parallelOptions, (i, state) =>
{
compare.Tick();
fileInfo = new(files[i]);
if (skipOlderThan is null || (fileInfo.Exists && fileInfo.LastWriteTime.Ticks >= skipOlderThan.Value))
ExifDirectoriesParallelFor(resultSettings, metadataSettings, results, fileInfo);
});
return results.AsReadOnly();
}
}