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?, DateTime?[]) GetDateTimes(Shared.Models.FileHolder fileHolder, IReadOnlyList directories) { List results = new(); DateTime? result = null; DateTime? dateTime; DateTime checkDateTime; string dateTimeFormat = Shared.Models.Stateless.Methods.IProperty.DateTimeFormat(); ExifDirectoryBase? exifDirectoryBase = directories.OfType().FirstOrDefault(); results.Add(fileHolder.CreationTime); results.Add(fileHolder.LastWriteTime); if (exifDirectoryBase is not null) { if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTime, out checkDateTime)) results.Add(checkDateTime); else { dateTime = Shared.Models.Stateless.Methods.IProperty.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTime)); if (dateTime is not null) results.Add(dateTime.Value); } if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTimeDigitized, out checkDateTime)) results.Add(checkDateTime); else { dateTime = Shared.Models.Stateless.Methods.IProperty.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTimeDigitized)); if (dateTime is not null) results.Add(dateTime.Value); } if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out checkDateTime)) { result ??= checkDateTime; results.Add(checkDateTime); } else { dateTime = Shared.Models.Stateless.Methods.IProperty.GetDateTime(dateTimeFormat, exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTimeOriginal)); if (dateTime is not null) { result ??= dateTime.Value; results.Add(dateTime.Value); } } } AviDirectory? aviDirectory = directories.OfType().FirstOrDefault(); if (aviDirectory is not null) { if (aviDirectory.TryGetDateTime(AviDirectory.TagDateTimeOriginal, out checkDateTime)) { result ??= checkDateTime; results.Add(checkDateTime); } else { dateTime = Shared.Models.Stateless.Methods.IProperty.GetDateTime(dateTimeFormat, aviDirectory.GetString(AviDirectory.TagDateTimeOriginal)); if (dateTime is not null) { result ??= dateTime.Value; results.Add(dateTime.Value); } } } QuickTimeMovieHeaderDirectory? quickTimeMovieHeaderDirectory = directories.OfType().FirstOrDefault(); if (quickTimeMovieHeaderDirectory is not null) { if (quickTimeMovieHeaderDirectory.TryGetDateTime(QuickTimeMovieHeaderDirectory.TagCreated, out checkDateTime)) { result ??= checkDateTime; results.Add(checkDateTime); } else { dateTime = Shared.Models.Stateless.Methods.IProperty.GetDateTime(dateTimeFormat, quickTimeMovieHeaderDirectory.GetString(QuickTimeMovieHeaderDirectory.TagCreated)); if (dateTime is not null) { result ??= dateTime.Value; results.Add(dateTime.Value); } } } QuickTimeTrackHeaderDirectory? quickTimeTrackHeaderDirectory = directories.OfType().FirstOrDefault(); if (quickTimeTrackHeaderDirectory is not null) { if (quickTimeTrackHeaderDirectory.TryGetDateTime(QuickTimeTrackHeaderDirectory.TagCreated, out checkDateTime)) { result ??= checkDateTime; results.Add(checkDateTime); } else { dateTime = Shared.Models.Stateless.Methods.IProperty.GetDateTime(dateTimeFormat, quickTimeTrackHeaderDirectory.GetString(QuickTimeTrackHeaderDirectory.TagCreated)); if (dateTime is not null) { result ??= dateTime.Value; results.Add(dateTime.Value); } } } return new(result, results.ToArray()); } 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; } }