Skip to content

Commit aa74bff

Browse files
authored
Merge pull request #411 from drewnoakes/file-type-detection-from-extension
Allow filename to influence file type detection
2 parents 3fdeeb0 + 273b8ad commit aa74bff

File tree

11 files changed

+178
-38
lines changed

11 files changed

+178
-38
lines changed

MetadataExtractor/ImageMetadataReader.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,13 @@ public static class ImageMetadataReader
5757
{
5858
/// <summary>Reads metadata from an <see cref="Stream"/>.</summary>
5959
/// <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>
60+
/// <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>
6061
/// <returns>A list of <see cref="Directory"/> instances containing the various types of metadata found within the file's data.</returns>
6162
/// <exception cref="ImageProcessingException">The file type is unknown, or processing errors occurred.</exception>
6263
/// <exception cref="IOException"/>
63-
public static IReadOnlyList<Directory> ReadMetadata(Stream stream)
64+
public static IReadOnlyList<Directory> ReadMetadata(Stream stream, string? fileName = null)
6465
{
65-
var fileType = FileTypeDetector.DetectFileType(stream);
66+
var fileType = FileTypeDetector.DetectFileType(stream, fileName);
6667

6768
var directories = new List<Directory>();
6869

@@ -76,23 +77,29 @@ public static IReadOnlyList<Directory> ReadMetadata(Stream stream)
7677
FileType.Bmp => BmpMetadataReader.ReadMetadata(stream),
7778
FileType.Crx => QuickTimeMetadataReader.ReadMetadata(stream),
7879
FileType.Cr2 => TiffMetadataReader.ReadMetadata(stream),
80+
FileType.Dng => TiffMetadataReader.ReadMetadata(stream),
7981
FileType.Eps => EpsMetadataReader.ReadMetadata(stream),
8082
FileType.Gif => GifMetadataReader.ReadMetadata(stream),
83+
FileType.GoPro => TiffMetadataReader.ReadMetadata(stream),
8184
FileType.Heif => HeifMetadataReader.ReadMetadata(stream),
8285
FileType.Ico => IcoMetadataReader.ReadMetadata(stream),
8386
FileType.Jpeg => JpegMetadataReader.ReadMetadata(stream),
87+
FileType.Kdc => TiffMetadataReader.ReadMetadata(stream),
8488
FileType.Mp3 => Mp3MetadataReader.ReadMetadata(stream),
8589
FileType.Mp4 => QuickTimeMetadataReader.ReadMetadata(stream),
8690
FileType.Nef => TiffMetadataReader.ReadMetadata(stream),
8791
FileType.Netpbm => [NetpbmMetadataReader.ReadMetadata(stream)],
8892
FileType.Orf => TiffMetadataReader.ReadMetadata(stream),
93+
FileType.Pef => TiffMetadataReader.ReadMetadata(stream),
8994
FileType.Pcx => [PcxMetadataReader.ReadMetadata(stream)],
9095
FileType.Png => PngMetadataReader.ReadMetadata(stream),
9196
FileType.Psd => PsdMetadataReader.ReadMetadata(stream),
9297
FileType.QuickTime => QuickTimeMetadataReader.ReadMetadata(stream),
9398
FileType.Raf => RafMetadataReader.ReadMetadata(stream),
9499
FileType.Rw2 => TiffMetadataReader.ReadMetadata(stream),
100+
FileType.Srw => TiffMetadataReader.ReadMetadata(stream),
95101
FileType.Tga => TgaMetadataReader.ReadMetadata(stream),
102+
FileType.ThreeFR => TiffMetadataReader.ReadMetadata(stream),
96103
FileType.Tiff => TiffMetadataReader.ReadMetadata(stream),
97104
FileType.Wav => WavMetadataReader.ReadMetadata(stream),
98105
FileType.WebP => WebPMetadataReader.ReadMetadata(stream),
@@ -109,7 +116,7 @@ public static IReadOnlyList<Directory> ReadMetadata(Stream stream)
109116
}
110117

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

121128
using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
122-
directories.AddRange(ReadMetadata(stream));
129+
directories.AddRange(ReadMetadata(stream, filePath));
123130

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

MetadataExtractor/PublicAPI/net462/PublicAPI.Shipped.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4378,13 +4378,13 @@ static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSeconds(double value
43784378
static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSecondsString(double value) -> string!
43794379
static MetadataExtractor.GeoLocation.DegreesMinutesSecondsToDecimal(MetadataExtractor.Rational degs, MetadataExtractor.Rational mins, MetadataExtractor.Rational secs, bool isNegative) -> double?
43804380
static MetadataExtractor.ImageMetadataReader.ReadMetadata(string! filePath) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
4381-
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
4381+
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream, string? fileName = null) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
43824382
static MetadataExtractor.Rational.operator !=(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
43834383
static MetadataExtractor.Rational.operator ==(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
43844384
static MetadataExtractor.TagDescriptor<T>.ConvertBytesToVersionString(int[]? components, int majorDigits) -> string?
43854385
static MetadataExtractor.TagDescriptor<T>.GetFocalLengthDescription(double mm) -> string!
43864386
static MetadataExtractor.TagDescriptor<T>.GetFStopDescription(double fStop) -> string!
4387-
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream) -> MetadataExtractor.Util.FileType
4387+
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream, string? fileName = null) -> MetadataExtractor.Util.FileType
43884388
static MetadataExtractor.Util.FileTypeExtensions.GetAllExtensions(this MetadataExtractor.Util.FileType fileType) -> System.Collections.Generic.IEnumerable<string!>?
43894389
static MetadataExtractor.Util.FileTypeExtensions.GetCommonExtension(this MetadataExtractor.Util.FileType fileType) -> string?
43904390
static MetadataExtractor.Util.FileTypeExtensions.GetLongName(this MetadataExtractor.Util.FileType fileType) -> string!

MetadataExtractor/PublicAPI/net462/PublicAPI.Unshipped.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@ MetadataExtractor.IO.IndexedCapturingReader.Dispose() -> void
115115
MetadataExtractor.IO.IndexedReader.GetByte(int index) -> byte
116116
MetadataExtractor.IO.IndexedReader.GetBytes(int index, int count) -> byte[]!
117117
MetadataExtractor.Util.FileType.Avif = 28 -> MetadataExtractor.Util.FileType
118+
MetadataExtractor.Util.FileType.Dng = 29 -> MetadataExtractor.Util.FileType
119+
MetadataExtractor.Util.FileType.GoPro = 30 -> MetadataExtractor.Util.FileType
120+
MetadataExtractor.Util.FileType.Kdc = 31 -> MetadataExtractor.Util.FileType
121+
MetadataExtractor.Util.FileType.ThreeFR = 32 -> MetadataExtractor.Util.FileType
122+
MetadataExtractor.Util.FileType.Pef = 33 -> MetadataExtractor.Util.FileType
123+
MetadataExtractor.Util.FileType.Srw = 34 -> MetadataExtractor.Util.FileType
118124
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor.GetDescription(int tagType) -> string?
119125
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.Name.get -> string!
120126
override MetadataExtractor.Formats.Exif.Makernotes.NikonPictureControl1Descriptor.GetDescription(int tagType) -> string?

MetadataExtractor/PublicAPI/net8.0/PublicAPI.Shipped.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4366,13 +4366,13 @@ static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSeconds(double value
43664366
static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSecondsString(double value) -> string!
43674367
static MetadataExtractor.GeoLocation.DegreesMinutesSecondsToDecimal(MetadataExtractor.Rational degs, MetadataExtractor.Rational mins, MetadataExtractor.Rational secs, bool isNegative) -> double?
43684368
static MetadataExtractor.ImageMetadataReader.ReadMetadata(string! filePath) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
4369-
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
4369+
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream, string? fileName = null) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
43704370
static MetadataExtractor.Rational.operator !=(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
43714371
static MetadataExtractor.Rational.operator ==(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
43724372
static MetadataExtractor.TagDescriptor<T>.ConvertBytesToVersionString(int[]? components, int majorDigits) -> string?
43734373
static MetadataExtractor.TagDescriptor<T>.GetFocalLengthDescription(double mm) -> string!
43744374
static MetadataExtractor.TagDescriptor<T>.GetFStopDescription(double fStop) -> string!
4375-
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream) -> MetadataExtractor.Util.FileType
4375+
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream, string? fileName = null) -> MetadataExtractor.Util.FileType
43764376
static MetadataExtractor.Util.FileTypeExtensions.GetAllExtensions(this MetadataExtractor.Util.FileType fileType) -> System.Collections.Generic.IEnumerable<string!>?
43774377
static MetadataExtractor.Util.FileTypeExtensions.GetCommonExtension(this MetadataExtractor.Util.FileType fileType) -> string?
43784378
static MetadataExtractor.Util.FileTypeExtensions.GetLongName(this MetadataExtractor.Util.FileType fileType) -> string!

MetadataExtractor/PublicAPI/net8.0/PublicAPI.Unshipped.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,12 @@ MetadataExtractor.IO.IndexedCapturingReader.Dispose() -> void
114114
MetadataExtractor.IO.IndexedReader.GetByte(int index) -> byte
115115
MetadataExtractor.IO.IndexedReader.GetBytes(int index, int count) -> byte[]!
116116
MetadataExtractor.Util.FileType.Avif = 28 -> MetadataExtractor.Util.FileType
117+
MetadataExtractor.Util.FileType.Dng = 29 -> MetadataExtractor.Util.FileType
118+
MetadataExtractor.Util.FileType.GoPro = 30 -> MetadataExtractor.Util.FileType
119+
MetadataExtractor.Util.FileType.Kdc = 31 -> MetadataExtractor.Util.FileType
120+
MetadataExtractor.Util.FileType.ThreeFR = 32 -> MetadataExtractor.Util.FileType
121+
MetadataExtractor.Util.FileType.Pef = 33 -> MetadataExtractor.Util.FileType
122+
MetadataExtractor.Util.FileType.Srw = 34 -> MetadataExtractor.Util.FileType
117123
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor.GetDescription(int tagType) -> string?
118124
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.Name.get -> string!
119125
override MetadataExtractor.Formats.Exif.Makernotes.NikonPictureControl1Descriptor.GetDescription(int tagType) -> string?

MetadataExtractor/PublicAPI/netstandard1.3/PublicAPI.Shipped.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4371,13 +4371,13 @@ static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSeconds(double value
43714371
static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSecondsString(double value) -> string!
43724372
static MetadataExtractor.GeoLocation.DegreesMinutesSecondsToDecimal(MetadataExtractor.Rational degs, MetadataExtractor.Rational mins, MetadataExtractor.Rational secs, bool isNegative) -> double?
43734373
static MetadataExtractor.ImageMetadataReader.ReadMetadata(string! filePath) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
4374-
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
4374+
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream, string? fileName = null) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
43754375
static MetadataExtractor.Rational.operator !=(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
43764376
static MetadataExtractor.Rational.operator ==(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
43774377
static MetadataExtractor.TagDescriptor<T>.ConvertBytesToVersionString(int[]? components, int majorDigits) -> string?
43784378
static MetadataExtractor.TagDescriptor<T>.GetFocalLengthDescription(double mm) -> string!
43794379
static MetadataExtractor.TagDescriptor<T>.GetFStopDescription(double fStop) -> string!
4380-
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream) -> MetadataExtractor.Util.FileType
4380+
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream, string? fileName = null) -> MetadataExtractor.Util.FileType
43814381
static MetadataExtractor.Util.FileTypeExtensions.GetAllExtensions(this MetadataExtractor.Util.FileType fileType) -> System.Collections.Generic.IEnumerable<string!>?
43824382
static MetadataExtractor.Util.FileTypeExtensions.GetCommonExtension(this MetadataExtractor.Util.FileType fileType) -> string?
43834383
static MetadataExtractor.Util.FileTypeExtensions.GetLongName(this MetadataExtractor.Util.FileType fileType) -> string!

MetadataExtractor/PublicAPI/netstandard1.3/PublicAPI.Unshipped.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@ MetadataExtractor.IO.IndexedCapturingReader.Dispose() -> void
115115
MetadataExtractor.IO.IndexedReader.GetByte(int index) -> byte
116116
MetadataExtractor.IO.IndexedReader.GetBytes(int index, int count) -> byte[]!
117117
MetadataExtractor.Util.FileType.Avif = 28 -> MetadataExtractor.Util.FileType
118+
MetadataExtractor.Util.FileType.Dng = 29 -> MetadataExtractor.Util.FileType
119+
MetadataExtractor.Util.FileType.GoPro = 30 -> MetadataExtractor.Util.FileType
120+
MetadataExtractor.Util.FileType.Kdc = 31 -> MetadataExtractor.Util.FileType
121+
MetadataExtractor.Util.FileType.ThreeFR = 32 -> MetadataExtractor.Util.FileType
122+
MetadataExtractor.Util.FileType.Pef = 33 -> MetadataExtractor.Util.FileType
123+
MetadataExtractor.Util.FileType.Srw = 34 -> MetadataExtractor.Util.FileType
118124
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor.GetDescription(int tagType) -> string?
119125
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.Name.get -> string!
120126
override MetadataExtractor.Formats.Exif.Makernotes.NikonPictureControl1Descriptor.GetDescription(int tagType) -> string?

MetadataExtractor/PublicAPI/netstandard2.1/PublicAPI.Shipped.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4373,13 +4373,13 @@ static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSeconds(double value
43734373
static MetadataExtractor.GeoLocation.DecimalToDegreesMinutesSecondsString(double value) -> string!
43744374
static MetadataExtractor.GeoLocation.DegreesMinutesSecondsToDecimal(MetadataExtractor.Rational degs, MetadataExtractor.Rational mins, MetadataExtractor.Rational secs, bool isNegative) -> double?
43754375
static MetadataExtractor.ImageMetadataReader.ReadMetadata(string! filePath) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
4376-
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
4376+
static MetadataExtractor.ImageMetadataReader.ReadMetadata(System.IO.Stream! stream, string? fileName = null) -> System.Collections.Generic.IReadOnlyList<MetadataExtractor.Directory!>!
43774377
static MetadataExtractor.Rational.operator !=(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
43784378
static MetadataExtractor.Rational.operator ==(MetadataExtractor.Rational a, MetadataExtractor.Rational b) -> bool
43794379
static MetadataExtractor.TagDescriptor<T>.ConvertBytesToVersionString(int[]? components, int majorDigits) -> string?
43804380
static MetadataExtractor.TagDescriptor<T>.GetFocalLengthDescription(double mm) -> string!
43814381
static MetadataExtractor.TagDescriptor<T>.GetFStopDescription(double fStop) -> string!
4382-
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream) -> MetadataExtractor.Util.FileType
4382+
static MetadataExtractor.Util.FileTypeDetector.DetectFileType(System.IO.Stream! stream, string? fileName = null) -> MetadataExtractor.Util.FileType
43834383
static MetadataExtractor.Util.FileTypeExtensions.GetAllExtensions(this MetadataExtractor.Util.FileType fileType) -> System.Collections.Generic.IEnumerable<string!>?
43844384
static MetadataExtractor.Util.FileTypeExtensions.GetCommonExtension(this MetadataExtractor.Util.FileType fileType) -> string?
43854385
static MetadataExtractor.Util.FileTypeExtensions.GetLongName(this MetadataExtractor.Util.FileType fileType) -> string!

MetadataExtractor/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,12 @@ MetadataExtractor.IO.IndexedCapturingReader.Dispose() -> void
114114
MetadataExtractor.IO.IndexedReader.GetByte(int index) -> byte
115115
MetadataExtractor.IO.IndexedReader.GetBytes(int index, int count) -> byte[]!
116116
MetadataExtractor.Util.FileType.Avif = 28 -> MetadataExtractor.Util.FileType
117+
MetadataExtractor.Util.FileType.Dng = 29 -> MetadataExtractor.Util.FileType
118+
MetadataExtractor.Util.FileType.GoPro = 30 -> MetadataExtractor.Util.FileType
119+
MetadataExtractor.Util.FileType.Kdc = 31 -> MetadataExtractor.Util.FileType
120+
MetadataExtractor.Util.FileType.ThreeFR = 32 -> MetadataExtractor.Util.FileType
121+
MetadataExtractor.Util.FileType.Pef = 33 -> MetadataExtractor.Util.FileType
122+
MetadataExtractor.Util.FileType.Srw = 34 -> MetadataExtractor.Util.FileType
117123
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDescriptor.GetDescription(int tagType) -> string?
118124
override MetadataExtractor.Formats.Exif.Makernotes.AppleRunTimeMakernoteDirectory.Name.get -> string!
119125
override MetadataExtractor.Formats.Exif.Makernotes.NikonPictureControl1Descriptor.GetDescription(int tagType) -> string?

0 commit comments

Comments
 (0)