screenshotHandler.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. var debug = require('debug')('ylt:screenshotHandler');
  2. var Jimp = require('jimp');
  3. var Q = require('q');
  4. var fs = require('fs');
  5. var path = require('path');
  6. var screenshotHandler = function() {
  7. var tmpFolderPath = 'tmp';
  8. var tmpFolderFullPath = path.join(__dirname, '..', tmpFolderPath);
  9. var tmpFileName = 'temp-screenshot.png';
  10. var tmpFileFullPath = path.join(tmpFolderFullPath, tmpFileName);
  11. this.findAndOptimizeScreenshot = function(width) {
  12. var that = this;
  13. debug('Starting screenshot transformation');
  14. return this.openImage(tmpFileFullPath)
  15. .then(function(image) {
  16. that.deleteTmpFile(tmpFileFullPath);
  17. return that.resizeImage(image, width);
  18. })
  19. .then(this.toBuffer);
  20. };
  21. this.openImage = function(imagePath) {
  22. var deferred = Q.defer();
  23. Jimp.read(imagePath, function(err, image){
  24. if (err) {
  25. debug('Could not open imagePath %s', imagePath);
  26. debug(err);
  27. deferred.reject(err);
  28. } else {
  29. debug('Image correctly open');
  30. deferred.resolve(image);
  31. }
  32. });
  33. return deferred.promise;
  34. };
  35. this.resizeImage = function(image, newWidth) {
  36. var deferred = Q.defer();
  37. var currentWidth = image.bitmap.width;
  38. if (currentWidth > 0) {
  39. var ratio = newWidth / currentWidth;
  40. image.scale(ratio, function(err, image){
  41. if (err) {
  42. debug('Could not resize image');
  43. debug(err);
  44. deferred.reject(err);
  45. } else {
  46. debug('Image correctly resized');
  47. deferred.resolve(image);
  48. }
  49. });
  50. } else {
  51. deferred.reject('Could not resize an empty image');
  52. }
  53. return deferred.promise;
  54. };
  55. this.toBuffer = function(image) {
  56. var deferred = Q.defer();
  57. image.quality(85).getBuffer(Jimp.MIME_JPEG, function(err, buffer){
  58. if (err) {
  59. debug('Could not save image to buffer');
  60. debug(err);
  61. deferred.reject(err);
  62. } else {
  63. debug('Image correctly transformed to buffer');
  64. deferred.resolve(buffer);
  65. }
  66. });
  67. return deferred.promise;
  68. };
  69. this.deleteTmpFile = function(tmpFilePath) {
  70. var deferred = Q.defer();
  71. fs.unlink(tmpFilePath, function (err) {
  72. if (err) {
  73. debug('Screenshot temporary file not found, could not be deleted. But it is not a problem.');
  74. } else {
  75. debug('Screenshot temporary file deleted.');
  76. }
  77. deferred.resolve();
  78. });
  79. return deferred.promise;
  80. };
  81. // Create a /tmp folder on the project's root directory
  82. this.createTmpScreenshotFolder = function() {
  83. var deferred = Q.defer();
  84. // Create the folder if it doesn't exist
  85. fs.exists(tmpFolderFullPath, function(exists) {
  86. if (exists) {
  87. deferred.resolve();
  88. } else {
  89. debug('Creating the tmp image folder', tmpFolderFullPath);
  90. fs.mkdir(tmpFolderFullPath, function(err) {
  91. if (err) {
  92. deferred.reject(err);
  93. } else {
  94. deferred.resolve();
  95. }
  96. });
  97. }
  98. });
  99. return deferred.promise;
  100. };
  101. this.getTmpFileRelativePath = function() {
  102. return tmpFolderPath + '/' + tmpFileName;
  103. };
  104. };
  105. module.exports = new screenshotHandler();