mirror of https://github.com/thumbsup/thumbsup
Generated website contains original media too
- now generate thumbs + large (original is too big for web download) - simpler build systempull/9/head
parent
3a388181ee
commit
1608b3cfac
@ -0,0 +1,57 @@
|
||||
var _ = require('lodash');
|
||||
var fs = require('fs-extra');
|
||||
var os = require('os');
|
||||
var path = require('path');
|
||||
var glob = require('glob');
|
||||
var async = require('async');
|
||||
var fileUtils = require('./files');
|
||||
|
||||
module.exports = function(opts, callback) {
|
||||
|
||||
if (typeof opts.dest === 'string') {
|
||||
opts.dest = rename(opts.dest);
|
||||
}
|
||||
|
||||
var globOptions = {
|
||||
cwd: opts.source,
|
||||
nonull: false,
|
||||
nocase: true
|
||||
};
|
||||
|
||||
glob(opts.filter, globOptions, function (err, files) {
|
||||
|
||||
if (err) return callback(err);
|
||||
|
||||
// create list of src/dest pairs
|
||||
var tasks = files.map(function(file) {
|
||||
return {
|
||||
src: path.resolve(path.join(opts.source, file)),
|
||||
dest: path.resolve(opts.dest(file))
|
||||
};
|
||||
});
|
||||
|
||||
// create all required folders
|
||||
var folders = _(tasks).pluck('dest').map(path.dirname).uniq().value();
|
||||
folders.forEach(function(f) { fs.mkdirsSync(f, 0777); });
|
||||
|
||||
// run them in parallel
|
||||
var fns = tasks.filter(function(task) {
|
||||
return fileUtils.newer(task.src, task.dest);
|
||||
}).map(function(task) {
|
||||
return opts.process.bind(this, task.src, task.dest);
|
||||
});
|
||||
async.parallelLimit(fns, os.cpus().length, callback);
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
function rename(pattern) {
|
||||
var parts = pattern.split('/');
|
||||
var full = path.join.apply(this, parts);
|
||||
return function(file) {
|
||||
return full.replace('$path', path.dirname(file))
|
||||
.replace('$name', path.basename(file, path.extname(file)))
|
||||
.replace('$ext', path.extname(file).substr(1));
|
||||
}
|
||||
}
|
@ -1,46 +1,36 @@
|
||||
var exec = require('child_process').exec;
|
||||
var fs = require('fs-extra');
|
||||
var path = require('path');
|
||||
var async = require('async');
|
||||
var gm = require('gm');
|
||||
var files = require('./files');
|
||||
|
||||
|
||||
// default thumbnail size (square)
|
||||
exports.size = 100;
|
||||
|
||||
// opts = input, thumbnail
|
||||
exports.photo = function(opts, callback) {
|
||||
var async = require('async');
|
||||
|
||||
if (files.newer(opts.thumbnail, opts.input)) return callback();
|
||||
fs.mkdirpSync(path.dirname(opts.thumbnail));
|
||||
exports.sizes = {
|
||||
thumb: 120,
|
||||
large: 1000,
|
||||
};
|
||||
|
||||
gm(path.resolve(opts.input))
|
||||
.resize(exports.size, exports.size, "^")
|
||||
exports.photoSquare = function(src, dest, callback) {
|
||||
gm(src)
|
||||
.resize(exports.sizes.thumb, exports.sizes.thumb, '^')
|
||||
.gravity('Center')
|
||||
.crop(exports.size, exports.size)
|
||||
.crop(exports.sizes.thumb, exports.sizes.thumb)
|
||||
.quality(90)
|
||||
.write(path.resolve(opts.thumbnail), callback);
|
||||
|
||||
.write(dest, callback);
|
||||
};
|
||||
|
||||
// opts = input, thumbnail, poster
|
||||
exports.video = function(opts, callback) {
|
||||
|
||||
var fnVideo = function(next) {
|
||||
var ffmpeg = 'ffmpeg -itsoffset -1 -i "' + opts.input + '" -ss 0.1 -vframes 1 -y "' + opts.poster + '"';
|
||||
exec(ffmpeg, next);
|
||||
};
|
||||
|
||||
var fnPhoto = function(next) {
|
||||
exports.photo({
|
||||
input: opts.poster,
|
||||
thumbnail: opts.thumbnail
|
||||
}, next);
|
||||
};
|
||||
exports.photoLarge = function(src, dest, callback) {
|
||||
gm(src)
|
||||
.resize(null, exports.sizes.large, '>')
|
||||
.quality(95)
|
||||
.write(dest, callback);
|
||||
};
|
||||
|
||||
if (files.newer(opts.thumbnail, opts.input)) return callback();
|
||||
fs.mkdirpSync(path.dirname(opts.thumbnail));
|
||||
async.series([fnVideo, fnPhoto], callback);
|
||||
exports.videoLarge = function(src, dest, callback) {
|
||||
var ffmpeg = 'ffmpeg -itsoffset -1 -i "' + src + '" -ss 0.1 -vframes 1 -y "' + dest + '"';
|
||||
exec(ffmpeg, callback);
|
||||
};
|
||||
|
||||
exports.videoSquare = function(src, dest, callback) {
|
||||
async.series([
|
||||
exports.videoLarge.bind(this, src, dest),
|
||||
exports.photoSquare.bind(this, dest, dest)
|
||||
], callback);
|
||||
};
|
||||
|
Loading…
Reference in New Issue