You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
thumbsup/src/index.js

122 lines
3.1 KiB
JavaScript

10 years ago
var fs = require('fs-extra');
var path = require('path');
var async = require('async');
var pad = require('pad');
10 years ago
var galleries = require('./galleries');
var render = require('./render');
var thumbs = require('./thumbs');
var files = require('./files');
var make = require('./make');
10 years ago
exports.build = function(opts) {
if (opts.thumbSize) thumbs.sizes.thumb = opts.thumbSize;
if (opts.largeSize) thumbs.sizes.large = opts.largeSize;
10 years ago
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);
});
};
10 years ago
}
function finish(err) {
console.log(err || 'Done');
console.log();
process.exit(err ? 1 : 0)
}