UNPKG

exiftool-vendored

Version:
331 lines (330 loc) 13.4 kB
import * as bc from "batch-cluster"; import { geoTz } from "./GeoTz"; import { Maybe } from "./Maybe"; import { Tags } from "./Tags"; /** * Options for the {@link ExifTool} constructor. * * Defaults are defined in {@link DefaultExifToolOptions}. */ export interface ExifToolOptions extends bc.BatchClusterOptions, bc.BatchProcessOptions, bc.ChildProcessFactory { /** * The maximum number of ExifTool child processes to spawn when load merits. * * Defaults to 1/4 the number of CPUs, minimally 1. */ maxProcs: number; /** * The maximum number of requests a given ExifTool process will service * before being retired. * * Defaults to 500, to balance performance with memory usage. */ maxTasksPerProcess: number; /** * Spawning new ExifTool processes must not take longer than * {@link spawnTimeoutMillis} milliseconds before the child process is timed * out and a new attempt is made. Be pessimistic here--windows can regularly * take several seconds to spin up a process, thanks to antivirus * shenanigans. This can't be set to a value less than 100ms. * * Defaults to 30 seconds, to accommodate slow Windows machines. */ spawnTimeoutMillis: number; /** * If requests to ExifTool take longer than this, presume the underlying * process is dead and we should restart the task. This can't be set to a * value less than 10ms, and really should be set to at more than a second * unless `taskRetries` is sufficiently large or all writes will be to a * fast local disk. Defaults to 10 seconds. */ taskTimeoutMillis: number; /** * An interval timer is scheduled to do periodic maintenance of underlying * child processes with this periodicity. * * Defaults to 2 seconds. */ onIdleIntervalMillis: number; /** * The number of times a task can error or timeout and be retried. * * Defaults to 1 (every task gets 2 chances). */ taskRetries: number; /** * Allows for non-standard paths to ExifTool. Defaults to the perl or * windows binaries provided by `exiftool-vendored.pl` or * `exiftool-vendored.exe`. * * This must be the full path to `exiftool`, not just the directory. */ exiftoolPath: string | Promise<string> | ((logger?: bc.Logger) => string | Promise<string>); /** * Args only passed to exiftool on launch. You probably don't need to change * this from the default. */ exiftoolArgs: string[]; /** * Environment variables passed to ExifTool (besides `EXIFTOOL_HOME`) */ exiftoolEnv: NodeJS.ProcessEnv; /** * Should ExifTool use MWG (Metadata Working Group) composite tags for * reading and writing tags? * * ExifTool recommends this to be set to true. This defaults to `false` to * maintain consistency with prior versions. * * Note that this can result in many tag value differences from * `ExifTool.read`, and makes `ExifTool.write` write to "synonymous" MWG * tags automatically. * * @see https://exiftool.org/TagNames/MWG.html for details */ useMWG: boolean; /** * Tag names (which can have '*' glob matchers) which you want numeric * values, rather than ExifTool's "Print Conversion." * * If you're using tag values only for human consumption, you may want to * leave this blank. * * The default includes "*Duration*", {@link Tags.GPSAltitude}, * {@link Tags.GPSLatitude}, {@link Tags.GPSLongitude}, * {@link Tags.GPSPosition}, and {@link Tags.Orientation}. */ numericTags: string[]; /** * If defined, ExifTool will attempt to calculate an "ImageDataHash" tag * value with a checksum of image data. * * Note that as of 2022-04-12, ExifTool supports JPEG, TIFF, PNG, CRW, CR3, * MRW, RAF, X3F, IIQ, JP2, JXL, HEIC and AVIF images, MOV/MP4 videos, and * some RIFF-based files such as AVI, WAV and WEBP. * * This defaults to undefined, as it adds ~20ms of overhead to every read */ imageHashType: false | "MD5" | "SHA256" | "SHA512"; /** * @deprecated Use `imageHashType` instead. */ includeImageDataMD5: boolean | undefined; /** * Video file dates are assumed to be in UTC, rather than using timezone * inference used in images. To disable this default, set this to false. * * @see https://github.com/photostructure/exiftool-vendored.js/issues/113 */ defaultVideosToUTC: boolean; /** * Should we try to backfill timezones for date-times that don't have them? * If set to `true`, and {@link defaultVideosToUTC} is also `true`, we'll * try backfilling timezones for date-times that are UTC, as well. * * Setting this to `false` removes **all** timezone inference--only those * date-times with an explicit offset will have a defined timezone. * * Prior versions of exiftool-vendored would use the file's `.tz` as a * backstop even if this was set to `false`. * * As of version 23, this now defaults to `true`, as it's more likely to be * what people expect. */ backfillTimezones: boolean; /** * We always look at {@link Tags.TimeZone}, {@link Tags.OffsetTime}, * {@link Tags.TimeZoneOffset}, {@link Tags.OffsetTimeOriginal}, * {@link Tags.OffsetTimeDigitized}, and GPS metadata to infer the timezone. * * If these strategies fail, and this is enabled, we'll try to infer the * timezone from non-UTC datestamps included in the * {@link inferTimezoneFromDatestampTags} value. * * This defaults to false as it both retains prior behavior and means fewer * "fuzzy" heuristics are enabled by default. */ inferTimezoneFromDatestamps: boolean; /** * This is the list of tag names that will be used to infer the timezone as * a backstop, if no explicit timezone is found in metadata. Note that * datestamps with UTC offsets are ignored, as they are frequently * incorrectly set. * * This setting is only in play if {@link inferTimezoneFromDatestamps} has * been overridden to be `true`. * * This defaults to {@link CapturedAtTagNames} */ inferTimezoneFromDatestampTags: (keyof Tags)[]; /** * Some cameras (Samsung Galaxy S7, for example) may not always include GPS * metadata in photos if a fix can't be obtained. If this option is true, and * GPS metadata is missing, we'll try to infer the timezone from the * difference of the TimeStamp tag and the first defined tag value from * {@link inferTimezoneFromDatestampTags}. * * This heuristic is pretty sketchy, and used as a last resort. You shouldn't * enable it unless you have to. * * @see https://github.com/photostructure/exiftool-vendored.js/issues/209 */ inferTimezoneFromTimeStamp: boolean; /** * Some software uses a GPS position of (0,0) as a synonym for "unset". If * this option is true, and GPSLatitude and GPSLongitude are both 0, then * those values will be returned, but the TZ will not be inferred from that * location. * * If both this and {@link geolocation} are `true`, we will _delete_ the * Geolocation tags from the returned metadata object. * * @see https://en.wikipedia.org/wiki/Null_Island */ ignoreZeroZeroLatLon: boolean; /** * Override the default geo-to-timezone lookup service. Note that if {@link geolocation} is enabled, we'll use {@link Tags.GeolocationTimeZone} if it's not blank. * * This defaults to `@photostructure/tz-lookup`, but if you have the * resources, consider using `geo-tz` for more accurate results. * * If your implementation throws an error, `ExifTool` will consider that given * latitude/longitude as invalid. * * Here's a snippet of how to use `geo-tz` instead of `tz-lookup`: * ```js const geotz = require("geo-tz") const { ExifTool } = require("exiftool-vendored") const exiftool = new ExifTool({ geoTz: (lat, lon) => geotz.find(lat, lon)[0] }) ``` * * @see https://github.com/photostructure/tz-lookup * @see https://github.com/evansiroky/node-geo-tz/ */ geoTz: typeof geoTz; /** * When reading metadata, should we enable ExifTool's geolocation features? * Note that this requires ExifTool version 12.78 or later. * * @see https://exiftool.org/geolocation.html * @see {@link GeolocationTags} */ geolocation: boolean; /** * Should we ignore minor errors when reading metadata? * * This defaults to `true`, as ExifTool can be quite chatty. */ ignoreMinorErrors: boolean; /** * When writing an extracted tag to a file, * this will overwrite an existing file instead of throwing an error. * Enabling this option is equivalent to `-w!` in ExifTool. * * This defaults to `false`. */ forceWrite: boolean; /** * `ExifTool` has a shebang line that assumes a valid `perl` is installed at * `/usr/bin/perl`. * * Some environments may not include a valid `/usr/bin/perl` (like AWS * Lambda), but `perl` may be available in your `PATH` some place else (like * `/opt/bin/perl`), if you pull in a perl layer. * * This will default to `true` in those environments as a workaround in these * situations. Note also that `perl` will be spawned in a sub-shell. */ ignoreShebang: boolean; /** * Should we check for a readable and executable `perl` file in $PATH? This * defaults to false on Windows, and true everywhere else. Set this to false * if you know perl is installed. */ checkPerl: boolean; /** * How should ExifTool handle nested structures? * * Defaults to `1`. * * - `0` = Read/copy flattened tags * - `1` = Read/copy structures * - `2` = Read/copy both flattened and structured tags, but flag flattened * tags as "unsafe" for copying * - `"undef"` = Same as `0` for reading and `2` for copying * * @see https://exiftool.org/struct.html */ struct: "undef" | 0 | 1 | 2; /** * Any additional arguments that should be added by default to all read tasks, * like `["-fast", "-api", "largefilesupport=1"]`. The value provided to the * ExifTool constructor can be overridden in the call to {@link ExifTool.read} */ readArgs: string[]; /** * Any additional arguments that should be added by default to all write * tasks, like `["-overwrite_original"]`. The value provided to the ExifTool * constructor can be overridden in the call to {@link ExifTool.write}. */ writeArgs: string[]; /** * The TimeZone tag normally represents the offset from UTC. * * Unfortunately, at least for some Nikon cameras, the TimeZone tag **and the * DaylightSavings tag** must be taken into account to find the UTC offset. * * By default, this is a predicate that returns `true` if the `Make` tag is * `Nikon`. If you find other makes and models that need this treatment, * please open a ticket on GitHub with example images or videos and we can * update the default predicate. * * The return value is the number of minutes to adjust the timezone by. * * @see https://github.com/photostructure/exiftool-vendored.js/issues/215 */ adjustTimeZoneIfDaylightSavings: (tags: Tags, tz: string) => Maybe<number>; /** * Timezone parsing requires a bunch of heuristics due to hardware and * software companies not following metadata specifications similarly. * * If GPS metadata is trustworthy, set this to `true` to override explicit * values assigned to {@link TimezoneOffsetTagnames}. * * Note that there **are** regions that have had their IANA timezone change * over time--this will result incorrect timezones. */ preferTimezoneInferenceFromGps: boolean; /** * Should ExifTool keep times that are stored as seconds since UTC epoch as * UTC times? If false, ExifTool will use local time instead of UTC/Zulu. * * We default to `true` to ensure we don't unintentionally adopt local * timezones. * * Please note: when trying to validate this option, I **could not find a * single example** that had a unixtime-encoded datetime, so I suspect this is * irrelevant for most use cases and files. * * @see https://exiftool.org/ExifTool.html#KeepUTCTime */ keepUTCTime: boolean; /** * Timeout in milliseconds for synchronous disposal (using Symbol.dispose). * If graceful cleanup takes longer than this, forceful cleanup is attempted. * * Defaults to 1000ms (1 second). */ disposalTimeoutMs?: number; /** * Timeout in milliseconds for asynchronous disposal (using Symbol.asyncDispose). * If graceful cleanup takes longer than this, forceful cleanup is attempted. * * Defaults to 5000ms (5 seconds). */ asyncDisposalTimeoutMs?: number; } export declare function handleDeprecatedOptions<T extends Partial<Pick<ExifToolOptions, "includeImageDataMD5" | "imageHashType">>>(options: T): T;