exiftool-vendored
Fast, cross-platform Node.js access to ExifTool.

Features
-
Best-of-class cross-platform performance and reliability.
Expect an order of magnitude faster performance than other packages.
-
Proper extraction of
-
Robust type definitions of the top 99.5% tags used by over 6,000
different camera makes and models
-
Auditable ExifTool source code (the vendored code is
checksum verified)
-
Automated updates to ExifTool (as new versions come out
monthly)
-
Robust test suite, performed with Node v4, v6, and v8 on Linux,
Mac, &
Windows.
Installation
npm install --save exiftool-vendored
Note that exiftool-vendored
provides an installation of ExifTool relevant for your platform
through
optionalDependencies.
You shouldn't include either the exiftool-vendored.exe
or
exiftool-vendored.pl
as direct dependencies to your project.
Usage
import { ExifTool } from "exiftool-vendored";
const exiftool = new ExifTool();
exiftool
.read("path/to/image.jpg")
.then((tags ) => console.log(`Make: ${tags.Make}, Model: ${tags.Model}`))
.catch(err => console.error("Something terrible happened: ", err))
exiftool.extractThumbnail("path/to/image.jpg", "path/to/thumbnail.jpg");
exiftool.extractPreview("path/to/image.jpg", "path/to/preview.jpg");
exiftool.extractJpgFromRaw("path/to/image.cr2", "path/to/fromRaw.jpg");
exiftool.extractBinaryTag("tagname", "path/to/file.exf", "path/to/dest.bin");
exiftool.write("path/to/file.jpg", { XPComment: "this is a test comment" });
exiftool.end()
Resource hygene
Remember to call .end()
.
If you use mocha v4 or later, and you don't call
exiftool.end()
, you will find that your tests hang after completion. The relevant change is described
here, and can be solved by
adding an after
block that shuts down the instance of ExifTool that your
tests are using:
after(() => exiftool.end())
Dates
Generally, EXIF tags encode dates and times with no timezone offset.
Presumably the time is captured in local time, but this means parsing the
same file in different parts of the world results in a different absolute
timestamp for the same file.
Rather than returning a
Date
which always includes a timezone, this library returns classes that encode the
date, the time of day, or both, with an optional tzoffset. It's up to you, then,
to do what's right.
In many cases, though, a tzoffset can be determined, either by the composite
TimeZone
tag, or by looking at the difference between the local
DateTimeOriginal
and GPSDateTime
tags. GPSDateTime
is present in most
smartphone images.
If a tzoffset can be determined, it is encoded in all related ExifDateTime
tags for those files.
Note also that some smartphones record timestamps with microsecond precision (not just millis!),
and both ExifDateTime
and ExifTime
have floating point milliseconds.
Tags
Official EXIF tag names
are PascalCased, like
AFPointSelected
and ISO
. ("Fixing" the field names to be camelCase, would
result in ungainly aFPointSelected
and iSO
atrocities).
The Tags.ts file is autogenerated by parsing through
images of more than 3,000 different camera makes and models taken from the
ExifTool site. It groups tags, their type, popularity, and example values such
that your IDE can autocomplete.
Note that if parsing fails (for, example, a datetime string), the raw string
will be returned. Consuming code should verify both existence and type as
reasonable for safety.
Performance
The npm run mktags
target reads all tags found in a batch of sample images and
parses the results.
Using exiftool-vendored
:
Read 2236 unique tags from 3011 files.
Parsing took 16191ms (5.4ms / file)
Parsing took 27141ms (9.0ms / file)
Parsing took 12545ms (4.2ms / file)
Using the exiftool
npm package takes 7x longer:
Reading 3011 files...
Parsing took 85654ms (28.4ms / file)
Batch mode
Starting the perl version of ExifTool is expensive, and is especially
expensive on the Windows version of ExifTool.
On Windows, for every invocation, exiftool installs a distribution of Perl
and extracts the ~1000 files that make up ExifTool, and then runs the
script. Windows virus scanners prevent reads on these files while they are
scanned, which makes this approach even more costly.
Using ExifTool's -stay_open
batch mode, we can reuse a single instance of
ExifTool across many requests, dropping response latency dramatically and
reducing system load.
Parallelism
The exiftool
singleton is configured with a maxProcs
set to the number of
CPUs on the current system; no more than maxProcs
instances of exiftool
will
be spawned.
Note that each child process consumes between 10 and 50 MB of RAM. If you have
limited system resources you may want to use a smaller maxProcs
value.
Changelog
See CHANGELOG.md.
Author
Contributors 🎉