...
1 package magic
2
3 import (
4 "bytes"
5 "encoding/binary"
6 )
7
8 var (
9
10 Flac = prefix([]byte("\x66\x4C\x61\x43\x00\x00\x00\x22"))
11
12 Midi = prefix([]byte("\x4D\x54\x68\x64"))
13
14 Ape = prefix([]byte("\x4D\x41\x43\x20\x96\x0F\x00\x00\x34\x00\x00\x00\x18\x00\x00\x00\x90\xE3"))
15
16 MusePack = prefix([]byte("MPCK"))
17
18 Au = prefix([]byte("\x2E\x73\x6E\x64"))
19
20 Amr = prefix([]byte("\x23\x21\x41\x4D\x52"))
21
22 Voc = prefix([]byte("Creative Voice File"))
23
24 M3u = prefix([]byte("#EXTM3U"))
25
26 AAC = prefix([]byte{0xFF, 0xF1}, []byte{0xFF, 0xF9})
27 )
28
29
30 func Mp3(raw []byte, limit uint32) bool {
31 if len(raw) < 3 {
32 return false
33 }
34
35 if bytes.HasPrefix(raw, []byte("ID3")) {
36
37
38 return true
39 }
40
41
42 switch binary.BigEndian.Uint16(raw[:2]) & 0xFFFE {
43 case 0xFFFA:
44
45 return true
46 case 0xFFF2:
47
48 return true
49 case 0xFFE2:
50
51 return true
52 }
53
54 return false
55 }
56
57
58 func Wav(raw []byte, limit uint32) bool {
59 return len(raw) > 12 &&
60 bytes.Equal(raw[:4], []byte("RIFF")) &&
61 bytes.Equal(raw[8:12], []byte{0x57, 0x41, 0x56, 0x45})
62 }
63
64
65 func Aiff(raw []byte, limit uint32) bool {
66 return len(raw) > 12 &&
67 bytes.Equal(raw[:4], []byte{0x46, 0x4F, 0x52, 0x4D}) &&
68 bytes.Equal(raw[8:12], []byte{0x41, 0x49, 0x46, 0x46})
69 }
70
71
72 func Qcp(raw []byte, limit uint32) bool {
73 return len(raw) > 12 &&
74 bytes.Equal(raw[:4], []byte("RIFF")) &&
75 bytes.Equal(raw[8:12], []byte("QLCM"))
76 }
77
View as plain text