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 each other, so this library follows Semver, and the vendored versions of ExifTool match the version that they vendor.
- π Non-backward-compatible API changes
- ποΈ End of life versions of Node.js are dropped from the build matrix
- π± New releases of ExifTool
- π₯ Security updates
- β¨ Backwards-compatible features
- π Backwards-compatible bug fixes
- π¦ Minor packaging changes
-
π/π/π¦ ExifTool sometimes returns
boolean
values for some tags, likeSemanticStylePreset
, but uses "Yes" or "No" values for other tags, likeGPSValid
(TIL!). If the tag name ends inValid
and is truthy (1, true, "Yes") or falsy (0, false, "No"), we'll convert it to a boolean for you. Note that this is arguably a breaking API change, but it should be what you were already expecting (so is it a bug fix?). See the diff to the Tags interface in this version to verify what types have changed. -
π¦ Reduced
streamFlushMillis
to10
. This reduced elapsed time for the full test suite by 2.5x on macOS and 3x on Windows, and drops the upper latency bound substantially. Note that this is at the risk of buffered stream collisions between tasks. The (extensive) test suite on Github Actions (whose virtual machines are notoriously slower than molasses) still runs solidly, but if you see internal errors, please open a Github issue and increase yourstreamFlushMillis
. -
π TypeScript now emits ES2022, which requires Node.js 18.
-
π/π¦ GPS Latitude and GPS Longitude values are now parsed from DMS notation, which seems to avoid some incorrectly signed values in some file formats (especially for some problematic XMP exports, like from Apple Photos). Numeric GPSLatitude and GPSLongitude are still accepted: to avoid the new coordinates parsing code, restore
GPSLatitude
andGPSLongitude
to theExifToolOptions.numericTags
array. -
π/π¦ If
ExifToolOptions.geolocation
is enabled, andGeolocationPosition
exists, and we got numeric GPS coordinates, we will assume the hemisphere from GeolocationPosition, as that tag seems to correct for more conditions than GPS*Ref values. -
π/π¦ If the encoded GPS location is invalid, all
GPS*
andGeolocation*
metadata will be omitted fromExifTool.readTags()
. Prior versions let some values (likeGPSCoordinates
) from invalid values slip by. A location is invalid if latitude and longitude are 0, out of bounds, either are unspecified. -
π/π¦ Reading and writing GPS latitude and GPS longitude values is surprisingly tricky, and could fail for some file formats due to inconsistent handling of negative values. Now, within
ExifTool.writeTags()
, we will automatically setGPSLatitudeRef
andGPSLongitudeRef
if lat/lon are provided but references are unspecified. More tests were added to verify this workaround. On reads,GPSLatitudeRef
andGPSLongitudeRef
will be backfilled to be correct. Note that they only return"N" | "S" | "E" | "W"
now, rather than possibly being the full cardinal direction name. -
π If
ignoreZeroZeroLatLon
andgeolocation
weretrue
, (0,0) location timezones could still be inferred in prior versions. -
π¦ GPS coordinates are now round to 6 decimal places (β11cm precision). This exceeds consumer GPS accuracy while simplifying test assertions and reducing noise in comparisons. Previously storing full float precision added complexity without practical benefit.
Important: ExifTool versions use the format NN.NN
and do not follow semantic versioning. The version from ExifTool will not parse correctly with the semver
library (for the next 10 versions) since they are zero- padded.
-
π± Upgraded ExifTool to version 13.00
Note: ExifTool version numbers increment by 0.01 and do not follow semantic versioning conventions. The changes between version 12.99 and 13.00 are minor updates without any known breaking changes.
-
π¦ Added Node.js v23 to the build matrix.
- π± ExifTool upgraded to version 12.99
-
π± ExifTool upgraded to version 12.97
-
π¦ Fields in
Tags
sub-interfaces are correctly sorted
-
π/π¦ Add new
ExifToolOptions.preferTimezoneInferenceFromGps
to prefer GPS timezones. See the jsdoc for details. -
π Support triple-deep IANA timezones, like
America/Indiana/Indianapolis
.
- π¦ The warning "Invalid GPSLatitude or GPSLongitude. Deleting geolocation tags" will only be added if
GPSLatitude
orGPSLongitude
is non-null.
- β¨ Add workaround for abberant Nikon
TimeZone
encoding. Addresses #215. SetExifToolOptions.adjustTimeZoneIfDaylightSavings
to() => undefined
to retain prior behavior.
- π Re-add +13:00 as a valid timezone offset. Addresses #214.
-
π± ExifTool upgraded to v12.96
-
β¨ Add support for timezone offset extraction from
TimeStamp
. Note that this is disabled by default to retain prior behavior (and due to me being chicken that this might break other random cameras). Addresses #209 -
β¨ @bugfest improved write typings around
Struct
s. Thanks! See #212 -
π @noahmorrison found and fixed an issue with
inferLikelyOffsetMinutes
. Thanks for the assist! See #208 for details. -
π¦/π Possible breaking change: several archane timezone offsets were removed from the
ValidTimezoneOffsets
array, to better address #208.
- π¦ Add
snyk-linux
to npmignore to fix #200
- π±/β¨/π ExifTool upgraded to v12.91. Notably, the shebang line has changed from
/usr/bin/perl
to/usr/bin/env perl
. The exiftool-vendored.pl package works around a new error from this shebang line.
-
π¦ Add tests for #187
-
π¦ Export
ImageDataHashTag
interface
-
π±/β¨/π ExifTool upgraded to v12.89. Notably, ExifTool on Windows is now using the "official" packaging. This should be equivalent to prior builds, as exiftool-vendored.exe was already using Oliver Betz's perl launcher.
-
π Prior versions included
APP1Tags
,APP4Tags
,APP5Tags
,APP6Tags
,APP12Tags
, andAPP14Tags
. Unfortunately, due to field name duplications, fields could hop between these interfaces between versions. These have all been collapsed into a single newAPPTags
. -
β¨ Added support for old Sony A7 UTC inference. Thanks for the help, Friso Smit!
-
β¨ Added support for Android Motion Photos. Thanks for the help, Lukas!
-
π¦ Updated
ReadTask
andWriteTask
constructors to be public as well as the.parse()
methods as a workaround for #190 -
π¦ Fought AND WON a very obscure issue with Node v22.5.0
-
π
ExifToolOptions.struct
is now"undef" | 0 | 1 | 2
. See #184 -
β¨
ExifToolOptions
now includesreadArgs
andwriteArgs
, which can be specified both atExifTool
construction, as well as calls toExifTool.read
andExifTool.write
. The prior method signatures are deprecated.
-
β¨ Support for all ExifTool
struct
modes (fixes #184). See ExifToolOptions.struct for details. -
π¦ Fix documentation to reference ExifTool.read() (fixes #183)
-
π±/β¨/π ExifTool upgraded to v12.85. Notably, this addresses reversed HEIC orientation.
-
π Perhaps address Perl not installed error.
-
π±/β¨ ExifTool upgraded to v12.84
-
π¦ Support disabling
-ignoreMinorErrors
to work around shenanigans like #181. This is an optional field that defaults to prior behavior (enabled, which ignores minor errors, which is normally desired, but has some side effects like fully reading tags that may be extremely long). See ExifToolOptions.ignoreMinorErrors for details. -
π¦ ExifTool on Windows was upgraded to Strawberry Perl 5.32.1
-
π±/β¨ ExifTool upgraded to v12.82
-
π¦ Add support for
NODE_DEBUG=exiftool-vendored
-
π¦ Export
exiftoolPath()
so custom implementations can use it as a fallback (or default, and provide their own fallback)
-
β¨ Added
retain
field toExifTool.deleteAllTags
to address #178 -
π¦ Added jsdocs for many
Tag
interface types -
π¦ Expose
GeolocationTags
andisGeolocationTag()
-
π¦ Add
FileTags.FileCreateDate
(only a thing on Windows)
-
π±/β¨ ExifTool upgraded to v12.80, which adds support for reverse-geo lookups and [several other geolocation features](https://exiftool.org/geolocation.html
-
β¨ If no vendored version of
exiftool
is available, we'll try to make do with whatever is available in thePATH
. -
β¨
ExifToolOptions.exiftoolPath
can now be anasync
function -
β¨ Added Geolocation Tags. These will only be available if
{geolocation: true}
is passed to the ExifTool constructor. -
π¦ Added support for
electron-forge
: see the docs for details.
-
π± ExifTool upgraded to v12.78
-
π¦ Added ExifTool.off
-
π± ExifTool upgraded to v12.76. Note that an ARW file corrupting issue was found that's existed since v12.45.
-
π¦ Updated dependencies, including new batch-cluster v13 π
-
π± ExifTool upgraded to v12.73.
-
π¦ If the underlying Perl installation is invalid, throw an error. See #168 for details.
-
π± ExifTool upgraded to v12.72.
-
π¦ Relax GPS latitude/longitude parser to handle invalid Ref values (a warning will be appended to the Tags.warnings field). See #165.
- π If
perl
isn't installed in/usr/bin
, feed the full path toperl
(if we can find it) tospawn
(rather than relying on the shell to use$PATH
). This should address issues like #163
- π¦ Relaxed
isWarning()
detection to be simply/warning:/i
. v24.0.0 would throw errors when extracting binary thumbnails due to issues like "Warning: Ignored non-standard EXIF at TIFF-IFD0-JPEG-APP1-IFD0", which is decidedly a warning.ExifTool.write
now leans (hard) on returningTags.warnings
rather than throwing errors: It is up to you to inspect.warnings
and decide for your own usecase if the issue is exceptional. See issue #162 for details.
-
π In the interests of reducing complexity, the
ExifToolOptions.isIgnorableError
predicate field was removed -- if this was used by anyone, please open an issue and we can talk about it. -
π
ExifTool.write
now returns metadata describing how many files were unchanged, updated, or created, and no longer throws errors if the operation is a no-op or inputs are invalid. See issue #162 for details. -
β¨
.warnings
are returned byExifTool.read
andExifTool.write
tasks if there are non-critical warnings emitted tostderr
by ExifTool. -
π¦ Some fields in
Tags
were moved to more correct groups -
π¦ Refined
WriteTags
signature to omitExifToolTags
andFileTags
fields. -
π¦ Added
node:
prefix to Node.js module imports. This requires node v14.13, v16.0, or later.
-
π¦ Added MWG
.HierarchicalKeywords
and.Collections
toTags
-
π/π¦
Rotation
was removed from the default set ofnumericTags
, as it may be encoded as an EXIF orientation value, or a degree rotation, and it should be up to the application to figure it out.
-
π¦ Added new option,
ignoreZeroZeroLatLon
, and defaulted this new option totrue
. Several camera manufacturers and image applications will write0
to theGPSLatitude
andGPSLongitude
tags when they mean "unset"--but this can cause incorrect timezone inference. Set tofalse
to retain prior code behavior. -
π¦
Rotation
was added to the default set ofnumericTags
, as it may be encoded as an EXIF orientation value. Prior builds could return Rotation values like"Rotate 270 CW"
. -
π¦
XMPTags.Notes
was added toTags
, used as an album description -
π Some
ExifToolOption
s were not passed from ExifTool into the ReadTask, which caused ReadTask to revert to defaults.
-
π± ExifTool upgraded to v12.70. π Thanks for 20 years of updates, Phil Harvey! π
-
π¦
XMPTags.Album
was added toTags
-
π± ExifTool upgraded to v12.69
-
π¦
ExifTool.read
:ExifTime
now adopts the default zone extracted from the file. This may result in different values for timestamps. -
π¦ Updated dependencies
- π Restored datestamp parsing of
ResourceEvent.When
-
β¨ Timezone parsing improvements:
- Added
ExifToolOptions.inferTimezoneFromDatestampTags
. - Timezone inference from datestamps now skips over UTC values, as Google Takeout (and several other applications) may spuriously set "+00:00" to datestamps.
- ReadTask.parse in prior versions had to scan all tags twice to set the timezone. Code was refactored to do this in a single pass.
- Timezone extraction and normalization was improved.
- Added
-
π¦ Add
creationDate
to CapturedAtTagNames. See PR#159.
-
π± ExifTool upgraded to v12.67
-
β¨
ExifTime
now parses and stores timezone offsets if available. This resolves issue #157. -
π¦
ExifDateTime
,ExifTime
, andExifDate
are now only allowed to try to parse keys that includesdate
ortime
, which avoids incorrect parsing of tags likeMonthDayCreated
(which looks like12:19
) -
π¦ Updated all dependencies, but only
devDependencies
were impacted.
-
ποΈ Dropped support for Node.js v16, which is End-of-Life.
-
π/π If
defaultVideosToUTC
is set totrue
,read()
will now allow non-UTC timezones extractable from other tags to be assigned to.tz
. Prior versions would simply force.tz
to "UTC" for all videos, which wasn't great. Note that "UTC" is still used as the default timezone for all datestamps without explicit timezones, just as prior versions did. See issue #156 for details. -
π
backfillTimezones
now defaults totrue
. Although this is likely to be what people expect, but know that this makes the assumption that all encoded times without an explicit offset share the same tz, which may not be correct (say, if you edit the image in a different timezone from when it was captured). -
π If
backfillTimezones
is set tofalse
,ExifDateTime
will no longer use the current file's.tz
as a default. Prior versions would inherit the file's.tz
, which might be incorrect. -
π¦
ExifDateTime
now includes an.inferredZone
field, which may be useful in helping to determine how "trustworthy" the zone and actual datestamp value is.
- π Apply the v22.2.3 bugfix even wider (just found a
SubSecTime
value of "01" in the wild, and it was happily parsed into today's date, oops).
- π Apply the v22.2.1 bugfix wider: we now reject parsing any date-ish or time-ish value that matches
/^0+$/
.
- π
ExifTime
now properly rejects invalidSubSecTime
,SubSecTimeOriginal
, ... values of "0" or "00".
-
β¨ Add support for zone extraction from
ExifDateTime
,ExifTime
,number[]
, andnumber
fields. -
π¦ Improve type signature of
extractTzOffsetFromTags
.
-
π± ExifTool upgraded to v12.65
-
β¨ Add support for new
ImageDataHash
tag: See the docs for details. -
π
perl
is checked for on non-windows machines at startup. This resolves #152. You can disable this with the newcheckPerl
option.
-
ποΈ Drop support for Node 14, which EOL'ed 2023-04-30
-
π± ExifTool upgraded to v12.62
-
π Fix exports for DefaultExifToolOptions and several other non-type values. Thanks for the bug report, renambot!
-
π¦ Avoid double-rendering of ImageDataMD5 (Thanks, Phil! See forum post for details)
-
π¦ Pull down new camera test images, rebuild Tags and docs
-
β¨ Added support for ExifTool's MWG Composite Tags. Set the new
ExifToolOptions.useMWG
option totrue
to enable. -
β¨ Added support for ExifTool's new
ImageDataMD5
feature. Set the newExifToolOptions.includeImageDataMD5
option totrue
to enable. -
π¦ Extracted options-related code into modules to remove a couple circular dependencies. Exports should make this transparent to external clients.
- π Improved types from
ExifTool.readRaw()
. Thanks for the suggestion, Silvio BrΓ€ndle!
-
π± ExifTool upgraded to v12.60
-
π¦ Replaced
Tags.tzSource
message"from lat/lon"
to"GPSLatitude/GPSLongitude"
to be more consistent with other timezone source messages.
- β¨ Implemented
ExifDateTime.plus()
. Added tests.
-
π Negative GPSLatitude and GPSLongitude values are now supported for EXIF (like
.JPEG
),.XMP
, and.MIE
files. Thanks for the bug report, Jason, and the solution, Phil! -
π± ExifTool upgraded to v12.56
-
π
ExifDateTime.fromDateTime()
now takes an option hash as the second argument (instead of the second argument beingrawValue
) -
π
ExifDateTime.milliseconds
will now beundefined
if the EXIF or ISO date string did not specify milliseconds, and will no longer render milliseconds if therawValue
did not include millisecond precision. -
π¦ EXIF and ISO dates without specified seconds or milliseconds are now allowed
-
π¦ Switched
package.json
scripts fromyarn
tonpm
, as yarn@1 doesn't work with Node v22.5 and GitHub Actions.
-
π
ExifTool.write
took a generic that defaulted toWriteTags
, but the type wasn't used for anything. I removed the generic typing, which may require consumers to change their code. -
π± ExifTool upgraded to v12.55
-
π¦
npm run prettier
now re-organizes imports -
π¦ Updated dependencies, re-ran prettier, rebuilt tags, rebuilt docs
-
π/π Fix #124: Improved support for filenames with non-latin (a-z0-9) characters on Windows machines that weren't set to UTF-8. Thanks for the bug report and PR, JΓΌrg Rast!
-
π/π ExifTool v12.54 has several new tags (see the diff) and now renders
GPSAltitude
with negative values when the altitude is below sea level. -
π± ExifTool upgraded to v12.54
-
π¦ Updated dependencies, re-ran prettier, rebuilt tags, rebuilt docs
-
π¦ Node v19 added to the CI test matrix
-
π± ExifTool upgraded to v12.50
-
π¦ Updated dependencies, rebuild tags and docs
-
β¨
ExifToolOptions
now supports anignorableError
predicate, used for characterizing errors as "ignorable". Defaults to ignoring the following styles of warnings:Warning: Duplicate MakerNoteUnknown tag in ExifIFD
Warning: ICC_Profile deleted. Image colors may be affected
-
π Only read operations are now retried. See #119
-
π Date-time tags with exactly Common Epoch (
1970-01-01T00:00:00Z
) are no longer filtered as invalid. See #118 for details. -
π¦ Updated dependencies, rebuild tags and docs
- π The public export for
BinaryField
mistakenly exposed it being namedBinaryDataField
. The name of the export and the class are now bothBinaryField
.
-
β¨ Binary fields are now parsed to a new
BinaryField
object which parses out the length of the binary field -
π/π¦ Added more required tag fields to
mktags
, includingSubSecModifyDate
(which fell off of the Tags.ts API in v18.3.0, oops!) -
π¦
ExifTime
now retains the raw value to be consistent withExifDate
andExifDateTime
-
π± ExifTool upgraded to v12.49, which adds write support to WEBP and a bunch of other goodness
-
π¦ Added new cameras to test image corpus, rebuilt tags and docs
-
π¦ Updated dependencies
- β¨ Add support for alternative gps timezone lookup libraries. If you want to use
geo-tz
instead, use something like this:
const geoTz = require("geo-tz")
const { ExifTool } = require("exiftool-vendored")
const exiftool = new ExifTool({
geoToTz: (lat, lon) => geoTz.find(lat, lon)[0],
})
-
β¨ If a timezone offset tag is present, and GPS metadata can infer a timezone, and they result in the same offset,
Tags.tz
will use the GPS zone name (likeAmerica/Los_Angeles
). -
π We now only apply timezone offset defaults to tag values that are lacking in explicit offsets and are not always encoded in UTC.
-
π¦ Timezone "normalization" to a single timezone is no longer applied--if a datetime tag has an offset, the ExifDateTime value should retain that offset value now. Use
ExifDateTime.setZone
if you want to normalize any instance. -
π¦ Restore
GPSPosition
to the defaultnumericTags
so all GPS lat/lon values are consistent.
-
π¦ Switch from the abandoned
tz-lookup
package to@photostructure/tz-lookup
. Note that this uses an updated time zone geo database, so some time zone names and geo shapes have changed. -
π¦ The
GPSPosition
tag is no longer included in the default set of numeric tags, as this results in ExifTool returning two floats, whitespace-separated. UseGPSLatitude
andGPSLongitude
instead.
-
π
ReadTask.for()
now takes an options hash, which includes the newdefaultVideosToUTC
option. -
π Videos now default to UTC, unless there is a
TimeZone
,OffsetTime
,OffsetTimeOriginal
,OffsetTimeDigitized
, orTimeZoneOffset
tag value. Thanks for the bug report, @mrbrahman! -
π± ExifTool upgraded to v12.45.
-
β¨
ExifDateTime
andExifDate
now have atoMillis()
to render in milliseconds from common epoch -
π¦ Expose
closeChildProcesses
from underlying BatchCluster instance -
π Pull in batch-cluster bugfix
(Note that this build does not pull in ExifTool v12.44, due to this bug)
- π
reasonableTzOffsetMinutes()
,extractOffset()
, andoffsetMinutesToZoneName()
handleUnsetZone
properly. This shouldn't normally come into play, as this would require serialization of the unset timezone, but... why not, eh?
-
π Luxon has a breaking change. Please verify that date parsing and zone assignments work as expected.
-
π± ExifTool upgraded to v12.43.
-
π
UnsetZone
now usesInfo.normalizeZone()
. -
π¦ Updated dependencies
-
π± ExifTool upgraded to v12.42.
-
π¦ Updated dependencies
-
π¦ Dropped Node v12 from GitHub Actions CI
-
π¦ Added RELEASE.md
-
π Struct values are now properly encoded when writing. Specifically, prior versions didn't support JSON string values (and now WriteTask knows how to serialize those characters to make ExifTool happy)
-
π¦/π
String.htmlEncode
was made private: it was a special-purpose function just forWriteTask
. -
π¦ Added Node 18 to test matrix. Node 12 will be dropped from support in the next version.
-
π¦ Updated dependencies
-
β¨ Added
ExifDateTime.fromMillis()
-
π¦ Fixed hanging sentence in README. Rebuild docs.
-
π¦ Migrated
omit()
toObject
.
-
β¨ Added read/write support for History and Versions structs.
-
These two tags return typed optional struct arrays.
-
Via the new
StructAppendTags
interface,ExifTool.write()
now accepts plus-suffixed variants of these tags to append to existing records.
-
-
π± ExifTool upgraded to v12.41.
-
π¦ Updated dependencies
-
β¨ Updated dependencies, including batch-cluster v10.4.0).
This new version will detect when tasks are rejected (due to parsing issues or any other reason), and in that case, the child
exiftool
process will be verified to be "healthy" before being put back into the service pool.
-
π/π Timezone extraction has been adjusted: if there is a GPS location, we'll prefer that
tzlookup
as the authoritative timezone offset. If there isn't GPS lat/lon, we'll useTimezone
,OffsetTime
, orTimeZoneOffset
. If those are missing, we'll infer the offset from UTC offsets.Prior builds would defer to the offset in
Timezone
,OffsetTime
, orTimeZoneOffset
, but GPS is more reliable, and results in a proper time zone (likeAmerica/Los_Angeles
). Zone names work correctly even when times are adjusted across daylight savings offset boundaries. -
π/π Timezone application is now has been improved: if a timezone can be extracted for a given file,
ExifTool.read()
will now make allExifDateTime
entries match that timezone. The timestamps should refer to the same timestamp/seconds-from-common-epoch, but "local time" may be different as we've adjusted the timezone accordingly.Metadata sometimes includes a timezone offset, and sometimes it doesn't, and it's all pretty inconsistent, but worse, prior versions would sometimes inherit the current system timezone for an arbitrary subset of tags. This version should remove the system timezone "leaking" into your metadata values.
As an example, if you took a photo with GPS information from Rome (CET, UTC+1), and your computer is in California with
TZ=America/Los_Angeles
, prior versions could returnCreateDate: 2022-02-02 02:02:22-07:00
. This version will translate that time intoCreateDate: 2022-02-02 11:02:22+01:00
.Note that this fix results in
ExifTool.read()
rendering differentExifDateTime
values from prior versions, so I bumped the major version to highlight this change. -
π
Tags
is automatically generated bymktags
, which now has a set of "required" tags with type and group metadata to ensure a core set of tags don't disappear or change types.As a reminder, the
Tags
interface is only a subset of fields returned, due to TypeScript limitations.ExifTool.read()
still returns all values that ExifTool provides. -
π Fixed a bunch of broken API links in the README due to
typedoc
changing URLs. Harumph. -
π Prior versions of
ExifDateTime.parseISO
would accept just time or date strings. -
π/π¦
TimeStamp
tags may now be properly parsed asExifDateTime
. -
π¦ Added performance section to the README.
-
π¦ Timezone offset formatting changed slightly: the hour offset is no longer zero-padded, which better matches the Luxon implementation we use internally.
-
π¦
ExifDateTime
caches the result oftoDateTime
now, which may save a couple extra objects fed to the GC. -
π¦ Updated dependencies, including batch-cluster v10.3.2), which fixed several race conditions and added several process performance improvements including support for zero-wait multi-process launches.
-
π¦ Updated dependencies (batch-cluster v10.3.0), including more pessimistic defaults for
streamFlushMillis
and newnoTaskData
event. -
π¦ Exported type signatures,
AdditionalWriteTags
,ExpandedDateTags
,Maybe
,Omit
, andStruct
to improvetypedoc
-generated documentation. Rebuilt docs.
-
π¦ We now verify external
exiftool
s are healthy with a-ver
ping every 30 seconds. -
π¦ Updated dependencies (batch-cluster v10.2.0) that includes this performance improvement/bugfix
-
π± ExifTool upgraded to v12.40.
-
π¦ Updated dependencies (batch-cluster v10.0.0)
-
π¦ Rebuild
Tags.ts
and docs
-
π¦ Updated dependencies (batch-cluster v8.1.0)
-
π¦ Rebuild docs
- π¦ Rebuild tags and docs with updated test images. Note that some
GPS
tags types changed tostring
: see v15.8.0.
- π¦ Exposed
UnsetZoneOffsetMinutes
fromTimezones
- π¦ Exposed
UnsetZone
andUnsetZoneName
fromTimezones
-
π
GPSDateTime
in prior versions could be incorrectly parsed, resulting in an incorrectly inferred current-date and encoded-time. -
π GPS latitude and longitude parsing could result in the incorrect hemisphere, depending on the version of ExifTool.
-
π¦ The prior default of making all
GPS*
tags numeric has been reduced to onlyGPSLatitude
andGPSLongitude
, which means tags likeGPSImgDirectionRef
will now be something like "Magnetic North" instead of the more cryptic "M", andGPSAltitudeRef
will now be "Below Sea Level" instead of "1".
-
π± ExifTool upgraded to v12.38.
-
β¨ Add specific support for deleting values associated to existing tags
-
π No-op
.write()
calls to sidecars are now gracefully no-op'ed. -
π¦ Added tests with and without retries (to validate stdout/stderr bugfixes in v8.0 of
batch-cluster
) -
π¦ Replace
orElse
calls with??
-
π¦ Updated dependencies
-
β¨ Added serialization support
-
π± ExifTool upgraded to v12.34.
-
π± ExifTool upgraded to v12.33.
-
π¦ Updated dependencies
-
π¦ Now ignoring
yarn.lock
-
π± ExifTool upgraded to v12.31.
-
π¦ Updated dependencies (including new TypeScript, which required import adjustments.
-
β¨
ExifTool.read
andExifTool.write
now accept generics. -
π± ExifTool upgraded to v12.30.
-
π¦ Updated dependencies (including new Luxon and TypeScript)
-
π¦ Rebuilt docs
- π¦ Updated dependencies (including batch-cluster v7.1.0, which fixes a 2s startup delay
- π¦ Rebuild
Tags.ts
from more recent exemplars and tag type overrides (v15.0.0 changed toKeywords: string
, this version reverts that change)
-
π TypeScript now renders modern (ES2018) JavaScript, which requires a supported version of Node.js.
-
β¨ New
ExifTool.extractBinaryTagToBuffer()
: extract binary tags directly into aBuffer
(watch out for memory bloat from very large binary tag payloads!) -
β¨ Expose
ExifTool.childEndCounts
(counts of why child processes were recycled: useful for debugging) -
π¦ Updated dependencies (including batch-cluster v7.0.0)
- π¦ Updated batch-cluster (support for listing current tasks)
- π¦ Updated batch-cluster (support for nullable pids)
-
π± ExifTool upgraded to v12.28.
-
π¦ Updated dependencies
-
π± ExifTool upgraded to v12.26.
-
π¦ Updated dependencies
-
β¨ Added
ExifDate.rawValue
-
π¦ Updated dependencies
-
π₯/π± ExifTool upgraded to v12.25.
All users should upgrade to this version as soon as possible, as this should address CVE-2021-22204.
-
π¦ Updated dependencies
- π± ExifTool upgraded to v12.23
- π¦ Republish of 14.1.0 (
np
failed to publish 14.1.0 properly)
-
π± ExifTool upgraded to v12.21
-
π¦ Stopped excluding sourcemaps
-
π¦ Updated dependencies
-
π
ExifDateTime.zone
will now return the actual IANA zone name (likeAmerica/Los_Angeles
) rather than the time offset. This addresses issues with timezones likeEurope/Kiev
where, from 1900-1924, had an offset ofUTC +2:02:04
. -
β¨ Added
ExifDateTime.isValid
-
π± ExifTool upgraded to v12.19
-
π¦ Rebuilt Tags.ts and docs
-
π¦ Updated dependencies
-
π± ExifTool upgraded to v12.18
-
π¦ Updated dependencies
-
π More complex characters, like emoji that use compound codepoints, like π¦, π¦, or π΅ββοΈ, are now supported. See #87 for more details. Thanks for the report, Gabe Rodriguez!
-
π± ExifTool upgraded to v12.14
-
π¦ he is now a dependency, which was required by the emoji bugfix.
-
π¦ Updated dependencies
-
π The
Tags.ts
types have changed. Some newly-found types were added, many rarely-occurring types have been removed, andTag
sub-interfaces have changed. Tag retention heuristics had to be updated, as TypeScript would crash witherror TS2590: Expression produces a union type that is too complex to represent
.mktags
now has a "safe" set of tags that will be retained, and a set of tags that are expressly excluded.These changes won't prevent all type changes from happening in the future, but will prevent these more-common tags from being removed completely.
As several tags are found in several different groups,
mktags
now tries to place tags first inFileTags
andEXIFTags
groups before more proprietary APP groups, which should help future interface stability. (This explains whyMIMEType
moved toFileTags
, for example). -
π± ExifTool upgraded to v12.12.
Note that this version renders file sizes a bit differently: "756 kB" will now be rendered as "756 KiB".
- π¦ Removed dev dependency on
npm-check-updates
, as it no longer supports Node v10 (wth, ncu)
- π± ExifTool upgraded to v12.10
- π¦ Rebuilt Tags.ts and docs
- π¦ Updated dependencies
- π± ExifTool upgraded to v12.06
- π¦ Added quoted-file test
- π± ExifTool upgraded to v12.05
- π¦ Updated dependencies
- π
ExifDateTime.toISOString()
now returnsstring | undefined
(as it proxies for Luxon'sDateTime.toISO()
, which now may returnnull
.) - π± ExifTool upgraded to v12.04
- π¦ Rebuilt Tags.ts and docs
- π¦ Updated dependencies
- π
ExifDateTime
andExifDate
no longer accept just a year or year and month. - π¦ Updated dependencies
- π± ExifTool upgraded to v12.01
- β¨ ExifTool now takes a
Logger
thunk in the constructor options. - π¦ Updated dependencies
- π± ExifTool upgraded to v11.98
- π¦ BinaryExtractionTasks don't bother retrying when binary payloads are missing (which turns out to be a common issue)
- π¦ ExifToolTask is now exported
- π¦ Updated dependencies
- π± ExifTool upgraded to v11.95
- π¦ Updated dependencies
- π¦ Updated dependencies, including
batch-cluster
. The newmaxIdleMsPerProcess
option shuts down ExifTool processes automatically if they are idle for longer thanmaxIdleMsPerProcess
milliseconds. New processes are forked when needed.
- π Breaking change: A number of tags were removed from
Tags
because we were getting dangerously close to TypeScript'serror TS2590: Expression produces a union type that is too complex to represent.
- π± ExifTool upgraded to v11.93
- π ExifTool doesn't (currently) respect
-ignoreMinorErrors
when extracting binary blobs.BinaryExtractionTask
now assumes stderr messages matching/^warning: /
are not actually errors. - π± ExifTool upgraded to v11.92
- π¦ Updated dependencies
- π¦ Prettier 2.0.0 pulled in and codebase reformatted with new defaults, causing huge (no-op) diff.
- π Breaking change: For the past many major versions, when date and time
fields are invalid, this library returns the raw (invalid) string provided by
ExifTool, rather than an instance of
ExifDateTime
,ExifDate
, orExifTime
. TheTag
types now reflect this, but you'll probably need to update your code. See #73 for more context. - π± ExifTool upgraded to v11.91
- π¦ Updated dependencies
- π/β¨ Date, DateTime, and Time tags can now ISO formatted. See #71. Thanks for the report, Roland Ayala!
- π± ExifTool upgraded to v11.86
- π¦ Replace tslint with eslint. Fixed new linting errors.
- π¦ Updated dependencies
- π± ExifTool upgraded to v11.80
- π± ExifTool upgraded to v11.78
- π¦ Updated ExifTool's homepage from https://www.sno.phy.queensu.ca/~phil/exiftool/ to https://exiftool.org.
- π¦ Updated dependencies. New
batch-cluster
doesn't propagate errors from ended processes anymore, which should address issue #46.
- π¦ Updated dependencies. New batch-cluster shouldn't throw errors within async blocks anymore.
- β¨ Rebuilt
Tags
from 8008 example images and videos. New tags were found, but some of the more obscure tags have been dropped. - π± ExifTool upgraded to v11.76
- π¦ Updated dependencies
- π± ExifTool upgraded to v11.75
- π¦ Updated dependencies, including TypeScript 2.7
- β¨ Aded
ExifTool.deleteAllTags
.
- π¦ This version is using the new Windows packaging of ExifTool written by Oliver Betz, and is why I bumped the major version (as there may be issues with the new packaging).
- π± ExifTool upgraded to v11.73
- β¨ Added
ExifDateTime.hasZone
- β¨
ExifDateTime.toISOString
automatically omits the timezone offset if unset - π Hour timezone offsets were rendered without padding (which doesn't comply with the ISO spec).
- π± ExifTool upgraded to v11.65.
- π Fixed timezone inference rounding bug (
UTC+2
would returnUTC+02:15
)
- β¨ Exposed
Tags.tzSource
from.read
. This is an optional string holding a description of where and how the source timezone offset,Tags.tz
, was extracted. You will love it.
- β¨ Support for
.ExifTool_config
files was added. Either place your user configuration file in yourHOME
directory, or set theEXIFTOOL_HOME
environment variable to the fully-qualified path that contains your user config. Addresses #55.
- π± ExifTool upgraded to v11.59.
- β¨ Rebuilt
Tags
from 6,818 sample images. - π
GPSDateTime
is now forced to beUTC
.
- β¨ Expose
Tags.tz
from.read
. This is an optional string holding the timezone offset, likeUTC+1
, or an actual location specification, likeAmerica/Los_Angeles
. This is only included when it is specified or inferred from tag values. - β¨ Added another timezone offset extraction heuristic: if
DateTimeUTC
and another created-at time is present, the offset is inferred from the delta.
- β¨ Automagick workaround for AWS Lambda. See the new
ignoreShebang
option, which should automatically be set totrue
on non-Windows platforms that don't have/usr/bin/perl
installed. See #53.
- π± ExifTool upgraded to v11.55.
- β¨ Write support has been improved
- Creation of new sidecar files is now supported
- Non-struct list tags (like
Keywords
) is now supported - Test coverage includes images,
.XMP
files, and.MIE
files
- π¦ Set up
nyc
(test coverage report) - π¦ Updated dependencies
- π± ExifTool upgraded to v11.54.
- π¦ Updated dependencies
- π¦ Mention the need for
perl
in the installation instructions. See #51.
- π¦ Updated dependencies
- π Better support for writing tags with date and time values. See #50.
- β¨ Manually added ApplicationRecordTags
- π¦ Updated dependencies
- π¦ Added NodeJS version 12 to the CI build matrix
- π± ExifTool upgraded to v11.51.
- β¨ Rebuilt
Tags
from 6779 examples. New tags were found, includingPreviewTIFF
. - π¦ Updated dependencies
- π± ExifTool upgraded to v11.49.
- π¦ Updated dependencies
- π± ExifTool upgraded to v11.47.
- π¦ Updated dependencies
- π± ExifTool upgraded to v11.43.
- π¦ Updated dependencies
- π Throw an error if process.platform() returns nullish
- π± ExifTool upgraded to v11.37.
- π¦ Updated dependencies, fixed a couple typing nits
- π± ExifTool upgraded to v11.34.
- β¨
ExifDateTime
andExifDate
now havefromExifStrict
andfromExifLoose
parsing methods. - π¦ Updated dependencies
- π¦ Updated dependencies
- π¦ Moved project to the PhotoStructure github org
- β¨
ExifDateTime
now has arawValue
field holding the raw value provided byexiftool
.
- π Luxon 1.12.0 caused issue #46. Fixed ExifDateTime to use new API.
- π± ExifTool upgraded to v11.32.
- π Pulled in new batch-cluster
5.6.0,
which fixed an issue with graceful
end
promise resolutions.
- π± ExifTool upgraded to v11.31.
- π
RewriteAllTagsTask
doesn't fail on warnings anymore - β¨ Pulled in new batch-cluster
5.4.0,
which fixed
maxProcs
.
- β¨ Pulled in new batch-cluster 5.3.1, which adds support for child start and exit events, internal errors, and more robust result parsing.
- β¨ Rebuilt
Tags
from over 6,600 unique camera makes and models. Added new exemplars to ensureKeywords
,Title
,Subject
, and other common user-added tags were included inTags
. - β¨ Added tslint, and delinted the codebase. Sparkles because no lint === β¨.
- π¦
WriteTags
now is a proper superset of values from Tags. - π¦ Updated dependencies
- π¦ Updated dependencies
- π¦
yarn update
now usesextract-zip
. - π± ExifTool upgraded to v11.29.
- β¨ Implemented
ExifTool.readRaw
. If you decide to use this method, please take care to read the method's documentation. Addresses both #44 and #45.
- β¨ Added support for EXIF dates that include both the UTC offset as well as the
time zone abbreviation, like
2014:07:17 08:46:27-07:00 DST
. The TZA is actually an over-specification, and can be safely discarded. - π± ExifTool upgraded to v11.27.
- π¦ Updated dependencies
- π¦ Mocha 6.0.0 broke
mocha.opts
, switched to.mocharc.yaml
Note that this release supports structures. The value associated to struct
tags will be different from prior versions (in that they will actually be a
structure!). Because of that, I bumped the major version number (but I suspect
most users won't be affected, unless you've been waiting for this feature!)
- π support for structs. Thanks, Joshua Harris!
- π± ExifTool upgraded to v11.26.
- π¦
update
now requireshttps
for new ExifTool instance checksums. - π¦ Updated dependencies
- π Removed
yyyy
padding references that would break under Japanese year eras. Also removed 0 and 1 year validity heuristics.
- π± ExifTool upgraded to v11.24.
- π Fix Lat/Lon parsing bug. Thanks, David Randler!
- π± ExifTool upgraded to v11.21.
- π
WriteTask
now supports newlines. Fixes #37.
- π¦ Rebuilt tags using new numeric default for GPS and new smartphone test
images. Note that some tags were incorrect, and have now changed types (like
GPSLatitude
andGPSLongitude
). New ExifTool versions gave us a newFlashPixTags
group of tags, as well. - π¦ Rebuilt docs
- π¦ Update dependencies to deal with event-stream π©π©οΈ
- π± ExifTool upgraded to v11.20.
- π
GPS*
was added to the default print conversion exceptions. GPS Latitude and Longitude parsing was DRY'ed up, and now ensures correct sign based on Ref. With prior heuristics, if the GPS values were re-encoded without updating ref, the sign would be incorrect. - π Timezone offset from GPS will be ignored if the date is > 14 hours different
- π¦ added more timezone extraction tests
- π¦ Moved the date and time parsing into the
ExifDateTime
,ExifDate
, andExifTime
classes.
- π¦ Added more test images to corpus, so there are more tags now.
- π¦ Found error in
Directory
tag example, rebuilt tags
-
β¨ More robust time zone extraction: this required adding
luxon
andtz-lookup
as dependencies. See https://photostructure.github.io/exiftool-vendored.js/#dates for more information. -
π Tag types are now unions of seen types. Previous typings only included the most prevalent type, which, unfortunately, meant values might return unexpected types at runtime. In an extreme case,
DateTimeOriginal
is now correctly reported as beingExifDateTime | ExifTime | number | string
, as we return the value from ExifTool if the value is not a valid datetime, date, or time. -
β¨ ExifTool's "print conversion" can be disabled for arbitrary tags, and the defaults include
Orientation
and*Duration*
(note that globs are supported!).By default, ExifTool-Vendored versions prior to
7.0.0
used ExifTool's print conversion code for most numeric values, rather than the actual numeric value. While ExifTool's output is reasonable for humans, writing code that consumed those values turned out to be hacky and brittle. -
π Depending on OS, errors might not be correctly reported. This issue was from
batch-cluster
, whose version 5.0.0 fixed this problem, and was pulled into this release. -
π± ExifTool upgraded to v11.15.
- π± ExifTool upgraded to v11.13.
- β¨ Rebuilt
Tags
based on new phone and camera models
- π¦ 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
taskData
events.
- β¨/π Joshua Harris added support for writing arrays
- π± ExifTool upgraded to v11.10.
- π¦ 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
minorErrorsRegExp
constructor parameter, or if you need more flexibility, by providing arejectTaskOnStderr
implementation 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
Partial<>
composites, somktags
now renders each Tag as optional. TheTag
interface 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.enqueueTask
takes 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
Tags
based on new phone and camera models - π¦ Files are not
stat
ed before passing them on to ExifTool, as it seems to be faster on all platforms without this check. If you were error-matching onENOENT
, 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
running
function has changed to return aPromise<number[]>
. - π± ExifTool upgraded to v11.09.
- π± ExifTool upgraded to v11.08.
- β¨ Some photo sharing sites will set the
CreateDate
orSubSecCreateDate
to invalid values like0001: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-fast
option. This read mode omits metadata found after the image payload. This makes reads much faster, but means that a few tags, likeOriginalImageHeight
, 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
-fast
a user preference. To maintain existing behavior, I've made the optional second argument ofExifTool.read
default to["-fast"]
. If you want to use "slow mode", just give an empty array to the second argument. If you want-fast2
mode, provide["-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
- β¨ new
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
Error
s now, andExifTool.on
observers 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
.pl
dependency 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
ENOENT
rejections fromExifTool.read
andExifTool.write
now. - π¦ Expose batch-cluster lifecycle events and logger
- π± ExifTool upgraded to v10.92
- β¨ Support for Electron. Added
exiftoolPath
to theExifTool
constructor. 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.79
- π¦ Update deps, including TypeScript 2.7.2
- π¦ Removed π±
- π± ExifTool upgraded to v10.78
- π¦ Update deps, including TypeScript 2.7.1
- π± ExifTool upgraded to v10.76
- π¦ Update deps
- π¦ Update deps
- π Use
spawn
instead ofexecFile
, as the latter has buggymaxBuffer
exit behavior and could leak exiftool processes on windows - π The
.exiftool
singleton now properly uses aDefaultMaxProcs
const.
- π± ExifTool upgraded to v10.70
- π¦ Replace tslint and tsfmt with prettier
- π¦ Add test coverage report
(due to buggy interactions between yarn
and 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
- β¨ Support for non-latin filenames and tag values Thanks, Demiurga!
- π± ExifTool upgraded to v10.67
- π¦ More conservative default for
maxProcs
:Math.max(1, system cpus / 4)
.
- π¦ Expose
ExifTool.ended
- β¨ Corrected the type interface to
ExifTool.write()
to be only string or numeric values with keys fromTags
so 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-cluster
with more aggressive child process management (usestaskkill
on win32 platforms andkill -9
on unixish platforms) - β¨ ExifTool constructor defaults were relaxed to handle slow NAS
- β¨ Upgraded to Mocha 4.0. Added calls to
exiftool.end()
in testafter
blocks and the README so--exit
isn't necessary. - π¦ Upgraded all dependencies
- π± 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
- π¦ Added
QuickTimeTags
from several example movies (previous versions ofTags
didn't have movie tag exemplar values) - π± ExifTool upgraded to v10.57
- π All
Tags
fields 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) - π¦ Rebuilt
Tags
with 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-modules
don't play nicely. Anton Mokrushin submitted several PRs to address this. Thanks!
- π Fixed
package.json
references totypes
andmain
- π¦ Completed jsdocs for ExifTool constructor
- π¦ Pulled in batch-cluster v1.1.0 that adds both
on("beforeExit")
andon("exit")
handlers
- β¨ 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
.npmignore
instead of package.json'sfiles
directive 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
ExifDateTime
,ExifDate
, andExifTime
.
- β¨ 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.
- β¨ Added
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. - β¨ Pump the
onIdle
method everyonIdleIntervalMillis
(defaults to every 10 seconds) to ensure all requested tasks are serviced. - β¨ If
ECONN
orECONNRESET
is 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. - β¨ Rebuilt
Tags
definitions using more (6,412!) sample image files (vianpm run mktags ~/sample-images
), including many RAW image types (like.ORF
,.CR2
, and.NEF
).
- β¨ Added
maxReuses
before exiftool processes are recycled - π± ExifTool upgraded to v10.50
- π Fixed
gps.toDate is not a function
- π± ExifTool upgraded to v10.47
- β¨ Added call to
.kill()
on.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.ts
error message didn't handle null statuscodes properly - π
update/mktags.ts
had 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 onstderr
of the child process).
- π± ExifTool upgraded to v10.41
- β¨
Orientation
is rendered as a string by ExifTool, which was surprising (to me, at least). By exposing optional args inExifTool.read
, the caller can choose how ExifTool renders tag values.
- π
LANG
andLC_
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.
- β¨
extractBinaryTag
exposed because there are a lot of binary tags (and they aren't all embedded images) - π
JpgFromRaw
was missing inTag
(no raw images were in the example corpus!)
- β¨
extractJpgFromRaw
implemented to pull out EXIF-embedded images from RAW formats
- π± ExifTool upgraded to v10.40
- β¨
extractThumbnail
andextractPreview
implemented to pull out EXIF-embedded images - π¦ Rebuilt package.json.files section
- π Switched from home-grown
logger
to debug
- π¦ 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 thanplatform-dependent-modules
.
- π Several imports (like
process
) name-collided on the globals imported by Electron
- π± ExifTool upgraded to v10.37
- π± ExifTool upgraded to v10.36
- β¨
Tag.Error
exposed 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.
- β¨ Added
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
maxProcs
ctor param - β¨ 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
ExifTimeZoneOffset
to handle theTimeZone
composite tag - β¨ Added support for millisecond timestamps
π±β¨ Initial Release. Packages ExifTool v10.31.