1package mimetype 2 3import ( 4 "sync" 5 6 "github.com/gabriel-vasile/mimetype/internal/magic" 7) 8 9// mimetype stores the list of MIME types in a tree structure with 10// "application/octet-stream" at the root of the hierarchy. The hierarchy 11// approach minimizes the number of checks that need to be done on the input 12// and allows for more precise results once the base type of file has been 13// identified. 14// 15// root is a matcher which passes for any slice of bytes. 16// When a matcher passes the check, the children magic 17// are tried in order to find a more accurate MIME type. 18var root = newMIME("application/octet-stream", "", 19 func([]byte, uint32) bool { return true }, 20 xpm, sevenZ, zip, pdf, fdf, ole, ps, psd, p7s, ogg, png, jpg, jp2, jpx, jpm, gif, webp, 21 exe, elf, ar, tar, xar, bz2, fits, tiff, bmp, ico, mp3, flac, midi, ape, 22 musePack, amr, wav, aiff, au, mpeg, quickTime, mqv, mp4, webM, threeGP, 23 threeG2, avi, flv, mkv, asf, aac, voc, aMp4, m4a, m3u, m4v, rmvb, 24 gzip, class, swf, crx, ttf, woff, woff2, otf, eot, wasm, 25 shx, dbf, dcm, rar, djvu, mobi, lit, bpg, sqlite3, dwg, nes, lnk, macho, qcp, 26 icns, heic, heicSeq, heif, heifSeq, hdr, mrc, mdb, accdb, zstd, cab, 27 rpm, xz, lzip, torrent, cpio, tzif, xcf, pat, gbr, glb, 28 // Keep text last because it is the slowest check 29 text, 30) 31 32// rootMu guards the root tree and the readLimit used when creating the detection buffer. 33var rootMu sync.RWMutex 34 35// The list of nodes appended to the root node. 36var ( 37 xz = newMIME("application/x-xz", ".xz", magic.Xz) 38 gzip = newMIME("application/gzip", ".gz", magic.Gzip).alias( 39 "application/x-gzip", "application/x-gunzip", "application/gzipped", 40 "application/gzip-compressed", "application/x-gzip-compressed", 41 "gzip/document") 42 sevenZ = newMIME("application/x-7z-compressed", ".7z", magic.SevenZ) 43 zip = newMIME("application/zip", ".zip", magic.Zip, xlsx, docx, pptx, epub, jar, odt, ods, odp, odg, odf, odc, sxc). 44 alias("application/x-zip", "application/x-zip-compressed") 45 tar = newMIME("application/x-tar", ".tar", magic.Tar) 46 xar = newMIME("application/x-xar", ".xar", magic.Xar) 47 bz2 = newMIME("application/x-bzip2", ".bz2", magic.Bz2) 48 pdf = newMIME("application/pdf", ".pdf", magic.Pdf). 49 alias("application/x-pdf") 50 fdf = newMIME("application/vnd.fdf", ".fdf", magic.Fdf) 51 xlsx = newMIME("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ".xlsx", magic.Xlsx) 52 docx = newMIME("application/vnd.openxmlformats-officedocument.wordprocessingml.document", ".docx", magic.Docx) 53 pptx = newMIME("application/vnd.openxmlformats-officedocument.presentationml.presentation", ".pptx", magic.Pptx) 54 epub = newMIME("application/epub+zip", ".epub", magic.Epub) 55 jar = newMIME("application/jar", ".jar", magic.Jar) 56 ole = newMIME("application/x-ole-storage", "", magic.Ole, aaf, msg, xls, pub, ppt, doc) 57 aaf = newMIME("application/octet-stream", ".aaf", magic.Aaf) 58 doc = newMIME("application/msword", ".doc", magic.Doc). 59 alias("application/vnd.ms-word") 60 ppt = newMIME("application/vnd.ms-powerpoint", ".ppt", magic.Ppt). 61 alias("application/mspowerpoint") 62 pub = newMIME("application/vnd.ms-publisher", ".pub", magic.Pub) 63 xls = newMIME("application/vnd.ms-excel", ".xls", magic.Xls). 64 alias("application/msexcel") 65 msg = newMIME("application/vnd.ms-outlook", ".msg", magic.Msg) 66 ps = newMIME("application/postscript", ".ps", magic.Ps) 67 fits = newMIME("application/fits", ".fits", magic.Fits) 68 ogg = newMIME("application/ogg", ".ogg", magic.Ogg, oggAudio, oggVideo). 69 alias("application/x-ogg") 70 oggAudio = newMIME("audio/ogg", ".oga", magic.OggAudio) 71 oggVideo = newMIME("video/ogg", ".ogv", magic.OggVideo) 72 text = newMIME("text/plain", ".txt", magic.Text, html, svg, xml, php, js, lua, perl, python, json, ndJson, rtf, tcl, csv, tsv, vCard, iCalendar, warc) 73 xml = newMIME("text/xml", ".xml", magic.Xml, rss, atom, x3d, kml, xliff, collada, gml, gpx, tcx, amf, threemf, xfdf, owl2) 74 json = newMIME("application/json", ".json", magic.Json, geoJson) 75 csv = newMIME("text/csv", ".csv", magic.Csv) 76 tsv = newMIME("text/tab-separated-values", ".tsv", magic.Tsv) 77 geoJson = newMIME("application/geo+json", ".geojson", magic.GeoJson) 78 ndJson = newMIME("application/x-ndjson", ".ndjson", magic.NdJson) 79 html = newMIME("text/html", ".html", magic.Html) 80 php = newMIME("text/x-php", ".php", magic.Php) 81 rtf = newMIME("text/rtf", ".rtf", magic.Rtf) 82 js = newMIME("application/javascript", ".js", magic.Js). 83 alias("application/x-javascript", "text/javascript") 84 lua = newMIME("text/x-lua", ".lua", magic.Lua) 85 perl = newMIME("text/x-perl", ".pl", magic.Perl) 86 python = newMIME("application/x-python", ".py", magic.Python) 87 tcl = newMIME("text/x-tcl", ".tcl", magic.Tcl). 88 alias("application/x-tcl") 89 vCard = newMIME("text/vcard", ".vcf", magic.VCard) 90 iCalendar = newMIME("text/calendar", ".ics", magic.ICalendar) 91 svg = newMIME("image/svg+xml", ".svg", magic.Svg) 92 rss = newMIME("application/rss+xml", ".rss", magic.Rss). 93 alias("text/rss") 94 owl2 = newMIME("application/owl+xml", ".owl", magic.Owl2) 95 atom = newMIME("application/atom+xml", ".atom", magic.Atom) 96 x3d = newMIME("model/x3d+xml", ".x3d", magic.X3d) 97 kml = newMIME("application/vnd.google-earth.kml+xml", ".kml", magic.Kml) 98 xliff = newMIME("application/x-xliff+xml", ".xlf", magic.Xliff) 99 collada = newMIME("model/vnd.collada+xml", ".dae", magic.Collada) 100 gml = newMIME("application/gml+xml", ".gml", magic.Gml) 101 gpx = newMIME("application/gpx+xml", ".gpx", magic.Gpx) 102 tcx = newMIME("application/vnd.garmin.tcx+xml", ".tcx", magic.Tcx) 103 amf = newMIME("application/x-amf", ".amf", magic.Amf) 104 threemf = newMIME("application/vnd.ms-package.3dmanufacturing-3dmodel+xml", ".3mf", magic.Threemf) 105 png = newMIME("image/png", ".png", magic.Png) 106 jpg = newMIME("image/jpeg", ".jpg", magic.Jpg) 107 jp2 = newMIME("image/jp2", ".jp2", magic.Jp2) 108 jpx = newMIME("image/jpx", ".jpf", magic.Jpx) 109 jpm = newMIME("image/jpm", ".jpm", magic.Jpm). 110 alias("video/jpm") 111 xpm = newMIME("image/x-xpixmap", ".xpm", magic.Xpm) 112 bpg = newMIME("image/bpg", ".bpg", magic.Bpg) 113 gif = newMIME("image/gif", ".gif", magic.Gif) 114 webp = newMIME("image/webp", ".webp", magic.Webp) 115 tiff = newMIME("image/tiff", ".tiff", magic.Tiff) 116 bmp = newMIME("image/bmp", ".bmp", magic.Bmp). 117 alias("image/x-bmp", "image/x-ms-bmp") 118 ico = newMIME("image/x-icon", ".ico", magic.Ico) 119 icns = newMIME("image/x-icns", ".icns", magic.Icns) 120 psd = newMIME("image/vnd.adobe.photoshop", ".psd", magic.Psd). 121 alias("image/x-psd", "application/photoshop") 122 heic = newMIME("image/heic", ".heic", magic.Heic) 123 heicSeq = newMIME("image/heic-sequence", ".heic", magic.HeicSequence) 124 heif = newMIME("image/heif", ".heif", magic.Heif) 125 heifSeq = newMIME("image/heif-sequence", ".heif", magic.HeifSequence) 126 hdr = newMIME("image/vnd.radiance", ".hdr", magic.Hdr) 127 mp3 = newMIME("audio/mpeg", ".mp3", magic.Mp3). 128 alias("audio/x-mpeg", "audio/mp3") 129 flac = newMIME("audio/flac", ".flac", magic.Flac) 130 midi = newMIME("audio/midi", ".midi", magic.Midi). 131 alias("audio/mid", "audio/sp-midi", "audio/x-mid", "audio/x-midi") 132 ape = newMIME("audio/ape", ".ape", magic.Ape) 133 musePack = newMIME("audio/musepack", ".mpc", magic.MusePack) 134 wav = newMIME("audio/wav", ".wav", magic.Wav). 135 alias("audio/x-wav", "audio/vnd.wave", "audio/wave") 136 aiff = newMIME("audio/aiff", ".aiff", magic.Aiff) 137 au = newMIME("audio/basic", ".au", magic.Au) 138 amr = newMIME("audio/amr", ".amr", magic.Amr). 139 alias("audio/amr-nb") 140 aac = newMIME("audio/aac", ".aac", magic.Aac) 141 voc = newMIME("audio/x-unknown", ".voc", magic.Voc) 142 aMp4 = newMIME("audio/mp4", ".mp4", magic.AMp4). 143 alias("audio/x-m4a", "audio/x-mp4a") 144 m4a = newMIME("audio/x-m4a", ".m4a", magic.M4a) 145 m3u = newMIME("application/vnd.apple.mpegurl", ".m3u", magic.M3u). 146 alias("audio/mpegurl") 147 m4v = newMIME("video/x-m4v", ".m4v", magic.M4v) 148 mp4 = newMIME("video/mp4", ".mp4", magic.Mp4) 149 webM = newMIME("video/webm", ".webm", magic.WebM). 150 alias("audio/webm") 151 mpeg = newMIME("video/mpeg", ".mpeg", magic.Mpeg) 152 quickTime = newMIME("video/quicktime", ".mov", magic.QuickTime) 153 mqv = newMIME("video/quicktime", ".mqv", magic.Mqv) 154 threeGP = newMIME("video/3gpp", ".3gp", magic.ThreeGP). 155 alias("video/3gp", "audio/3gpp") 156 threeG2 = newMIME("video/3gpp2", ".3g2", magic.ThreeG2). 157 alias("video/3g2", "audio/3gpp2") 158 avi = newMIME("video/x-msvideo", ".avi", magic.Avi). 159 alias("video/avi", "video/msvideo") 160 flv = newMIME("video/x-flv", ".flv", magic.Flv) 161 mkv = newMIME("video/x-matroska", ".mkv", magic.Mkv) 162 asf = newMIME("video/x-ms-asf", ".asf", magic.Asf). 163 alias("video/asf", "video/x-ms-wmv") 164 rmvb = newMIME("application/vnd.rn-realmedia-vbr", ".rmvb", magic.Rmvb) 165 class = newMIME("application/x-java-applet", ".class", magic.Class) 166 swf = newMIME("application/x-shockwave-flash", ".swf", magic.Swf) 167 crx = newMIME("application/x-chrome-extension", ".crx", magic.Crx) 168 ttf = newMIME("font/ttf", ".ttf", magic.Ttf). 169 alias("font/sfnt", "application/x-font-ttf", "application/font-sfnt") 170 woff = newMIME("font/woff", ".woff", magic.Woff) 171 woff2 = newMIME("font/woff2", ".woff2", magic.Woff2) 172 otf = newMIME("font/otf", ".otf", magic.Otf) 173 eot = newMIME("application/vnd.ms-fontobject", ".eot", magic.Eot) 174 wasm = newMIME("application/wasm", ".wasm", magic.Wasm) 175 shp = newMIME("application/octet-stream", ".shp", magic.Shp) 176 shx = newMIME("application/octet-stream", ".shx", magic.Shx, shp) 177 dbf = newMIME("application/x-dbf", ".dbf", magic.Dbf) 178 exe = newMIME("application/vnd.microsoft.portable-executable", ".exe", magic.Exe) 179 elf = newMIME("application/x-elf", "", magic.Elf, elfObj, elfExe, elfLib, elfDump) 180 elfObj = newMIME("application/x-object", "", magic.ElfObj) 181 elfExe = newMIME("application/x-executable", "", magic.ElfExe) 182 elfLib = newMIME("application/x-sharedlib", ".so", magic.ElfLib) 183 elfDump = newMIME("application/x-coredump", "", magic.ElfDump) 184 ar = newMIME("application/x-archive", ".a", magic.Ar, deb). 185 alias("application/x-unix-archive") 186 deb = newMIME("application/vnd.debian.binary-package", ".deb", magic.Deb) 187 rpm = newMIME("application/x-rpm", ".rpm", magic.Rpm) 188 dcm = newMIME("application/dicom", ".dcm", magic.Dcm) 189 odt = newMIME("application/vnd.oasis.opendocument.text", ".odt", magic.Odt, ott). 190 alias("application/x-vnd.oasis.opendocument.text") 191 ott = newMIME("application/vnd.oasis.opendocument.text-template", ".ott", magic.Ott). 192 alias("application/x-vnd.oasis.opendocument.text-template") 193 ods = newMIME("application/vnd.oasis.opendocument.spreadsheet", ".ods", magic.Ods, ots). 194 alias("application/x-vnd.oasis.opendocument.spreadsheet") 195 ots = newMIME("application/vnd.oasis.opendocument.spreadsheet-template", ".ots", magic.Ots). 196 alias("application/x-vnd.oasis.opendocument.spreadsheet-template") 197 odp = newMIME("application/vnd.oasis.opendocument.presentation", ".odp", magic.Odp, otp). 198 alias("application/x-vnd.oasis.opendocument.presentation") 199 otp = newMIME("application/vnd.oasis.opendocument.presentation-template", ".otp", magic.Otp). 200 alias("application/x-vnd.oasis.opendocument.presentation-template") 201 odg = newMIME("application/vnd.oasis.opendocument.graphics", ".odg", magic.Odg, otg). 202 alias("application/x-vnd.oasis.opendocument.graphics") 203 otg = newMIME("application/vnd.oasis.opendocument.graphics-template", ".otg", magic.Otg). 204 alias("application/x-vnd.oasis.opendocument.graphics-template") 205 odf = newMIME("application/vnd.oasis.opendocument.formula", ".odf", magic.Odf). 206 alias("application/x-vnd.oasis.opendocument.formula") 207 odc = newMIME("application/vnd.oasis.opendocument.chart", ".odc", magic.Odc). 208 alias("application/x-vnd.oasis.opendocument.chart") 209 sxc = newMIME("application/vnd.sun.xml.calc", ".sxc", magic.Sxc) 210 rar = newMIME("application/x-rar-compressed", ".rar", magic.Rar). 211 alias("application/x-rar") 212 djvu = newMIME("image/vnd.djvu", ".djvu", magic.DjVu) 213 mobi = newMIME("application/x-mobipocket-ebook", ".mobi", magic.Mobi) 214 lit = newMIME("application/x-ms-reader", ".lit", magic.Lit) 215 sqlite3 = newMIME("application/x-sqlite3", ".sqlite", magic.Sqlite) 216 dwg = newMIME("image/vnd.dwg", ".dwg", magic.Dwg). 217 alias("image/x-dwg", "application/acad", "application/x-acad", 218 "application/autocad_dwg", "application/dwg", "application/x-dwg", 219 "application/x-autocad", "drawing/dwg") 220 warc = newMIME("application/warc", ".warc", magic.Warc) 221 nes = newMIME("application/vnd.nintendo.snes.rom", ".nes", magic.Nes) 222 lnk = newMIME("application/x-ms-shortcut", ".lnk", magic.Lnk) 223 macho = newMIME("application/x-mach-binary", ".macho", magic.MachO) 224 qcp = newMIME("audio/qcelp", ".qcp", magic.Qcp) 225 mrc = newMIME("application/marc", ".mrc", magic.Marc) 226 mdb = newMIME("application/x-msaccess", ".mdb", magic.MsAccessMdb) 227 accdb = newMIME("application/x-msaccess", ".accdb", magic.MsAccessAce) 228 zstd = newMIME("application/zstd", ".zst", magic.Zstd) 229 cab = newMIME("application/vnd.ms-cab-compressed", ".cab", magic.Cab) 230 lzip = newMIME("application/lzip", ".lz", magic.Lzip) 231 torrent = newMIME("application/x-bittorrent", ".torrent", magic.Torrent) 232 cpio = newMIME("application/x-cpio", ".cpio", magic.Cpio) 233 tzif = newMIME("application/tzif", "", magic.TzIf) 234 p7s = newMIME("application/pkcs7-signature", ".p7s", magic.P7s) 235 xcf = newMIME("image/x-xcf", ".xcf", magic.Xcf) 236 pat = newMIME("image/x-gimp-pat", ".pat", magic.Pat) 237 gbr = newMIME("image/x-gimp-gbr", ".gbr", magic.Gbr) 238 xfdf = newMIME("application/vnd.adobe.xfdf", ".xfdf", magic.Xfdf) 239 glb = newMIME("model/gltf-binary", ".glb", magic.Glb) 240) 241