Skip to content

Allow filename to influence file type detection #411

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions MetadataExtractor/ImageMetadataReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,13 @@ public static class ImageMetadataReader
{
/// <summary>Reads metadata from an <see cref="Stream"/>.</summary>
/// <param name="stream">A stream from which the file data may be read. The stream must be positioned at the beginning of the file's data.</param>
/// <param name="fileName">The file name, if available. May contain path information if that's more convenient. The method will only inspect the extension of the path (i.e. <c>EndsWith</c>).</param>
/// <returns>A list of <see cref="Directory"/> instances containing the various types of metadata found within the file's data.</returns>
/// <exception cref="ImageProcessingException">The file type is unknown, or processing errors occurred.</exception>
/// <exception cref="IOException"/>
public static IReadOnlyList<Directory> ReadMetadata(Stream stream)
public static IReadOnlyList<Directory> ReadMetadata(Stream stream, string? fileName = null)
{
var fileType = FileTypeDetector.DetectFileType(stream);
var fileType = FileTypeDetector.DetectFileType(stream, fileName);

var directories = new List<Directory>();

Expand All @@ -76,23 +77,29 @@ public static IReadOnlyList<Directory> ReadMetadata(Stream stream)
FileType.Bmp => BmpMetadataReader.ReadMetadata(stream),
FileType.Crx => QuickTimeMetadataReader.ReadMetadata(stream),
FileType.Cr2 => TiffMetadataReader.ReadMetadata(stream),
FileType.Dng => TiffMetadataReader.ReadMetadata(stream),
FileType.Eps => EpsMetadataReader.ReadMetadata(stream),
FileType.Gif => GifMetadataReader.ReadMetadata(stream),
FileType.GoPro => TiffMetadataReader.ReadMetadata(stream),
FileType.Heif => HeifMetadataReader.ReadMetadata(stream),
FileType.Ico => IcoMetadataReader.ReadMetadata(stream),
FileType.Jpeg => JpegMetadataReader.ReadMetadata(stream),
FileType.Kdc => TiffMetadataReader.ReadMetadata(stream),
FileType.Mp3 => Mp3MetadataReader.ReadMetadata(stream),
FileType.Mp4 => QuickTimeMetadataReader.ReadMetadata(stream),
FileType.Nef => TiffMetadataReader.ReadMetadata(stream),
FileType.Netpbm => [NetpbmMetadataReader.ReadMetadata(stream)],
FileType.Orf => TiffMetadataReader.ReadMetadata(stream),
FileType.Pef => TiffMetadataReader.ReadMetadata(stream),
FileType.Pcx => [PcxMetadataReader.ReadMetadata(stream)],
FileType.Png => PngMetadataReader.ReadMetadata(stream),
FileType.Psd => PsdMetadataReader.ReadMetadata(stream),
FileType.QuickTime => QuickTimeMetadataReader.ReadMetadata(stream),
FileType.Raf => RafMetadataReader.ReadMetadata(stream),
FileType.Rw2 => TiffMetadataReader.ReadMetadata(stream),
FileType.Srw => TiffMetadataReader.ReadMetadata(stream),
FileType.Tga => TgaMetadataReader.ReadMetadata(stream),
FileType.ThreeFR => TiffMetadataReader.ReadMetadata(stream),
FileType.Tiff => TiffMetadataReader.ReadMetadata(stream),
FileType.Wav => WavMetadataReader.ReadMetadata(stream),
FileType.WebP => WebPMetadataReader.ReadMetadata(stream),
Expand All @@ -109,7 +116,7 @@ public static IReadOnlyList<Directory> ReadMetadata(Stream stream)
}

/// <summary>Reads metadata from a file.</summary>
/// <remarks>Unlike <see cref="ReadMetadata(Stream)"/>, this overload includes a <see cref="FileMetadataDirectory"/> in the output.</remarks>
/// <remarks>Unlike <see cref="ReadMetadata(Stream, string)"/>, this overload includes a <see cref="FileMetadataDirectory"/> in the output.</remarks>
/// <param name="filePath">Location of a file from which data should be read.</param>
/// <returns>A list of <see cref="Directory"/> instances containing the various types of metadata found within the file's data.</returns>
/// <exception cref="ImageProcessingException">The file type is unknown, or processing errors occurred.</exception>
Expand All @@ -119,7 +126,7 @@ public static IReadOnlyList<Directory> ReadMetadata(string filePath)
var directories = new List<Directory>();

using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
directories.AddRange(ReadMetadata(stream));
directories.AddRange(ReadMetadata(stream, filePath));

directories.Add(new FileMetadataReader().Read(filePath));

Expand Down
4 changes: 2 additions & 2 deletions MetadataExtractor/PublicAPI/net462/PublicAPI.Shipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4378,13 +4378,13 @@ static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSeconds(double value
static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSecondsString(double value) -> string!
static MetadataExtractor.GeoLocation.DegreesMinutesSecondsToDecimal(MetadataExtractor.Rational degs, MetadataExtractor.Rational mins, MetadataExtractor.Rational secs, bool isNegative) -> double?
static MetadataExtractor.ImageMetadataReader.ReadMetadata(string! filePath) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream, string? fileName = null) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
static MetadataExtractor.Rational.operator !=(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
static MetadataExtractor.Rational.operator ==(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
static MetadataExtractor.TagDescriptor<T>.ConvertBytesToVersionString(int[]? components, int majorDigits) -> string?
static MetadataExtractor.TagDescriptor<T>.GetFocalLengthDescription(double mm) -> string!
static MetadataExtractor.TagDescriptor<T>.GetFStopDescription(double fStop) -> string!
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream) -> MetadataExtractor.Util.FileType
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream, string? fileName = null) -> MetadataExtractor.Util.FileType
static MetadataExtractor.Util.FileTypeExtensions.GetAllExtensions(this MetadataExtractor.Util.FileType fileType) -> System.Collections.Generic.IEnumerable<string!>?
static MetadataExtractor.Util.FileTypeExtensions.GetCommonExtension(this MetadataExtractor.Util.FileType fileType) -> string?
static MetadataExtractor.Util.FileTypeExtensions.GetLongName(this MetadataExtractor.Util.FileType fileType) -> string!
Expand Down
6 changes: 6 additions & 0 deletions MetadataExtractor/PublicAPI/net462/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,12 @@ MetadataExtractor.IO.IndexedCapturingReader.Dispose() -> void
MetadataExtractor.IO.IndexedReader.GetByte(int index) -> byte
MetadataExtractor.IO.IndexedReader.GetBytes(int index, int count) -> byte[]!
MetadataExtractor.Util.FileType.Avif = 28 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Dng = 29 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.GoPro = 30 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Kdc = 31 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.ThreeFR = 32 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Pef = 33 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Srw = 34 -> MetadataExtractor.Util.FileType
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor.GetDescription(int tagType) -> string?
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.Name.get -> string!
override MetadataExtractor.Formats.Exif.Makernotes.NikonPictureControl1Descriptor.GetDescription(int tagType) -> string?
Expand Down
4 changes: 2 additions & 2 deletions MetadataExtractor/PublicAPI/net8.0/PublicAPI.Shipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4366,13 +4366,13 @@ static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSeconds(double value
static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSecondsString(double value) -> string!
static MetadataExtractor.GeoLocation.DegreesMinutesSecondsToDecimal(MetadataExtractor.Rational degs, MetadataExtractor.Rational mins, MetadataExtractor.Rational secs, bool isNegative) -> double?
static MetadataExtractor.ImageMetadataReader.ReadMetadata(string! filePath) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream, string? fileName = null) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
static MetadataExtractor.Rational.operator !=(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
static MetadataExtractor.Rational.operator ==(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
static MetadataExtractor.TagDescriptor<T>.ConvertBytesToVersionString(int[]? components, int majorDigits) -> string?
static MetadataExtractor.TagDescriptor<T>.GetFocalLengthDescription(double mm) -> string!
static MetadataExtractor.TagDescriptor<T>.GetFStopDescription(double fStop) -> string!
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream) -> MetadataExtractor.Util.FileType
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream, string? fileName = null) -> MetadataExtractor.Util.FileType
static MetadataExtractor.Util.FileTypeExtensions.GetAllExtensions(this MetadataExtractor.Util.FileType fileType) -> System.Collections.Generic.IEnumerable<string!>?
static MetadataExtractor.Util.FileTypeExtensions.GetCommonExtension(this MetadataExtractor.Util.FileType fileType) -> string?
static MetadataExtractor.Util.FileTypeExtensions.GetLongName(this MetadataExtractor.Util.FileType fileType) -> string!
Expand Down
6 changes: 6 additions & 0 deletions MetadataExtractor/PublicAPI/net8.0/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,12 @@ MetadataExtractor.IO.IndexedCapturingReader.Dispose() -> void
MetadataExtractor.IO.IndexedReader.GetByte(int index) -> byte
MetadataExtractor.IO.IndexedReader.GetBytes(int index, int count) -> byte[]!
MetadataExtractor.Util.FileType.Avif = 28 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Dng = 29 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.GoPro = 30 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Kdc = 31 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.ThreeFR = 32 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Pef = 33 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Srw = 34 -> MetadataExtractor.Util.FileType
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor.GetDescription(int tagType) -> string?
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.Name.get -> string!
override MetadataExtractor.Formats.Exif.Makernotes.NikonPictureControl1Descriptor.GetDescription(int tagType) -> string?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4371,13 +4371,13 @@ static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSeconds(double value
static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSecondsString(double value) -> string!
static MetadataExtractor.GeoLocation.DegreesMinutesSecondsToDecimal(MetadataExtractor.Rational degs, MetadataExtractor.Rational mins, MetadataExtractor.Rational secs, bool isNegative) -> double?
static MetadataExtractor.ImageMetadataReader.ReadMetadata(string! filePath) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream, string? fileName = null) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
static MetadataExtractor.Rational.operator !=(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
static MetadataExtractor.Rational.operator ==(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
static MetadataExtractor.TagDescriptor<T>.ConvertBytesToVersionString(int[]? components, int majorDigits) -> string?
static MetadataExtractor.TagDescriptor<T>.GetFocalLengthDescription(double mm) -> string!
static MetadataExtractor.TagDescriptor<T>.GetFStopDescription(double fStop) -> string!
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream) -> MetadataExtractor.Util.FileType
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream, string? fileName = null) -> MetadataExtractor.Util.FileType
static MetadataExtractor.Util.FileTypeExtensions.GetAllExtensions(this MetadataExtractor.Util.FileType fileType) -> System.Collections.Generic.IEnumerable<string!>?
static MetadataExtractor.Util.FileTypeExtensions.GetCommonExtension(this MetadataExtractor.Util.FileType fileType) -> string?
static MetadataExtractor.Util.FileTypeExtensions.GetLongName(this MetadataExtractor.Util.FileType fileType) -> string!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,12 @@ MetadataExtractor.IO.IndexedCapturingReader.Dispose() -> void
MetadataExtractor.IO.IndexedReader.GetByte(int index) -> byte
MetadataExtractor.IO.IndexedReader.GetBytes(int index, int count) -> byte[]!
MetadataExtractor.Util.FileType.Avif = 28 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Dng = 29 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.GoPro = 30 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Kdc = 31 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.ThreeFR = 32 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Pef = 33 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Srw = 34 -> MetadataExtractor.Util.FileType
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor.GetDescription(int tagType) -> string?
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.Name.get -> string!
override MetadataExtractor.Formats.Exif.Makernotes.NikonPictureControl1Descriptor.GetDescription(int tagType) -> string?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4373,13 +4373,13 @@ static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSeconds(double value
static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSecondsString(double value) -> string!
static MetadataExtractor.GeoLocation.DegreesMinutesSecondsToDecimal(MetadataExtractor.Rational degs, MetadataExtractor.Rational mins, MetadataExtractor.Rational secs, bool isNegative) -> double?
static MetadataExtractor.ImageMetadataReader.ReadMetadata(string! filePath) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream, string? fileName = null) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
static MetadataExtractor.Rational.operator !=(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
static MetadataExtractor.Rational.operator ==(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
static MetadataExtractor.TagDescriptor<T>.ConvertBytesToVersionString(int[]? components, int majorDigits) -> string?
static MetadataExtractor.TagDescriptor<T>.GetFocalLengthDescription(double mm) -> string!
static MetadataExtractor.TagDescriptor<T>.GetFStopDescription(double fStop) -> string!
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream) -> MetadataExtractor.Util.FileType
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream, string? fileName = null) -> MetadataExtractor.Util.FileType
static MetadataExtractor.Util.FileTypeExtensions.GetAllExtensions(this MetadataExtractor.Util.FileType fileType) -> System.Collections.Generic.IEnumerable<string!>?
static MetadataExtractor.Util.FileTypeExtensions.GetCommonExtension(this MetadataExtractor.Util.FileType fileType) -> string?
static MetadataExtractor.Util.FileTypeExtensions.GetLongName(this MetadataExtractor.Util.FileType fileType) -> string!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,12 @@ MetadataExtractor.IO.IndexedCapturingReader.Dispose() -> void
MetadataExtractor.IO.IndexedReader.GetByte(int index) -> byte
MetadataExtractor.IO.IndexedReader.GetBytes(int index, int count) -> byte[]!
MetadataExtractor.Util.FileType.Avif = 28 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Dng = 29 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.GoPro = 30 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Kdc = 31 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.ThreeFR = 32 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Pef = 33 -> MetadataExtractor.Util.FileType
MetadataExtractor.Util.FileType.Srw = 34 -> MetadataExtractor.Util.FileType
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor.GetDescription(int tagType) -> string?
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.Name.get -> string!
override MetadataExtractor.Formats.Exif.Makernotes.NikonPictureControl1Descriptor.GetDescription(int tagType) -> string?
Expand Down
Loading