UNPKG

@richardo2016/rcli

Version:
87 lines (86 loc) 3.46 kB
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;