using MetadataExtractor; using MetadataExtractor.Formats.Avi; using MetadataExtractor.Formats.Exif; using MetadataExtractor.Formats.QuickTime; using View_by_Distance.Shared.Models.Stateless; namespace View_by_Distance.Metadata.Models.Stateless.Methods; internal class Metadata { internal static string? GetFaceEncoding(IReadOnlyList directories) { string? result; List results = new(); const string comment = "Comment: "; foreach (MetadataExtractor.Directory directory in directories) { if (directory.Name != "PNG-tEXt") continue; foreach (Tag tag in directory.Tags) { if (tag.Name != "Textual Data" || string.IsNullOrEmpty(tag.Description)) continue; if (!tag.Description.StartsWith(comment)) continue; results.Add(tag.Description); } } result = results.Any() ? results[0][comment.Length..] : null; return result; } internal static string? GetOutputResolution(IReadOnlyList directories) { string? result; List results = new(); const string artist = "Artist: "; foreach (MetadataExtractor.Directory directory in directories) { if (directory.Name != "PNG-tEXt") continue; foreach (Tag tag in directory.Tags) { if (tag.Name != "Textual Data" || string.IsNullOrEmpty(tag.Description)) continue; if (!tag.Description.StartsWith(artist)) continue; results.Add(tag.Description); } } result = results.Any() ? results[0][artist.Length..] : null; return result; } internal static DateTime? GetMinimumDateTime(IReadOnlyList directories) { DateTime? result; DateTime dateTime; List results = new(); ExifDirectoryBase? exifDirectoryBase = directories.OfType().FirstOrDefault(); if (exifDirectoryBase is not null) { if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTime, out dateTime)) results.Add(dateTime); if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTimeDigitized, out dateTime)) results.Add(dateTime); if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out dateTime)) results.Add(dateTime); } AviDirectory? aviDirectory = directories.OfType().FirstOrDefault(); if (aviDirectory is not null) { if (aviDirectory.TryGetDateTime(AviDirectory.TagDateTimeOriginal, out dateTime)) results.Add(dateTime); } QuickTimeMovieHeaderDirectory? quickTimeMovieHeaderDirectory = directories.OfType().FirstOrDefault(); if (quickTimeMovieHeaderDirectory is not null) { if (quickTimeMovieHeaderDirectory.TryGetDateTime(QuickTimeMovieHeaderDirectory.TagCreated, out dateTime)) results.Add(dateTime); } QuickTimeTrackHeaderDirectory? quickTimeTrackHeaderDirectory = directories.OfType().FirstOrDefault(); if (quickTimeTrackHeaderDirectory is not null) { if (quickTimeTrackHeaderDirectory.TryGetDateTime(QuickTimeTrackHeaderDirectory.TagCreated, out dateTime)) results.Add(dateTime); } if (results.Any()) result = results.Min(); else result = null; return result; } internal static DateTime? GetMinimumDateTime(IReadOnlyList directories, Shared.Models.FileHolder fileHolder) { DateTime? result; DateTime? dateTime = GetMinimumDateTime(directories); List results = new() { fileHolder.CreationTime, fileHolder.LastWriteTime, dateTime }; result = results.Min(); return result; } internal static string? GetModel(IReadOnlyList directories) { string? result; ExifDirectoryBase? exifDirectoryBase = directories.OfType().FirstOrDefault(); if (exifDirectoryBase is null) result = null; else result = exifDirectoryBase.GetString(ExifDirectoryBase.TagModel); return result; } internal static int GetOrientation(List> metadataCollection) { int result; const string orientation = nameof(IExif.Tags.Orientation); List orientations = (from l in metadataCollection where l.Key.Contains(orientation) select l.Value).ToList(); if (!orientations.Any()) result = 0; else if (!int.TryParse(orientations[0], out result)) result = 0; return result; } }