Pack and published 8.0.118.14728

Metadata alignment
This commit is contained in:
2025-07-19 09:25:58 -07:00
parent 05fb8685d9
commit ba11c04f4a
10 changed files with 413 additions and 316 deletions

View File

@ -71,7 +71,7 @@ internal static class FilterLogicA
continue; continue;
if (!string.IsNullOrEmpty(distanceSettings.FocusModel)) if (!string.IsNullOrEmpty(distanceSettings.FocusModel))
{ {
model = Metadata.Models.Stateless.IMetadata.GetModel(locationContainer.ExifDirectory); model = IMetaBase.GetModel(locationContainer.ExifDirectory);
if (string.IsNullOrEmpty(model) || !model.Contains(distanceSettings.FocusModel)) if (string.IsNullOrEmpty(model) || !model.Contains(distanceSettings.FocusModel))
continue; continue;
} }

View File

@ -11,7 +11,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.AA.Metadata</PackageId> <PackageId>Phares.AA.Metadata</PackageId>
<Version>8.0.114.$([System.Math]::Floor($([MSBuild]::Divide($([MSBuild]::Subtract($([System.DateTimeOffset]::UtcNow.ToUnixTimeSeconds()), 1699920000)), 3600))))</Version> <Version>8.0.118.$([System.Math]::Floor($([MSBuild]::Divide($([MSBuild]::Subtract($([System.DateTimeOffset]::UtcNow.ToUnixTimeSeconds()), 1699920000)), 3600))))</Version>
<Company>Phares</Company> <Company>Phares</Company>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -1,68 +0,0 @@
using System.Collections.ObjectModel;
using View_by_Distance.Shared.Models;
namespace View_by_Distance.Metadata.Models.Stateless;
internal static class Base
{
internal static string? GetMaker(ExifDirectoryBase[]? exifBaseDirectories)
{
string? result = null;
if (exifBaseDirectories is not null)
{
string value;
foreach (ExifDirectoryBase exifDirectoryBase in exifBaseDirectories)
{
value = exifDirectoryBase?.Make is null ? string.Empty : exifDirectoryBase.Make.ToString().Trim();
if (string.IsNullOrEmpty(value))
result = null;
else
{
result = $"{value[0].ToString().ToUpper()}{value[1..].ToLower()}";
break;
}
}
}
return result;
}
internal static string? GetModel(ExifDirectoryBase[]? exifBaseDirectories)
{
string? result = null;
if (exifBaseDirectories is not null)
{
string value;
foreach (ExifDirectoryBase exifDirectoryBase in exifBaseDirectories)
{
value = exifDirectoryBase?.Model is null ? string.Empty : exifDirectoryBase.Model.ToString().Trim();
if (string.IsNullOrEmpty(value))
result = null;
else
{
result = value;
break;
}
}
}
return result;
}
internal static ReadOnlyCollection<string> GetKeywords(ExifDirectoryBase[]? exifBaseDirectories)
{
List<string> results = [];
if (exifBaseDirectories is not null)
{
string value;
foreach (ExifDirectoryBase exifDirectoryBase in exifBaseDirectories)
{
value = exifDirectoryBase?.WinKeywords is null ? string.Empty : exifDirectoryBase.WinKeywords.ToString().Trim();
if (string.IsNullOrEmpty(value))
continue;
results.Add(value);
}
}
return results.AsReadOnly();
}
}

View File

@ -27,24 +27,22 @@ internal abstract class Exif
private static Shared.Models.AviDirectory[] GetAviDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.AviDirectory[] GetAviDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
List<Shared.Models.AviDirectory> results = []; List<Shared.Models.AviDirectory> results = [];
Shared.Models.AviDirectory aviDirectory;
IEnumerable<MetadataExtractor.Formats.Avi.AviDirectory> aviDirectories = directories.OfType<MetadataExtractor.Formats.Avi.AviDirectory>(); IEnumerable<MetadataExtractor.Formats.Avi.AviDirectory> aviDirectories = directories.OfType<MetadataExtractor.Formats.Avi.AviDirectory>();
foreach (MetadataExtractor.Formats.Avi.AviDirectory a in aviDirectories) foreach (MetadataExtractor.Formats.Avi.AviDirectory aviDirectory in aviDirectories)
{ {
if (a.Tags.Count == 0) if (aviDirectory.Tags.Count == 0)
continue; continue;
DateTime? dateTimeOriginal; DateTime? dateTimeOriginal;
string? duration = a.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagDuration); string? duration = aviDirectory.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagDuration);
string? height = a.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagHeight); string? height = aviDirectory.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagHeight);
string? width = a.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagWidth); string? width = aviDirectory.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagWidth);
if (a.TryGetDateTime(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal, out DateTime checkDateTime)) if (aviDirectory.TryGetDateTime(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal, out DateTime checkDateTime))
dateTimeOriginal = checkDateTime; dateTimeOriginal = checkDateTime;
else else
dateTimeOriginal = GetDateTime(a.GetString(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal)); dateTimeOriginal = GetDateTime(aviDirectory.GetString(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal));
if (dateTimeOriginal is null && duration is null && height is null && width is null) if (dateTimeOriginal is null && duration is null && height is null && width is null)
continue; continue;
aviDirectory = new(dateTimeOriginal, duration, height, width); results.Add(new(dateTimeOriginal, duration, height, width));
results.Add(aviDirectory);
} }
return results.ToArray(); return results.ToArray();
} }
@ -52,71 +50,72 @@ internal abstract class Exif
private static Shared.Models.ExifDirectoryBase[] GetExifBaseDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.ExifDirectoryBase[] GetExifBaseDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
List<Shared.Models.ExifDirectoryBase> results = []; List<Shared.Models.ExifDirectoryBase> results = [];
Shared.Models.ExifDirectoryBase exifDirectoryBase;
IEnumerable<ExifDirectoryBase> exifBaseDirectories = directories.OfType<ExifDirectoryBase>(); IEnumerable<ExifDirectoryBase> exifBaseDirectories = directories.OfType<ExifDirectoryBase>();
foreach (ExifDirectoryBase e in exifBaseDirectories) foreach (ExifDirectoryBase exifDirectoryBase in exifBaseDirectories)
{ {
if (e.Tags.Count == 0) if (exifDirectoryBase.Tags.Count == 0)
continue; continue;
DateTime? dateTime; DateTime? dateTime;
DateTime checkDateTime; DateTime checkDateTime;
DateTime? dateTimeOriginal; DateTime? dateTimeOriginal;
DateTime? dateTimeDigitized; DateTime? dateTimeDigitized;
string? aperture = e.GetDescription(ExifDirectoryBase.TagAperture); string? aperture = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagAperture);
string? applicationNotes = e.GetDescription(ExifDirectoryBase.TagApplicationNotes); string? applicationNotes = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagApplicationNotes);
string? artist = e.GetDescription(ExifDirectoryBase.TagArtist); string? artist = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagArtist);
string? bitsPerSample = e.GetDescription(ExifDirectoryBase.TagBitsPerSample); string? bitsPerSample = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagBitsPerSample);
string? bodySerialNumber = e.GetDescription(ExifDirectoryBase.TagBodySerialNumber); string? bodySerialNumber = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagBodySerialNumber);
string? cameraOwnerName = e.GetDescription(ExifDirectoryBase.TagCameraOwnerName); string? cameraOwnerName = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagCameraOwnerName);
string? compressedAverageBitsPerPixel = e.GetDescription(ExifDirectoryBase.TagCompressedAverageBitsPerPixel); string? compressedAverageBitsPerPixel = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagCompressedAverageBitsPerPixel);
string? compression = e.GetDescription(ExifDirectoryBase.TagCompression); string? compression = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagCompression);
string? copyright = e.GetDescription(ExifDirectoryBase.TagCopyright); string? copyright = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagCopyright);
string? documentName = e.GetDescription(ExifDirectoryBase.TagDocumentName); string? documentName = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagDocumentName);
string? exifVersion = e.GetDescription(ExifDirectoryBase.TagExifVersion); string? exifVersion = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagExifVersion);
string? exposureTime = e.GetDescription(ExifDirectoryBase.TagExposureTime); string? exposureTime = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagExposureTime);
string? fileSource = e.GetDescription(ExifDirectoryBase.TagFileSource); string? fileSource = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagFileSource);
string? imageDescription = e.GetDescription(ExifDirectoryBase.TagImageDescription); string? imageDescription = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagImageDescription);
string? imageHeight = e.GetDescription(ExifDirectoryBase.TagImageHeight); string? imageHeight = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagImageHeight);
string? imageNumber = e.GetDescription(ExifDirectoryBase.TagImageNumber); int? imageHeightValue = imageHeight is null ? null : exifDirectoryBase.GetInt32(ExifDirectoryBase.TagImageHeight);
string? imageUniqueId = e.GetDescription(ExifDirectoryBase.TagImageUniqueId); string? imageNumber = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagImageNumber);
string? imageWidth = e.GetDescription(ExifDirectoryBase.TagImageWidth); string? imageUniqueId = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagImageUniqueId);
string? isoSpeed = e.GetDescription(ExifDirectoryBase.TagIsoSpeed); string? imageWidth = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagImageWidth);
string? lensMake = e.GetDescription(ExifDirectoryBase.TagLensMake); int? imageWidthValue = imageWidth is null ? null : exifDirectoryBase.GetInt32(ExifDirectoryBase.TagImageWidth);
string? lensModel = e.GetDescription(ExifDirectoryBase.TagLensModel); string? isoSpeed = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagIsoSpeed);
string? lensSerialNumber = e.GetDescription(ExifDirectoryBase.TagLensSerialNumber); string? lensMake = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagLensMake);
string? make = e.GetDescription(ExifDirectoryBase.TagMake); string? lensModel = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagLensModel);
string? makerNote = e.GetDescription(ExifDirectoryBase.TagMakernote); string? lensSerialNumber = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagLensSerialNumber);
string? model = e.GetDescription(ExifDirectoryBase.TagModel); string? make = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagMake);
string? orientation = e.GetDescription(ExifDirectoryBase.TagOrientation); string? makerNote = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagMakernote);
int? orientationValue = orientation is null ? null : e.GetInt32(ExifDirectoryBase.TagOrientation); string? model = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagModel);
string? rating = e.GetDescription(ExifDirectoryBase.TagRating); string? orientation = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagOrientation);
string? ratingPercent = e.GetDescription(ExifDirectoryBase.TagRatingPercent); int? orientationValue = orientation is null ? null : exifDirectoryBase.GetInt32(ExifDirectoryBase.TagOrientation);
string? securityClassification = e.GetDescription(ExifDirectoryBase.TagSecurityClassification); string? rating = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagRating);
string? shutterSpeed = e.GetDescription(ExifDirectoryBase.TagShutterSpeed); string? ratingPercent = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagRatingPercent);
string? software = e.GetDescription(ExifDirectoryBase.TagSoftware); string? securityClassification = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagSecurityClassification);
string? timeZone = e.GetDescription(ExifDirectoryBase.TagTimeZone); string? shutterSpeed = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagShutterSpeed);
string? timeZoneDigitized = e.GetDescription(ExifDirectoryBase.TagTimeZoneDigitized); string? software = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagSoftware);
string? timeZoneOriginal = e.GetDescription(ExifDirectoryBase.TagTimeZoneOriginal); string? timeZone = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagTimeZone);
string? userComment = e.GetDescription(ExifDirectoryBase.TagUserComment); string? timeZoneDigitized = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagTimeZoneDigitized);
string? winAuthor = e.GetDescription(ExifDirectoryBase.TagWinAuthor); string? timeZoneOriginal = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagTimeZoneOriginal);
string? winComment = e.GetDescription(ExifDirectoryBase.TagWinComment); string? userComment = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagUserComment);
string? winKeywords = e.GetDescription(ExifDirectoryBase.TagWinKeywords); string? winAuthor = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagWinAuthor);
string? winSubject = e.GetDescription(ExifDirectoryBase.TagWinSubject); string? winComment = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagWinComment);
string? winTitle = e.GetDescription(ExifDirectoryBase.TagWinTitle); string? winKeywords = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagWinKeywords);
string? xResolution = e.GetDescription(ExifDirectoryBase.TagXResolution); string? winSubject = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagWinSubject);
string? yResolution = e.GetDescription(ExifDirectoryBase.TagYResolution); string? winTitle = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagWinTitle);
if (e.TryGetDateTime(ExifDirectoryBase.TagDateTime, out checkDateTime)) string? xResolution = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagXResolution);
string? yResolution = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagYResolution);
if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTime, out checkDateTime))
dateTime = checkDateTime; dateTime = checkDateTime;
else else
dateTime = GetDateTime(e.GetString(ExifDirectoryBase.TagDateTime)); dateTime = GetDateTime(exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTime));
if (e.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out checkDateTime)) if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out checkDateTime))
dateTimeOriginal = checkDateTime; dateTimeOriginal = checkDateTime;
else else
dateTimeOriginal = GetDateTime(e.GetString(ExifDirectoryBase.TagDateTimeOriginal)); dateTimeOriginal = GetDateTime(exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTimeOriginal));
if (e.TryGetDateTime(ExifDirectoryBase.TagDateTimeDigitized, out checkDateTime)) if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTimeDigitized, out checkDateTime))
dateTimeDigitized = checkDateTime; dateTimeDigitized = checkDateTime;
else else
dateTimeDigitized = GetDateTime(e.GetString(ExifDirectoryBase.TagDateTimeDigitized)); dateTimeDigitized = GetDateTime(exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTimeDigitized));
if (userComment is not null && userComment.Length > 255) if (userComment is not null && userComment.Length > 255)
userComment = "..."; userComment = "...";
if (aperture is null if (aperture is null
@ -166,53 +165,54 @@ internal abstract class Exif
&& xResolution is not null && xResolution is not null
&& yResolution is null) && yResolution is null)
continue; continue;
exifDirectoryBase = new(aperture, results.Add(new(Aperture: aperture,
applicationNotes, ApplicationNotes: applicationNotes,
artist, Artist: artist,
bitsPerSample, BitsPerSample: bitsPerSample,
bodySerialNumber, BodySerialNumber: bodySerialNumber,
cameraOwnerName, CameraOwnerName: cameraOwnerName,
compressedAverageBitsPerPixel, CompressedAverageBitsPerPixel: compressedAverageBitsPerPixel,
compression, Compression: compression,
copyright, Copyright: copyright,
dateTime, DateTime: dateTime,
dateTimeDigitized, DateTimeDigitized: dateTimeDigitized,
dateTimeOriginal, DateTimeOriginal: dateTimeOriginal,
documentName, DocumentName: documentName,
exifVersion, ExifVersion: exifVersion,
exposureTime, ExposureTime: exposureTime,
fileSource, FileSource: fileSource,
imageDescription, ImageDescription: imageDescription,
imageHeight, ImageHeight: imageHeight,
imageNumber, ImageHeightValue: imageHeightValue,
imageUniqueId, ImageNumber: imageNumber,
imageWidth, ImageUniqueId: imageUniqueId,
isoSpeed, ImageWidth: imageWidth,
lensMake, ImageWidthValue: imageWidthValue,
lensModel, IsoSpeed: isoSpeed,
lensSerialNumber, LensMake: lensMake,
make, LensModel: lensModel,
makerNote, LensSerialNumber: lensSerialNumber,
model, Make: make,
orientation, MakerNote: makerNote,
orientationValue, Model: model,
rating, Orientation: orientation,
ratingPercent, OrientationValue: orientationValue,
securityClassification, Rating: rating,
shutterSpeed, RatingPercent: ratingPercent,
software, SecurityClassification: securityClassification,
timeZone, ShutterSpeed: shutterSpeed,
timeZoneDigitized, Software: software,
timeZoneOriginal, TimeZone: timeZone,
userComment, TimeZoneDigitized: timeZoneDigitized,
winAuthor, TimeZoneOriginal: timeZoneOriginal,
winComment, UserComment: userComment,
winKeywords, WinAuthor: winAuthor,
winSubject, WinComment: winComment,
winTitle, WinKeywords: winKeywords,
xResolution, WinSubject: winSubject,
yResolution); WinTitle: winTitle,
results.Add(exifDirectoryBase); XResolution: xResolution,
YResolution: yResolution));
} }
return results.ToArray(); return results.ToArray();
} }
@ -220,25 +220,23 @@ internal abstract class Exif
private static Shared.Models.FileMetadataDirectory[] GetFileMetadataDirectories(string file, IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.FileMetadataDirectory[] GetFileMetadataDirectories(string file, IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
List<Shared.Models.FileMetadataDirectory> results = []; List<Shared.Models.FileMetadataDirectory> results = [];
Shared.Models.FileMetadataDirectory fileMetadataDirectory;
IEnumerable<MetadataExtractor.Formats.FileSystem.FileMetadataDirectory> fileMetadataDirectories = directories.OfType<MetadataExtractor.Formats.FileSystem.FileMetadataDirectory>(); IEnumerable<MetadataExtractor.Formats.FileSystem.FileMetadataDirectory> fileMetadataDirectories = directories.OfType<MetadataExtractor.Formats.FileSystem.FileMetadataDirectory>();
foreach (MetadataExtractor.Formats.FileSystem.FileMetadataDirectory f in fileMetadataDirectories) foreach (MetadataExtractor.Formats.FileSystem.FileMetadataDirectory fileMetadataDirectory in fileMetadataDirectories)
{ {
if (f.Tags.Count == 0) if (fileMetadataDirectory.Tags.Count == 0)
continue; continue;
DateTime? fileModifiedDate; DateTime? fileModifiedDate;
string? fileName = f.GetDescription(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileName); string? fileName = fileMetadataDirectory.GetDescription(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileName);
string? fileSize = f.GetDescription(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileSize); string? fileSize = fileMetadataDirectory.GetDescription(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileSize);
if (f.TryGetDateTime(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileModifiedDate, out DateTime checkDateTime)) if (fileMetadataDirectory.TryGetDateTime(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileModifiedDate, out DateTime checkDateTime))
fileModifiedDate = checkDateTime; fileModifiedDate = checkDateTime;
else else
fileModifiedDate = GetDateTime(f.GetString(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileModifiedDate)); fileModifiedDate = GetDateTime(fileMetadataDirectory.GetString(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileModifiedDate));
if (fileName is null || !file.EndsWith(fileName)) if (fileName is null || !file.EndsWith(fileName))
throw new NotSupportedException($"!{file}.EndsWith({fileName})"); throw new NotSupportedException($"!{file}.EndsWith({fileName})");
if (fileModifiedDate is null && fileName is null && fileSize is null) if (fileModifiedDate is null && fileName is null && fileSize is null)
continue; continue;
fileMetadataDirectory = new(fileModifiedDate, fileName, fileSize); results.Add(new(fileModifiedDate, fileName, fileSize));
results.Add(fileMetadataDirectory);
} }
return results.ToArray(); return results.ToArray();
} }
@ -246,18 +244,16 @@ internal abstract class Exif
private static Shared.Models.GifHeaderDirectory[] GetGifHeaderDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.GifHeaderDirectory[] GetGifHeaderDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
List<Shared.Models.GifHeaderDirectory> results = []; List<Shared.Models.GifHeaderDirectory> results = [];
Shared.Models.GifHeaderDirectory gifHeaderDirectory;
IEnumerable<MetadataExtractor.Formats.Gif.GifHeaderDirectory> gifHeaderDirectories = directories.OfType<MetadataExtractor.Formats.Gif.GifHeaderDirectory>(); IEnumerable<MetadataExtractor.Formats.Gif.GifHeaderDirectory> gifHeaderDirectories = directories.OfType<MetadataExtractor.Formats.Gif.GifHeaderDirectory>();
foreach (MetadataExtractor.Formats.Gif.GifHeaderDirectory g in gifHeaderDirectories) foreach (MetadataExtractor.Formats.Gif.GifHeaderDirectory gifHeaderDirectory in gifHeaderDirectories)
{ {
if (g.Tags.Count == 0) if (gifHeaderDirectory.Tags.Count == 0)
continue; continue;
string? imageHeight = g.GetDescription(MetadataExtractor.Formats.Gif.GifHeaderDirectory.TagImageHeight); string? imageHeight = gifHeaderDirectory.GetDescription(MetadataExtractor.Formats.Gif.GifHeaderDirectory.TagImageHeight);
string? imageWidth = g.GetDescription(MetadataExtractor.Formats.Gif.GifHeaderDirectory.TagImageWidth); string? imageWidth = gifHeaderDirectory.GetDescription(MetadataExtractor.Formats.Gif.GifHeaderDirectory.TagImageWidth);
if (imageHeight is null && imageWidth is null) if (imageHeight is null && imageWidth is null)
continue; continue;
gifHeaderDirectory = new(imageHeight, imageWidth); results.Add(new(imageHeight, imageWidth));
results.Add(gifHeaderDirectory);
} }
return results.ToArray(); return results.ToArray();
} }
@ -265,31 +261,29 @@ internal abstract class Exif
private static Shared.Models.GpsDirectory[] GetGpsDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.GpsDirectory[] GetGpsDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
List<Shared.Models.GpsDirectory> results = []; List<Shared.Models.GpsDirectory> results = [];
Shared.Models.GpsDirectory gpsDirectory;
IEnumerable<GpsDirectory> gpsDirectories = directories.OfType<GpsDirectory>(); IEnumerable<GpsDirectory> gpsDirectories = directories.OfType<GpsDirectory>();
foreach (GpsDirectory g in gpsDirectories) foreach (GpsDirectory gpsDirectory in gpsDirectories)
{ {
if (g.Tags.Count == 0) if (gpsDirectory.Tags.Count == 0)
continue; continue;
DateTime? timeStamp; DateTime? timeStamp;
string? altitude = g.GetDescription(GpsDirectory.TagAltitude); string? altitude = gpsDirectory.GetDescription(GpsDirectory.TagAltitude);
string? latitude = g.GetDescription(GpsDirectory.TagLatitude); string? latitude = gpsDirectory.GetDescription(GpsDirectory.TagLatitude);
string? latitudeRef = g.GetDescription(GpsDirectory.TagLatitudeRef); string? latitudeRef = gpsDirectory.GetDescription(GpsDirectory.TagLatitudeRef);
string? longitude = g.GetDescription(GpsDirectory.TagLongitude); string? longitude = gpsDirectory.GetDescription(GpsDirectory.TagLongitude);
string? longitudeRef = g.GetDescription(GpsDirectory.TagLongitudeRef); string? longitudeRef = gpsDirectory.GetDescription(GpsDirectory.TagLongitudeRef);
if (g.TryGetDateTime(GpsDirectory.TagTimeStamp, out DateTime checkDateTime)) if (gpsDirectory.TryGetDateTime(GpsDirectory.TagTimeStamp, out DateTime checkDateTime))
timeStamp = checkDateTime; timeStamp = checkDateTime;
else else
timeStamp = GetDateTime(g.GetString(GpsDirectory.TagTimeStamp)); timeStamp = GetDateTime(gpsDirectory.GetString(GpsDirectory.TagTimeStamp));
if (altitude is null && latitude is null && latitudeRef is null && longitude is null && longitudeRef is null && timeStamp is null) if (altitude is null && latitude is null && latitudeRef is null && longitude is null && longitudeRef is null && timeStamp is null)
continue; continue;
gpsDirectory = new(altitude, results.Add(new(altitude,
latitude, latitude,
latitudeRef, latitudeRef,
longitude, longitude,
longitudeRef, longitudeRef,
timeStamp); timeStamp));
results.Add(gpsDirectory);
} }
return results.ToArray(); return results.ToArray();
} }
@ -297,18 +291,16 @@ internal abstract class Exif
private static Shared.Models.JpegDirectory[] GetJpegDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.JpegDirectory[] GetJpegDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
List<Shared.Models.JpegDirectory> results = []; List<Shared.Models.JpegDirectory> results = [];
Shared.Models.JpegDirectory jpegDirectory;
IEnumerable<MetadataExtractor.Formats.Jpeg.JpegDirectory> jpegDirectories = directories.OfType<MetadataExtractor.Formats.Jpeg.JpegDirectory>(); IEnumerable<MetadataExtractor.Formats.Jpeg.JpegDirectory> jpegDirectories = directories.OfType<MetadataExtractor.Formats.Jpeg.JpegDirectory>();
foreach (MetadataExtractor.Formats.Jpeg.JpegDirectory j in jpegDirectories) foreach (MetadataExtractor.Formats.Jpeg.JpegDirectory jpegDirectory in jpegDirectories)
{ {
if (j.Tags.Count == 0) if (jpegDirectory.Tags.Count == 0)
continue; continue;
string? imageHeight = j.GetDescription(MetadataExtractor.Formats.Jpeg.JpegDirectory.TagImageHeight); string? imageHeight = jpegDirectory.GetDescription(MetadataExtractor.Formats.Jpeg.JpegDirectory.TagImageHeight);
string? imageWidth = j.GetDescription(MetadataExtractor.Formats.Jpeg.JpegDirectory.TagImageWidth); string? imageWidth = jpegDirectory.GetDescription(MetadataExtractor.Formats.Jpeg.JpegDirectory.TagImageWidth);
if (imageHeight is null && imageWidth is null) if (imageHeight is null && imageWidth is null)
continue; continue;
jpegDirectory = new(imageHeight, imageWidth); results.Add(new(imageHeight, imageWidth));
results.Add(jpegDirectory);
} }
return results.ToArray(); return results.ToArray();
} }
@ -316,7 +308,6 @@ internal abstract class Exif
private static Shared.Models.MakernoteDirectory[] GetMakernoteDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.MakernoteDirectory[] GetMakernoteDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
List<Shared.Models.MakernoteDirectory> results = []; List<Shared.Models.MakernoteDirectory> results = [];
Shared.Models.MakernoteDirectory makernoteDirectory;
IEnumerable<AppleMakernoteDirectory> appleMakernoteDirectories = directories.OfType<AppleMakernoteDirectory>(); IEnumerable<AppleMakernoteDirectory> appleMakernoteDirectories = directories.OfType<AppleMakernoteDirectory>();
foreach (AppleMakernoteDirectory appleMakernoteDirectory in appleMakernoteDirectories) foreach (AppleMakernoteDirectory appleMakernoteDirectory in appleMakernoteDirectories)
{ {
@ -327,8 +318,7 @@ internal abstract class Exif
string? qualityAndFileFormat = null; string? qualityAndFileFormat = null;
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue; continue;
makernoteDirectory = new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat); results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
results.Add(makernoteDirectory);
} }
IEnumerable<CanonMakernoteDirectory> canonMakernoteDirectories = directories.OfType<CanonMakernoteDirectory>(); IEnumerable<CanonMakernoteDirectory> canonMakernoteDirectories = directories.OfType<CanonMakernoteDirectory>();
foreach (CanonMakernoteDirectory canonMakernoteDirectory in canonMakernoteDirectories) foreach (CanonMakernoteDirectory canonMakernoteDirectory in canonMakernoteDirectories)
@ -340,8 +330,7 @@ internal abstract class Exif
string? qualityAndFileFormat = canonMakernoteDirectory.GetDescription(CanonMakernoteDirectory.CameraSettings.TagQuality); string? qualityAndFileFormat = canonMakernoteDirectory.GetDescription(CanonMakernoteDirectory.CameraSettings.TagQuality);
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue; continue;
makernoteDirectory = new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat); results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
results.Add(makernoteDirectory);
} }
IEnumerable<NikonType2MakernoteDirectory> nikonType2MakernoteDirectories = directories.OfType<NikonType2MakernoteDirectory>(); IEnumerable<NikonType2MakernoteDirectory> nikonType2MakernoteDirectories = directories.OfType<NikonType2MakernoteDirectory>();
foreach (NikonType2MakernoteDirectory nikonType2MakernoteDirectory in nikonType2MakernoteDirectories) foreach (NikonType2MakernoteDirectory nikonType2MakernoteDirectory in nikonType2MakernoteDirectories)
@ -353,8 +342,7 @@ internal abstract class Exif
string? qualityAndFileFormat = nikonType2MakernoteDirectory.GetDescription(NikonType2MakernoteDirectory.TagQualityAndFileFormat); string? qualityAndFileFormat = nikonType2MakernoteDirectory.GetDescription(NikonType2MakernoteDirectory.TagQualityAndFileFormat);
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue; continue;
makernoteDirectory = new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat); results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
results.Add(makernoteDirectory);
} }
IEnumerable<OlympusMakernoteDirectory> olympusMakernoteDirectories = directories.OfType<OlympusMakernoteDirectory>(); IEnumerable<OlympusMakernoteDirectory> olympusMakernoteDirectories = directories.OfType<OlympusMakernoteDirectory>();
foreach (OlympusMakernoteDirectory olympusMakernoteDirectory in olympusMakernoteDirectories) foreach (OlympusMakernoteDirectory olympusMakernoteDirectory in olympusMakernoteDirectories)
@ -366,8 +354,7 @@ internal abstract class Exif
string? qualityAndFileFormat = olympusMakernoteDirectory.GetDescription(OlympusMakernoteDirectory.TagJpegQuality); string? qualityAndFileFormat = olympusMakernoteDirectory.GetDescription(OlympusMakernoteDirectory.TagJpegQuality);
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue; continue;
makernoteDirectory = new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat); results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
results.Add(makernoteDirectory);
} }
IEnumerable<PanasonicMakernoteDirectory> panasonicMakernoteDirectories = directories.OfType<PanasonicMakernoteDirectory>(); IEnumerable<PanasonicMakernoteDirectory> panasonicMakernoteDirectories = directories.OfType<PanasonicMakernoteDirectory>();
foreach (PanasonicMakernoteDirectory panasonicMakernoteDirectory in panasonicMakernoteDirectories) foreach (PanasonicMakernoteDirectory panasonicMakernoteDirectory in panasonicMakernoteDirectories)
@ -379,8 +366,7 @@ internal abstract class Exif
string? qualityAndFileFormat = panasonicMakernoteDirectory.GetDescription(PanasonicMakernoteDirectory.TagQualityMode); string? qualityAndFileFormat = panasonicMakernoteDirectory.GetDescription(PanasonicMakernoteDirectory.TagQualityMode);
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue; continue;
makernoteDirectory = new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat); results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
results.Add(makernoteDirectory);
} }
IEnumerable<SamsungType2MakernoteDirectory> samsungType2MakernoteDirectories = directories.OfType<SamsungType2MakernoteDirectory>(); IEnumerable<SamsungType2MakernoteDirectory> samsungType2MakernoteDirectories = directories.OfType<SamsungType2MakernoteDirectory>();
foreach (SamsungType2MakernoteDirectory samsungType2MakernoteDirectory in samsungType2MakernoteDirectories) foreach (SamsungType2MakernoteDirectory samsungType2MakernoteDirectory in samsungType2MakernoteDirectories)
@ -392,8 +378,7 @@ internal abstract class Exif
string? qualityAndFileFormat = null; string? qualityAndFileFormat = null;
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue; continue;
makernoteDirectory = new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat); results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
results.Add(makernoteDirectory);
} }
IEnumerable<SonyType6MakernoteDirectory> sonyType6MakernoteDirectories = directories.OfType<SonyType6MakernoteDirectory>(); IEnumerable<SonyType6MakernoteDirectory> sonyType6MakernoteDirectories = directories.OfType<SonyType6MakernoteDirectory>();
foreach (SonyType6MakernoteDirectory sonyType6MakernoteDirectory in sonyType6MakernoteDirectories) foreach (SonyType6MakernoteDirectory sonyType6MakernoteDirectory in sonyType6MakernoteDirectories)
@ -405,8 +390,7 @@ internal abstract class Exif
string? qualityAndFileFormat = null; string? qualityAndFileFormat = null;
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue; continue;
makernoteDirectory = new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat); results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
results.Add(makernoteDirectory);
} }
return results.ToArray(); return results.ToArray();
} }
@ -414,18 +398,16 @@ internal abstract class Exif
private static Shared.Models.PhotoshopDirectory[] GetPhotoshopDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.PhotoshopDirectory[] GetPhotoshopDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
List<Shared.Models.PhotoshopDirectory> results = []; List<Shared.Models.PhotoshopDirectory> results = [];
Shared.Models.PhotoshopDirectory photoshopDirectory;
IEnumerable<MetadataExtractor.Formats.Photoshop.PhotoshopDirectory> photoshopDirectories = directories.OfType<MetadataExtractor.Formats.Photoshop.PhotoshopDirectory>(); IEnumerable<MetadataExtractor.Formats.Photoshop.PhotoshopDirectory> photoshopDirectories = directories.OfType<MetadataExtractor.Formats.Photoshop.PhotoshopDirectory>();
foreach (MetadataExtractor.Formats.Photoshop.PhotoshopDirectory p in photoshopDirectories) foreach (MetadataExtractor.Formats.Photoshop.PhotoshopDirectory photoshopDirectory in photoshopDirectories)
{ {
if (p.Tags.Count == 0) if (photoshopDirectory.Tags.Count == 0)
continue; continue;
string? jpegQuality = p.GetDescription(MetadataExtractor.Formats.Photoshop.PhotoshopDirectory.TagJpegQuality); string? jpegQuality = photoshopDirectory.GetDescription(MetadataExtractor.Formats.Photoshop.PhotoshopDirectory.TagJpegQuality);
string? url = p.GetDescription(MetadataExtractor.Formats.Photoshop.PhotoshopDirectory.TagUrl); string? url = photoshopDirectory.GetDescription(MetadataExtractor.Formats.Photoshop.PhotoshopDirectory.TagUrl);
if (jpegQuality is null && url is null) if (jpegQuality is null && url is null)
continue; continue;
photoshopDirectory = new(jpegQuality, url); results.Add(new(jpegQuality, url));
results.Add(photoshopDirectory);
} }
return results.ToArray(); return results.ToArray();
} }
@ -433,19 +415,17 @@ internal abstract class Exif
private static Shared.Models.PngDirectory[] GetPngDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.PngDirectory[] GetPngDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
List<Shared.Models.PngDirectory> results = []; List<Shared.Models.PngDirectory> results = [];
Shared.Models.PngDirectory pngDirectory;
IEnumerable<MetadataExtractor.Formats.Png.PngDirectory> pngDirectories = directories.OfType<MetadataExtractor.Formats.Png.PngDirectory>(); IEnumerable<MetadataExtractor.Formats.Png.PngDirectory> pngDirectories = directories.OfType<MetadataExtractor.Formats.Png.PngDirectory>();
foreach (MetadataExtractor.Formats.Png.PngDirectory p in pngDirectories) foreach (MetadataExtractor.Formats.Png.PngDirectory pngDirectory in pngDirectories)
{ {
if (p.Tags.Count == 0) if (pngDirectory.Tags.Count == 0)
continue; continue;
string? imageHeight = p.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagImageHeight); string? imageHeight = pngDirectory.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagImageHeight);
string? imageWidth = p.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagImageWidth); string? imageWidth = pngDirectory.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagImageWidth);
string? textualData = p.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagTextualData); string? textualData = pngDirectory.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagTextualData);
if (imageHeight is null && imageWidth is null && textualData is null) if (imageHeight is null && imageWidth is null && textualData is null)
continue; continue;
pngDirectory = new(imageHeight, imageWidth, textualData); results.Add(new(imageHeight, imageWidth, textualData));
results.Add(pngDirectory);
} }
return results.ToArray(); return results.ToArray();
} }
@ -453,21 +433,19 @@ internal abstract class Exif
private static Shared.Models.QuickTimeMovieHeaderDirectory[] GetQuickTimeMovieHeaderDirectoryDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.QuickTimeMovieHeaderDirectory[] GetQuickTimeMovieHeaderDirectoryDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
List<Shared.Models.QuickTimeMovieHeaderDirectory> results = []; List<Shared.Models.QuickTimeMovieHeaderDirectory> results = [];
Shared.Models.QuickTimeMovieHeaderDirectory quickTimeMovieHeaderDirectory;
IEnumerable<MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory> quickTimeMovieHeaderDirectories = directories.OfType<MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory>(); IEnumerable<MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory> quickTimeMovieHeaderDirectories = directories.OfType<MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory>();
foreach (MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory q in quickTimeMovieHeaderDirectories) foreach (MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory quickTimeMovieHeaderDirectory in quickTimeMovieHeaderDirectories)
{ {
if (q.Tags.Count == 0) if (quickTimeMovieHeaderDirectory.Tags.Count == 0)
continue; continue;
DateTime? created; DateTime? created;
if (q.TryGetDateTime(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated, out DateTime checkDateTime)) if (quickTimeMovieHeaderDirectory.TryGetDateTime(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated, out DateTime checkDateTime))
created = checkDateTime; created = checkDateTime;
else else
created = GetDateTime(q.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated)); created = GetDateTime(quickTimeMovieHeaderDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated));
if (created is null) if (created is null)
continue; continue;
quickTimeMovieHeaderDirectory = new(created); results.Add(new(created));
results.Add(quickTimeMovieHeaderDirectory);
} }
return results.ToArray(); return results.ToArray();
} }
@ -475,21 +453,19 @@ internal abstract class Exif
private static Shared.Models.QuickTimeTrackHeaderDirectory[] GetQuickTimeTrackHeaderDirectoryDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.QuickTimeTrackHeaderDirectory[] GetQuickTimeTrackHeaderDirectoryDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
List<Shared.Models.QuickTimeTrackHeaderDirectory> results = []; List<Shared.Models.QuickTimeTrackHeaderDirectory> results = [];
Shared.Models.QuickTimeTrackHeaderDirectory quickTimeTrackHeaderDirectory;
IEnumerable<MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory> quickTimeTrackHeaderDirectories = directories.OfType<MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory>(); IEnumerable<MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory> quickTimeTrackHeaderDirectories = directories.OfType<MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory>();
foreach (MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory q in quickTimeTrackHeaderDirectories) foreach (MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory quickTimeTrackHeaderDirectory in quickTimeTrackHeaderDirectories)
{ {
if (q.Tags.Count == 0) if (quickTimeTrackHeaderDirectory.Tags.Count == 0)
continue; continue;
DateTime? created; DateTime? created;
if (q.TryGetDateTime(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated, out DateTime checkDateTime)) if (quickTimeTrackHeaderDirectory.TryGetDateTime(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated, out DateTime checkDateTime))
created = checkDateTime; created = checkDateTime;
else else
created = GetDateTime(q.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated)); created = GetDateTime(quickTimeTrackHeaderDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated));
if (created is null) if (created is null)
continue; continue;
quickTimeTrackHeaderDirectory = new(created); results.Add(new(created));
results.Add(quickTimeTrackHeaderDirectory);
} }
return results.ToArray(); return results.ToArray();
} }
@ -497,18 +473,16 @@ internal abstract class Exif
private static Shared.Models.WebPDirectory[] GetWebPDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.WebPDirectory[] GetWebPDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
List<Shared.Models.WebPDirectory> results = []; List<Shared.Models.WebPDirectory> results = [];
Shared.Models.WebPDirectory webPDirectory;
IEnumerable<MetadataExtractor.Formats.WebP.WebPDirectory> webPDirectories = directories.OfType<MetadataExtractor.Formats.WebP.WebPDirectory>(); IEnumerable<MetadataExtractor.Formats.WebP.WebPDirectory> webPDirectories = directories.OfType<MetadataExtractor.Formats.WebP.WebPDirectory>();
foreach (MetadataExtractor.Formats.WebP.WebPDirectory w in webPDirectories) foreach (MetadataExtractor.Formats.WebP.WebPDirectory webPDirectory in webPDirectories)
{ {
if (w.Tags.Count == 0) if (webPDirectory.Tags.Count == 0)
continue; continue;
string? imageHeight = w.GetDescription(MetadataExtractor.Formats.WebP.WebPDirectory.TagImageHeight); string? imageHeight = webPDirectory.GetDescription(MetadataExtractor.Formats.WebP.WebPDirectory.TagImageHeight);
string? imageWidth = w.GetDescription(MetadataExtractor.Formats.WebP.WebPDirectory.TagImageWidth); string? imageWidth = webPDirectory.GetDescription(MetadataExtractor.Formats.WebP.WebPDirectory.TagImageWidth);
if (imageHeight is null && imageWidth is null) if (imageHeight is null && imageWidth is null)
continue; continue;
webPDirectory = new(imageHeight, imageWidth); results.Add(new(imageHeight, imageWidth));
results.Add(webPDirectory);
} }
return results.ToArray(); return results.ToArray();
} }
@ -523,27 +497,27 @@ internal abstract class Exif
Shared.Models.WebPDirectory[] webPDirectories = GetWebPDirectories(directories); Shared.Models.WebPDirectory[] webPDirectories = GetWebPDirectories(directories);
Shared.Models.ExifDirectoryBase[] exifBaseDirectories = GetExifBaseDirectories(directories); Shared.Models.ExifDirectoryBase[] exifBaseDirectories = GetExifBaseDirectories(directories);
Shared.Models.GifHeaderDirectory[] gifHeaderDirectories = GetGifHeaderDirectories(directories); Shared.Models.GifHeaderDirectory[] gifHeaderDirectories = GetGifHeaderDirectories(directories);
Shared.Models.MakernoteDirectory[] MakernoteDirectories = GetMakernoteDirectories(directories); Shared.Models.MakernoteDirectory[] makernoteDirectories = GetMakernoteDirectories(directories);
Shared.Models.PhotoshopDirectory[] photoshopDirectories = GetPhotoshopDirectories(directories); Shared.Models.PhotoshopDirectory[] photoshopDirectories = GetPhotoshopDirectories(directories);
Shared.Models.FileMetadataDirectory[] fileMetadataDirectories = GetFileMetadataDirectories(filePath.FullName, directories); Shared.Models.FileMetadataDirectory[] fileMetadataDirectories = GetFileMetadataDirectories(filePath.FullName, directories);
Shared.Models.QuickTimeMovieHeaderDirectory[] quickTimeMovieHeaderDirectories = GetQuickTimeMovieHeaderDirectoryDirectories(directories); Shared.Models.QuickTimeMovieHeaderDirectory[] quickTimeMovieHeaderDirectories = GetQuickTimeMovieHeaderDirectoryDirectories(directories);
Shared.Models.QuickTimeTrackHeaderDirectory[] quickTimeTrackHeaderDirectories = GetQuickTimeTrackHeaderDirectoryDirectories(directories); Shared.Models.QuickTimeTrackHeaderDirectory[] quickTimeTrackHeaderDirectories = GetQuickTimeTrackHeaderDirectoryDirectories(directories);
result = new(aviDirectories, result = new(AviDirectories: aviDirectories,
exifBaseDirectories, ExifBaseDirectories: exifBaseDirectories,
fileMetadataDirectories, FileMetadataDirectories: fileMetadataDirectories,
filePath, FilePath: filePath,
gifHeaderDirectories, GifHeaderDirectories: gifHeaderDirectories,
gpsDirectories, GpsDirectories: gpsDirectories,
size?.Height, Height: size?.Height ?? Shared.Models.Stateless.IMetaBase.GetHeight(exifBaseDirectories),
jpegDirectories, JpegDirectories: jpegDirectories,
MakernoteDirectories, MakernoteDirectories: makernoteDirectories,
personKeyFormattedAndKeyTicksAndDisplayDirectoryName, PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName: personKeyFormattedAndKeyTicksAndDisplayDirectoryName,
photoshopDirectories, PhotoshopDirectories: photoshopDirectories,
pngDirectories, PngDirectories: pngDirectories,
quickTimeMovieHeaderDirectories, QuickTimeMovieHeaderDirectories: quickTimeMovieHeaderDirectories,
quickTimeTrackHeaderDirectories, QuickTimeTrackHeaderDirectories: quickTimeTrackHeaderDirectories,
webPDirectories, WebPDirectories: webPDirectories,
size?.Width); Width: size?.Width ?? Shared.Models.Stateless.IMetaBase.GetWidth(exifBaseDirectories));
return result; return result;
} }
@ -552,15 +526,10 @@ internal abstract class Exif
Shared.Models.ExifDirectory result; Shared.Models.ExifDirectory result;
IReadOnlyList<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(stream); IReadOnlyList<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(stream);
System.Drawing.Size? size; System.Drawing.Size? size;
if (!stream.CanSeek) try
size = null; { size = Dimensions.GetDimensions(stream); }
else catch (Exception)
{ { size = null; }
try
{ size = Dimensions.GetDimensions(stream); }
catch (Exception)
{ size = null; }
}
result = Covert(filePath, personKeyFormattedAndKeyTicksAndDisplayDirectoryName, directories, size); result = Covert(filePath, personKeyFormattedAndKeyTicksAndDisplayDirectoryName, directories, size);
return result; return result;
} }

View File

@ -22,21 +22,6 @@ public interface IMetadata
static ExifDirectory GetExifDirectory(FilePath filePath, Stream stream, PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName? personKeyFormattedAndKeyTicksAndDisplayDirectoryName) => static ExifDirectory GetExifDirectory(FilePath filePath, Stream stream, PersonKeyFormattedAndKeyTicksAndDisplayDirectoryName? personKeyFormattedAndKeyTicksAndDisplayDirectoryName) =>
Exif.GetExifDirectory(filePath, stream, personKeyFormattedAndKeyTicksAndDisplayDirectoryName); Exif.GetExifDirectory(filePath, stream, personKeyFormattedAndKeyTicksAndDisplayDirectoryName);
string? TestStatic_GetMaker(ExifDirectory? exifDirectory) =>
GetMaker(exifDirectory);
static string? GetMaker(ExifDirectory? exifDirectory) =>
Base.GetMaker(exifDirectory?.ExifBaseDirectories);
string? TestStatic_GetModel(ExifDirectory? exifDirectory) =>
GetModel(exifDirectory);
static string? GetModel(ExifDirectory? exifDirectory) =>
Base.GetModel(exifDirectory?.ExifBaseDirectories);
ReadOnlyCollection<string> TestStatic_GetKeywords(ExifDirectory? exifDirectory) =>
GetKeywords(exifDirectory);
static ReadOnlyCollection<string> GetKeywords(ExifDirectory? exifDirectory) =>
Base.GetKeywords(exifDirectory?.ExifBaseDirectories);
string? TestStatic_GetOutputResolution(ExifDirectory? exifDirectory) => string? TestStatic_GetOutputResolution(ExifDirectory? exifDirectory) =>
GetOutputResolution(exifDirectory); GetOutputResolution(exifDirectory);
static string? GetOutputResolution(ExifDirectory? exifDirectory) => static string? GetOutputResolution(ExifDirectory? exifDirectory) =>

View File

@ -394,7 +394,7 @@ public partial class Rename : IRename, IDisposable
const string jpeg = ".jpeg"; const string jpeg = ".jpeg";
List<ToDo> toDoCollection = []; List<ToDo> toDoCollection = [];
DateTime? dateTime = IDate.GetDateTimeOriginal(exifDirectory); DateTime? dateTime = IDate.GetDateTimeOriginal(exifDirectory);
ReadOnlyCollection<string> keywords = IMetadata.GetKeywords(exifDirectory); ReadOnlyCollection<string> keywords = IMetaBase.GetKeywords(exifDirectory);
bool hasIgnoreKeyword = appSettings.MetadataSettings.IgnoreRulesKeyWords.Any(keywords.Contains); bool hasIgnoreKeyword = appSettings.MetadataSettings.IgnoreRulesKeyWords.Any(keywords.Contains);
string checkFileExtension = exifDirectory.FilePath.ExtensionLowered == jpeg ? jpg : exifDirectory.FilePath.ExtensionLowered; string checkFileExtension = exifDirectory.FilePath.ExtensionLowered == jpeg ? jpg : exifDirectory.FilePath.ExtensionLowered;
bool hasDateTimeOriginal = dateTime is not null; bool hasDateTimeOriginal = dateTime is not null;
@ -454,7 +454,7 @@ public partial class Rename : IRename, IDisposable
dateTime = IDate.GetDateTimeOriginal(firstPass.ExifDirectory); dateTime = IDate.GetDateTimeOriginal(firstPass.ExifDirectory);
hasDateTimeOriginal = dateTime is not null; hasDateTimeOriginal = dateTime is not null;
dateTime ??= IDate.GetMinimum(firstPass.ExifDirectory); dateTime ??= IDate.GetMinimum(firstPass.ExifDirectory);
keywords = IMetadata.GetKeywords(firstPass.ExifDirectory); keywords = IMetaBase.GetKeywords(firstPass.ExifDirectory);
hasIgnoreKeyword = appSettings.MetadataSettings.IgnoreRulesKeyWords.Any(l => keywords.Contains(l)); hasIgnoreKeyword = appSettings.MetadataSettings.IgnoreRulesKeyWords.Any(l => keywords.Contains(l));
record = new(DateTime: dateTime.Value, record = new(DateTime: dateTime.Value,
ExifDirectory: firstPass.ExifDirectory, ExifDirectory: firstPass.ExifDirectory,
@ -544,7 +544,7 @@ public partial class Rename : IRename, IDisposable
hasDateTimeOriginal = dateTime is not null; hasDateTimeOriginal = dateTime is not null;
if (dateTime is null && appSettings.ResultSettings.ValidVideoFormatExtensions.Contains(record.ExifDirectory.FilePath.ExtensionLowered)) if (dateTime is null && appSettings.ResultSettings.ValidVideoFormatExtensions.Contains(record.ExifDirectory.FilePath.ExtensionLowered))
continue; continue;
keywords = IMetadata.GetKeywords(record.ExifDirectory); keywords = IMetaBase.GetKeywords(record.ExifDirectory);
hasIgnoreKeyword = appSettings.MetadataSettings.IgnoreRulesKeyWords.Any(keywords.Contains); hasIgnoreKeyword = appSettings.MetadataSettings.IgnoreRulesKeyWords.Any(keywords.Contains);
} }
cei = IPath.GetCombinedEnumAndIndex(appSettings.ResultSettings, record.ExifDirectory.FilePath); cei = IPath.GetCombinedEnumAndIndex(appSettings.ResultSettings, record.ExifDirectory.FilePath);
@ -640,7 +640,7 @@ public partial class Rename : IRename, IDisposable
isWrongYear = null; isWrongYear = null;
string directoryName; string directoryName;
string tfw = GetTFW(record, isWrongYear); string tfw = GetTFW(record, isWrongYear);
string? maker = IMetadata.GetMaker(record.ExifDirectory); string? maker = IMetaBase.GetMaker(record.ExifDirectory);
string rootDirectory = appSettings.ResultSettings.RootDirectory; string rootDirectory = appSettings.ResultSettings.RootDirectory;
string[] segments = checkDirectoryName.Split(years, StringSplitOptions.None); string[] segments = checkDirectoryName.Split(years, StringSplitOptions.None);
(int seasonValue, string seasonName) = IDate.GetSeason(record.DateTime.DayOfYear); (int seasonValue, string seasonName) = IDate.GetSeason(record.DateTime.DayOfYear);

View File

@ -10,7 +10,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.AA.Shared</PackageId> <PackageId>Phares.AA.Shared</PackageId>
<Version>8.0.114.$([System.Math]::Floor($([MSBuild]::Divide($([MSBuild]::Subtract($([System.DateTimeOffset]::UtcNow.ToUnixTimeSeconds()), 1699920000)), 3600))))</Version> <Version>8.0.118.$([System.Math]::Floor($([MSBuild]::Divide($([MSBuild]::Subtract($([System.DateTimeOffset]::UtcNow.ToUnixTimeSeconds()), 1699920000)), 3600))))</Version>
<Company>Phares</Company> <Company>Phares</Company>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -21,9 +21,11 @@ public record ExifDirectoryBase(string? Aperture,
string? FileSource, string? FileSource,
string? ImageDescription, string? ImageDescription,
string? ImageHeight, string? ImageHeight,
int? ImageHeightValue,
string? ImageNumber, string? ImageNumber,
string? ImageUniqueId, string? ImageUniqueId,
string? ImageWidth, string? ImageWidth,
int? ImageWidthValue,
string? IsoSpeed, string? IsoSpeed,
string? LensMake, string? LensMake,
string? LensModel, string? LensModel,

135
Shared/Models/MetaBase.cs Normal file
View File

@ -0,0 +1,135 @@
using System.Collections.ObjectModel;
using System.Globalization;
namespace View_by_Distance.Shared.Models;
internal static class MetaBase
{
internal static string? GetMaker(ExifDirectoryBase[]? exifBaseDirectories)
{
string? result = null;
if (exifBaseDirectories is not null)
{
string value;
foreach (ExifDirectoryBase exifDirectoryBase in exifBaseDirectories)
{
value = exifDirectoryBase?.Make is null ? string.Empty : exifDirectoryBase.Make.ToString().Trim();
if (string.IsNullOrEmpty(value))
result = null;
else
{
result = $"{value[0].ToString().ToUpper()}{value[1..].ToLower()}";
break;
}
}
}
return result;
}
internal static string? GetModel(ExifDirectoryBase[]? exifBaseDirectories)
{
string? result = null;
if (exifBaseDirectories is not null)
{
string value;
foreach (ExifDirectoryBase exifDirectoryBase in exifBaseDirectories)
{
value = exifDirectoryBase?.Model is null ? string.Empty : exifDirectoryBase.Model.ToString().Trim();
if (string.IsNullOrEmpty(value))
result = null;
else
{
result = value;
break;
}
}
}
return result;
}
internal static int? GetOrientation(ExifDirectoryBase[]? exifBaseDirectories)
{
int? result = null;
// public const int TagOrientation = 274;
if (exifBaseDirectories is not null)
{
foreach (ExifDirectoryBase exifDirectoryBase in exifBaseDirectories)
{
result = exifDirectoryBase?.OrientationValue;
if (result is not null)
break;
}
}
return result;
}
internal static ReadOnlyCollection<string> GetKeywords(ExifDirectoryBase[]? exifBaseDirectories)
{
List<string> results = [];
if (exifBaseDirectories is not null)
{
string value;
foreach (ExifDirectoryBase exifDirectoryBase in exifBaseDirectories)
{
value = exifDirectoryBase?.WinKeywords is null ? string.Empty : exifDirectoryBase.WinKeywords.ToString().Trim();
if (string.IsNullOrEmpty(value))
continue;
results.Add(value);
}
}
return results.AsReadOnly();
}
internal static int? GetWidth(ExifDirectoryBase[]? exifBaseDirectories)
{
int? result = null;
// public const int TagImageWidth = 256;
if (exifBaseDirectories is not null)
{
foreach (ExifDirectoryBase exifDirectoryBase in exifBaseDirectories)
{
result = exifDirectoryBase?.ImageWidthValue;
if (result is not null)
break;
}
}
return result;
}
internal static int? GetHeight(ExifDirectoryBase[]? exifBaseDirectories)
{
int? result = null;
// public const int TagImageHeight = 257;
if (exifBaseDirectories is not null)
{
foreach (ExifDirectoryBase exifDirectoryBase in exifBaseDirectories)
{
result = exifDirectoryBase?.ImageHeightValue;
if (result is not null)
break;
}
}
return result;
}
#pragma warning disable CA1416
internal static DateTime? GetDateTime(string dateTimeFormat, string? value)
{
DateTime? result;
string alternateFormat = "ddd MMM dd HH:mm:ss yyyy";
if (value is not null && DateTime.TryParse(value, out DateTime dateTime))
result = dateTime;
else if (value is not null && value.Length == dateTimeFormat.Length && DateTime.TryParseExact(value, dateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime))
result = dateTime;
else if (value is not null && value.Length == alternateFormat.Length && DateTime.TryParseExact(value, alternateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime))
result = dateTime;
else
result = null;
return result;
}
#pragma warning restore CA1416
}

View File

@ -0,0 +1,74 @@
using System.Collections.ObjectModel;
namespace View_by_Distance.Shared.Models.Stateless;
public interface IMetaBase
{
public static string DateTimeFormat() =>
"yyyy:MM:dd HH:mm:ss";
public static string? GetMaker(ExifDirectory? exifDirectory) =>
MetaBase.GetMaker(exifDirectory?.ExifBaseDirectories);
public static string? GetModel(ExifDirectory? exifDirectory) =>
MetaBase.GetModel(exifDirectory?.ExifBaseDirectories);
public static int? GetOrientation(ExifDirectory? exifDirectory) =>
MetaBase.GetOrientation(exifDirectory?.ExifBaseDirectories);
public static int? GetWidth(ExifDirectoryBase[]? exifBaseDirectories) =>
MetaBase.GetWidth(exifBaseDirectories);
public static int? GetHeight(ExifDirectoryBase[]? exifBaseDirectories) =>
MetaBase.GetHeight(exifBaseDirectories);
public static string? GetMaker(ExifDirectoryBase[]? exifBaseDirectories) =>
MetaBase.GetMaker(exifBaseDirectories);
public static string? GetModel(ExifDirectoryBase[]? exifBaseDirectories) =>
MetaBase.GetModel(exifBaseDirectories);
public static DateTime? GetDateTime(string dateTimeFormat, string? value) =>
MetaBase.GetDateTime(dateTimeFormat, value);
public static int? GetOrientation(ExifDirectoryBase[]? exifBaseDirectories) =>
MetaBase.GetOrientation(exifBaseDirectories);
public static ReadOnlyCollection<string> GetKeywords(ExifDirectory? exifDirectory) =>
MetaBase.GetKeywords(exifDirectory?.ExifBaseDirectories);
public static ReadOnlyCollection<string> GetKeywords(ExifDirectoryBase[]? exifBaseDirectories) =>
MetaBase.GetKeywords(exifBaseDirectories);
internal string TestStatic_DateTimeFormat() =>
DateTimeFormat();
internal string? TestStatic_GetMaker(ExifDirectory? exifDirectory) =>
GetMaker(exifDirectory);
internal string? TestStatic_GetModel(ExifDirectory? exifDirectory) =>
GetModel(exifDirectory);
internal static int? TestStatic_GetWidth(ExifDirectoryBase[]? exifBaseDirectories) =>
GetWidth(exifBaseDirectories);
internal static int? TestStatic_GetHeight(ExifDirectoryBase[]? exifBaseDirectories) =>
GetHeight(exifBaseDirectories);
internal static string? TestStatic_GetMaker(ExifDirectoryBase[]? exifBaseDirectories) =>
GetMaker(exifBaseDirectories);
internal static string? TestStatic_GetModel(ExifDirectoryBase[]? exifBaseDirectories) =>
GetModel(exifBaseDirectories);
internal static DateTime? TestStatic_GetDateTime(string dateTimeFormat, string? value) =>
GetDateTime(dateTimeFormat, value);
internal static int? TestStatic_GetOrientation(ExifDirectoryBase[]? exifBaseDirectories) =>
GetOrientation(exifBaseDirectories);
internal static ReadOnlyCollection<string> TestStatic_GetKeywords(ExifDirectoryBase[]? exifBaseDirectories) =>
GetKeywords(exifBaseDirectories);
}