155 lines
5.0 KiB
JavaScript
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
|