var _ = require('lodash'); var fs = require('fs-extra'); var path = require('path'); var async = require('async'); var pad = require('pad'); var regen = require('regen'); var metadata = require('./metadata'); var website = require('./website'); var thumbs = require('./thumbs'); exports.build = function(opts) { opts = _.defaults(opts, { title: 'Photo gallery', thumbSize: 120, largeSize: 1000 }); opts.input = path.resolve(opts.input); opts.output = path.resolve(opts.output); thumbs.sizes.thumb = opts.thumbSize; thumbs.sizes.large = opts.largeSize; fs.mkdirpSync(opts.output); var media = path.join(opts.output, 'media'); async.series([ buildStep('Original media', { cwd: opts.input, src: '**/*.{jpg,jpeg,png,mp4,mov}', dest: media + '/original/$path/$name.$ext', process: fs.copy }), buildStep('Photos (large)', { cwd: opts.input, src: '**/*.{jpg,jpeg,png}', dest: media + '/large/$path/$name.$ext', process: thumbs.photoLarge, }), buildStep('Photos (thumbs)', { cwd: opts.input, src: '**/*.{jpg,jpeg,png}', dest: media + '/thumbs/$path/$name.$ext', process: thumbs.photoSquare, }), buildStep('Videos (web)', { cwd: opts.input, src: '**/*.{mp4,mov}', dest: media + '/large/$path/$name.mp4', process: thumbs.videoWeb, }), buildStep('Videos (poster)', { cwd: opts.input, src: '**/*.{mp4,mov}', dest: media + '/large/$path/$name.jpg', process: thumbs.videoLarge, }), buildStep('Videos (thumbs)', { cwd: opts.input, src: '**/*.{mp4,mov}', dest: media + '/thumbs/$path/$name.jpg', process: thumbs.videoSquare, }), function updateMetadata(callback) { metadata.update(opts, callback); }, function staticWebsite(callback) { website.build(opts, callback); } ], finish); }; function buildStep(message, opts) { return function(callback) { regen(_.extend(opts, { report: pad(message, 20) + '$progress' }), callback); } } function finish(err) { console.log(); console.log(err || 'Gallery generated successfully'); console.log(); process.exit(err ? 1 : 0) }