Skip to content

Instantly share code, notes, and snippets.

@qrpike
Created January 11, 2018 00:10
Show Gist options
  • Save qrpike/c4386b85681db30bb5a78178e378d6fe to your computer and use it in GitHub Desktop.
Save qrpike/c4386b85681db30bb5a78178e378d6fe to your computer and use it in GitHub Desktop.
'use strict'
// Load in Route Class
const Route = require('restify-loader/route')
const lodash = require('lodash')
const sharp = require('sharp')
const Promise = require('bluebird')
const request = require('request-promise')
const S3_HOST = process.env.S3_HOST || 'https://s3.stackdot.com/sketch-storage'
console.log('S3 HOST:', S3_HOST)
// Create Route
module.exports = class Thumbnail extends Route {
init(){
this.S3 = this.params.S3
this.debug( 'Thumbnail API')
this.addListeners()
}
addListeners(){
this.debug( 'Adding Listeners' )
this.server.get({ url: '/thumbnail/:user/:sketch/:version/:artboard',
validation: {
resources: {
size: {
isRequired: false,
min: 16,
max: 3000
},
sizeh: {
isRequired: false,
min: 16,
max: 3000
},
quality: {
isRequired: false,
min: 20,
max: 100
},
scaleOnly: {
isRequired: false,
isBoolean: true
}
}
}
}, this.getStatus.bind( this ))
}
cropImage( img, settings ){
return sharp( img )
.resize( 2500, 2500 )
.min()
.withoutEnlargement()
.toBuffer()
.then(( sharpImg ) => {
return sharp( sharpImg )
.resize( settings.sizew, settings.size )
.min()
.crop(sharp.gravity.northwest)
.jpeg({ progressive: true, quality: settings.quality })
.toBuffer()
})
}
scaleOnly( img, settings ){
return sharp( img )
.resize( settings.sizew, settings.size )
.min()
.withoutEnlargement()
.jpeg({ progressive: true, quality: settings.quality })
.toBuffer()
}
getStatus( req, res, next ){
this.debug('got req')
// Defaults:
let size = 600
if( req.params.size ) size = parseInt( req.params.size )
let sizew = size
if( req.params.sizew ) sizew = parseInt( req.params.sizew )
let quality = 98
if( req.params.quality ) quality = parseInt( req.params.quality )
let scaleOnly = req.params.scaleOnly || false
let settings = {
size: size,
sizew: sizew,
quality: quality,
scaleOnly: scaleOnly
}
let url = `${S3_HOST}/${req.params.user}/${req.params.sketch}/${req.params.version}/${req.params.artboard}`
this.getImage( url )
.then(( img ) => {
if( scaleOnly ){
return this.scaleOnly( img, settings )
}
return this.cropImage( img, settings )
})
.then(( buffer ) => {
res.set('Content-Type','image/jpeg')
res.write(buffer)
res.end()
})
.catch(next)
}
getImage( url ){
return request({
uri: url,
encoding: null
})
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment