Skip to content

Instantly share code, notes, and snippets.

@mhf-ir
Last active January 6, 2022 13:49
Show Gist options
  • Save mhf-ir/98d447c64e27e222faaa5d517cb4ba65 to your computer and use it in GitHub Desktop.
Save mhf-ir/98d447c64e27e222faaa5d517cb4ba65 to your computer and use it in GitHub Desktop.
Compare different mimetype detector
Path Valid Reference File Perl Go
3mf.3mf πŸ”Ž application/vnd.ms-package.3dmanufacturing-3dmodel+xml https://en.wikipedia.org/wiki/3D_Manufacturing_Format text/xml application/xml application/vnd.ms-package.3dmanufacturing-3dmodel+xml
aac.aac πŸ”Ž audio/aac https://en.wikipedia.org/wiki/Advanced_Audio_Coding audio/x-hx-aac-adts audio/aac audio/aac
aaf.aaf πŸ”Ž application/cdfv2 application/x-ole-storage application/octet-stream
accdb.accdb πŸ”Ž application/x-msaccess application/octet-stream application/x-msaccess
aiff.aiff πŸ”Ž audio/x-aiff audio/x-aiff audio/aiff
amf.amf πŸ”Ž text/xml application/xml application/x-amf
ape.ape πŸ”Ž audio/x-ape audio/x-ape audio/ape
asf.asf πŸ”Ž video/x-ms-asf application/vnd.ms-asf video/x-ms-asf
atom.atom πŸ”Ž text/xml application/atom+xml application/atom+xml
audio.mp4 πŸ”Ž audio/mp4 video/mp4 audio/mp4
avif.avif πŸ”Ž application/octet-stream image/avif application/octet-stream
avifsequence.avif πŸ”Ž application/octet-stream image/avif application/octet-stream
bad.dbf πŸ”Ž application/octet-stream application/x-dbf application/octet-stream
bpg.bpg πŸ”Ž image/bpg application/octet-stream image/bpg
bz2.bz2 πŸ”Ž application/x-bzip2 application/x-bzip application/x-bzip2
class.class πŸ”Ž application/x-java-applet application/x-java application/x-java-applet
cpio.cpio πŸ”Ž application/octet-stream application/x-cpio application/x-cpio
crx.crx πŸ”Ž application/x-chrome-extension application/octet-stream application/x-chrome-extension
csv.csv πŸ”Ž text/plain text/csv text/csv
dae.dae πŸ”Ž text/xml application/xml model/vnd.collada+xml
djvu.djvu πŸ”Ž image/vnd.djvu image/vnd.djvu+multipage image/vnd.djvu
eot.eot πŸ”Ž application/vnd.ms-fontobject application/octet-stream application/vnd.ms-fontobject
exe.exe πŸ”Ž application/x-dosexec application/x-ms-dos-executable application/vnd.microsoft.portable-executable
fdf.fdf πŸ”Ž application/vnd.fdf text/x-matlab application/vnd.fdf
fits.1.fits πŸ”Ž image/fits image/fits application/fits
fits.fits πŸ”Ž image/fits image/fits application/fits
geojson.1.geojson πŸ”Ž application/json application/geo+json application/geo+json
geojson.geojson πŸ”Ž application/json application/geo+json application/geo+json
glb.glb πŸ”Ž application/octet-stream application/octet-stream model/gltf-binary
gml.gml πŸ”Ž text/xml application/gml+xml application/gml+xml
gpx.gpx πŸ”Ž text/xml application/gpx+xml application/gpx+xml
har.har πŸ”Ž application/json text/plain application/json
hdr.hdr πŸ”Ž application/octet-stream text/x-mpsub image/vnd.radiance
heic.single.heic πŸ”Ž image/heic image/heif image/heic
ico.ico πŸ”Ž image/vnd.microsoft.icon image/vnd.microsoft.icon image/x-icon
jar.jar πŸ”Ž application/java-archive application/x-java-archive application/jar
js.js πŸ”Ž text/x-c application/javascript application/javascript
jxl.jxl πŸ”Ž application/octet-stream application/octet-stream image/jxl
kml.kml πŸ”Ž text/xml application/vnd.google-earth.kml+xml application/vnd.google-earth.kml+xml
lit.lit πŸ”Ž application/x-ms-reader application/octet-stream application/x-ms-reader
lnk.lnk πŸ”Ž application/octet-stream application/octet-stream application/x-ms-shortcut
lz.lz πŸ”Ž application/x-lzip application/x-lzip application/lzip
m3u.m3u πŸ”Ž text/plain audio/x-mpegurl application/vnd.apple.mpegurl
m4a.m4a πŸ”Ž audio/x-m4a audio/mp4 audio/x-m4a
macho.macho πŸ”Ž application/x-mach-binary application/x-java application/x-mach-binary
mdb.mdb πŸ”Ž application/x-msaccess application/vnd.ms-access application/x-msaccess
mobi.mobi πŸ”Ž application/octet-stream application/x-mobipocket-ebook application/x-mobipocket-ebook
mpc.mpc πŸ”Ž audio/x-musepack audio/x-musepack audio/musepack
mqv.mqv πŸ”Ž video/quicktime application/octet-stream video/quicktime
mrc.mrc πŸ”Ž application/octet-stream text/plain application/marc
msg.msg πŸ”Ž application/vnd.ms-outlook application/x-ole-storage application/vnd.ms-outlook
msi.msi πŸ”Ž application/x-msi application/x-msi application/x-ms-installer
ndjson.ndjson πŸ”Ž application/json text/plain application/x-ndjson
ndjson.xl.ndjson πŸ”Ž application/json text/plain application/x-ndjson
nes.nes πŸ”Ž application/x-nes-rom application/x-nes-rom application/vnd.nintendo.snes.rom
ogg.oga πŸ”Ž audio/ogg audio/x-vorbis+ogg audio/ogg
ogg.spx.oga πŸ”Ž audio/ogg audio/x-speex+ogg audio/ogg
otf.otf πŸ”Ž application/vnd.ms-opentype application/vnd.oasis.opendocument.formula-template font/otf
owl2.owl πŸ”Ž text/xml application/rdf+xml application/owl+xml
p7s_der.p7s πŸ”Ž application/octet-stream application/pkcs7-signature application/pkcs7-signature
p7s_pem.p7s πŸ”Ž text/plain application/pkcs7-signature application/pkcs7-signature
php.php πŸ”Ž text/plain application/x-php text/x-php
pl.pl πŸ”Ž text/x-perl application/x-perl text/x-perl
pub.pub πŸ”Ž application/vnd.ms-office application/vnd.ms-publisher application/vnd.ms-publisher
py.py πŸ”Ž text/x-script.python text/x-python application/x-python
qcp.qcp πŸ”Ž application/octet-stream application/x-riff audio/qcelp
rar.rar πŸ”Ž application/x-rar application/vnd.rar application/x-rar-compressed
rmvb.rmvb πŸ”Ž application/vnd.rn-realmedia application/vnd.rn-realmedia application/vnd.rn-realmedia-vbr
rss.rss πŸ”Ž text/xml application/rss+xml application/rss+xml
rtf.rtf πŸ”Ž text/rtf application/rtf text/rtf
sample32.macho πŸ”Ž application/x-mach-binary application/octet-stream application/x-mach-binary
sample64.macho πŸ”Ž application/x-mach-binary application/octet-stream application/x-mach-binary
sqlite.sqlite πŸ”Ž application/x-sqlite3 application/vnd.sqlite3 application/vnd.sqlite3
svg.1.svg πŸ”Ž text/plain image/svg+xml text/html
swf.swf πŸ”Ž application/x-shockwave-flash application/vnd.adobe.flash.movie application/x-shockwave-flash
tcl.tcl πŸ”Ž text/x-tcl text/tcl text/x-tcl
tcx.tcx πŸ”Ž text/xml application/xml application/vnd.garmin.tcx+xml
tsv.tsv πŸ”Ž text/plain text/tab-separated-values text/tab-separated-values
ttf.ttf πŸ”Ž font/sfnt font/ttf font/ttf
tzfile πŸ”Ž application/octet-stream application/octet-stream application/tzif
voc.voc πŸ”Ž audio/x-unknown audio/x-voc audio/x-unknown
warc.warc πŸ”Ž application/warc text/plain application/warc
wasm.wasm πŸ”Ž application/octet-stream application/octet-stream application/wasm
wav.wav πŸ”Ž audio/x-wav audio/x-wav audio/wav
woff.woff πŸ”Ž application/octet-stream font/woff font/woff
woff2.woff2 πŸ”Ž application/octet-stream font/woff2 font/woff2
x3d.x3d πŸ”Ž model/x3d+xml application/xml model/x3d+xml
xfdf.xfdf πŸ”Ž text/xml application/xml application/vnd.adobe.xfdf
xlf.xlf πŸ”Ž text/xml application/xliff+xml application/x-xliff+xml
xlsx.1.xlsx πŸ”Ž application/octet-stream application/vnd.openxmlformats-officedocument.spreadsheetml.sheet application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xml.withbr.xml πŸ”Ž text/plain application/xml text/xml
xml.xml πŸ”Ž text/xml application/xml text/xml
xpm.xpm πŸ”Ž image/x-xpmi image/x-xpixmap image/x-xpixmap
package main

import (
	"fmt"
	"mime"
	"net/url"
	"os"
	"os/exec"
	"path/filepath"
	"strings"

	"github.com/gabriel-vasile/mimetype"
)

func ExtensionName(s string) string {
	n := strings.LastIndexByte(s, '.')
	return s[n+1:]
}

func BaseName(s string) string {
	n := strings.LastIndexByte(s, '/')
	return s[n+1:]
}

func listTestFiles() []string {
	var files []string

	err := filepath.Walk("./testdata", func(path string, info os.FileInfo, err error) error {
		if !info.IsDir() {
			files = append(files, path)
		}
		return nil
	})
	if err != nil {
		panic(err)
	}
	return files
}

// sudo apt install libfile-mimeinfo-perl
func fileMIMETypePerl(path string) (string, error) {
	out, err := exec.Command("mimetype", "-b", path).Output()
	if err != nil {
		return "", err
	}

	return strings.TrimSpace(strings.ToLower(string(out))), nil
}

// sudo apt install file
func fileMIMETypeFile(path string) (string, error) {
	out, err := exec.Command("file", "-b", "--mime-type", path).Output()
	if err != nil {
		return "", err
	}

	return strings.TrimSpace(strings.ToLower(string(out))), nil
}

// native golang
func fileMIMETypeGo(path string) (string, error) {
	mimeTypeObject, err := mimetype.DetectFile(path)
	if err != nil {
		return "", err
	}

	mediaType, _, err := mime.ParseMediaType(mimeTypeObject.String())
	if err != nil {
		return "", err
	}

	return mediaType, nil

}

func main() {
	fmt.Println("| Path | Valid | Reference | File | Perl | Go |")
	fmt.Println("| --- | --- | --- | --- | --- | --- |")
	lines1 := []string{}
	lines2 := []string{}
	for _, path := range listTestFiles() {
		mimeFile, _ := fileMIMETypeFile(path)
		mimePerl, _ := fileMIMETypePerl(path)
		mimeGo, _ := fileMIMETypeGo(path)
		diff := (mimeGo != mimePerl || mimePerl != mimeFile)
		// diffWord := ""
		// if diff {
		// 	diffWord = "Yes"
		// }

		googleQuery := "." + url.QueryEscape(ExtensionName(path)+" file extension mime type")

		line := fmt.Sprintf("| %s [πŸ”Ž](https://www.google.com/search?q=%s) | | | %s | %s | %s |\n", BaseName(path), googleQuery, mimeFile, mimePerl, mimeGo)

		if diff {
			lines1 = append(lines1, line)
		} else {
			lines2 = append(lines2, line)
		}
	}

	for _, l := range lines1 {
		fmt.Print(l)
	}
	// same result
	// for _, l := range lines2 {
	// 	fmt.Print(l)
	// }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment