Skip to content

Commit

Permalink
Merge pull request #411 from drewnoakes/file-type-detection-from-exte…
Browse files Browse the repository at this point in the history
…nsion

Allow filename to influence file type detection
  • Loading branch information
drewnoakes authored Feb 18, 2024
2 parents 3fdeeb0 + 273b8ad commit aa74bff
Show file tree
Hide file tree
Showing 11 changed files with 178 additions and 38 deletions.
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

0 comments on commit aa74bff

Please sign in to comment.