You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.1 KiB
77 lines
2.1 KiB
package magic
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
)
|
|
|
|
var (
|
|
// Flac matches a Free Lossless Audio Codec file.
|
|
Flac = prefix([]byte("\x66\x4C\x61\x43\x00\x00\x00\x22"))
|
|
// Midi matches a Musical Instrument Digital Interface file.
|
|
Midi = prefix([]byte("\x4D\x54\x68\x64"))
|
|
// Ape matches a Monkey's Audio file.
|
|
Ape = prefix([]byte("\x4D\x41\x43\x20\x96\x0F\x00\x00\x34\x00\x00\x00\x18\x00\x00\x00\x90\xE3"))
|
|
// MusePack matches a Musepack file.
|
|
MusePack = prefix([]byte("MPCK"))
|
|
// Au matches a Sun Microsystems au file.
|
|
Au = prefix([]byte("\x2E\x73\x6E\x64"))
|
|
// Amr matches an Adaptive Multi-Rate file.
|
|
Amr = prefix([]byte("\x23\x21\x41\x4D\x52"))
|
|
// Voc matches a Creative Voice file.
|
|
Voc = prefix([]byte("Creative Voice File"))
|
|
// M3u matches a Playlist file.
|
|
M3u = prefix([]byte("#EXTM3U"))
|
|
// AAC matches an Advanced Audio Coding file.
|
|
AAC = prefix([]byte{0xFF, 0xF1}, []byte{0xFF, 0xF9})
|
|
)
|
|
|
|
// Mp3 matches an mp3 file.
|
|
func Mp3(raw []byte, limit uint32) bool {
|
|
if len(raw) < 3 {
|
|
return false
|
|
}
|
|
|
|
if bytes.HasPrefix(raw, []byte("ID3")) {
|
|
// MP3s with an ID3v2 tag will start with "ID3"
|
|
// ID3v1 tags, however appear at the end of the file.
|
|
return true
|
|
}
|
|
|
|
// Match MP3 files without tags
|
|
switch binary.BigEndian.Uint16(raw[:2]) & 0xFFFE {
|
|
case 0xFFFA:
|
|
// MPEG ADTS, layer III, v1
|
|
return true
|
|
case 0xFFF2:
|
|
// MPEG ADTS, layer III, v2
|
|
return true
|
|
case 0xFFE2:
|
|
// MPEG ADTS, layer III, v2.5
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// Wav matches a Waveform Audio File Format file.
|
|
func Wav(raw []byte, limit uint32) bool {
|
|
return len(raw) > 12 &&
|
|
bytes.Equal(raw[:4], []byte("RIFF")) &&
|
|
bytes.Equal(raw[8:12], []byte{0x57, 0x41, 0x56, 0x45})
|
|
}
|
|
|
|
// Aiff matches Audio Interchange File Format file.
|
|
func Aiff(raw []byte, limit uint32) bool {
|
|
return len(raw) > 12 &&
|
|
bytes.Equal(raw[:4], []byte{0x46, 0x4F, 0x52, 0x4D}) &&
|
|
bytes.Equal(raw[8:12], []byte{0x41, 0x49, 0x46, 0x46})
|
|
}
|
|
|
|
// Qcp matches a Qualcomm Pure Voice file.
|
|
func Qcp(raw []byte, limit uint32) bool {
|
|
return len(raw) > 12 &&
|
|
bytes.Equal(raw[:4], []byte("RIFF")) &&
|
|
bytes.Equal(raw[8:12], []byte("QLCM"))
|
|
}
|