UNPKG

vigour-shutter

Version:

Makes a sprite out of an array of urls

132 lines (124 loc) 2.53 kB
'use strict' var fs = require('vigour-fs/lib/server') , imgManip = require('./imgManip') , util = require('./util') , config = require('./config') module.exports = exports = {} exports.requestSprite = function (pathToSpriteData, data, params, tmpDir, dimensions, out, cb) { var items = dive(data.raw, pathToSpriteData) if (items) { getSprite(items, params, tmpDir, dimensions, out, cb) } else { cb({ status: 400 , msg: config.invalidRequestMessage }) } } function getSprite (items, params, tmpDir, dimensions, out, cb) { var ids = [] , l , i , nbLeft , id , url , path , paths = [] , errMessage for (item in items) { ids[items[item].number - 1] = items[item].img } nbLeft = l = ids.length if (l === 0) { cb({ status: 400 , msg: config.invalidRequestMessage }) } else { for (i = 0; i < l; i += 1) { if (ids[i]) { id = ids[i] url = util.urlFromId(id) path = tmpDir + '/' + ids[i] } else { url = false path = '../images/mtv_logo_placeholder.png' } paths.push(path) if (url) { fs.writeFile(path, url, { maxTries: config.maxTries , retryOn404: true // MTV sometimes responds with 404 even when retries work } , function (err) { if (err) { errMessage = "\nDownload error (" + url + "). " log.error(errMessage, err) cb({ status: 500 , msg: errMessage + err }) util.cleanup(tmpDir) } else { nbLeft -= 1 getSpriteIfReady(nbLeft , paths , dimensions , tmpDir , out , cb) } }) } else { nbLeft -= 1 getSpriteIfReady(nbLeft , paths , dimensions , tmpDir , out , cb) } } } } function getSpriteIfReady (nbLeft, paths, dimensions, tmpDir, out, cb) { if (nbLeft === 0) { imgManip.sprite(paths , dimensions , tmpDir , config.maxCols , out , function (err, spriteName) { var errMessage if (err) { errMessage = "\nError creating sprite: " log.error(errMessage, err) cb({ status: 500 , msg: errMessage + err }) util.cleanup(tmpDir) } else { cb(null, spriteName, function (err) { if (err) { log.error(err) } util.cleanup(tmpDir) }) } }) } } function dive (obj, path) { var r = obj , l = path.length , i for (i = 0; i < l; i += 1) { r = r[path[i]] if (!r) { console.error(path[i] + ' not found') return false } } return r }