# GenMagic
Determine file type. Elixir bindings for [libmagic](http://man7.org/linux/man-pages/man3/libmagic.3.html).
[![Build Status](https://travis-ci.org/devstopfix/gen_magic.svg?branch=master)](https://travis-ci.org/devstopfix/gen_magic)
## Installation
The package can be installed by adding `gen_magic` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:gen_magic, "~> 0.20"}
]
end
```
## Usage
The libmagic library requires a magic file which can be installed in various locations on your file system. A good way of locating it is given in the [default config](config/config.exs):
```elixir
database = [
"/usr/local/share/misc/magic.mgc",
"/usr/share/file/magic.mgc",
"/usr/share/misc/magic.mgc"
] |> Enum.find(&File.exists?/1)
```
The GenServer SHOULD be run under a supervisor or a pool as it is designed to end should it receive any unexpected error. Here we run it under a supervisor:
```elixir
{:ok, _} = Supervisor.start_link([
{GenMagic.ApprenticeServer,
[database_patterns: [database], name: :gen_magic]}],
strategy: :one_for_one)
```
Now we can ask it to inspect a file:
```elixir
> GenMagic.ApprenticeServer.file(:gen_magic, Path.expand("~/.bash_history"))
{:ok, [mime_type: "text/plain", encoding: "us-ascii", content: "ASCII text"]}
```
For a one shot test, use the helper method:
```elixir
> GenMagic.perform(Path.join(File.cwd!(), "Makefile"))
{:ok,
[
mime_type: "text/x-makefile",
encoding: "us-ascii",
content: "makefile script, ASCII text"
]}
```
### Check uploaded files in a Phoenix controller
You can inspect the file from your controller:
```elixir
def upload(conn, %{"upload" => %{path: path}}) do
{:ok, [mime_type: _, encoding: _, content: content]} = GenMagic.ApprenticeServer.file(:gen_magic, path)
text(conn, "Received your file containing #{content}")
end
```
## Soak test
Run an endless cycle to prove that the GenServer is resilient:
```bash
find /usr/share/ -name *png | xargs mix run test/soak.exs
find . -name *ex | xargs mix run test/soak.exs
```
## Acknowledgements
Original design, implementation and C code by [Evadne Wu](https://github.com/evadne). Elixir wrapper by [devstopfix](https://github.com/devstopfix/gen_magic).
## License
TBC.