63 lines
2.5 KiB
JavaScript
63 lines
2.5 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.BinaryExtractionTask = void 0;
|
|
const node_fs_1 = require("node:fs");
|
|
const node_path_1 = __importDefault(require("node:path"));
|
|
const ExifToolTask_1 = require("./ExifToolTask");
|
|
const FilenameCharsetArgs_1 = require("./FilenameCharsetArgs");
|
|
const String_1 = require("./String");
|
|
const StdoutRe = /\b(\d+) output files? created/i;
|
|
/**
|
|
* Task that returns an error string (to prevent retries), or undefined if
|
|
* everything seems to have worked.
|
|
*/
|
|
class BinaryExtractionTask extends ExifToolTask_1.ExifToolTask {
|
|
constructor(args, options) {
|
|
super(args, options);
|
|
}
|
|
static for(tagname, imgSrc, imgDest, options) {
|
|
// Ensure the destination directory exists:
|
|
(0, node_fs_1.mkdirSync)(node_path_1.default.dirname(imgDest), { recursive: true });
|
|
const forceWrite = options?.forceWrite ?? false;
|
|
const args = [
|
|
...FilenameCharsetArgs_1.Utf8FilenameCharsetArgs,
|
|
"-b", // -binary
|
|
"-" + tagname,
|
|
// Capital W allows destination files to not have a pattern. See
|
|
// https://exiftool.org/exiftool_pod.html#W-FMT--tagOut
|
|
//
|
|
// Prior code used -w with %0f "to avoid shell expansion", but as this
|
|
// command gets sent directly to exiftool thanks to stay_open mode, we
|
|
// don't need to worry about shell expansion.
|
|
//
|
|
// I also tried `-out` instead of `-W`, and that didn't work at least on
|
|
// ExifTool 13.17.
|
|
forceWrite ? "-W!" : "-W",
|
|
node_path_1.default.resolve(imgDest),
|
|
node_path_1.default.resolve(imgSrc),
|
|
];
|
|
return new BinaryExtractionTask(args, options);
|
|
}
|
|
parse(stdout, err) {
|
|
const s = (0, String_1.toS)(stdout).trim();
|
|
const m = StdoutRe.exec(s);
|
|
if (err != null) {
|
|
throw err;
|
|
}
|
|
else if (m == null) {
|
|
throw new Error("Missing expected status message (got " + stdout + ")");
|
|
}
|
|
else if (m[1] === "1") {
|
|
return;
|
|
}
|
|
else {
|
|
// Don't retry: the binary payload is missing, and retrying won't fix that.
|
|
return s;
|
|
}
|
|
}
|
|
}
|
|
exports.BinaryExtractionTask = BinaryExtractionTask;
|
|
//# sourceMappingURL=BinaryExtractionTask.js.map
|