openpose_api/dist/index.js

155 lines
5.0 KiB
JavaScript

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
require("dotenv/config");
const express_1 = __importDefault(require("express"));
const promises_1 = require("fs/promises");
const os_1 = require("os");
const path_1 = require("path");
const body_parser_1 = __importDefault(require("body-parser"));
const multer_1 = __importDefault(require("multer"));
const uuid_1 = require("uuid");
const log_1 = require("./log");
const env_1 = require("./env");
const shell_1 = require("./shell");
const PORT = (0, env_1.envInt)('PORT', 7474);
const BIN = (0, env_1.envString)('BIN', 'openpose');
const CWD = (0, env_1.envString)('CWD', '.');
const log = (0, log_1.createLog)('openpose_api');
const app = (0, express_1.default)();
const tmp = (0, os_1.tmpdir)();
const storage = multer_1.default.diskStorage({
destination: function (req, file, cb) {
cb(null, tmp);
},
filename: function (req, file, cb) {
cb(null, `${+new Date()}_${file.originalname}`);
}
});
async function exists(path) {
try {
await (0, promises_1.access)(path);
return true;
}
catch {
return false;
}
}
app.use(body_parser_1.default.json());
app.use(body_parser_1.default.urlencoded({ extended: true }));
const uploadImage = (0, multer_1.default)({ storage });
app.get('/', (req, res, next) => {
return res.send('/');
});
//./build/examples/openpose/openpose.bin -v 1 -image_dir ./examples/media/ -write_images ./output -write_json ./json --face --hand
app.post('/openpose', uploadImage.single('image'), async (req, res, next) => {
const id = (0, uuid_1.v4)();
const dir = (0, path_1.join)(tmp, id);
const image_dir = (0, path_1.join)(dir, 'image');
const json_dir = (0, path_1.join)(dir, 'json');
const json_file = (0, path_1.join)(json_dir, 'openpose_keypoints.json');
let json_exists = false;
let openpose_str = '{}';
let output;
let image_file;
let image_ext;
let sh;
//
const args = [
BIN,
'--render_pose', '0',
'-display', '0',
'-image_dir', image_dir,
'-write_json', json_dir
];
if (typeof req.file === 'undefined') {
return next(new Error('No image uploaded'));
}
image_ext = (0, path_1.extname)((0, path_1.basename)(req.file.path));
image_file = (0, path_1.join)(image_dir, `openpose${image_ext}`);
if (typeof req.body.face !== 'undefined' && req.body.face === 'true') {
args.push('--face');
}
if (typeof req.body.hand !== 'undefined' && req.body.hand === 'true') {
args.push('--hand');
}
try {
await (0, promises_1.mkdir)(dir);
}
catch (err) {
log.error(`Error making directory ${dir}`, err);
return next(new Error('Error making dir'));
}
try {
await (0, promises_1.mkdir)(image_dir);
}
catch (err) {
log.error(`Error making directory ${image_dir}`, err);
return next(new Error('Error making image_dir'));
}
try {
await (0, promises_1.mkdir)(json_dir);
}
catch (err) {
log.error(`Error making directory ${image_dir}`, err);
return next(new Error('Error making image_dir'));
}
try {
await (0, promises_1.copyFile)(req.file.path, image_file);
}
catch (err) {
log.error(`Error copying file ${req.file.path}`, err);
return next(new Error('Error copying temp image'));
}
sh = new shell_1.Shell(args, CWD, null, null, null, true);
try {
await sh.execute();
}
catch (err) {
log.error(`Error executing ${args.join(' ')}`, err);
return next(new Error('Error running openpose'));
}
try {
json_exists = await exists(json_file);
}
catch (err) {
log.error(`Error checking json ${json_file} exists`, err);
return next(new Error('Error checking json exists'));
}
if (json_exists) {
try {
openpose_str = await (0, promises_1.readFile)(json_file, 'utf8');
}
catch (err) {
log.error(`Error reading json file ${json_file}`, err);
return next(new Error('Error reading json file'));
}
}
else {
log.error(`The json file ${json_file} does not exist`);
return next(new Error('Error running openpose'));
}
try {
output = JSON.parse(openpose_str);
}
catch (err) {
log.error(`Error parsing openpose json`, err);
return next(new Error('Error parsing openpose json'));
}
output.image = req.file.originalname;
try {
await (0, promises_1.rm)(dir, { recursive: true });
}
catch (err) {
log.error(`Error unlinking ${dir}`, err);
return next(new Error('Error unlinking temp dir'));
}
return res.json(output);
});
app.listen(PORT, () => {
log.info(`Openpose API server running on port ${PORT}`);
log.info(`Using openpose binary ${BIN}`);
});
//# sourceMappingURL=index.js.map