g6/bin/screenshot.js
2018-06-05 23:58:10 +08:00

83 lines
2.5 KiB
JavaScript
Executable File

#!/usr/bin/env node
process.env.DEBUG = 'app:*';
const debug = require('debug')('app:screenshot');
const MAX_POOL_SIZE = require('os').cpus().length;
const Nightmare = require('nightmare');
const _ = require('lodash');
const commander = require('commander');
const connect = require('connect');
const getPort = require('get-port');
const http = require('http');
const path = require('path');
const basename = path.basename;
const extname = path.extname;
const join = path.join;
const queue = require('d3-queue').queue;
const serveStatic = require('serve-static');
const shelljs = require('shelljs');
const ls = shelljs.ls;
const mkdir = shelljs.mkdir;
const pkg = require('../package.json');
commander
.version(pkg.version)
.option('-p, --port <port>', 'specify a port number to run on', parseInt)
.option('-n, --name <name>', 'specify the name for demos')
.parse(process.argv);
// assets
const src = join(process.cwd(), './demos');
const dest = join(process.cwd(), './demos/assets/screenshots');
mkdir('-p', dest);
const app = connect();
app.use('/', serveStatic(process.cwd()));
const DELAY = 10000;
getPort().then(port => {
http.createServer(app).listen(port);
const url = 'http://127.0.0.1:' + port;
debug('server is ready on port ' + port + '! url: ' + url);
const q = queue(MAX_POOL_SIZE > 2 ? MAX_POOL_SIZE - 1 : MAX_POOL_SIZE);
const files = ls(src).filter(filename => (extname(filename) === '.html'));
files.forEach(filename => {
const name = basename(filename, '.html');
if (_.isString(commander.name) && filename.indexOf(commander.name) === -1) {
debug(`>>>>>>>>> skipping because filename not matched: ${name}`);
return;
}
q.defer(callback => {
const t0 = Date.now();
const nightmare = Nightmare({
gotoTimeout: 600000,
show: false
});
const url = `http://127.0.0.1:${port}/demos/${name}.html`;
const target = join(dest, `./${name}.png`);
nightmare.viewport(800, 450) // 16 x 9
.goto(url)
.wait(DELAY)
.screenshot(target, () => {
debug(name + ' took ' + (Date.now() - t0) + ' to take a screenshot.');
callback(null);
})
.end()
.catch(e => {
debug(url);
debug(target);
debug(name + ' failed to take a screenshot: ' + e);
});
});
});
q.awaitAll(error => {
if (error) {
debug(error);
process.exit(1);
}
debug('screenshots are all captured!');
process.exit();
});
});