Improve the detection of mp4 types #86 (#98)
Add more byte patterns for the values that can follow `ftyp` in an mp4 file.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d44ddfe..d52b8da 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,6 @@
# 1.0.5-wip
+* Update video/mp4 mimeType lookup by header bytes.
* Add m4b mimeType lookup by extension.
* Add `text/markdown` mimeType lookup by extension.
diff --git a/lib/src/magic_number.dart b/lib/src/magic_number.dart
index ee3de31..5de7d87 100644
--- a/lib/src/magic_number.dart
+++ b/lib/src/magic_number.dart
@@ -113,7 +113,7 @@
MagicNumber('audio/mpeg', [0x49, 0x44, 0x33]),
MagicNumber('audio/mpeg', [0xFF, 0xFB]),
MagicNumber('audio/ogg', [0x4F, 0x70, 0x75]),
- MagicNumber('video/mp4', [
+ MagicNumber('video/3gpp', [
0x00,
0x00,
0x00,
@@ -140,6 +140,141 @@
0xFF,
0xFF
]),
+ MagicNumber('video/mp4', [
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x66,
+ 0x74,
+ 0x79,
+ 0x70,
+ 0x61,
+ 0x76,
+ 0x63,
+ 0x31
+ ], mask: [
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF
+ ]),
+ MagicNumber('video/mp4', [
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x66,
+ 0x74,
+ 0x79,
+ 0x70,
+ 0x69,
+ 0x73,
+ 0x6F,
+ 0x32
+ ], mask: [
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF
+ ]),
+ MagicNumber('video/mp4', [
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x66,
+ 0x74,
+ 0x79,
+ 0x70,
+ 0x69,
+ 0x73,
+ 0x6F,
+ 0x6D
+ ], mask: [
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF
+ ]),
+ MagicNumber('video/mp4', [
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x66,
+ 0x74,
+ 0x79,
+ 0x70,
+ 0x6D,
+ 0x70,
+ 0x34,
+ 0x31
+ ], mask: [
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF
+ ]),
+ MagicNumber('video/mp4', [
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x66,
+ 0x74,
+ 0x79,
+ 0x70,
+ 0x6D,
+ 0x70,
+ 0x34,
+ 0x32
+ ], mask: [
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF
+ ]),
MagicNumber('model/gltf-binary', [0x46, 0x54, 0x6C, 0x67]),
/// The WebP file format is based on the RIFF document format.
diff --git a/test/mime_type_test.dart b/test/mime_type_test.dart
index 099d5e8..f10d847 100644
--- a/test/mime_type_test.dart
+++ b/test/mime_type_test.dart
@@ -85,7 +85,7 @@
0x1A,
0x0A
]);
- _expectMimeType('file.mp4', 'video/mp4', headerBytes: [
+ _expectMimeType('file', 'video/3gpp', headerBytes: [
0x00,
0x00,
0x00,
@@ -99,6 +99,90 @@
0x70,
0x35
]);
+ _expectMimeType('file.mp4', 'video/mp4', headerBytes: [
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x04,
+ 0x66,
+ 0x74,
+ 0x79,
+ 0x70,
+ 0xFF,
+ 0xFF,
+ 0xFF,
+ 0xFF
+ ]);
+ _expectMimeType('file', 'video/mp4', headerBytes: [
+ 0x00,
+ 0xF0,
+ 0xF0,
+ 0xF0,
+ 0x66,
+ 0x74,
+ 0x79,
+ 0x70,
+ 0x61,
+ 0x76,
+ 0x63,
+ 0x31
+ ]);
+ _expectMimeType('file', 'video/mp4', headerBytes: [
+ 0x00,
+ 0xF0,
+ 0xF0,
+ 0xF0,
+ 0x66,
+ 0x74,
+ 0x79,
+ 0x70,
+ 0x69,
+ 0x73,
+ 0x6F,
+ 0x32
+ ]);
+ _expectMimeType('file', 'video/mp4', headerBytes: [
+ 0x00,
+ 0xF0,
+ 0xF0,
+ 0xF0,
+ 0x66,
+ 0x74,
+ 0x79,
+ 0x70,
+ 0x69,
+ 0x73,
+ 0x6F,
+ 0x6D
+ ]);
+ _expectMimeType('file', 'video/mp4', headerBytes: [
+ 0x00,
+ 0xF0,
+ 0xF0,
+ 0xF0,
+ 0x66,
+ 0x74,
+ 0x79,
+ 0x70,
+ 0x6D,
+ 0x70,
+ 0x34,
+ 0x31
+ ]);
+ _expectMimeType('file', 'video/mp4', headerBytes: [
+ 0x00,
+ 0xF0,
+ 0xF0,
+ 0xF0,
+ 0x66,
+ 0x74,
+ 0x79,
+ 0x70,
+ 0x6D,
+ 0x70,
+ 0x34,
+ 0x32
+ ]);
_expectMimeType('file', 'image/webp', headerBytes: [
0x52,
0x49,