screenshotHandler.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. this.findAndOptimizeScreenshot = function(width) {
  8. var that = this;
  9. debug('Starting screenshot transformation');
  10. return this.openImage(this.getTmpFileRelativePath())
  11. .then(function(image) {
  12. that.deleteTmpFile(that.getTmpFileRelativePath());
  13. return that.resizeImage(image, width);
  14. })
  15. .then(this.toBuffer);
  16. };
  17. this.openImage = function(imagePath) {
  18. var deferred = Q.defer();
  19. Jimp.read(imagePath, function(err, image){
  20. if (err) {
  21. debug('Could not open imagePath %s', imagePath);
  22. debug(err);
  23. deferred.reject(err);
  24. } else {
  25. debug('Image correctly open');
  26. deferred.resolve(image);
  27. }
  28. });
  29. return deferred.promise;
  30. };
  31. this.resizeImage = function(image, newWidth) {
  32. var deferred = Q.defer();
  33. var currentWidth = image.bitmap.width;
  34. if (currentWidth > 0) {
  35. var ratio = newWidth / currentWidth;
  36. image.scale(ratio, function(err, image){
  37. if (err) {
  38. debug('Could not resize image');
  39. debug(err);
  40. deferred.reject(err);
  41. } else {
  42. debug('Image correctly resized');
  43. deferred.resolve(image);
  44. }
  45. });
  46. } else {
  47. deferred.reject('Could not resize an empty image');
  48. }
  49. return deferred.promise;
  50. };
  51. this.toBuffer = function(image) {
  52. var deferred = Q.defer();
  53. image.quality(85).getBuffer(Jimp.MIME_JPEG, function(err, buffer){
  54. if (err) {
  55. debug('Could not save image to buffer');
  56. debug(err);
  57. deferred.reject(err);
  58. } else {
  59. debug('Image correctly transformed to buffer');
  60. deferred.resolve(buffer);
  61. }
  62. });
  63. return deferred.promise;
  64. };
  65. this.deleteTmpFile = function(tmpFilePath) {
  66. var deferred = Q.defer();
  67. fs.unlink(this.getTmpFileRelativePath(), function (err) {
  68. if (err) {
  69. debug('Screenshot temporary file not found, could not be deleted. But it is not a problem.');
  70. } else {
  71. debug('Screenshot temporary file deleted.');
  72. }
  73. deferred.resolve();
  74. });
  75. return deferred.promise;
  76. };
  77. this.getTmpFileRelativePath = function() {
  78. // Chrome saves a temporary file on the disk, which is then removed.
  79. // Its default folder is /tmp, but it can be changed in server_config/settings.json
  80. var serverSettings = require('../server_config/settings.json');
  81. var tmpFolderPath = serverSettings.screenshotTempPath || '/tmp';
  82. var tmpFileName = 'temp-chrome-screenshot.png';
  83. var tmpFileFullPath = path.join(tmpFolderPath, tmpFileName);
  84. return tmpFileFullPath;
  85. };
  86. };
  87. module.exports = new screenshotHandler();