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 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 GetExifDirectories(ResultSettings resultSettings, MetadataSettings metadataSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, long ticks, string outputResolution) { List 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(); } }