This commit is contained in:
Mike Phares 2023-12-26 18:27:04 -07:00
parent 7ec50dd56e
commit 684ba1f0df
12 changed files with 608 additions and 262 deletions

View File

@ -22,6 +22,7 @@
"Hmmssfff", "Hmmssfff",
"jfif", "jfif",
"JOSN", "JOSN",
"Makernote",
"mmod", "mmod",
"Nicéphore", "Nicéphore",
"Niépce", "Niépce",

View File

@ -1,8 +1,6 @@
using MetadataExtractor;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Text.Json; using System.Text.Json;
using View_by_Distance.Metadata.Models.Stateless; using View_by_Distance.Metadata.Models.Stateless;
using View_by_Distance.Metadata.Models.Stateless.Methods;
using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Properties; using View_by_Distance.Shared.Models.Properties;
using View_by_Distance.Shared.Models.Stateless.Methods; using View_by_Distance.Shared.Models.Stateless.Methods;
@ -104,9 +102,7 @@ public class A_Metadata
if (result is null) if (result is null)
{ {
string json; string json;
System.Drawing.Size? size = Dimensions.GetDimensions(filePath.FullName); result = Exif.GetExifDirectory(filePath, deterministicHashCode);
IReadOnlyList<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(filePath.FullName);
result = Exif.Covert(filePath, deterministicHashCode, size, directories);
(int exifYear, string jsonFile) = GetJsonFile(metadataConfiguration.ResultConfiguration, filePath, result); (int exifYear, string jsonFile) = GetJsonFile(metadataConfiguration.ResultConfiguration, filePath, result);
if (exifYear == fileInfoMinimumYear) if (exifYear == fileInfoMinimumYear)
json = JsonSerializer.Serialize(result, ExifDirectorySourceGenerationContext.Default.ExifDirectory); json = JsonSerializer.Serialize(result, ExifDirectorySourceGenerationContext.Default.ExifDirectory);

View File

@ -0,0 +1,54 @@
using View_by_Distance.Shared.Models;
namespace View_by_Distance.Metadata.Models.Stateless.Methods;
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;
}
}
}
if (string.IsNullOrEmpty(result))
result = "Unknown";
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;
}
}
}
if (string.IsNullOrEmpty(result))
result = "Unknown";
return result;
}
}

View File

@ -1,6 +1,8 @@
using MetadataExtractor; using MetadataExtractor;
using MetadataExtractor.Formats.Exif; using MetadataExtractor.Formats.Exif;
using MetadataExtractor.Formats.Exif.Makernotes;
using System.Globalization; using System.Globalization;
using View_by_Distance.Metadata.Models.Stateless.Methods;
namespace View_by_Distance.Metadata.Models.Stateless; namespace View_by_Distance.Metadata.Models.Stateless;
@ -23,14 +25,14 @@ internal abstract class Exif
return result; return result;
} }
private static Shared.Models.AviDirectory GetAviDirectory(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.AviDirectory[] GetAviDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
Shared.Models.AviDirectory result; List<Shared.Models.AviDirectory> results = [];
MetadataExtractor.Formats.Avi.AviDirectory? aviDirectory = directories.OfType<MetadataExtractor.Formats.Avi.AviDirectory>().FirstOrDefault(); IEnumerable<MetadataExtractor.Formats.Avi.AviDirectory> aviDirectories = directories.OfType<MetadataExtractor.Formats.Avi.AviDirectory>();
if (aviDirectory is null) foreach (MetadataExtractor.Formats.Avi.AviDirectory aviDirectory in aviDirectories)
result = new(null, null, null, null);
else
{ {
if (aviDirectory.Tags.Count == 0)
continue;
DateTime? dateTimeOriginal; DateTime? dateTimeOriginal;
string? duration = aviDirectory.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagDuration); string? duration = aviDirectory.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagDuration);
string? height = aviDirectory.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagHeight); string? height = aviDirectory.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagHeight);
@ -39,19 +41,21 @@ internal abstract class Exif
dateTimeOriginal = checkDateTime; dateTimeOriginal = checkDateTime;
else else
dateTimeOriginal = GetDateTime(aviDirectory.GetString(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal)); dateTimeOriginal = GetDateTime(aviDirectory.GetString(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal));
result = new(dateTimeOriginal, duration, height, width); if (dateTimeOriginal is null && duration is null && height is null && width is null)
continue;
results.Add(new(dateTimeOriginal, duration, height, width));
} }
return result; return results.ToArray();
} }
private static Shared.Models.ExifDirectoryBase GetExifDirectoryBase(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.ExifDirectoryBase[] GetExifBaseDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
Shared.Models.ExifDirectoryBase result; List<Shared.Models.ExifDirectoryBase> results = [];
ExifDirectoryBase? exifDirectoryBase = directories.OfType<ExifDirectoryBase>().FirstOrDefault(); IEnumerable<ExifDirectoryBase> exifBaseDirectories = directories.OfType<ExifDirectoryBase>();
if (exifDirectoryBase is null) foreach (ExifDirectoryBase exifDirectoryBase in exifBaseDirectories)
result = new(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);
else
{ {
if (exifDirectoryBase.Tags.Count == 0)
continue;
DateTime? dateTime; DateTime? dateTime;
DateTime checkDateTime; DateTime checkDateTime;
DateTime? dateTimeOriginal; DateTime? dateTimeOriginal;
@ -111,64 +115,113 @@ internal abstract class Exif
dateTimeDigitized = checkDateTime; dateTimeDigitized = checkDateTime;
else else
dateTimeDigitized = GetDateTime(exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTimeDigitized)); dateTimeDigitized = GetDateTime(exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTimeDigitized));
result = new(aperture, if (userComment is not null && userComment.Length > 255)
applicationNotes, userComment = "...";
artist, if (aperture is null
bitsPerSample, && applicationNotes is null
bodySerialNumber, && artist is null
cameraOwnerName, && bitsPerSample is null
compressedAverageBitsPerPixel, && bodySerialNumber is null
compression, && cameraOwnerName is null
copyright, && compressedAverageBitsPerPixel is null
dateTime, && compression is null
dateTimeDigitized, && copyright is null
dateTimeOriginal, && dateTime is null
documentName, && dateTimeDigitized is null
exifVersion, && dateTimeOriginal is null
exposureTime, && documentName is null
fileSource, && exifVersion is null
imageDescription, && exposureTime is null
imageHeight, && fileSource is null
imageNumber, && imageDescription is null
imageUniqueId, && imageHeight is null
imageWidth, && imageNumber is null
isoSpeed, && imageUniqueId is null
lensMake, && imageWidth is null
lensModel, && isoSpeed is null
lensSerialNumber, && lensMake is null
make, && lensModel is null
makerNote, && lensSerialNumber is null
model, && make is null
orientation, && makerNote is null
orientationValue, && model is null
rating, && orientation is null
ratingPercent, && orientationValue is null
securityClassification, && rating is null
shutterSpeed, && ratingPercent is null
software, && securityClassification is null
timeZone, && shutterSpeed is null
timeZoneDigitized, && software is null
timeZoneOriginal, && timeZone is null
userComment, && timeZoneDigitized is null
winAuthor, && timeZoneOriginal is null
winComment, && userComment is null
winKeywords, && winAuthor is null
winSubject, && winComment is null
winTitle, && winKeywords is null
xResolution, && winSubject is null
yResolution); && winTitle is null
&& xResolution is not null
&& yResolution is null)
continue;
results.Add(new(aperture,
applicationNotes,
artist,
bitsPerSample,
bodySerialNumber,
cameraOwnerName,
compressedAverageBitsPerPixel,
compression,
copyright,
dateTime,
dateTimeDigitized,
dateTimeOriginal,
documentName,
exifVersion,
exposureTime,
fileSource,
imageDescription,
imageHeight,
imageNumber,
imageUniqueId,
imageWidth,
isoSpeed,
lensMake,
lensModel,
lensSerialNumber,
make,
makerNote,
model,
orientation,
orientationValue,
rating,
ratingPercent,
securityClassification,
shutterSpeed,
software,
timeZone,
timeZoneDigitized,
timeZoneOriginal,
userComment,
winAuthor,
winComment,
winKeywords,
winSubject,
winTitle,
xResolution,
yResolution));
} }
return result; return results.ToArray();
} }
private static Shared.Models.FileMetadataDirectory GetFileMetadataDirectory(string file, IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.FileMetadataDirectory[] GetFileMetadataDirectories(string file, IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
Shared.Models.FileMetadataDirectory result; List<Shared.Models.FileMetadataDirectory> results = [];
MetadataExtractor.Formats.FileSystem.FileMetadataDirectory? fileMetadataDirectory = directories.OfType<MetadataExtractor.Formats.FileSystem.FileMetadataDirectory>().FirstOrDefault(); IEnumerable<MetadataExtractor.Formats.FileSystem.FileMetadataDirectory> fileMetadataDirectories = directories.OfType<MetadataExtractor.Formats.FileSystem.FileMetadataDirectory>();
if (fileMetadataDirectory is null) foreach (MetadataExtractor.Formats.FileSystem.FileMetadataDirectory fileMetadataDirectory in fileMetadataDirectories)
result = new(null, null, null);
else
{ {
if (fileMetadataDirectory.Tags.Count == 0)
continue;
DateTime? fileModifiedDate; DateTime? fileModifiedDate;
string? fileName = fileMetadataDirectory.GetDescription(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileName); string? fileName = fileMetadataDirectory.GetDescription(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileName);
string? fileSize = fileMetadataDirectory.GetDescription(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileSize); string? fileSize = fileMetadataDirectory.GetDescription(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileSize);
@ -178,49 +231,38 @@ internal abstract class Exif
fileModifiedDate = GetDateTime(fileMetadataDirectory.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})");
result = new(fileModifiedDate, fileName, fileSize); if (fileModifiedDate is null && fileName is null && fileSize is null)
continue;
results.Add(new(fileModifiedDate, fileName, fileSize));
} }
return result; return results.ToArray();
} }
private static Shared.Models.GifHeaderDirectory GetGifHeaderDirectory(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.GifHeaderDirectory[] GetGifHeaderDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
Shared.Models.GifHeaderDirectory result; List<Shared.Models.GifHeaderDirectory> results = [];
MetadataExtractor.Formats.Gif.GifHeaderDirectory? gifHeaderDirectory = directories.OfType<MetadataExtractor.Formats.Gif.GifHeaderDirectory>().FirstOrDefault(); IEnumerable<MetadataExtractor.Formats.Gif.GifHeaderDirectory> gifHeaderDirectories = directories.OfType<MetadataExtractor.Formats.Gif.GifHeaderDirectory>();
if (gifHeaderDirectory is null) foreach (MetadataExtractor.Formats.Gif.GifHeaderDirectory gifHeaderDirectory in gifHeaderDirectories)
result = new(null, null);
else
{ {
if (gifHeaderDirectory.Tags.Count == 0)
continue;
string? imageHeight = gifHeaderDirectory.GetDescription(MetadataExtractor.Formats.Gif.GifHeaderDirectory.TagImageHeight); string? imageHeight = gifHeaderDirectory.GetDescription(MetadataExtractor.Formats.Gif.GifHeaderDirectory.TagImageHeight);
string? imageWidth = gifHeaderDirectory.GetDescription(MetadataExtractor.Formats.Gif.GifHeaderDirectory.TagImageWidth); string? imageWidth = gifHeaderDirectory.GetDescription(MetadataExtractor.Formats.Gif.GifHeaderDirectory.TagImageWidth);
result = new(imageHeight, imageWidth); if (imageHeight is null && imageWidth is null)
continue;
results.Add(new(imageHeight, imageWidth));
} }
return result; return results.ToArray();
} }
private static Shared.Models.PhotoshopDirectory GetPhotoshopDirectory(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.GpsDirectory[] GetGpsDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
Shared.Models.PhotoshopDirectory result; List<Shared.Models.GpsDirectory> results = [];
MetadataExtractor.Formats.Photoshop.PhotoshopDirectory? PhotoshopDirectory = directories.OfType<MetadataExtractor.Formats.Photoshop.PhotoshopDirectory>().FirstOrDefault(); IEnumerable<GpsDirectory> gpsDirectories = directories.OfType<GpsDirectory>();
if (PhotoshopDirectory is null) foreach (GpsDirectory gpsDirectory in gpsDirectories)
result = new(null, null);
else
{
string? jpegQuality = PhotoshopDirectory.GetDescription(MetadataExtractor.Formats.Photoshop.PhotoshopDirectory.TagJpegQuality);
string? url = PhotoshopDirectory.GetDescription(MetadataExtractor.Formats.Photoshop.PhotoshopDirectory.TagUrl);
result = new(jpegQuality, url);
}
return result;
}
private static Shared.Models.GpsDirectory GetGpsDirectory(IReadOnlyList<MetadataExtractor.Directory> directories)
{
Shared.Models.GpsDirectory result;
GpsDirectory? gpsDirectory = directories.OfType<GpsDirectory>().FirstOrDefault();
if (gpsDirectory is null)
result = new(null, null, null, null, null, null);
else
{ {
if (gpsDirectory.Tags.Count == 0)
continue;
DateTime? timeStamp; DateTime? timeStamp;
string? altitude = gpsDirectory.GetDescription(GpsDirectory.TagAltitude); string? altitude = gpsDirectory.GetDescription(GpsDirectory.TagAltitude);
string? latitude = gpsDirectory.GetDescription(GpsDirectory.TagLatitude); string? latitude = gpsDirectory.GetDescription(GpsDirectory.TagLatitude);
@ -231,136 +273,257 @@ internal abstract class Exif
timeStamp = checkDateTime; timeStamp = checkDateTime;
else else
timeStamp = GetDateTime(gpsDirectory.GetString(GpsDirectory.TagTimeStamp)); timeStamp = GetDateTime(gpsDirectory.GetString(GpsDirectory.TagTimeStamp));
result = new(altitude, if (altitude is null && latitude is null && latitudeRef is null && longitude is null && longitudeRef is null && timeStamp is null)
latitude, continue;
latitudeRef, results.Add(new(altitude,
longitude, latitude,
longitudeRef, latitudeRef,
timeStamp); longitude,
longitudeRef,
timeStamp));
} }
return result; return results.ToArray();
} }
private static Shared.Models.JpegDirectory GetJpegDirectory(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.JpegDirectory[] GetJpegDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
Shared.Models.JpegDirectory result; List<Shared.Models.JpegDirectory> results = [];
MetadataExtractor.Formats.Jpeg.JpegDirectory? jpegDirectory = directories.OfType<MetadataExtractor.Formats.Jpeg.JpegDirectory>().FirstOrDefault(); IEnumerable<MetadataExtractor.Formats.Jpeg.JpegDirectory> jpegDirectories = directories.OfType<MetadataExtractor.Formats.Jpeg.JpegDirectory>();
if (jpegDirectory is null) foreach (MetadataExtractor.Formats.Jpeg.JpegDirectory jpegDirectory in jpegDirectories)
result = new(null, null);
else
{ {
if (jpegDirectory.Tags.Count == 0)
continue;
string? imageHeight = jpegDirectory.GetDescription(MetadataExtractor.Formats.Jpeg.JpegDirectory.TagImageHeight); string? imageHeight = jpegDirectory.GetDescription(MetadataExtractor.Formats.Jpeg.JpegDirectory.TagImageHeight);
string? imageWidth = jpegDirectory.GetDescription(MetadataExtractor.Formats.Jpeg.JpegDirectory.TagImageWidth); string? imageWidth = jpegDirectory.GetDescription(MetadataExtractor.Formats.Jpeg.JpegDirectory.TagImageWidth);
result = new(imageHeight, imageWidth); if (imageHeight is null && imageWidth is null)
continue;
results.Add(new(imageHeight, imageWidth));
} }
return result; return results.ToArray();
} }
private static Shared.Models.PngDirectory GetPngDirectory(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.MakernoteDirectory[] GetMakernoteDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
Shared.Models.PngDirectory result; List<Shared.Models.MakernoteDirectory> results = [];
MetadataExtractor.Formats.Png.PngDirectory? pngDirectory = directories.OfType<MetadataExtractor.Formats.Png.PngDirectory>().FirstOrDefault(); IEnumerable<AppleMakernoteDirectory> appleMakernoteDirectories = directories.OfType<AppleMakernoteDirectory>();
if (pngDirectory is null) foreach (AppleMakernoteDirectory appleMakernoteDirectory in appleMakernoteDirectories)
result = new(null, null);
else
{ {
if (appleMakernoteDirectory.Tags.Count == 0)
continue;
string? cameraSerialNumber = null;
string? firmwareVersion = null;
string? qualityAndFileFormat = null;
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue;
results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
}
IEnumerable<CanonMakernoteDirectory> canonMakernoteDirectories = directories.OfType<CanonMakernoteDirectory>();
foreach (CanonMakernoteDirectory canonMakernoteDirectory in canonMakernoteDirectories)
{
if (canonMakernoteDirectory.Tags.Count == 0)
continue;
string? cameraSerialNumber = canonMakernoteDirectory.GetDescription(CanonMakernoteDirectory.TagModelId);
string? firmwareVersion = canonMakernoteDirectory.GetDescription(CanonMakernoteDirectory.TagCanonFirmwareVersion);
string? qualityAndFileFormat = canonMakernoteDirectory.GetDescription(CanonMakernoteDirectory.CameraSettings.TagQuality);
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue;
results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
}
IEnumerable<NikonType2MakernoteDirectory> nikonType2MakernoteDirectories = directories.OfType<NikonType2MakernoteDirectory>();
foreach (NikonType2MakernoteDirectory nikonType2MakernoteDirectory in nikonType2MakernoteDirectories)
{
if (nikonType2MakernoteDirectory.Tags.Count == 0)
continue;
string? cameraSerialNumber = nikonType2MakernoteDirectory.GetDescription(NikonType2MakernoteDirectory.TagCameraSerialNumber);
string? firmwareVersion = nikonType2MakernoteDirectory.GetDescription(NikonType2MakernoteDirectory.TagFirmwareVersion);
string? qualityAndFileFormat = nikonType2MakernoteDirectory.GetDescription(NikonType2MakernoteDirectory.TagQualityAndFileFormat);
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue;
results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
}
IEnumerable<OlympusMakernoteDirectory> olympusMakernoteDirectories = directories.OfType<OlympusMakernoteDirectory>();
foreach (OlympusMakernoteDirectory olympusMakernoteDirectory in olympusMakernoteDirectories)
{
if (olympusMakernoteDirectory.Tags.Count == 0)
continue;
string? cameraSerialNumber = olympusMakernoteDirectory.GetDescription(OlympusMakernoteDirectory.TagSerialNumber1);
string? firmwareVersion = olympusMakernoteDirectory.GetDescription(OlympusMakernoteDirectory.TagBodyFirmwareVersion);
string? qualityAndFileFormat = olympusMakernoteDirectory.GetDescription(OlympusMakernoteDirectory.TagJpegQuality);
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue;
results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
}
IEnumerable<PanasonicMakernoteDirectory> panasonicMakernoteDirectories = directories.OfType<PanasonicMakernoteDirectory>();
foreach (PanasonicMakernoteDirectory panasonicMakernoteDirectory in panasonicMakernoteDirectories)
{
if (panasonicMakernoteDirectory.Tags.Count == 0)
continue;
string? cameraSerialNumber = panasonicMakernoteDirectory.GetDescription(PanasonicMakernoteDirectory.TagInternalSerialNumber);
string? firmwareVersion = panasonicMakernoteDirectory.GetDescription(PanasonicMakernoteDirectory.TagFirmwareVersion);
string? qualityAndFileFormat = panasonicMakernoteDirectory.GetDescription(PanasonicMakernoteDirectory.TagQualityMode);
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue;
results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
}
IEnumerable<SamsungType2MakernoteDirectory> samsungType2MakernoteDirectories = directories.OfType<SamsungType2MakernoteDirectory>();
foreach (SamsungType2MakernoteDirectory samsungType2MakernoteDirectory in samsungType2MakernoteDirectories)
{
if (samsungType2MakernoteDirectory.Tags.Count == 0)
continue;
string? cameraSerialNumber = samsungType2MakernoteDirectory.GetDescription(SamsungType2MakernoteDirectory.TagSerialNumber);
string? firmwareVersion = samsungType2MakernoteDirectory.GetDescription(SamsungType2MakernoteDirectory.TagFirmwareName);
string? qualityAndFileFormat = null;
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue;
results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
}
IEnumerable<SonyType6MakernoteDirectory> sonyType6MakernoteDirectories = directories.OfType<SonyType6MakernoteDirectory>();
foreach (SonyType6MakernoteDirectory sonyType6MakernoteDirectory in sonyType6MakernoteDirectories)
{
if (sonyType6MakernoteDirectory.Tags.Count == 0)
continue;
string? cameraSerialNumber = null;
string? firmwareVersion = null;
string? qualityAndFileFormat = null;
if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null)
continue;
results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat));
}
return results.ToArray();
}
private static Shared.Models.PhotoshopDirectory[] GetPhotoshopDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{
List<Shared.Models.PhotoshopDirectory> results = [];
IEnumerable<MetadataExtractor.Formats.Photoshop.PhotoshopDirectory> photoshopDirectories = directories.OfType<MetadataExtractor.Formats.Photoshop.PhotoshopDirectory>();
foreach (MetadataExtractor.Formats.Photoshop.PhotoshopDirectory photoshopDirectory in photoshopDirectories)
{
if (photoshopDirectory.Tags.Count == 0)
continue;
string? jpegQuality = photoshopDirectory.GetDescription(MetadataExtractor.Formats.Photoshop.PhotoshopDirectory.TagJpegQuality);
string? url = photoshopDirectory.GetDescription(MetadataExtractor.Formats.Photoshop.PhotoshopDirectory.TagUrl);
if (jpegQuality is null && url is null)
continue;
results.Add(new(jpegQuality, url));
}
return results.ToArray();
}
private static Shared.Models.PngDirectory[] GetPngDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{
List<Shared.Models.PngDirectory> results = [];
IEnumerable<MetadataExtractor.Formats.Png.PngDirectory> pngDirectories = directories.OfType<MetadataExtractor.Formats.Png.PngDirectory>();
foreach (MetadataExtractor.Formats.Png.PngDirectory pngDirectory in pngDirectories)
{
if (pngDirectory.Tags.Count == 0)
continue;
string? imageHeight = pngDirectory.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagImageHeight); string? imageHeight = pngDirectory.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagImageHeight);
string? imageWidth = pngDirectory.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagImageWidth); string? imageWidth = pngDirectory.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagImageWidth);
result = new(imageHeight, imageWidth); string? textualData = pngDirectory.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagTextualData);
if (imageHeight is null && imageWidth is null && textualData is null)
continue;
results.Add(new(imageHeight, imageWidth, textualData));
} }
return result; return results.ToArray();
} }
private static Shared.Models.QuickTimeMovieHeaderDirectory GetQuickTimeMovieHeaderDirectoryDirectory(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.QuickTimeMovieHeaderDirectory[] GetQuickTimeMovieHeaderDirectoryDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
Shared.Models.QuickTimeMovieHeaderDirectory result; List<Shared.Models.QuickTimeMovieHeaderDirectory> results = [];
MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory? aviDirectory = directories.OfType<MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory>().FirstOrDefault(); IEnumerable<MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory> quickTimeMovieHeaderDirectories = directories.OfType<MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory>();
if (aviDirectory is null) foreach (MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory quickTimeMovieHeaderDirectory in quickTimeMovieHeaderDirectories)
result = new(null);
else
{ {
if (quickTimeMovieHeaderDirectory.Tags.Count == 0)
continue;
DateTime? created; DateTime? created;
if (aviDirectory.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(aviDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated)); created = GetDateTime(quickTimeMovieHeaderDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated));
result = new(created); if (created is null)
continue;
results.Add(new(created));
} }
return result; return results.ToArray();
} }
private static Shared.Models.QuickTimeTrackHeaderDirectory GetQuickTimeTrackHeaderDirectoryDirectory(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.QuickTimeTrackHeaderDirectory[] GetQuickTimeTrackHeaderDirectoryDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
Shared.Models.QuickTimeTrackHeaderDirectory result; List<Shared.Models.QuickTimeTrackHeaderDirectory> results = [];
MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory? aviDirectory = directories.OfType<MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory>().FirstOrDefault(); IEnumerable<MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory> quickTimeTrackHeaderDirectories = directories.OfType<MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory>();
if (aviDirectory is null) foreach (MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory quickTimeTrackHeaderDirectory in quickTimeTrackHeaderDirectories)
result = new(null);
else
{ {
if (quickTimeTrackHeaderDirectory.Tags.Count == 0)
continue;
DateTime? created; DateTime? created;
if (aviDirectory.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(aviDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated)); created = GetDateTime(quickTimeTrackHeaderDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated));
result = new(created); if (created is null)
continue;
results.Add(new(created));
} }
return result; return results.ToArray();
} }
private static Shared.Models.WebPDirectory GetWebPDirectory(IReadOnlyList<MetadataExtractor.Directory> directories) private static Shared.Models.WebPDirectory[] GetWebPDirectories(IReadOnlyList<MetadataExtractor.Directory> directories)
{ {
Shared.Models.WebPDirectory result; List<Shared.Models.WebPDirectory> results = [];
MetadataExtractor.Formats.WebP.WebPDirectory? WebPDirectory = directories.OfType<MetadataExtractor.Formats.WebP.WebPDirectory>().FirstOrDefault(); IEnumerable<MetadataExtractor.Formats.WebP.WebPDirectory> webPDirectories = directories.OfType<MetadataExtractor.Formats.WebP.WebPDirectory>();
if (WebPDirectory is null) foreach (MetadataExtractor.Formats.WebP.WebPDirectory webPDirectory in webPDirectories)
result = new(null, null);
else
{ {
string? imageHeight = WebPDirectory.GetDescription(MetadataExtractor.Formats.WebP.WebPDirectory.TagImageHeight); if (webPDirectory.Tags.Count == 0)
string? imageWidth = WebPDirectory.GetDescription(MetadataExtractor.Formats.WebP.WebPDirectory.TagImageWidth); continue;
result = new(imageHeight, imageWidth); string? imageHeight = webPDirectory.GetDescription(MetadataExtractor.Formats.WebP.WebPDirectory.TagImageHeight);
string? imageWidth = webPDirectory.GetDescription(MetadataExtractor.Formats.WebP.WebPDirectory.TagImageWidth);
if (imageHeight is null && imageWidth is null)
continue;
results.Add(new(imageHeight, imageWidth));
} }
return results.ToArray();
}
private static Shared.Models.ExifDirectory Covert(Shared.Models.FilePath filePath, Shared.Models.DeterministicHashCode deterministicHashCode, System.Drawing.Size? size, IReadOnlyList<MetadataExtractor.Directory> directories)
{
Shared.Models.ExifDirectory result;
Shared.Models.AviDirectory[] aviDirectories = GetAviDirectories(directories);
Shared.Models.GpsDirectory[] gpsDirectories = GetGpsDirectories(directories);
Shared.Models.PngDirectory[] pngDirectories = GetPngDirectories(directories);
Shared.Models.JpegDirectory[] jpegDirectories = GetJpegDirectories(directories);
Shared.Models.WebPDirectory[] webPDirectories = GetWebPDirectories(directories);
Shared.Models.ExifDirectoryBase[] exifBaseDirectories = GetExifBaseDirectories(directories);
Shared.Models.GifHeaderDirectory[] gifHeaderDirectories = GetGifHeaderDirectories(directories);
Shared.Models.MakernoteDirectory[] MakernoteDirectories = GetMakernoteDirectories(directories);
Shared.Models.PhotoshopDirectory[] photoshopDirectories = GetPhotoshopDirectories(directories);
Shared.Models.FileMetadataDirectory[] fileMetadataDirectories = GetFileMetadataDirectories(filePath.FullName, directories);
Shared.Models.QuickTimeMovieHeaderDirectory[] quickTimeMovieHeaderDirectories = GetQuickTimeMovieHeaderDirectoryDirectories(directories);
Shared.Models.QuickTimeTrackHeaderDirectory[] quickTimeTrackHeaderDirectories = GetQuickTimeTrackHeaderDirectoryDirectories(directories);
result = new(aviDirectories,
exifBaseDirectories,
fileMetadataDirectories,
gifHeaderDirectories,
gpsDirectories,
size?.Height,
deterministicHashCode.Id ?? filePath.Id,
jpegDirectories,
MakernoteDirectories,
filePath.Name,
photoshopDirectories,
pngDirectories,
quickTimeMovieHeaderDirectories,
quickTimeTrackHeaderDirectories,
webPDirectories,
size?.Width);
return result; return result;
} }
internal static Shared.Models.ExifDirectory Covert(Shared.Models.FilePath filePath, Shared.Models.DeterministicHashCode deterministicHashCode, System.Drawing.Size? size, IReadOnlyList<MetadataExtractor.Directory> directories) internal static Shared.Models.ExifDirectory GetExifDirectory(Shared.Models.FilePath filePath, Shared.Models.DeterministicHashCode deterministicHashCode)
{ {
Shared.Models.ExifDirectory results; Shared.Models.ExifDirectory? result;
Shared.Models.AviDirectory aviDirectory = GetAviDirectory(directories); System.Drawing.Size? size = Dimensions.GetDimensions(filePath.FullName);
Shared.Models.GpsDirectory gpsDirectory = GetGpsDirectory(directories); IReadOnlyList<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(filePath.FullName);
Shared.Models.PngDirectory pngDirectory = GetPngDirectory(directories); result = Covert(filePath, deterministicHashCode, size, directories);
Shared.Models.JpegDirectory jpegDirectory = GetJpegDirectory(directories);
Shared.Models.WebPDirectory webPDirectory = GetWebPDirectory(directories);
Shared.Models.ExifDirectoryBase exifDirectoryBase = GetExifDirectoryBase(directories);
Shared.Models.GifHeaderDirectory gifHeaderDirectory = GetGifHeaderDirectory(directories);
Shared.Models.PhotoshopDirectory photoshopDirectory = GetPhotoshopDirectory(directories);
Shared.Models.FileMetadataDirectory fileMetadataDirectory = GetFileMetadataDirectory(filePath.FullName, directories);
Shared.Models.QuickTimeMovieHeaderDirectory quickTimeMovieHeaderDirectory = GetQuickTimeMovieHeaderDirectoryDirectory(directories);
Shared.Models.QuickTimeTrackHeaderDirectory quickTimeTrackHeaderDirectory = GetQuickTimeTrackHeaderDirectoryDirectory(directories);
results = new(aviDirectory,
exifDirectoryBase,
fileMetadataDirectory,
gifHeaderDirectory,
gpsDirectory,
size?.Height,
deterministicHashCode.Id ?? filePath.Id,
jpegDirectory,
filePath.Name,
photoshopDirectory,
pngDirectory,
quickTimeMovieHeaderDirectory,
quickTimeTrackHeaderDirectory,
webPDirectory,
size?.Width);
return results;
}
internal static string GetMaker(Shared.Models.ExifDirectoryBase exifDirectoryBase)
{
string result;
if (string.IsNullOrEmpty(exifDirectoryBase.Make?.ToString().Trim()))
result = "Unknown";
else
result = $"{exifDirectoryBase.Make[0].ToString().ToUpper()}{exifDirectoryBase.Make[1..].ToLower()}".Trim();
return result; return result;
} }

View File

@ -0,0 +1,42 @@
using View_by_Distance.Shared.Models;
namespace View_by_Distance.Metadata.Models.Stateless.Methods;
internal static class Face
{
internal static string? GetFaceEncoding(PngDirectory[]? pngDirectories)
{
string? result = null;
if (pngDirectories is not null)
{
const string comment = "Comment:";
foreach (PngDirectory pngDirectory in pngDirectories)
{
if (pngDirectory.TextualData is null || !pngDirectory.TextualData.StartsWith(comment))
continue;
result = pngDirectory.TextualData[comment.Length..];
break;
}
}
return result;
}
internal static string? GetOutputResolution(PngDirectory[]? pngDirectories)
{
string? result = null;
if (pngDirectories is not null)
{
const string artist = "Artist:";
foreach (PngDirectory pngDirectory in pngDirectories)
{
if (pngDirectory.TextualData is null || !pngDirectory.TextualData.StartsWith(artist))
continue;
result = pngDirectory.TextualData[artist.Length..];
break;
}
}
return result;
}
}

View File

@ -1,4 +1,6 @@
using MetadataExtractor;
using View_by_Distance.Metadata.Models.Stateless.Methods; using View_by_Distance.Metadata.Models.Stateless.Methods;
using View_by_Distance.Shared.Models;
namespace View_by_Distance.Metadata.Models.Stateless; namespace View_by_Distance.Metadata.Models.Stateless;
@ -85,34 +87,36 @@ internal abstract class GPS
return result; return result;
} }
// internal static GeoLocation? GeoLocation(ReadOnlyDictionary<string, MetadataExtractorDirectory> metadataExtractorDirectories) internal static GeoLocation? GeoLocation(GpsDirectory[]? gpsDirectories)
// { {
// GeoLocation? result; GeoLocation? result = null;
// if (!metadataExtractorDirectories.TryGetValue("GPS", out MetadataExtractorDirectory? metadataExtractorDirectory)) if (gpsDirectories is not null)
// result = null; {
// else foreach (GpsDirectory gpsDirectory in gpsDirectories)
// { {
// MetadataExtractorTag? metadataExtractorTag; if (string.IsNullOrEmpty(gpsDirectory?.Latitude))
// if (!metadataExtractorDirectory.Tags.TryGetValue((int)Shared.Models.Stateless.IExif.Tags.GPSLatitude, out metadataExtractorTag) || string.IsNullOrEmpty(metadataExtractorTag.Description)) result = null;
// result = null; else
// else {
// { string latitudeDMS = gpsDirectory.Latitude;
// string latitudeDMS = metadataExtractorTag.Description; double latitude = ParseValueFromDmsString(latitudeDMS);
// double latitude = ParseValueFromDmsString(latitudeDMS); if (string.IsNullOrEmpty(gpsDirectory.Longitude))
// if (!metadataExtractorDirectory.Tags.TryGetValue((int)Shared.Models.Stateless.IExif.Tags.GPSLongitude, out metadataExtractorTag) || string.IsNullOrEmpty(metadataExtractorTag.Description)) result = null;
// result = null; else
// else {
// { string longitudeDMS = gpsDirectory.Longitude;
// string longitudeDMS = metadataExtractorTag.Description; double longitude = ParseValueFromDmsString(longitudeDMS);
// double longitude = ParseValueFromDmsString(longitudeDMS); result = new(latitude, longitude);
// result = new(latitude, longitude); string dms = result.ToDmsString();
// string dms = result.ToDmsString(); if ($"{latitudeDMS}, {longitudeDMS}" != dms)
// if ($"{latitudeDMS}, {longitudeDMS}" != dms) result = null;
// result = null; }
// } }
// } if (result is not null)
// } break;
// return result; }
// } }
return result;
}
} }

View File

@ -1,3 +1,6 @@
using MetadataExtractor;
using View_by_Distance.Shared.Models;
namespace View_by_Distance.Metadata.Models.Stateless.Methods; namespace View_by_Distance.Metadata.Models.Stateless.Methods;
public interface IMetadata public interface IMetadata
@ -11,10 +14,35 @@ public interface IMetadata
Meters Meters
} }
string TestStatic_GetMaker(Shared.Models.ExifDirectoryBase exifDirectoryBase) => ExifDirectory TestStatic_GetExifDirectory(FilePath filePath, DeterministicHashCode deterministicHashCode) =>
GetMaker(exifDirectoryBase); GetExifDirectory(filePath, deterministicHashCode);
static string GetMaker(Shared.Models.ExifDirectoryBase exifDirectoryBase) => static ExifDirectory GetExifDirectory(FilePath filePath, DeterministicHashCode deterministicHashCode) =>
Exif.GetMaker(exifDirectoryBase); Exif.GetExifDirectory(filePath, deterministicHashCode);
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);
string? TestStatic_GetOutputResolution(ExifDirectory? exifDirectory) =>
GetOutputResolution(exifDirectory);
static string? GetOutputResolution(ExifDirectory? exifDirectory) =>
Face.GetOutputResolution(exifDirectory?.PngDirectories);
string? TestStatic_GetFaceEncoding(ExifDirectory? exifDirectory) =>
GetFaceEncoding(exifDirectory);
static string? GetFaceEncoding(ExifDirectory? exifDirectory) =>
Face.GetFaceEncoding(exifDirectory?.PngDirectories);
GeoLocation? TestStatic_GeoLocation(ExifDirectory? exifDirectory) =>
GeoLocation(exifDirectory);
static GeoLocation? GeoLocation(ExifDirectory? exifDirectory) =>
GPS.GeoLocation(exifDirectory?.GpsDirectories);
double? TestStatic_GetDistance(double originLatitude, double originLongitude, double destinationLatitude, double destinationLongitude, int decimalPlaces = 1, DistanceUnit distanceUnit = DistanceUnit.Miles) => double? TestStatic_GetDistance(double originLatitude, double originLongitude, double destinationLatitude, double destinationLongitude, int decimalPlaces = 1, DistanceUnit distanceUnit = DistanceUnit.Miles) =>
GetDistance(originLatitude, originLongitude, destinationLatitude, destinationLongitude, decimalPlaces, distanceUnit); GetDistance(originLatitude, originLongitude, destinationLatitude, destinationLongitude, decimalPlaces, distanceUnit);

View File

@ -221,7 +221,7 @@ public class Rename : IRename
throw new NotImplementedException(); throw new NotImplementedException();
else else
{ {
string maker = IMetadata.GetMaker(record.ExifDirectory.ExifDirectoryBase); string maker = IMetadata.GetMaker(record.ExifDirectory);
(int seasonValue, string seasonName) = IDate.GetSeason(record.DateTime.DayOfYear); (int seasonValue, string seasonName) = IDate.GetSeason(record.DateTime.DayOfYear);
string splat = fileHolder.DirectoryName[^3..][1] == '!' ? fileHolder.DirectoryName[^3..] : string.Empty; string splat = fileHolder.DirectoryName[^3..][1] == '!' ? fileHolder.DirectoryName[^3..] : string.Empty;
directoryName = $"{year}.{seasonValue} {seasonName} {maker.Split(' ')[0]}{splat}"; directoryName = $"{year}.{seasonValue} {seasonName} {maker.Split(' ')[0]}{splat}";

View File

@ -3,20 +3,21 @@ using System.Text.Json.Serialization;
namespace View_by_Distance.Shared.Models; namespace View_by_Distance.Shared.Models;
public record ExifDirectory(AviDirectory AviDirectory, public record ExifDirectory(AviDirectory[] AviDirectories,
ExifDirectoryBase ExifDirectoryBase, ExifDirectoryBase[] ExifBaseDirectories,
FileMetadataDirectory FileMetadataDirectory, FileMetadataDirectory[] FileMetadataDirectories,
GifHeaderDirectory GifHeaderDirectory, GifHeaderDirectory[] GifHeaderDirectories,
GpsDirectory GpsDirectory, GpsDirectory[] GpsDirectories,
int? Height, int? Height,
int? Id, int? Id,
JpegDirectory JpegDirectory, JpegDirectory[] JpegDirectories,
MakernoteDirectory[] MakernoteDirectories,
string OriginalFileName, string OriginalFileName,
PhotoshopDirectory PhotoshopDirectory, PhotoshopDirectory[] PhotoshopDirectories,
PngDirectory PngDirectory, PngDirectory[] PngDirectories,
QuickTimeMovieHeaderDirectory QuickTimeMovieHeaderDirectory, QuickTimeMovieHeaderDirectory[] QuickTimeMovieHeaderDirectories,
QuickTimeTrackHeaderDirectory QuickTimeTrackHeaderDirectory, QuickTimeTrackHeaderDirectory[] QuickTimeTrackHeaderDirectories,
WebPDirectory WebPDirectory, WebPDirectory[] WebPDirectories,
int? Width) int? Width)
{ {
@ -28,7 +29,7 @@ public record ExifDirectory(AviDirectory AviDirectory,
} }
[JsonSourceGenerationOptions(WriteIndented = true)] [JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
[JsonSerializable(typeof(ExifDirectory))] [JsonSerializable(typeof(ExifDirectory))]
public partial class ExifDirectorySourceGenerationContext : JsonSerializerContext public partial class ExifDirectorySourceGenerationContext : JsonSerializerContext
{ {

View File

@ -0,0 +1,23 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace View_by_Distance.Shared.Models;
public record MakernoteDirectory(string? CameraSerialNumber,
string? FirmwareVersion,
string? QualityAndFileFormat)
{
public override string ToString()
{
string result = JsonSerializer.Serialize(this, MakernoteDirectorySourceGenerationContext.Default.MakernoteDirectory);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(MakernoteDirectory))]
public partial class MakernoteDirectorySourceGenerationContext : JsonSerializerContext
{
}

View File

@ -4,7 +4,8 @@ using System.Text.Json.Serialization;
namespace View_by_Distance.Shared.Models; namespace View_by_Distance.Shared.Models;
public record PngDirectory(string? ImageHeight, public record PngDirectory(string? ImageHeight,
string? ImageWidth) string? ImageWidth,
string? TextualData)
{ {
public override string ToString() public override string ToString()

View File

@ -54,14 +54,26 @@ internal abstract class XDate
{ {
DateTime? result; DateTime? result;
List<DateTime> results = []; List<DateTime> results = [];
if (exifDirectory.ExifDirectoryBase.DateTimeOriginal is not null) foreach (ExifDirectoryBase exifDirectoryBase in exifDirectory.ExifBaseDirectories)
results.Add(exifDirectory.ExifDirectoryBase.DateTimeOriginal.Value); {
if (exifDirectory.AviDirectory.DateTimeOriginal is not null) if (exifDirectoryBase.DateTimeOriginal is not null)
results.Add(exifDirectory.AviDirectory.DateTimeOriginal.Value); results.Add(exifDirectoryBase.DateTimeOriginal.Value);
if (exifDirectory.QuickTimeMovieHeaderDirectory.Created is not null) }
results.Add(exifDirectory.QuickTimeMovieHeaderDirectory.Created.Value); foreach (AviDirectory aviDirectory in exifDirectory.AviDirectories)
if (exifDirectory.QuickTimeTrackHeaderDirectory.Created is not null) {
results.Add(exifDirectory.QuickTimeTrackHeaderDirectory.Created.Value); if (aviDirectory.DateTimeOriginal is not null)
results.Add(aviDirectory.DateTimeOriginal.Value);
}
foreach (QuickTimeMovieHeaderDirectory quickTimeMovieHeaderDirectory in exifDirectory.QuickTimeMovieHeaderDirectories)
{
if (quickTimeMovieHeaderDirectory.Created is not null)
results.Add(quickTimeMovieHeaderDirectory.Created.Value);
}
foreach (QuickTimeTrackHeaderDirectory quickTimeTrackHeaderDirectory in exifDirectory.QuickTimeTrackHeaderDirectories)
{
if (quickTimeTrackHeaderDirectory.Created is not null)
results.Add(quickTimeTrackHeaderDirectory.Created.Value);
}
result = results.Count == 0 ? null : results.Min(); result = results.Count == 0 ? null : results.Min();
return result; return result;
} }
@ -121,27 +133,48 @@ internal abstract class XDate
{ {
DateTime result; DateTime result;
List<DateTime> results = []; List<DateTime> results = [];
if (exifDirectory.ExifDirectoryBase.DateTimeOriginal is not null) foreach (ExifDirectoryBase exifDirectoryBase in exifDirectory.ExifBaseDirectories)
results.Add(exifDirectory.ExifDirectoryBase.DateTimeOriginal.Value); {
if (exifDirectory.AviDirectory.DateTimeOriginal is not null) if (exifDirectoryBase.DateTimeOriginal is not null)
results.Add(exifDirectory.AviDirectory.DateTimeOriginal.Value); results.Add(exifDirectoryBase.DateTimeOriginal.Value);
if (exifDirectory.QuickTimeMovieHeaderDirectory.Created is not null) }
results.Add(exifDirectory.QuickTimeMovieHeaderDirectory.Created.Value); foreach (AviDirectory aviDirectory in exifDirectory.AviDirectories)
if (exifDirectory.QuickTimeTrackHeaderDirectory.Created is not null) {
results.Add(exifDirectory.QuickTimeTrackHeaderDirectory.Created.Value); if (aviDirectory.DateTimeOriginal is not null)
results.Add(aviDirectory.DateTimeOriginal.Value);
}
foreach (QuickTimeMovieHeaderDirectory quickTimeMovieHeaderDirectory in exifDirectory.QuickTimeMovieHeaderDirectories)
{
if (quickTimeMovieHeaderDirectory.Created is not null)
results.Add(quickTimeMovieHeaderDirectory.Created.Value);
}
foreach (QuickTimeTrackHeaderDirectory quickTimeTrackHeaderDirectory in exifDirectory.QuickTimeTrackHeaderDirectories)
{
if (quickTimeTrackHeaderDirectory.Created is not null)
results.Add(quickTimeTrackHeaderDirectory.Created.Value);
}
if (results.Count == 0) if (results.Count == 0)
{ {
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(exifDirectory.OriginalFileName); string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(exifDirectory.OriginalFileName);
DateTime? dateTime = GetDateTimeFromName(fileNameWithoutExtension); DateTime? dateTime = GetDateTimeFromName(fileNameWithoutExtension);
if (dateTime is not null) if (dateTime is not null)
results.Add(dateTime.Value); results.Add(dateTime.Value);
if (exifDirectory.ExifDirectoryBase.DateTime is not null) foreach (ExifDirectoryBase exifDirectoryBase in exifDirectory.ExifBaseDirectories)
results.Add(exifDirectory.ExifDirectoryBase.DateTime.Value); {
if (exifDirectory.ExifDirectoryBase.DateTimeDigitized is not null) if (exifDirectoryBase.DateTime is not null)
results.Add(exifDirectory.ExifDirectoryBase.DateTimeDigitized.Value); results.Add(exifDirectoryBase.DateTime.Value);
if (exifDirectoryBase.DateTimeDigitized is not null)
results.Add(exifDirectoryBase.DateTimeDigitized.Value);
}
}
if (results.Count == 0)
{
foreach (FileMetadataDirectory fileMetadataDirectory in exifDirectory.FileMetadataDirectories)
{
if (fileMetadataDirectory.FileModifiedDate is not null)
results.Add(fileMetadataDirectory.FileModifiedDate.Value);
}
} }
if (results.Count == 0 && exifDirectory.FileMetadataDirectory.FileModifiedDate is not null)
results.Add(exifDirectory.FileMetadataDirectory.FileModifiedDate.Value);
result = results.Count == 0 ? DateTime.MinValue : results.Min(); result = results.Count == 0 ? DateTime.MinValue : results.Min();
return result; return result;
} }