screenshotHandler.js 3.3 KB

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