FormatParser

February 27, 2026 ยท View on GitHub

Code Quality Continuous Integration Coverage Status Hex.pm version Hex.pm downloads

FormatParser can be used to figure out the type and the format of a file. It also can extract some additional information.

Documentation can be found here.

Inspired heavily by format_parser.

Basic usage

# Image
{:ok, file} = File.read("myimage.png")
match = FormatParser.parse(file)
match.nature                      #=> :image
match.format                      #=> :gif
match.width_px                    #=> 256
match.height_px                   #=> 256
match.intrinsics[:filter_method]  #=> 0

# Video
{:ok, file} = File.read("myvideo.flv")
match = FormatParser.parse(file)
match.nature                      #=> :video
match.format                      #=> :flv

# Document
{:ok, file} = File.read("mydocument.rtf")
match = FormatParser.parse(file)
match.nature                      #=> :document
match.format                      #=> :rtf

# Audio
{:ok, file} = File.read("myaudio.wav")
match = FormatParser.parse(file)
match.nature                      #=> :audio
match.format                      #=> :wav
match.sample_rate_hz              #=> 44100
match.num_audio_channels          #=> 2

# Font
{:ok, file} = File.read("myfont.ttf")
match = FormatParser.parse(file)
match.nature                      #=> :font
match.format                      #=> :ttf

# Data
{:ok, file} = File.read("mydata.parquet")
match = FormatParser.parse(file)
match.nature                      #=> :data
match.format                      #=> :pqt

# Archive
{:ok, file} = File.read("myarchive.iso")
match = FormatParser.parse(file)
match.nature                      #=> :archive
match.format                      #=> :iso

Supported Formats

Data

TypeNatureFormatIntrinsics
pqtxx
sqlite3xx
duckdbxx
arrowxx
featherxx

Audio

TypeNatureFormatSample Rate# of ChannelsIntrinsics
aiffxxxnum_frames, bits_per_sample
wavxxxxbyte_rate, block_align, bits_per_sample
vorbisxxxxvorbis_version
opusxxxxversion, pre_skip, output_gain, mapping_family
flacxxxx
oggflacxx
aacxxxx
m4axx
midixxformat, num_tracks, time_division

Video

TypeNatureFormat
flvxx
mp4xx
avixx
wmvxx
movxx
webmxx
mkvxx

Document

TypeNatureFormatIntrinsics
rtfxx
pdfxxpage_count
docxxx
docxx
xlsxxx
pptxxx
odtxx
odsxx
odpxx
epubxx

Image

TypeNatureFormatWidthHeightIntrinsics
jpgxx
gifxxxx
icoxxxxnum_color_palette, color_planes, bits_per_pixel
curxxxxnum_color_palette, hotspot_horizontal_coords, hotspot_vertical_coords
cr2xxxxdate_time, model, preview_byte_count, preview_offset
nefxxxxdate_time, model, preview_byte_count, preview_offset
tifxxxx
bmpxxxx
pngxxxxbit_depth, color_type, compression_method, crc, filter_method, interlace_method
psdxxxx
jb2xx
xcfxx
exrxx
webpxx
heicxx
heifxx
avifxx
jxlxx
svgxx

Font

TypeNatureFormat
ttfxx
otfxx
fonxx
woffxx
woff2xx

Archive

TypeNatureFormat
zipxx
rarxx
7zxx
gzxx
bz2xx
xzxx
tarxx
isoxx
zstdxx

Installation

Add the following to your mix.exs file

def deps do
  [
    {:format_parser, "~> 2.6.0"}
  ]
end

And run mix deps.get

Contribute

Please feel free to fork and send us a PR or open up an issue.