Rename updates again Mirror-Length in place Delete-By-Distinct long to string Copy-Distinct handle move and move back
179 lines
7.3 KiB
C#
179 lines
7.3 KiB
C#
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<MetadataExtractor.Directory> directories)
|
|
{
|
|
string? result;
|
|
List<string> 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<MetadataExtractor.Directory> directories)
|
|
{
|
|
string? result;
|
|
List<string> 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<MetadataExtractor.Directory> directories)
|
|
{
|
|
List<DateTime?> results = new();
|
|
DateTime? result = null;
|
|
DateTime? dateTime;
|
|
DateTime checkDateTime;
|
|
string dateTimeFormat = Shared.Models.Stateless.Methods.IProperty.DateTimeFormat();
|
|
ExifDirectoryBase? exifDirectoryBase = directories.OfType<ExifDirectoryBase>().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<AviDirectory>().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<QuickTimeMovieHeaderDirectory>().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<QuickTimeTrackHeaderDirectory>().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<MetadataExtractor.Directory> directories)
|
|
{
|
|
string? result;
|
|
ExifDirectoryBase? exifDirectoryBase = directories.OfType<ExifDirectoryBase>().FirstOrDefault();
|
|
if (exifDirectoryBase is null)
|
|
result = null;
|
|
else
|
|
result = exifDirectoryBase.GetString(ExifDirectoryBase.TagModel);
|
|
return result;
|
|
}
|
|
|
|
internal static int GetOrientation(List<KeyValuePair<string, string>> metadataCollection)
|
|
{
|
|
int result;
|
|
const string orientation = nameof(IExif.Tags.Orientation);
|
|
List<string> 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;
|
|
}
|
|
|
|
} |