|
|
|
var fs = require('fs-extra');
|
|
|
|
var path = require('path');
|
|
|
|
var async = require('async');
|
|
|
|
var pad = require('pad');
|
|
|
|
|
|
|
|
var galleries = require('./galleries');
|
|
|
|
var render = require('./render');
|
|
|
|
var thumbs = require('./thumbs');
|
|
|
|
var files = require('./files');
|
|
|
|
var make = require('./make');
|
|
|
|
|
|
|
|
exports.build = function(opts) {
|
|
|
|
|
|
|
|
if (opts.thumbSize) thumbs.sizes.thumb = opts.thumbSize;
|
|
|
|
if (opts.largeSize) thumbs.sizes.large = opts.largeSize;
|
|
|
|
|
|
|
|
fs.mkdirp(opts.output);
|
|
|
|
var media = path.join(opts.output, 'media');
|
|
|
|
|
|
|
|
function website(callback) {
|
|
|
|
galleries.fromDisk(opts.input, thumbs.sizes.thumb, function(err, list) {
|
|
|
|
if (err) return callback(err);
|
|
|
|
|
|
|
|
var rendered = render.gallery(list, list[0]);
|
|
|
|
var outputPath = path.join(opts.output, 'index.html');
|
|
|
|
fs.writeFileSync(outputPath, rendered);
|
|
|
|
|
|
|
|
list.forEach(function(folder) {
|
|
|
|
var rendered = render.gallery(list, folder);
|
|
|
|
var outputPath = path.join(opts.output, folder.url);
|
|
|
|
fs.writeFileSync(outputPath, rendered);
|
|
|
|
});
|
|
|
|
|
|
|
|
callback();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function support(callback) {
|
|
|
|
var src = path.join(__dirname, '..', 'public');
|
|
|
|
var dest = path.join(opts.output, 'public');
|
|
|
|
copyFolder(src, dest, callback);
|
|
|
|
}
|
|
|
|
|
|
|
|
function copyMedia(callback) {
|
|
|
|
var dest = path.join(opts.output, 'media', 'original');
|
|
|
|
copyFolder(opts.input, dest, callback);
|
|
|
|
}
|
|
|
|
|
|
|
|
function photoLarge(callback) {
|
|
|
|
make({
|
|
|
|
source: opts.input,
|
|
|
|
filter: '**/*.{jpg,jpeg,png}',
|
|
|
|
dest: media + '/large/$path/$name.$ext',
|
|
|
|
process: thumbs.photoLarge
|
|
|
|
}, callback);
|
|
|
|
}
|
|
|
|
|
|
|
|
function photoThumbs(callback) {
|
|
|
|
make({
|
|
|
|
source: opts.input,
|
|
|
|
filter: '**/*.{jpg,jpeg,png}',
|
|
|
|
dest: media + '/thumbs/$path/$name.$ext',
|
|
|
|
process: thumbs.photoSquare
|
|
|
|
}, callback);
|
|
|
|
}
|
|
|
|
|
|
|
|
function videoLarge(callback) {
|
|
|
|
make({
|
|
|
|
source: opts.input,
|
|
|
|
filter: '**/*.{mp4,mov}',
|
|
|
|
dest: media + '/large/$path/$name.jpg',
|
|
|
|
process: thumbs.videoLarge
|
|
|
|
}, callback);
|
|
|
|
}
|
|
|
|
|
|
|
|
function videoThumbs(callback) {
|
|
|
|
make({
|
|
|
|
source: opts.input,
|
|
|
|
filter: '**/*.{mp4,mov}',
|
|
|
|
dest: media + '/thumbs/$path/$name.jpg',
|
|
|
|
process: thumbs.videoSquare
|
|
|
|
}, callback);
|
|
|
|
}
|
|
|
|
|
|
|
|
async.series([
|
|
|
|
step('Website', website),
|
|
|
|
step('Support', support),
|
|
|
|
step('Original media', copyMedia),
|
|
|
|
step('Photos (large)', photoLarge),
|
|
|
|
step('Photos (thumbs)', photoThumbs),
|
|
|
|
step('Videos (large)', videoLarge),
|
|
|
|
step('Videos (thumbs)', videoThumbs)
|
|
|
|
], finish);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
function copyFolder(src, dest, callback) {
|
|
|
|
var src = path.resolve(src);
|
|
|
|
var dest = path.resolve(dest);
|
|
|
|
if (files.newer(src, dest)) {
|
|
|
|
fs.copy(src, dest, callback);
|
|
|
|
} else {
|
|
|
|
callback();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function step(msg, fn) {
|
|
|
|
return function(callback) {
|
|
|
|
console.log(pad(msg, 20) + '[STARTED]')
|
|
|
|
fn(function(err) {
|
|
|
|
console.log(pad(msg, 20) + (err ? '[FAILED]\n' : '[OK]'));
|
|
|
|
callback(err);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function finish(err) {
|
|
|
|
console.log(err || 'Done');
|
|
|
|
console.log();
|
|
|
|
process.exit(err ? 1 : 0)
|
|
|
|
}
|