screenshotHandler.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. var debug = require('debug')('ylt:screenshotHandler');
  2. var lwip = require('lwip');
  3. var tmp = require('temporary');
  4. var Q = require('q');
  5. var fs = require('fs');
  6. var path = require('path');
  7. var screenshotHandler = function() {
  8. this.getScreenshotTempFile = function() {
  9. var screenshotTmpFolder = new tmp.Dir();
  10. var tmpFilePath = path.join(screenshotTmpFolder.path, 'screenshot.jpg');
  11. var that = this;
  12. return {
  13. getTmpFolder: function() {
  14. return screenshotTmpFolder;
  15. },
  16. getTmpFilePath: function() {
  17. return tmpFilePath;
  18. },
  19. toThumbnail: function(width) {
  20. return that.optimize(tmpFilePath, width);
  21. },
  22. deleteTmpFile: function() {
  23. return that.deleteTmpFileAndFolder(tmpFilePath, screenshotTmpFolder);
  24. }
  25. };
  26. };
  27. this.optimize = function(imagePath, width) {
  28. var that = this;
  29. debug('Starting screenshot transformation');
  30. return this.openImage(imagePath)
  31. .then(function(image) {
  32. return that.resizeImage(image, width);
  33. })
  34. .then(this.toBuffer);
  35. };
  36. this.openImage = function(imagePath) {
  37. var deferred = Q.defer();
  38. lwip.open(imagePath, function(err, image){
  39. if (err) {
  40. debug('Could not open imagePath %s', imagePath);
  41. debug(err);
  42. deferred.reject(err);
  43. } else {
  44. debug('Image correctly open');
  45. deferred.resolve(image);
  46. }
  47. });
  48. return deferred.promise;
  49. };
  50. this.resizeImage = function(image, newWidth) {
  51. var deferred = Q.defer();
  52. var currentWidth = image.width();
  53. var ratio = newWidth / currentWidth;
  54. image.scale(ratio, function(err, image){
  55. if (err) {
  56. debug('Could not resize image');
  57. debug(err);
  58. deferred.reject(err);
  59. } else {
  60. debug('Image correctly resized');
  61. deferred.resolve(image);
  62. }
  63. });
  64. return deferred.promise;
  65. };
  66. this.toBuffer = function(image) {
  67. var deferred = Q.defer();
  68. image.toBuffer('jpg', {quality: 85}, function(err, buffer){
  69. if (err) {
  70. debug('Could not save image to buffer');
  71. debug(err);
  72. deferred.reject(err);
  73. } else {
  74. debug('Image correctly transformed to buffer');
  75. deferred.resolve(buffer);
  76. }
  77. });
  78. return deferred.promise;
  79. };
  80. this.deleteTmpFileAndFolder = function(tmpFilePath, screenshotTmpFolder) {
  81. var deferred = Q.defer();
  82. fs.unlink(tmpFilePath, function (err) {
  83. if (err) {
  84. debug('Screenshot file not found, could not be deleted. But it is not a problem.');
  85. } else {
  86. debug('Screenshot file deleted.');
  87. }
  88. screenshotTmpFolder.rmdir();
  89. debug('Screenshot temp folder deleted');
  90. deferred.resolve();
  91. });
  92. return deferred.promise;
  93. };
  94. };
  95. module.exports = new screenshotHandler();