Providing the flexibility to reversion the API or UPDATE version slots as features or bugfixes arise and using ExifTool's version number is at odds with eachother, so this library follows Semver, and the vendored versions of ExifTool match the version they vendor.
API version is incremented for
💔Non-backward-compatible API changes 🌲New releases of ExifTool that have externally visible changes
UPDATE version is incremented for
🌱New releases of ExifTool with no externally visible changes ✨Backwards-compatible features
PATCH version is incremented for
🐞Backwards-compatible bug fixes 📦Minor packaging changes
📦Better tag ratings by rebuilding tags with ExifTool's default category sorting. This fixed a number of tags (like ExposureTime, ISO, and FNumber) that were erroneously marked as "rare" because they were also (rarely) found in APP categories.
🐞Increased default task timeout to 20s to resolve #34
📦Pull in batch-cluster 4.3.0, which exposes
📦By pulling in the latest batch-cluster, the default logger is NoLogger, which may be a nicer default for people. Added logging, event, and error information to the README.
🐞Warnings work now, and I even have a test to prove it. 😳 ✨Warning-vs-fatal errors can be configured via the new
minorErrorsRegExpconstructor parameter, or if you need more flexibility, by providing a
rejectTaskOnStderrimplementation to the ExifTool constructor.
✨Warnings are back! Non-fatal processing errors are added to the Tags.errors field. 📦Pulled in new typedoc version and switched to "file" rendering, which seems to generate better docs. This unfortunately broke links to underlying jsdocs.
📦Typedoc fails to render
mktagsnow renders each Tag as optional. The
Taginterface should be exactly the same as from v6.0.0.
ExifTool's many constructor parameters turned out to be quite unweildy. Version 6's constructor now takes an options hash. If you used the defaults, those haven't changed, and your code won't need to change.
ExifTool.enqueueTasktakes a Task thunk now, to enable cleaner task retry code. I don't expect many consumers will have used this API directly.
🐞In prior versions, when maxTasksPerProcess was reached, on some OSes, the host process would exit. ✨Rebuilt
Tagsbased on new phone and camera models
📦Files are not
stated before passing them on to ExifTool, as it seems to be faster on all platforms without this check. If you were error-matching on ENOENT, you'll need to switch to looking for "File not found".
💔BatchCluster was updated, which has a robust PID-exists implementation, but those signatures now return Promises rather than being synchronous, so the exported
runningfunction has changed to return a
🌱ExifTool upgraded to v11.09.
🌱ExifTool upgraded to v11.08.
✨Some photo sharing sites will set the
SubSecCreateDateto invalid values like
0001:01:01 00:00:00.00. These values are now returned as strings so consumers can more consistently discriminate invalid metadata.
✨Prior versions of
ExifTool.read()always added the
-fastoption. This read mode omits metadata found after the image payload. This makes reads much faster, but means that a few tags, like
OriginalImageHeight, may not be extracted. See https://sno.phy.queensu.ca/~phil/exiftool/#performance for more details.
Cuneytt reported this and I realized I should make
-fasta user preference. To maintain existing behavior, I've made the optional second argument of
["-fast"]. If you want to use "slow mode", just give an empty array to the second argument. If you want
["-fast2"]as the second argument.
🌱ExifTool upgraded to v11.06. 📦Removed node 9 from the build graph, as it isn't supported anymore: https://github.com/nodejs/Release#release-schedule 📦Pull in latest dependencies
exiftool.rewriteAllTags(), which may repair problematic image metadata.
🌱ExifTool upgraded to v11.02. 📦taskRetries default is now 1, which should allow recovery of the rare RPC/fork error, but actual corrupt files and realy errors can be rejected sooner. 📦Pull in latest dependencies, include new batch-cluster.
💔/ ✨Task rejections are always
Errors now, and
ExifTool.onobservers will be provided Errors on failure cases. Previously, rejections and events had been a mixture of strings and Errors. I'm bumping the major version just to make sure people adjust their code accordingly, but I'm hoping this is a no-op for most people. Thanks for the suggestion, Nils Knappmeier!
🌱ExifTool upgraded to v11.01. Note that ExifTool doesn't really follow semver, so this shouldn't be a breaking change, so we'll stay on v4. 📦Pull in latest dependencies, including batch-cluster and TypeScript. 📦Fix version spec because exiftool now has a left-zero-padded version that semver is not happy about.
🌱ExifTool upgraded to v10.98
🌱ExifTool upgraded to v10.95 📦Fix
.pldependency to omit test files and documentation
🌱ExifTool upgraded to v10.94 📦Pull in latest dependencies, including more robust BatchCluster exiting (which may help with rare child zombies during long-lived parent processes on macOS)
📦Pull in latest dependencies, including less-verbose BatchCluster
✨Before reading or writing tags, we stat the file first to ensure it exists. Expect
📦Expose batch-cluster lifecycle events and logger 🌱ExifTool upgraded to v10.92
✨Support for Electron. Added
ExifToolconstructor. See the wiki for more information.
🌱ExifTool upgraded to v10.89
🌱ExifTool upgraded to v10.86
📦Pick up batch-cluster 1.10.0 to possibly address this issue.
🌱ExifTool upgraded to v10.81 📦Update deps, including batch-cluster 1.9.0 📦Dropped support for node 4 (EOLs in 1 month).
🌱ExifTool upgraded to v10.78 📦Update deps, including TypeScript 2.7.1
🌱ExifTool upgraded to v10.76 📦Update deps
execFile, as the latter has buggy
maxBufferexit behavior and could leak exiftool processes on windows
.exiftoolsingleton now properly uses a
🌱ExifTool upgraded to v10.70 📦Replace tslint and tsfmt with prettier 📦Add test coverage report
(due to buggy interactions between
np, v4.13.0 was published in
an incomplete state and subsequently unpublished)
📦Rollback the rollback, as it's a known issue with par. If this happens again I'll add a windows-specific validation of the par directory.
🐞Rollback to ExifTool v10.65 to avoid this windows issue
🌱ExifTool upgraded to v10.67
📦More conservative default for
Math.max(1, system cpus / 4).
✨Corrected the type interface to
ExifTool.write()to be only string or numeric values with keys from
Tagsso intellisense can work it's magicks
📦Updated the README with more examples 📦Added timestamp write tests
✨Metadata writing is now supported. Closes #6
🌱ExifTool upgraded to v10.66 ✨Pull in new
batch-clusterwith more aggressive child process management (uses
taskkillon win32 platforms and
kill -9on unixish platforms)
✨ExifTool constructor defaults were relaxed to handle slow NAS ✨Upgraded to Mocha 4.0. Added calls to
afterblocks and the README so
🌱ExifTool upgraded to v10.64
📦reverted batch-cluster reference
🌱ExifTool upgraded to v10.61 🐞Re-added the "-stay_open\nFalse" ExifTool exit command, which may be more reliable than only using signal traps. 📦
yarn upgrade --latest
🌱ExifTool upgraded to v10.60 📦Upgraded all dependencies
🌱ExifTool upgraded to v10.58
QuickTimeTagsfrom several example movies (previous versions of
Tagsdidn't have movie tag exemplar values)
🌱ExifTool upgraded to v10.57
Tagsfields are now marked as possibly undefined, as there are no EXIF, IPTC, or other values that are guaranteed to be set. Sorry for the major break, but the prior signature that promised all values were always set was strictly wrong.
✨Added support for all downstream batch-cluster options in the ExifTool constructor. 📦Added
ExifTool.pids(used by a couple new integration tests)
Tagswith additional sample images and looser tag filtering.
🌱ExifTool upgraded to v10.54 📦Pulled in batch-cluster v1.2.0 that supports more robust child process cleanup ✨Yarn and
platform-dependent-modulesdon't play nicely. Anton Mokrushin submitted several PRs to address this. Thanks!
📦Completed jsdocs for ExifTool constructor 📦Pulled in batch-cluster v1.1.0 that adds both
✨Extracted batch-cluster to power child process management. Task timeout, retry, and failure handling has excellent test coverage now. 💔Switched from debug to node's debuglog to reduce external dependencies 🌱ExifTool upgraded to v10.51 📦Using
.npmignoreinstead of package.json's
filesdirective to specify the contents of the module.
🐛Rounded milliseconds were not set by
ExifDateTime.toDate()when timezone was not available. Breaking tests were added.
📦Exposed datetime parsing via static methods on
✨Some newer smartphones (like the Google Pixel) render timestamps with microsecond precision, which is now supported.
✨Added example movies to the sample image corpus used to build the tag definitions.
taskTimeoutMillis, which will cause the promise to be rejected if exiftool takes longer than this value to parse the file. Note that this timeout only starts "ticking" when the task is enqueued to an idle ExifTool process.
onIdleIntervalMillis(defaults to every 10 seconds) to ensure all requested tasks are serviced.
ECONNRESETis raised from the child process (which seems to happen for roughly 1% of requests), the current task is re-enqueued and the current exiftool process is recycled.
Tagsdefinitions using more (6,412!) sample image files (via
npm run mktags ~/sample-images), including many RAW image types (like
maxReusesbefore exiftool processes are recycled
🌱ExifTool upgraded to v10.50
gps.toDate is not a function
🌱ExifTool upgraded to v10.47 ✨Added call to
.end()in case the stdin command was missed by ExifTool
✨Added support for Node 4. TypeScript builds under es5 mode.
🌱ExifTool upgraded to v10.46
🌱ExifTool upgraded to v10.44 📦Upgraded to TypeScript 2.2 🐞
update/io.tserror message didn't handle null statuscodes properly
update/mktags.tshad a counting bug exposed by TS 2.2
✨More robust error handling for child processes (previously there was no
.on("error")added to the process itself, only on
stderrof the child process).
🌱ExifTool upgraded to v10.41 ✨
Orientationis rendered as a string by ExifTool, which was surprising (to me, at least). By exposing optional args in
ExifTool.read, the caller can choose how ExifTool renders tag values.
LC_environment variables were passed through to exiftool (and subsequently, perl). These are now explicitly unset when exec'ing ExifTool, both to ensure tag names aren't internationalized, and to prevent perl errors from bubbling up to the caller due to missing locales.
extractBinaryTagexposed because there are a lot of binary tags (and they aren't all embedded images)
JpgFromRawwas missing in
Tag(no raw images were in the example corpus!)
extractJpgFromRawimplemented to pull out EXIF-embedded images from RAW formats
🌱ExifTool upgraded to v10.40
extractPreviewimplemented to pull out EXIF-embedded images
📦Rebuilt package.json.files section
💔Switched from home-grown
📦Switch back to
platform-dependent-modules. npm warnings aren't awesome.
📦Don't include tests or updater in the published package
🌱ExifTool upgraded to v10.38 📦Use
npm's os-specific optionalDependencies rather than
🐛Several imports (like
process) name-collided on the globals imported by Electron
🌱ExifTool upgraded to v10.37
🌱ExifTool upgraded to v10.36 ✨
Tag.Errorexposed for unsupported file types.
🐛It was too easy to miss calling
ExifTool.end(), which left child ExifTool processes running. The constructor to ExifTool now adds a shutdown hook to send all child processes a shutdown signal.
toString()for all date/time types
✨Added typings reference in the package.json 🌱Upgraded vendored exiftool to 10.33
📦Fixed packaging (maintain jsdocs in .d.ts and added typings reference) 📦Using np for packaging
✨Multithreading support with the
✨Added tests for reading images with truncated or missing EXIF headers ✨Added tests for timezone offset extraction and rendering ✨Subsecond resolution from the Google Pixel has 8 significant digits(!!), added support for that.
✨More rigorous TimeZone extraction from assets, and added the
ExifTimeZoneOffsetto handle the
✨Added support for millisecond timestamps