gia-ast
Version:
A CLI Wrapping AST Web API calls to servers
275 lines (217 loc) • 7.11 kB
JavaScript
;
const giaenc = require("gia-lib-encoding-base64");
const http = require('http');
const axios = require('axios').default;
var path = require('path');
const Buffer = require('safer-buffer').Buffer;
const fs = require('fs');
const tempfile = require('tempfile');
const sharp = require('sharp');
var args = process.argv.slice(2);
//----for later
const yargs = require('yargs');
var ver = yargs.version();
var appStartMessage =
`Multi platform Contact Sheet maker
By Guillaume Descoteaux-Isabelle, 2020-2021
version ${ver}
----------------------------------------`;
//const { argv } = require('process');
//const { hideBin } = require('yargs/helpers')
const argv = yargs(process.argv)
.scriptName("gia-ast")
.usage(appStartMessage)
// .command('serve [port]', 'start the server', (yargs) => {
// yargs
// .positional('f', {
// describe: 'port to bind on',
// type:'string',
// default: 5000
// })
// }, (argv) => {
// if (argv.verbose) console.info(`start server on :${argv.port}`)
// //serve(argv.port)
// console.log("test");
// console.info(`start server on :${argv.port}`)
// })
.option('file', {
alias: 'f',
type: 'string',
description: 'Specify the file out'
})
.option('directory', {
alias: 'd',
type: 'boolean',
default: false,
description: 'Name the output using current Basedirname'
}).usage(`gis-csm -d --label # Assuming this file in directory: vm_s01-v01_768x___285k.jpg
# will extract 285 and add that instead of filename`)
.option('verbose', {
alias: 'v',
default: false,
type: 'boolean',
description: 'Run with verbose logging'
})
.option('label', {
alias: 'l',
type: 'boolean',
default: false,
description: 'Label using last digit in filename (used for parsing inference result that contain checkpoint number)'
})
.argv;
//-----------
var config = null;
const envListHelp = `
vi ~/.bash_env
export asthostname="orko.guillaumeisabelle.com"
export astoutsuffix="__stylized__"
export astportbase=90
export astcallprotocol="http"
export astcallmethod="stylize"
`;
try {
if (fs.existsSync(__dirname + '/config.js'))
config = require(__dirname + '/config.js');
else if (fs.existsSync(process.env.HOME + '/astconfig.js'))
config = require(process.env.HOME + '/astconfig.js');
} catch (error) {
// console.error("config.js NOT FOUND. ");
//console.log("Read from ENV VAR");
try {
config = new Object();
var envErr = 0;
//----grab-the-env
if (process.env.asthostname)
config.hostname = process.env.asthostname;
else envErr++;
if (process.env.astoutsuffix)
config.outsuffix = process.env.astoutsuffix;
else envErr++;
if (process.env.astportbase)
config.portbase = process.env.astportbase;
else envErr++;
if (process.env.astcallprotocol)
config.callprotocol = process.env.astcallprotocol;
else envErr++;
if (process.env.astcallmethod)
config.callmethod = process.env.astcallmethod;
else envErr++;
if (envErr > 0) {
console.log("Env require setup");
console.log(envListHelp);
}
//----grab-the-env
} catch (error) {
console.error("Require config.js or env var to be set");
console.log(envListHelp);
process.exit(1);
}
}
if (args[0] == "--help" || args[0] == "-h" || args[0] == "-help" || args[0] == "--h" || !args[0] || !args[1]) {
console.log(`
-------------------------------------
AST Web API Stylizer CLI Wrapper
by Guillaume D-Isabelle, 2021
Version 0.1.15
--------------------------------------
-------------HELP----------------------
Stylize an image using the Web API.
Synopsis:
./gia-ast.js [IMAGE] [ModelID]
usage :
./gia-ast.js mycontent.jpg 91
./gia-ast.js mycontent.jpg 01
./gia-ast.js mycontent.jpg 12
------------------------------
`);
if (!args[0] || !args[1]) console.log("MISSING ARGUMENTS");
}
else // Lets do the work
{
var stylizedImage;
var imgFile = args[0];
var ext = path.extname(imgFile);
var imgFileBasename = path.basename(imgFile);
var imgFileNameOnly = imgFileBasename.replace(ext, "");
var resizeSwitch = false;
var targetResolutionX = 768;
if (args[2]) {
resizeSwitch = true;
targetResolutionX = Number(args[2]);
}
//ModelID is related to a port will use
var modelid = args[1];
var targetOutput = imgFileNameOnly + config.outsuffix + modelid + ext;
console.log("TargetOutput: " + targetOutput);
var portnum = config.portbase + modelid;
const callurl = config.callprotocol + "://" + config.hostname + ":" + portnum + "/" + config.callmethod.replace("/", "");
console.log("Processing: " + imgFile + " at port :" + portnum);
/*
//Use later to resized the image if switch used
sharp('input.jpg')
.rotate()
.resize(200)
.jpeg({ mozjpeg: true })
.toBuffer()
.then( data => { ... })
.catch( err => { ... });
*/
doWeResize(imgFile, config, portnum, callurl, targetOutput, resizeSwitch, targetResolutionX);
}
function doWeResize(imgFile, config, portnum, callurl, targetOutput, resizeSwitch = false, targetResolutionX = 512) {
if (resizeSwitch) {
var tfile = tempfile('.jpg');
//console.log("Tempfile:" + tfile);
sharp(imgFile)
.resize(targetResolutionX)
.toFile(tfile, (err, info) => {
if (err) console.error(err);
//console.log(info);
console.log("A resized contentImage should be available at that path :\n feh " + tfile
+ " \n with resolution : " + targetResolutionX);
// process.exit(1);
doTheWork(tfile, config, portnum, callurl, targetOutput);
});
} else //no resize command
doTheWork(imgFile, config, portnum, callurl, targetOutput);
}
function doTheWork(cFile, config, portnum, callurl, targetOutput) {
try {
var data = giaenc.
encFileToJSONStringifyBase64Prop(cFile, "contentImage");
//console.log(data);
//var unparsedData = JSON.parse(data);
//---------------------
const options = {
hostname: config.hostname,
port: portnum,
path: config.callmethod,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': data.length
}
};
console.log("Calling : " + config.hostname + ":" + portnum);
axios.post(callurl, data, options)
.then(function (response) {
// var d = JSON.parse(response);
var { data } = response;
var { stylizedImage } = data;
//---import
// decode_base64_to_file(stylizedImage, targetOutput);
giaenc.dec64_StringToFile(stylizedImage, targetOutput);
console.log("A stylizedImage should be available at that path :\n feh " + targetOutput);
//console.log(stylizedImage);
})
.catch(function (err) {
console.log("There was error");
console.log(err.message);
});
//-----------------------
} catch (error) {
console.log("something went wrong: ");
console.log(error);
}
}