diff --git a/lib/screenshotHandler.js b/lib/screenshotHandler.js new file mode 100644 index 0000000..7570857 --- /dev/null +++ b/lib/screenshotHandler.js @@ -0,0 +1,118 @@ +var debug = require('debug')('ylt:screenshotHandler'); +var Jimp = require('jimp'); +var Q = require('q'); +var fs = require('fs'); +var path = require('path'); + + +var screenshotHandler = function() { + + var tmpFolderPath = 'tmp'; + var tmpFolderFullPath = path.join(__dirname, '..', tmpFolderPath); + var tmpFileName = 'temp-screenshot.png'; + var tmpFileFullPath = path.join(tmpFolderFullPath, tmpFileName); + + + this.findAndOptimizeScreenshot = function(width) { + var that = this; + + debug('Starting screenshot transformation'); + + return this.openImage(tmpFileFullPath) + + .then(function(image) { + that.deleteTmpFile(tmpFileFullPath); + return that.resizeImage(image, width); + }) + + .then(this.toBuffer); + }; + + + this.openImage = function(imagePath) { + var deferred = Q.defer(); + + Jimp.read(imagePath, function(err, image){ + if (err) { + debug('Could not open imagePath %s', imagePath); + debug(err); + + deferred.reject(err); + } else { + debug('Image correctly open'); + deferred.resolve(image); + } + }); + + return deferred.promise; + }; + + + this.resizeImage = function(image, newWidth) { + var deferred = Q.defer(); + + var currentWidth = image.bitmap.width; + + if (currentWidth > 0) { + var ratio = newWidth / currentWidth; + + image.scale(ratio, function(err, image){ + if (err) { + debug('Could not resize image'); + debug(err); + + deferred.reject(err); + } else { + debug('Image correctly resized'); + deferred.resolve(image); + } + }); + } else { + deferred.reject('Could not resize an empty image'); + } + + return deferred.promise; + }; + + + this.toBuffer = function(image) { + var deferred = Q.defer(); + + image.quality(85).getBuffer(Jimp.MIME_JPEG, function(err, buffer){ + if (err) { + debug('Could not save image to buffer'); + debug(err); + + deferred.reject(err); + } else { + debug('Image correctly transformed to buffer'); + deferred.resolve(buffer); + } + }); + + return deferred.promise; + }; + + + this.deleteTmpFile = function(tmpFilePath) { + var deferred = Q.defer(); + + fs.unlink(tmpFilePath, function (err) { + if (err) { + debug('Screenshot temporary file not found, could not be deleted. But it is not a problem.'); + } else { + debug('Screenshot temporary file deleted.'); + } + + deferred.resolve(); + }); + + return deferred.promise; + }; + + this.getTmpFileRelativePath = function() { + return tmpFolderPath + '/' + tmpFileName; + }; +}; + +module.exports = new screenshotHandler(); diff --git a/package.json b/package.json index 682827f..a68ddad 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "is-webp": "1.0.1", "is-woff": "1.0.3", "is-woff2": "1.0.0", + "jimp": "0.6.0", "md5": "2.2.1", "meow": "5.0.0", "parse-color": "1.0.0",