exiftool-vendored 21.5.1 → 22.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/RELEASE.md +13 -7
- package/dist/Array.d.ts +13 -2
- package/dist/Array.js +58 -7
- package/dist/Array.js.map +1 -1
- package/dist/BinaryField.js.map +1 -1
- package/dist/BinaryToBufferTask.js.map +1 -1
- package/dist/DateTime.d.ts +3 -0
- package/dist/DateTime.js +5 -1
- package/dist/DateTime.js.map +1 -1
- package/dist/DefaultExifToolOptions.js +6 -1
- package/dist/DefaultExifToolOptions.js.map +1 -1
- package/dist/DefaultExiftoolArgs.js +1 -0
- package/dist/DefaultExiftoolArgs.js.map +1 -1
- package/dist/ExifDate.d.ts +1 -0
- package/dist/ExifDate.js +6 -0
- package/dist/ExifDate.js.map +1 -1
- package/dist/ExifDateTime.d.ts +3 -0
- package/dist/ExifDateTime.js +17 -0
- package/dist/ExifDateTime.js.map +1 -1
- package/dist/ExifTool.d.ts +18 -14
- package/dist/ExifTool.js +47 -11
- package/dist/ExifTool.js.map +1 -1
- package/dist/ExifToolOptions.d.ts +38 -8
- package/dist/ExifToolOptions.js +8 -0
- package/dist/ExifToolOptions.js.map +1 -1
- package/dist/ImageDataHashTag.d.ts +11 -0
- package/dist/ImageDataHashTag.js +3 -0
- package/dist/ImageDataHashTag.js.map +1 -0
- package/dist/Lazy.js +6 -2
- package/dist/Lazy.js.map +1 -1
- package/dist/Object.js +1 -1
- package/dist/Object.js.map +1 -1
- package/dist/ReadTask.d.ts +6 -5
- package/dist/ReadTask.js +90 -64
- package/dist/ReadTask.js.map +1 -1
- package/dist/String.js +3 -3
- package/dist/String.js.map +1 -1
- package/dist/Tags.d.ts +57 -56
- package/dist/Times.d.ts +1 -0
- package/dist/Times.js +10 -0
- package/dist/Times.js.map +1 -0
- package/dist/Timezones.d.ts +6 -14
- package/dist/Timezones.js +71 -25
- package/dist/Timezones.js.map +1 -1
- package/dist/VersionTask.js +1 -1
- package/dist/VersionTask.js.map +1 -1
- package/dist/Which.d.ts +2 -0
- package/dist/Which.js +23 -0
- package/dist/Which.js.map +1 -0
- package/package.json +23 -27
package/dist/ExifTool.js
CHANGED
|
@@ -22,11 +22,17 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
22
|
__setModuleDefault(result, mod);
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
26
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
27
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
28
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
29
|
+
};
|
|
25
30
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
31
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
32
|
};
|
|
33
|
+
var _ExifTool_checkForPerl;
|
|
28
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.exiftool = exports.ExifTool = exports.
|
|
35
|
+
exports.exiftool = exports.ExifTool = exports.DefaultWriteTaskOptions = exports.offsetMinutesToZoneName = exports.defaultVideosToUTC = exports.UnsetZoneOffsetMinutes = exports.UnsetZoneName = exports.UnsetZone = exports.DefaultReadTaskOptions = exports.parseJSON = exports.isIgnorableWarning = exports.ExifToolTask = exports.ExifTime = exports.ExifDateTime = exports.ExifDate = exports.DefaultMaxProcs = exports.DefaultExiftoolArgs = exports.DefaultExifToolOptions = exports.BinaryField = void 0;
|
|
30
36
|
const bc = __importStar(require("batch-cluster"));
|
|
31
37
|
const _cp = __importStar(require("child_process"));
|
|
32
38
|
const _fs = __importStar(require("fs"));
|
|
@@ -36,6 +42,7 @@ const BinaryExtractionTask_1 = require("./BinaryExtractionTask");
|
|
|
36
42
|
const BinaryToBufferTask_1 = require("./BinaryToBufferTask");
|
|
37
43
|
const DefaultExifToolOptions_1 = require("./DefaultExifToolOptions");
|
|
38
44
|
const DeleteAllTagsArgs_1 = require("./DeleteAllTagsArgs");
|
|
45
|
+
const ExifToolOptions_1 = require("./ExifToolOptions");
|
|
39
46
|
const IsWin32_1 = require("./IsWin32");
|
|
40
47
|
const Lazy_1 = require("./Lazy");
|
|
41
48
|
const Pick_1 = require("./Pick");
|
|
@@ -44,9 +51,16 @@ const ReadTask_1 = require("./ReadTask");
|
|
|
44
51
|
const RewriteAllTagsTask_1 = require("./RewriteAllTagsTask");
|
|
45
52
|
const String_1 = require("./String");
|
|
46
53
|
const VersionTask_1 = require("./VersionTask");
|
|
54
|
+
const Which_1 = require("./Which");
|
|
47
55
|
const WriteTask_1 = require("./WriteTask");
|
|
48
56
|
var BinaryField_1 = require("./BinaryField");
|
|
49
57
|
Object.defineProperty(exports, "BinaryField", { enumerable: true, get: function () { return BinaryField_1.BinaryField; } });
|
|
58
|
+
var DefaultExifToolOptions_2 = require("./DefaultExifToolOptions");
|
|
59
|
+
Object.defineProperty(exports, "DefaultExifToolOptions", { enumerable: true, get: function () { return DefaultExifToolOptions_2.DefaultExifToolOptions; } });
|
|
60
|
+
var DefaultExiftoolArgs_1 = require("./DefaultExiftoolArgs");
|
|
61
|
+
Object.defineProperty(exports, "DefaultExiftoolArgs", { enumerable: true, get: function () { return DefaultExiftoolArgs_1.DefaultExiftoolArgs; } });
|
|
62
|
+
var DefaultMaxProcs_1 = require("./DefaultMaxProcs");
|
|
63
|
+
Object.defineProperty(exports, "DefaultMaxProcs", { enumerable: true, get: function () { return DefaultMaxProcs_1.DefaultMaxProcs; } });
|
|
50
64
|
var ExifDate_1 = require("./ExifDate");
|
|
51
65
|
Object.defineProperty(exports, "ExifDate", { enumerable: true, get: function () { return ExifDate_1.ExifDate; } });
|
|
52
66
|
var ExifDateTime_1 = require("./ExifDateTime");
|
|
@@ -59,12 +73,16 @@ var IgnorableError_1 = require("./IgnorableError");
|
|
|
59
73
|
Object.defineProperty(exports, "isIgnorableWarning", { enumerable: true, get: function () { return IgnorableError_1.isIgnorableWarning; } });
|
|
60
74
|
var JSON_1 = require("./JSON");
|
|
61
75
|
Object.defineProperty(exports, "parseJSON", { enumerable: true, get: function () { return JSON_1.parseJSON; } });
|
|
76
|
+
var ReadTask_2 = require("./ReadTask");
|
|
77
|
+
Object.defineProperty(exports, "DefaultReadTaskOptions", { enumerable: true, get: function () { return ReadTask_2.DefaultReadTaskOptions; } });
|
|
62
78
|
var Timezones_1 = require("./Timezones");
|
|
63
|
-
Object.defineProperty(exports, "defaultVideosToUTC", { enumerable: true, get: function () { return Timezones_1.defaultVideosToUTC; } });
|
|
64
|
-
Object.defineProperty(exports, "offsetMinutesToZoneName", { enumerable: true, get: function () { return Timezones_1.offsetMinutesToZoneName; } });
|
|
65
79
|
Object.defineProperty(exports, "UnsetZone", { enumerable: true, get: function () { return Timezones_1.UnsetZone; } });
|
|
66
80
|
Object.defineProperty(exports, "UnsetZoneName", { enumerable: true, get: function () { return Timezones_1.UnsetZoneName; } });
|
|
67
81
|
Object.defineProperty(exports, "UnsetZoneOffsetMinutes", { enumerable: true, get: function () { return Timezones_1.UnsetZoneOffsetMinutes; } });
|
|
82
|
+
Object.defineProperty(exports, "defaultVideosToUTC", { enumerable: true, get: function () { return Timezones_1.defaultVideosToUTC; } });
|
|
83
|
+
Object.defineProperty(exports, "offsetMinutesToZoneName", { enumerable: true, get: function () { return Timezones_1.offsetMinutesToZoneName; } });
|
|
84
|
+
var WriteTask_2 = require("./WriteTask");
|
|
85
|
+
Object.defineProperty(exports, "DefaultWriteTaskOptions", { enumerable: true, get: function () { return WriteTask_2.DefaultWriteTaskOptions; } });
|
|
68
86
|
const _ignoreShebang = (0, Lazy_1.lazy)(() => !(0, IsWin32_1.isWin32)() && !_fs.existsSync("/usr/bin/perl"));
|
|
69
87
|
/**
|
|
70
88
|
* Manages delegating calls to a vendored running instance of ExifTool.
|
|
@@ -80,13 +98,28 @@ class ExifTool {
|
|
|
80
98
|
*/
|
|
81
99
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
82
100
|
this.on = (event, listener) => this.batchCluster.on(event, listener);
|
|
101
|
+
_ExifTool_checkForPerl.set(this, (0, Lazy_1.lazy)(async () => {
|
|
102
|
+
if (this.options.checkPerl) {
|
|
103
|
+
const perl = await (0, Which_1.which)("perl");
|
|
104
|
+
if (perl == null) {
|
|
105
|
+
throw new Error("ExifTool requires perl. Please install perl and try again.");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
})
|
|
109
|
+
/**
|
|
110
|
+
* Most users will not need to use `enqueueTask` directly. This method
|
|
111
|
+
* supports submitting custom `BatchCluster` tasks.
|
|
112
|
+
*
|
|
113
|
+
* @see BinaryExtractionTask for an example task implementation
|
|
114
|
+
*/
|
|
115
|
+
);
|
|
83
116
|
if (options != null && typeof options !== "object") {
|
|
84
117
|
throw new Error("Please update caller to the new ExifTool constructor API");
|
|
85
118
|
}
|
|
86
|
-
const o = {
|
|
119
|
+
const o = (0, ExifToolOptions_1.handleDeprecatedOptions)({
|
|
87
120
|
...DefaultExifToolOptions_1.DefaultExifToolOptions,
|
|
88
121
|
...options,
|
|
89
|
-
};
|
|
122
|
+
});
|
|
90
123
|
const ignoreShebang = (_a = o.ignoreShebang) !== null && _a !== void 0 ? _a : _ignoreShebang();
|
|
91
124
|
const env = { ...o.exiftoolEnv, LANG: "C" };
|
|
92
125
|
if ((0, String_1.notBlank)(process_1.default.env.EXIFTOOL_HOME) && (0, String_1.blank)(env.EXIFTOOL_HOME)) {
|
|
@@ -136,7 +169,7 @@ class ExifTool {
|
|
|
136
169
|
read(file, optionalArgs = ["-fast"], options) {
|
|
137
170
|
return this.enqueueTask(() => ReadTask_1.ReadTask.for(file, {
|
|
138
171
|
optionalArgs,
|
|
139
|
-
...(0, Pick_1.pick)(this.options, "numericTags", "useMWG", "
|
|
172
|
+
...(0, Pick_1.pick)(this.options, "numericTags", "useMWG", "imageHashType", "defaultVideosToUTC", "geoTz"),
|
|
140
173
|
...options,
|
|
141
174
|
})); // < no way to know at compile time if we're going to get back a T!
|
|
142
175
|
}
|
|
@@ -174,12 +207,13 @@ class ExifTool {
|
|
|
174
207
|
*
|
|
175
208
|
* @param {string} file an existing file to write `tags` to.
|
|
176
209
|
* @param {Tags} tags the tags to write to `file`.
|
|
177
|
-
* @param {string[]} [args] any additional ExifTool arguments, like
|
|
178
|
-
*
|
|
179
|
-
* @returns {Promise<void>} Either the promise will be resolved if the
|
|
180
|
-
*
|
|
181
|
-
*
|
|
210
|
+
* @param {string[]} [args] any additional ExifTool arguments, like `-n`, or
|
|
211
|
+
* `-overwrite_original`.
|
|
212
|
+
* @returns {Promise<void>} Either the promise will be resolved if the tags
|
|
213
|
+
* are written to successfully, or the promise will be rejected if there are
|
|
214
|
+
* errors or warnings.
|
|
182
215
|
* @memberof ExifTool
|
|
216
|
+
* @see https://exiftool.org/exiftool_pod.html#overwrite_original
|
|
183
217
|
*/
|
|
184
218
|
write(file, tags, args, options) {
|
|
185
219
|
const retriable = false;
|
|
@@ -317,6 +351,7 @@ class ExifTool {
|
|
|
317
351
|
*/
|
|
318
352
|
enqueueTask(task, retriable = true) {
|
|
319
353
|
const f = async () => {
|
|
354
|
+
await __classPrivateFieldGet(this, _ExifTool_checkForPerl, "f").call(this);
|
|
320
355
|
const t = await task();
|
|
321
356
|
// if we have to add more options for every task, rethink this approach:
|
|
322
357
|
t.isIgnorableError = this.options.isIgnorableError;
|
|
@@ -366,6 +401,7 @@ class ExifTool {
|
|
|
366
401
|
}
|
|
367
402
|
}
|
|
368
403
|
exports.ExifTool = ExifTool;
|
|
404
|
+
_ExifTool_checkForPerl = new WeakMap();
|
|
369
405
|
/**
|
|
370
406
|
* Use this singleton rather than instantiating new ExifTool instances in order
|
|
371
407
|
* to leverage a single running ExifTool process. As of v3.0, its `maxProcs` is
|
package/dist/ExifTool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExifTool.js","sourceRoot":"","sources":["../src/ExifTool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ExifTool.js","sourceRoot":"","sources":["../src/ExifTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -85,23 +85,46 @@ export interface ExifToolOptions extends bc.BatchClusterOptions, bc.BatchProcess
|
|
|
85
85
|
*/
|
|
86
86
|
numericTags: string[];
|
|
87
87
|
/**
|
|
88
|
-
* If
|
|
89
|
-
* value with
|
|
88
|
+
* If defined, ExifTool will attempt to calculate an "ImageDataHash" tag
|
|
89
|
+
* value with a checksum of image data.
|
|
90
90
|
*
|
|
91
|
-
* Note that as of 2022-04-12, ExifTool supports JPEG, PNG,
|
|
92
|
-
*
|
|
93
|
-
*
|
|
91
|
+
* Note that as of 2022-04-12, ExifTool supports JPEG, TIFF, PNG, CRW, CR3,
|
|
92
|
+
* MRW, RAF, X3F, IIQ, JP2, JXL, HEIC and AVIF images, MOV/MP4 videos, and
|
|
93
|
+
* some RIFF-based files such as AVI, WAV and WEBP.
|
|
94
94
|
*
|
|
95
|
-
* This defaults to
|
|
95
|
+
* This defaults to undefined, as it adds ~20ms of overhead to every read
|
|
96
96
|
*/
|
|
97
|
-
|
|
97
|
+
imageHashType: false | "MD5" | "SHA256" | "SHA512";
|
|
98
|
+
/**
|
|
99
|
+
* @deprecated Use `imageHashType` instead.
|
|
100
|
+
*/
|
|
101
|
+
includeImageDataMD5: boolean | undefined;
|
|
98
102
|
/**
|
|
99
103
|
* Video file dates are assumed to be in UTC, rather than using timezone
|
|
100
104
|
* inference used in images. To disable this default, set this to false.
|
|
101
105
|
*
|
|
102
|
-
* @see
|
|
106
|
+
* @see https://github.com/photostructure/exiftool-vendored.js/issues/113
|
|
103
107
|
*/
|
|
104
108
|
defaultVideosToUTC: boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Should we try to backfill timezones for date-times that don't have them?
|
|
111
|
+
* If set to `true`, and `defaultVideosToUTC` is also `true`, we'll try
|
|
112
|
+
* backfilling timezones for date-times that are UTC, as well.
|
|
113
|
+
*
|
|
114
|
+
* This defaults to false to retain prior versions' behavior.
|
|
115
|
+
*/
|
|
116
|
+
backfillTimezones: boolean;
|
|
117
|
+
/**
|
|
118
|
+
* We always look at TimeZone, OffsetTime, TimeZoneOffset, and GPS metadata
|
|
119
|
+
* to infer the timezone.
|
|
120
|
+
*
|
|
121
|
+
* If these strategies fail, can we infer a timezone from any non-UTC
|
|
122
|
+
* datestamp whose tag starts with "Creat" and includes an offset? (This
|
|
123
|
+
* means CreateDateSubSec, CreateDate, and CreationDate will be considered).
|
|
124
|
+
*
|
|
125
|
+
* This defaults to false to retain prior versions' behavior.
|
|
126
|
+
*/
|
|
127
|
+
inferTimezoneFromDatestamps: boolean;
|
|
105
128
|
/**
|
|
106
129
|
* `ExifTool` has a shebang line that assumes a valid `perl` is installed at
|
|
107
130
|
* `/usr/bin/perl`.
|
|
@@ -114,6 +137,12 @@ export interface ExifToolOptions extends bc.BatchClusterOptions, bc.BatchProcess
|
|
|
114
137
|
* situations. Note also that `perl` will be spawned in a sub-shell.
|
|
115
138
|
*/
|
|
116
139
|
ignoreShebang: boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Should we check for a readable and executable `perl` file in $PATH? This
|
|
142
|
+
* defaults to false on Windows, and true everywhere else. Set this to false
|
|
143
|
+
* if you know perl is installed.
|
|
144
|
+
*/
|
|
145
|
+
checkPerl: boolean;
|
|
117
146
|
/**
|
|
118
147
|
* Override the default geo-to-timezone lookup service.
|
|
119
148
|
*
|
|
@@ -143,3 +172,4 @@ export interface ExifToolOptions extends bc.BatchClusterOptions, bc.BatchProcess
|
|
|
143
172
|
*/
|
|
144
173
|
isIgnorableError: IgnorableError;
|
|
145
174
|
}
|
|
175
|
+
export declare function handleDeprecatedOptions<T extends Pick<ExifToolOptions, "includeImageDataMD5" | "imageHashType">>(options: T): T;
|
package/dist/ExifToolOptions.js
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleDeprecatedOptions = void 0;
|
|
4
|
+
function handleDeprecatedOptions(options) {
|
|
5
|
+
if (options.imageHashType == null && options.includeImageDataMD5 != null) {
|
|
6
|
+
options.imageHashType = options.includeImageDataMD5 ? "MD5" : false;
|
|
7
|
+
}
|
|
8
|
+
return options;
|
|
9
|
+
}
|
|
10
|
+
exports.handleDeprecatedOptions = handleDeprecatedOptions;
|
|
3
11
|
//# sourceMappingURL=ExifToolOptions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExifToolOptions.js","sourceRoot":"","sources":["../src/ExifToolOptions.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"ExifToolOptions.js","sourceRoot":"","sources":["../src/ExifToolOptions.ts"],"names":[],"mappings":";;;AAqMA,SAAgB,uBAAuB,CAErC,OAAU;IACV,IAAI,OAAO,CAAC,aAAa,IAAI,IAAI,IAAI,OAAO,CAAC,mBAAmB,IAAI,IAAI,EAAE;QACxE,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;KACpE;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAPD,0DAOC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ImageDataHashTag {
|
|
2
|
+
/**
|
|
3
|
+
* This is calculated by ExifTool to be the SHA256 hash of the image data
|
|
4
|
+
* (ignoring metadata). This tag is only included if the default
|
|
5
|
+
* `ExifToolOptions.imageHashType` value is overridden with a valid string
|
|
6
|
+
* value.
|
|
7
|
+
*
|
|
8
|
+
* @see ExifToolOptions.imageHashType
|
|
9
|
+
*/
|
|
10
|
+
ImageDataHash?: string;
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageDataHashTag.js","sourceRoot":"","sources":["../src/ImageDataHashTag.ts"],"names":[],"mappings":""}
|
package/dist/Lazy.js
CHANGED
|
@@ -4,16 +4,20 @@ exports.lazy = void 0;
|
|
|
4
4
|
function lazy(thunk) {
|
|
5
5
|
let invoked = false;
|
|
6
6
|
let result;
|
|
7
|
+
let error;
|
|
7
8
|
return () => {
|
|
8
9
|
if (!invoked) {
|
|
9
10
|
try {
|
|
10
11
|
invoked = true;
|
|
11
12
|
result = thunk();
|
|
12
13
|
}
|
|
13
|
-
catch (
|
|
14
|
-
|
|
14
|
+
catch (e) {
|
|
15
|
+
error = e;
|
|
16
|
+
throw e;
|
|
15
17
|
}
|
|
16
18
|
}
|
|
19
|
+
if (error != null)
|
|
20
|
+
throw error;
|
|
17
21
|
return result;
|
|
18
22
|
};
|
|
19
23
|
}
|
package/dist/Lazy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Lazy.js","sourceRoot":"","sources":["../src/Lazy.ts"],"names":[],"mappings":";;;AAAA,SAAgB,IAAI,CAAI,KAAc;IACpC,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,MAAS,CAAA;IACb,OAAO,GAAG,EAAE;QACV,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI;gBACF,OAAO,GAAG,IAAI,CAAA;gBACd,MAAM,GAAG,KAAK,EAAE,CAAA;aACjB;YAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"Lazy.js","sourceRoot":"","sources":["../src/Lazy.ts"],"names":[],"mappings":";;;AAAA,SAAgB,IAAI,CAAI,KAAc;IACpC,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,MAAS,CAAA;IACb,IAAI,KAAY,CAAA;IAChB,OAAO,GAAG,EAAE;QACV,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI;gBACF,OAAO,GAAG,IAAI,CAAA;gBACd,MAAM,GAAG,KAAK,EAAE,CAAA;aACjB;YAAC,OAAO,CAAM,EAAE;gBACf,KAAK,GAAG,CAAC,CAAA;gBACT,MAAM,CAAC,CAAA;aACR;SACF;QACD,IAAI,KAAK,IAAI,IAAI;YAAE,MAAM,KAAK,CAAA;QAC9B,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;AACH,CAAC;AAjBD,oBAiBC"}
|
package/dist/Object.js
CHANGED
|
@@ -5,7 +5,7 @@ exports.omit = exports.fromEntries = exports.isFunction = exports.keys = void 0;
|
|
|
5
5
|
function keys(o) {
|
|
6
6
|
return o == null
|
|
7
7
|
? []
|
|
8
|
-
: Object.keys(o).filter((ea) => ({}.propertyIsEnumerable.call(o, ea))
|
|
8
|
+
: Object.keys(o).filter((ea) => ({}).propertyIsEnumerable.call(o, ea));
|
|
9
9
|
}
|
|
10
10
|
exports.keys = keys;
|
|
11
11
|
function isFunction(obj) {
|
package/dist/Object.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Object.js","sourceRoot":"","sources":["../src/Object.ts"],"names":[],"mappings":";;;AAEA,wDAAwD;AACxD,SAAgB,IAAI,CAA+C,CAAI;IACrE,OAAO,CAAC,IAAI,IAAI;QACd,CAAC,CAAC,EAAE;QACJ,CAAC,CAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAC5B,CAAC,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"Object.js","sourceRoot":"","sources":["../src/Object.ts"],"names":[],"mappings":";;;AAEA,wDAAwD;AACxD,SAAgB,IAAI,CAA+C,CAAI;IACrE,OAAO,CAAC,IAAI,IAAI;QACd,CAAC,CAAC,EAAE;QACJ,CAAC,CAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAC5B,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAC9B,CAAA;AACf,CAAC;AAND,oBAMC;AAED,SAAgB,UAAU,CAAC,GAAQ;IACjC,OAAO,OAAO,GAAG,KAAK,UAAU,CAAA;AAClC,CAAC;AAFD,gCAEC;AAED,SAAgB,WAAW,CACzB,GAAkC,EAClC,GAAS;IAET,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAA;IAC/C,4DAA4D;IAC5D,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE;QAC/C,IAAI,EAAE,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YACnC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAA;YACjB,qBAAqB;YACrB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,SAAS,EAAE;gBAChC,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAAE,GAAG,GAAG,EAAE,CAAA;gBACrC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;aACX;SACF;KACF;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAjBD,kCAiBC;AAID,SAAgB,IAAI,CAClB,CAAI,EACJ,GAAG,UAAe;IAElB,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,EAAS,CAAA;IAC/B,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,CAAA;IACvB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE;QAC3B,OAAO,MAAM,CAAC,EAAE,CAAC,CAAA;KAClB;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAVD,oBAUC"}
|
package/dist/ReadTask.d.ts
CHANGED
|
@@ -2,10 +2,13 @@ import { ExifToolTask } from "./ExifToolTask";
|
|
|
2
2
|
import { Tags } from "./Tags";
|
|
3
3
|
export declare function nullish(s: string | undefined): s is undefined;
|
|
4
4
|
export declare const DefaultReadTaskOptions: {
|
|
5
|
-
readonly defaultVideosToUTC: boolean;
|
|
6
5
|
readonly useMWG: boolean;
|
|
7
6
|
readonly numericTags: string[];
|
|
8
|
-
readonly
|
|
7
|
+
readonly imageHashType: false | "MD5" | "SHA256" | "SHA512";
|
|
8
|
+
readonly includeImageDataMD5: boolean | undefined;
|
|
9
|
+
readonly defaultVideosToUTC: boolean;
|
|
10
|
+
readonly backfillTimezones: boolean;
|
|
11
|
+
readonly inferTimezoneFromDatestamps: boolean;
|
|
9
12
|
readonly geoTz: typeof import("./GeoTz").geoTz;
|
|
10
13
|
readonly optionalArgs: string[];
|
|
11
14
|
};
|
|
@@ -16,10 +19,8 @@ export declare class ReadTask extends ExifToolTask<Tags> {
|
|
|
16
19
|
readonly args: string[];
|
|
17
20
|
readonly options: ReadTaskOptions;
|
|
18
21
|
private readonly degroup;
|
|
19
|
-
/** May have keys that are group-prefixed */
|
|
20
22
|
private _raw;
|
|
21
|
-
|
|
22
|
-
private _tags;
|
|
23
|
+
private _rawDegrouped;
|
|
23
24
|
private readonly tags;
|
|
24
25
|
private lat;
|
|
25
26
|
private lon;
|
package/dist/ReadTask.js
CHANGED
|
@@ -27,16 +27,18 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
27
27
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
28
28
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
29
29
|
};
|
|
30
|
-
var _ReadTask_instances, _ReadTask_tagName, _ReadTask_parseTags, _ReadTask_extractLatLon, _ReadTask_latlon, _ReadTask_geoTz, _ReadTask_extractTzOffset, _ReadTask_parseTag;
|
|
30
|
+
var _ReadTask_instances, _ReadTask_isVideo, _ReadTask_defaultToUTC, _ReadTask_tagName, _ReadTask_maybeSetZone, _ReadTask_parseTags, _ReadTask_extractLatLon, _ReadTask_latlon, _ReadTask_geoTz, _ReadTask_extractTzOffset, _ReadTask_parseTag;
|
|
31
31
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
32
|
exports.ReadTask = exports.DefaultReadTaskOptions = exports.nullish = void 0;
|
|
33
33
|
const batch_cluster_1 = require("batch-cluster");
|
|
34
34
|
const _path = __importStar(require("path"));
|
|
35
|
+
const Array_1 = require("./Array");
|
|
35
36
|
const BinaryField_1 = require("./BinaryField");
|
|
36
37
|
const DefaultExifToolOptions_1 = require("./DefaultExifToolOptions");
|
|
37
38
|
const ExifDate_1 = require("./ExifDate");
|
|
38
39
|
const ExifDateTime_1 = require("./ExifDateTime");
|
|
39
40
|
const ExifTime_1 = require("./ExifTime");
|
|
41
|
+
const ExifToolOptions_1 = require("./ExifToolOptions");
|
|
40
42
|
const ExifToolTask_1 = require("./ExifToolTask");
|
|
41
43
|
const FilenameCharsetArgs_1 = require("./FilenameCharsetArgs");
|
|
42
44
|
const FirstDateTime_1 = require("./FirstDateTime");
|
|
@@ -63,8 +65,10 @@ function nullish(s) {
|
|
|
63
65
|
exports.nullish = nullish;
|
|
64
66
|
exports.DefaultReadTaskOptions = {
|
|
65
67
|
optionalArgs: [],
|
|
66
|
-
...(0, Pick_1.pick)(DefaultExifToolOptions_1.DefaultExifToolOptions, "numericTags", "useMWG", "includeImageDataMD5", "defaultVideosToUTC", "geoTz"),
|
|
68
|
+
...(0, Pick_1.pick)(DefaultExifToolOptions_1.DefaultExifToolOptions, "numericTags", "useMWG", "includeImageDataMD5", "imageHashType", "defaultVideosToUTC", "backfillTimezones", "inferTimezoneFromDatestamps", "geoTz"),
|
|
67
69
|
};
|
|
70
|
+
const MaybeDateOrTimeRe = /when|date|time|subsec|creat|modif/i;
|
|
71
|
+
const TimeRe = /time/i;
|
|
68
72
|
class ReadTask extends ExifToolTask_1.ExifToolTask {
|
|
69
73
|
constructor(sourceFile, args, options) {
|
|
70
74
|
super(args);
|
|
@@ -72,10 +76,9 @@ class ReadTask extends ExifToolTask_1.ExifToolTask {
|
|
|
72
76
|
this.sourceFile = sourceFile;
|
|
73
77
|
this.args = args;
|
|
74
78
|
this.options = options;
|
|
75
|
-
/** May have keys that are group-prefixed */
|
|
76
79
|
this._raw = {};
|
|
77
|
-
|
|
78
|
-
this.
|
|
80
|
+
this._rawDegrouped = {};
|
|
81
|
+
this.tags = {};
|
|
79
82
|
this.invalidLatLon = false;
|
|
80
83
|
_ReadTask_extractLatLon.set(this, (0, Lazy_1.lazy)(() => {
|
|
81
84
|
var _a, _b;
|
|
@@ -98,29 +101,35 @@ class ReadTask extends ExifToolTask_1.ExifToolTask {
|
|
|
98
101
|
return;
|
|
99
102
|
}
|
|
100
103
|
}));
|
|
101
|
-
|
|
104
|
+
// See https://github.com/photostructure/exiftool-vendored.js/issues/147#issuecomment-1642580118
|
|
105
|
+
this.degroup = this.args.includes("-G");
|
|
102
106
|
this.tags = { SourceFile: sourceFile };
|
|
103
107
|
this.tags.errors = this.errors;
|
|
104
108
|
}
|
|
105
109
|
static for(filename, options) {
|
|
106
|
-
const opts =
|
|
110
|
+
const opts = (0, ExifToolOptions_1.handleDeprecatedOptions)({
|
|
111
|
+
...exports.DefaultReadTaskOptions,
|
|
112
|
+
...options,
|
|
113
|
+
});
|
|
107
114
|
const sourceFile = _path.resolve(filename);
|
|
108
115
|
const args = [
|
|
109
116
|
...FilenameCharsetArgs_1.Utf8FilenameCharsetArgs,
|
|
110
117
|
"-json",
|
|
111
118
|
"-struct",
|
|
112
|
-
...opts.optionalArgs,
|
|
119
|
+
...(0, Array_1.toA)(opts.optionalArgs),
|
|
113
120
|
];
|
|
114
121
|
if (opts.useMWG) {
|
|
115
122
|
args.push("-use", "MWG");
|
|
116
123
|
}
|
|
117
|
-
if (opts.
|
|
124
|
+
if (opts.imageHashType != null && opts.imageHashType !== false) {
|
|
118
125
|
// See https://exiftool.org/forum/index.php?topic=14706.msg79218#msg79218
|
|
119
|
-
args.push("-api", "requesttags=
|
|
126
|
+
args.push("-api", "requesttags=imagedatahash");
|
|
127
|
+
args.push("-api", "imagehashtype=" + opts.imageHashType);
|
|
120
128
|
}
|
|
121
|
-
// IMPORTANT: "-all" must be after numeric tag references
|
|
122
|
-
// in wins
|
|
129
|
+
// IMPORTANT: "-all" must be after numeric tag references, as the first
|
|
130
|
+
// reference in wins
|
|
123
131
|
args.push(...opts.numericTags.map((ea) => "-" + ea + "#"));
|
|
132
|
+
// We have to add a -all or else we'll only get the numericTags. sad.
|
|
124
133
|
// TODO: Do you need -xmp:all, -all, or -all:all? Is -* better?
|
|
125
134
|
args.push("-all", sourceFile);
|
|
126
135
|
return new ReadTask(sourceFile, args, opts);
|
|
@@ -149,35 +158,72 @@ class ReadTask extends ExifToolTask_1.ExifToolTask {
|
|
|
149
158
|
throw new Error(`Internal error: unexpected SourceFile of ${this._raw.SourceFile} for file ${this.sourceFile}`);
|
|
150
159
|
}
|
|
151
160
|
if (this.degroup) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
161
|
+
this._rawDegrouped = {};
|
|
162
|
+
for (const [key, value] of Object.entries(this._raw)) {
|
|
163
|
+
const k = __classPrivateFieldGet(this, _ReadTask_instances, "m", _ReadTask_tagName).call(this, key);
|
|
164
|
+
this._rawDegrouped[k] = value;
|
|
165
|
+
}
|
|
155
166
|
}
|
|
156
167
|
else {
|
|
157
|
-
this.
|
|
168
|
+
this._rawDegrouped = this._raw;
|
|
158
169
|
}
|
|
159
170
|
return __classPrivateFieldGet(this, _ReadTask_instances, "m", _ReadTask_parseTags).call(this);
|
|
160
171
|
}
|
|
161
172
|
}
|
|
162
173
|
exports.ReadTask = ReadTask;
|
|
163
|
-
_ReadTask_extractLatLon = new WeakMap(), _ReadTask_geoTz = new WeakMap(), _ReadTask_instances = new WeakSet(),
|
|
174
|
+
_ReadTask_extractLatLon = new WeakMap(), _ReadTask_geoTz = new WeakMap(), _ReadTask_instances = new WeakSet(), _ReadTask_isVideo = function _ReadTask_isVideo() {
|
|
175
|
+
var _a;
|
|
176
|
+
return String((_a = this._rawDegrouped) === null || _a === void 0 ? void 0 : _a.MIMEType).startsWith("video/");
|
|
177
|
+
}, _ReadTask_defaultToUTC = function _ReadTask_defaultToUTC() {
|
|
178
|
+
return __classPrivateFieldGet(this, _ReadTask_instances, "m", _ReadTask_isVideo).call(this) && this.options.defaultVideosToUTC;
|
|
179
|
+
}, _ReadTask_tagName = function _ReadTask_tagName(k) {
|
|
164
180
|
var _a;
|
|
165
181
|
return this.degroup ? (_a = k.split(":")[1]) !== null && _a !== void 0 ? _a : k : k;
|
|
182
|
+
}, _ReadTask_maybeSetZone = function _ReadTask_maybeSetZone(edt, candidates) {
|
|
183
|
+
if (edt.hasZone && edt.zone === this.tz)
|
|
184
|
+
return edt;
|
|
185
|
+
for (const src of candidates) {
|
|
186
|
+
const result = edt.maybeMatchZone(src);
|
|
187
|
+
if (result != null) {
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return;
|
|
166
192
|
}, _ReadTask_parseTags = function _ReadTask_parseTags() {
|
|
193
|
+
var _a;
|
|
167
194
|
__classPrivateFieldGet(this, _ReadTask_extractLatLon, "f").call(this);
|
|
168
195
|
__classPrivateFieldGet(this, _ReadTask_instances, "m", _ReadTask_extractTzOffset).call(this);
|
|
169
196
|
(0, Maybe_1.map)(this.tz, (ea) => (this.tags.tz = ea));
|
|
170
197
|
(0, Maybe_1.map)(this.tzSource, (ea) => (this.tags.tzSource = ea));
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
198
|
+
// avoid casting `this.tags as any` everywhere:
|
|
199
|
+
const tags = this.tags;
|
|
200
|
+
const datesWithTz = [];
|
|
201
|
+
// two passes: one to parse dates, and the next to possibly set timezones.
|
|
202
|
+
for (const [key, value] of Object.entries(this._raw)) {
|
|
203
|
+
const k = __classPrivateFieldGet(this, _ReadTask_instances, "m", _ReadTask_tagName).call(this, key);
|
|
204
|
+
const v = __classPrivateFieldGet(this, _ReadTask_instances, "m", _ReadTask_parseTag).call(this, k, value);
|
|
205
|
+
if (v instanceof ExifDateTime_1.ExifDateTime && v.hasZone && !isUtcTagName(key)) {
|
|
206
|
+
// don't incorrectly infer UTC dates if this is a UTC tag.
|
|
207
|
+
datesWithTz.push(v);
|
|
208
|
+
}
|
|
209
|
+
// Note that we set `key` (which may include a group prefix):
|
|
210
|
+
tags[key] = v;
|
|
211
|
+
}
|
|
212
|
+
if (this.options.backfillTimezones === true) {
|
|
213
|
+
// prefer non-UTC offsets (which may be incorrect):
|
|
214
|
+
const candidates = (0, Array_1.sortBy)(datesWithTz, (ea) => { var _a; return -Math.abs((_a = ea.tzoffsetMinutes) !== null && _a !== void 0 ? _a : 0); });
|
|
215
|
+
for (const [key, value] of Object.entries(tags)) {
|
|
216
|
+
if (value instanceof ExifDateTime_1.ExifDateTime && !isUtcTagName(key)) {
|
|
217
|
+
tags[key] = (_a = __classPrivateFieldGet(this, _ReadTask_instances, "m", _ReadTask_maybeSetZone).call(this, value, candidates)) !== null && _a !== void 0 ? _a : value;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
174
220
|
}
|
|
175
221
|
if (this.errors.length > 0)
|
|
176
222
|
this.tags.errors = this.errors;
|
|
177
|
-
return
|
|
223
|
+
return tags;
|
|
178
224
|
}, _ReadTask_latlon = function _ReadTask_latlon(tagName, negateRef, maxValid) {
|
|
179
|
-
const tagValue = this.
|
|
180
|
-
const ref = this.
|
|
225
|
+
const tagValue = this._rawDegrouped[tagName];
|
|
226
|
+
const ref = this._rawDegrouped[tagName + "Ref"];
|
|
181
227
|
const result = (0, Number_1.toFloat)(tagValue);
|
|
182
228
|
if (result == null) {
|
|
183
229
|
return;
|
|
@@ -204,13 +250,13 @@ _ReadTask_extractLatLon = new WeakMap(), _ReadTask_geoTz = new WeakMap(), _ReadT
|
|
|
204
250
|
// If there is an explicit TimeZone tag (which is rare), defer to that
|
|
205
251
|
// before defaulting to UTC for videos:
|
|
206
252
|
() => {
|
|
207
|
-
const tz = (0, Timezones_1.extractTzOffsetFromTags)(this.
|
|
253
|
+
const tz = (0, Timezones_1.extractTzOffsetFromTags)(this._rawDegrouped, this.options);
|
|
208
254
|
// If this tz offset matches the GPS zone, use the GPS zone name (like "America/Los_Angeles") instead of the offset.
|
|
209
255
|
const z = (0, Timezones_1.normalizeZone)(tz === null || tz === void 0 ? void 0 : tz.tz);
|
|
210
256
|
if (tz != null && z != null) {
|
|
211
257
|
const geoTz = __classPrivateFieldGet(this, _ReadTask_geoTz, "f").call(this);
|
|
212
258
|
if (geoTz != null) {
|
|
213
|
-
const edt = (0, FirstDateTime_1.firstDateTime)(this.
|
|
259
|
+
const edt = (0, FirstDateTime_1.firstDateTime)(this._rawDegrouped);
|
|
214
260
|
if (edt != null) {
|
|
215
261
|
const ts = edt.toMillis();
|
|
216
262
|
const zOffset = z.offset(ts);
|
|
@@ -224,25 +270,22 @@ _ReadTask_extractLatLon = new WeakMap(), _ReadTask_geoTz = new WeakMap(), _ReadT
|
|
|
224
270
|
}
|
|
225
271
|
}
|
|
226
272
|
}
|
|
273
|
+
// nope, no GPS, just use the minutes-offset zone format:
|
|
227
274
|
return tz;
|
|
228
275
|
},
|
|
229
276
|
// See https://github.com/photostructure/exiftool-vendored.js/issues/113
|
|
230
|
-
// Videos are frequently encoded in UTC, but don't include the
|
|
231
|
-
//
|
|
232
|
-
//
|
|
233
|
-
//
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
243
|
-
: // not applicable:
|
|
244
|
-
undefined;
|
|
245
|
-
},
|
|
277
|
+
// Videos are frequently encoded in UTC, but don't include the
|
|
278
|
+
// timezone offset in their datetime stamps.
|
|
279
|
+
// This must be BEFORE the tz_lookup/geoTz strategy, as smartphone
|
|
280
|
+
// videos will contain GPS, but still encode timestamps in UTC without
|
|
281
|
+
// an explicit offset. HURRAY
|
|
282
|
+
() => __classPrivateFieldGet(this, _ReadTask_instances, "m", _ReadTask_defaultToUTC).call(this)
|
|
283
|
+
? {
|
|
284
|
+
tz: "UTC",
|
|
285
|
+
src: "defaultVideosToUTC",
|
|
286
|
+
}
|
|
287
|
+
: // not applicable:
|
|
288
|
+
undefined,
|
|
246
289
|
// If lat/lon is valid, use the tzlookup library, as it will be a proper
|
|
247
290
|
// Zone name (like "America/New_York"), rather than just an hour offset.
|
|
248
291
|
() => (0, Maybe_1.map)(__classPrivateFieldGet(this, _ReadTask_geoTz, "f").call(this), (ea) => ({
|
|
@@ -250,10 +293,10 @@ _ReadTask_extractLatLon = new WeakMap(), _ReadTask_geoTz = new WeakMap(), _ReadT
|
|
|
250
293
|
src: "GPSLatitude/GPSLongitude",
|
|
251
294
|
})),
|
|
252
295
|
// This is a last-ditch estimation heuristic:
|
|
253
|
-
() => (0, Timezones_1.extractTzOffsetFromUTCOffset)(this.
|
|
296
|
+
() => (0, Timezones_1.extractTzOffsetFromUTCOffset)(this._rawDegrouped),
|
|
254
297
|
]), (ea) => ({ tz: this.tz, src: this.tzSource } = ea));
|
|
255
298
|
}, _ReadTask_parseTag = function _ReadTask_parseTag(tagName, value) {
|
|
256
|
-
var _a, _b, _c
|
|
299
|
+
var _a, _b, _c;
|
|
257
300
|
if (nullish(value))
|
|
258
301
|
return undefined;
|
|
259
302
|
try {
|
|
@@ -280,27 +323,10 @@ _ReadTask_extractLatLon = new WeakMap(), _ReadTask_geoTz = new WeakMap(), _ReadT
|
|
|
280
323
|
const b = BinaryField_1.BinaryField.fromRawValue(value);
|
|
281
324
|
if (b != null)
|
|
282
325
|
return b;
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
tagName.
|
|
287
|
-
tagName.toLowerCase().includes("timestamp")) {
|
|
288
|
-
const d = (_a = ExifDateTime_1.ExifDateTime.fromExifStrict(value, tz)) !== null && _a !== void 0 ? _a : ExifDateTime_1.ExifDateTime.fromISO(value, tz);
|
|
289
|
-
if (d != null)
|
|
290
|
-
return d;
|
|
291
|
-
}
|
|
292
|
-
if (tagName === "When" || tagName.includes("Date")) {
|
|
293
|
-
const d =
|
|
294
|
-
// Some tags, like CreationDate, actually include time resolution.
|
|
295
|
-
(_f = (_e = (_d = (_c = (_b = ExifDateTime_1.ExifDateTime.fromExifStrict(value, tz)) !== null && _b !== void 0 ? _b : ExifDateTime_1.ExifDateTime.fromISO(value, tz)) !== null && _c !== void 0 ? _c : ExifDateTime_1.ExifDateTime.fromExifLoose(value, tz)) !== null && _d !== void 0 ? _d : ExifDate_1.ExifDate.fromExifStrict(value)) !== null && _e !== void 0 ? _e : ExifDate_1.ExifDate.fromISO(value)) !== null && _f !== void 0 ? _f : ExifDate_1.ExifDate.fromExifLoose(value);
|
|
296
|
-
if (d != null) {
|
|
297
|
-
return d;
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
if (tagName.includes("Time")) {
|
|
301
|
-
const t = ExifTime_1.ExifTime.fromEXIF(value);
|
|
302
|
-
if (t != null)
|
|
303
|
-
return t;
|
|
326
|
+
if (MaybeDateOrTimeRe.test(tagName)) {
|
|
327
|
+
const utc_tz_override = isUtcTagName(tagName) || __classPrivateFieldGet(this, _ReadTask_instances, "m", _ReadTask_defaultToUTC).call(this);
|
|
328
|
+
const tz = utc_tz_override ? "UTC" : this.tz;
|
|
329
|
+
return ((_c = (_b = (_a = ExifDateTime_1.ExifDateTime.from(value, tz)) !== null && _a !== void 0 ? _a : (TimeRe.test(tagName) ? ExifTime_1.ExifTime.fromEXIF(value) : undefined)) !== null && _b !== void 0 ? _b : ExifDate_1.ExifDate.from(value)) !== null && _c !== void 0 ? _c : value);
|
|
304
330
|
}
|
|
305
331
|
}
|
|
306
332
|
// Trust that ExifTool rendered the value with the correct type in JSON:
|