@richardo2016/rcli
Version:
Richard's cli
87 lines (86 loc) • 3.46 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const uuid = require("uuid");
const url = require("url");
const os = require("os");
const gd = require("gd");
const ssl = require("ssl");
const path = require("path");
const http = require("http");
const rmdirr = require("@fibjs/rmdirr");
ssl.ca.loadRootCerts();
const fsUtils = require("../utils/fs");
const number_1 = require("../utils/number");
exports._2GIF_DEFAULT_TARGET = './2gif_dist';
// const DEFAULT_COMPRESSION_RATE = .45
const EXTS_MAP = {
'.jpg': gd.JPEG,
'.jpeg': gd.JPEG,
'.bmp': gd.BMP,
'.png': gd.PNG,
'.webp': gd.WEBP,
'.tiff': gd.TIFF,
'.gif': gd.GIF,
};
function handler(srcfile, target, ctx = {}) {
const { cwd = process.cwd() } = ctx || {};
let { compression_rate = null } = ctx;
if (typeof compression_rate !== 'number' || !number_1.inRange(compression_rate, 0, 1))
compression_rate = null;
let tmpDir = [];
// TODO: add test case about it.
if (srcfile && (srcfile.startsWith('https://') || srcfile.startsWith('http://'))) {
const ourl = srcfile;
const urlObj = url.parse(srcfile);
const md5Value = uuid.md5(uuid.URL, urlObj.path).hex();
const dir = path.resolve(os.tmpdir(), `./${md5Value}`);
let basename = path.basename(urlObj.path);
if (fsUtils.getExtensionIdx(basename) === null) {
basename += '.jpeg';
}
srcfile = path.resolve(dir, `./${basename}`);
fsUtils.ensureDirectoryExisted(dir);
try {
const buf = http.get(ourl).readAll();
fs.writeFile(srcfile, buf);
}
catch (error) {
console.notice(`[2gif] error occured when try to download ${ourl}`);
throw error;
}
tmpDir.push(dir);
}
srcfile = fsUtils.normalizeToAbsolute(srcfile, cwd);
if (!target)
target = path.join(fsUtils.getDirname(srcfile), exports._2GIF_DEFAULT_TARGET);
target = fsUtils.normalizeToAbsolute(target, cwd);
const single_target = target && EXTS_MAP.hasOwnProperty(fsUtils.getExtension(target)) ? target : null;
const target_dir = single_target ? path.dirname(target) : fsUtils.getDirname(target);
fsUtils.ensureDirectoryExisted(target_dir);
fsUtils.walkFileList(srcfile, (rsrcpath, ctx) => {
if (!EXTS_MAP.hasOwnProperty(ctx.extension.toLowerCase()))
return;
const srcpath = path.join(ctx.basedir, rsrcpath);
let image = gd.load(srcpath);
// if (image.format === gd.GIF)
// return ;
const targetpath = single_target ? single_target : path.resolve(target_dir, `${ctx.filebase}.gif`);
const targetbase = path.dirname(targetpath);
fsUtils.ensureDirectoryExisted(targetbase);
if (compression_rate !== null)
image = image.resample(image.width * compression_rate, image.height * compression_rate);
const targetFormat = EXTS_MAP[fsUtils.getExtension(targetpath)] || gd.JPEG;
image.save(targetpath, targetFormat, .85);
console.notice(`[2gif] transform success {@compression_rate: ${compression_rate}}!`);
console.notice(`source -- ${srcpath}`);
console.notice(`target -- ${targetpath}`);
console.log();
});
tmpDir.forEach(dirname => {
try {
rmdirr(dirname);
}
catch (error) { }
});
}
exports.default = handler;