Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/zRedShift/mimemagic
Powerful and versatile MIME sniffing package using pre-compiled glob patterns, magic number signatures, XML document namespaces, and tree magic for mounted volumes, generated from the XDG shared-mime-info database.
https://github.com/zRedShift/mimemagic
detection extension filetype freedesktop go golang magic-numbers mime mime-database mime-types sniffing xdg
Last synced: about 1 month ago
JSON representation
Powerful and versatile MIME sniffing package using pre-compiled glob patterns, magic number signatures, XML document namespaces, and tree magic for mounted volumes, generated from the XDG shared-mime-info database.
- Host: GitHub
- URL: https://github.com/zRedShift/mimemagic
- Owner: zRedShift
- License: gpl-2.0
- Created: 2018-10-11T16:12:54.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2023-10-11T23:23:51.000Z (about 1 year ago)
- Last Synced: 2024-11-07T16:51:08.221Z (about 1 month ago)
- Topics: detection, extension, filetype, freedesktop, go, golang, magic-numbers, mime, mime-database, mime-types, sniffing, xdg
- Language: Go
- Homepage:
- Size: 14.8 MB
- Stars: 99
- Watchers: 3
- Forks: 10
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-go-extra - mimemagic - compiled glob patterns, magic number signatures, XML document namespaces, and tree magic for mounted volumes, generated from the XDG shared-mime-info database.|76|9|2|2018-10-11T16:12:54Z|2021-12-13T04:48:58Z| (Utilities / Fail injection)
- awesome-go - mimemagic - Powerful and versatile MIME sniffing package using pre-compiled glob patterns, magic number signatures, XML document namespaces, and tree magic for mounted volumes, generated from the XDG shared-mime-info database. - ★ 29 (Utilities)
README
mimemagic
=========
[![GoDoc](https://godoc.org/github.com/zRedShift/mimemagic?status.svg)](https://godoc.org/github.com/zRedShift/mimemagic)
[![Build Status](https://travis-ci.org/zRedShift/mimemagic.svg?branch=master)](https://travis-ci.org/zRedShift/mimemagic)
[![Codecov](https://codecov.io/gh/zRedShift/mimemagic/branch/master/graph/badge.svg)](https://codecov.io/gh/zRedShift/mimemagic/)
[![Go Report Card](https://goreportcard.com/badge/github.com/zRedShift/mimemagic)](https://goreportcard.com/report/github.com/zRedShift/mimemagic)Powerful and versatile MIME sniffing package using pre-compiled glob patterns, magic number signatures, xml document
namespaces, and tree magic for mounted volumes, generated from the XDG shared-mime-info database.## License
The generated code in `magicsigs.go`, `globs.go`, `treemagicsigs.go`, `namespaces.go`
and `mediatypes.go` makes this a derivative work of `shared-mime-info`, and therefore falls under the
`GPL-2.0-or-later` license. See the [discussion](https://github.com/zRedShift/mimemagic/issues/4).For an MIT licensed branch with the generated code removed, please see
[this](https://github.com/zRedShift/mimemagic/tree/MIT). Providing a hypothetical permissively licensed
freedesktop.org.xml file for parsing is still required, to redistribute the compiled executable with that license,
however.## Features
- All in native go, no outside dependencies/C library bindings
- 1003 MIME types, with a description, an acronym (where available), common aliases, extensions, icons, and
subclasses
- 493 magic signature tests (comprising of 1147 individual patterns), featuring range searches and bit masks, as per
the xdg specification
- 1099 glob patterns, for filename-based matching
- 11 Tree Magic signatures and 28 XML namespace/local name pairs, offered for completeness' sake.
- Included is the xml file parser to generate your own MIME definitions
- Also included is a CLI based on this library that is fully featured and blazing-fast, beating the native 'file'
and KDE's 'kmimetypefinder' in performance
- Cross-platform support## Installation
The library:
```bash
go get github.com/zRedShift/mimemagic/v2
```
The CLI:
```bash
go get github.com/zRedShift/mimemagic/v2/cmd/mimemagic
```## API
See the [Godoc](https://godoc.org/github.com/zRedShift/mimemagic) reference, and cmd/mimemagic for an example
implementation.## Usage
The library:
```go
package mainimport (
"fmt"
"github.com/zRedShift/mimemagic/v2"
"strings"
)func main() {
// Ignoring Read errors that might arise
mimeType, _ := mimemagic.MatchFilePath("sample.svgz", -1)// image/svg+xml-compressed
fmt.Println(mimeType.MediaType())// compressed SVG image
fmt.Println(mimeType.Comment)// SVG (Scalable Vector Graphics)
fmt.Printf("%s (%s)\n", mimeType.Acronym, mimeType.ExpandedAcronym)// application/gzip
fmt.Println(strings.Join(mimeType.SubClassOf, ", "))// .svgz
fmt.Println(strings.Join(mimeType.Extensions, ", "))// This is an image.
switch mimeType.Media {
case "image":
fmt.Println("This is an image.")
case "video":
fmt.Println("This is a video file.")
case "audio":
fmt.Println("This is an audio file.")
case "application":
fmt.Println("This is an application.")
default:
fmt.Printf("This is a(n) %s.", mimeType.Media)
}// true
fmt.Println(mimeType.IsExtension(".svgz"))
}
```
The CLI:
```
Usage: mimemagic [options] ...
Determines the MIME type of the given file(s).Options:
-c Determine the MIME type of the file(s) using only its content.
-f Determine the MIME type of the file(s) using only the file name. Does
not check for the file's existence. The -c
flag takes precedence.
-i Output the MIME type in a human readable format.
-l int
The number of bytes from the beginning of the file mimemagic will
examine. Reads the entire file if set to a negative value. By default
mimemagic will only read the first 512 from stdin, however setting this
flag to a non-default negative value will override this. (default -1)
-t Determine the MIME type of the directory/mounted volume using tree
magic. Can't be used in conjunction with with -c, -f or -x.
-x Determine the MIME type of the xml file(s) using the local names and
namespaces within. Can't be used in conjunction with -c, -f or -t.Arguments:
file
The file(s) to test. '-' to read from stdin. If '-' is set, all other
inputs will be ignored.Examples:
$ mimemagic -c sample.svgz
application/gzip
$ mimemagic *.svg*
Olympic_rings_with_transparent_rims.svg: image/svg+xml
Piano.svg.png: image/png
RAID_5.svg: image/svg+xml
sample.svgz: image/svg+xml-compressed
$ cat /dev/urandom | mimemagic -
application/octet-stream
$ ls software; mimemagic -i -t software/
autorun
UNIX software
```## Benchmarks
See [Benchmarks](https://github.com/zRedShift/mimemagic/blob/master/benchmarks.txt). For Match(), the average across
over 400 completely different files (representing a unique MIME type each) is 13 ± 7 μs/op. For MatchGlob() it's 900
± 200 ns/op, and for 12 ± 7 μs/op MatchMagic().