use 'request' for http actions; remove skins/tmp (was only for debugging); use buffer for skin -> avatar

This commit is contained in:
jomo 2014-10-23 23:56:52 +02:00
parent 636f93f752
commit e2348bbb9d
5 changed files with 64 additions and 48 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
skins/ skins/
*.log *.log
node_modules/ node_modules/
.DS_Store

View File

@ -13,6 +13,7 @@
"serve-favicon": "~2.1.3", "serve-favicon": "~2.1.3",
"debug": "~2.0.0", "debug": "~2.0.0",
"jade": "~1.6.0", "jade": "~1.6.0",
"lwip": "0.0.5" "lwip": "0.0.5",
"request": "2.45.0"
} }
} }

View File

@ -29,12 +29,17 @@ router.get('/:uuid/:size?', function(req, res) {
var skinurl = skins.skin_url(profile); var skinurl = skins.skin_url(profile);
if (skinurl) { if (skinurl) {
console.log('got profile, skin url is "' + skinurl + '" downloading..'); console.log('got profile, skin url is "' + skinurl + '" downloading..');
skins.skin_file(skinurl, filename, function() { skins.skin_file(skinurl, "skins/" + filename, function() {
console.log('got skin'); console.log('got skin');
skins.resize_img("skins/" + filename, size, function(data) { skins.resize_img("skins/" + filename, size, function(data) {
// tell browser to cache image locally for 10 minutes // tell browser to cache image locally for 10 minutes
var end = new Date() - start; var end = new Date() - start;
res.writeHead(200, {'Content-Type': 'image/png', 'Cache-Control': 'max-age=600, public', 'Response-Time': end, 'Storage-Type': 'downloaded'}); res.writeHead(200, {
'Content-Type': 'image/png',
'Cache-Control': 'max-age=600, public',
'Response-Time': end,
'Storage-Type': 'downloaded'
});
res.end(data); res.end(data);
}); });
}); });

View File

@ -1,19 +1,17 @@
var http = require('http'); var request = require('request');
var https = require('https');
var fs = require('fs');
var lwip = require('lwip'); var lwip = require('lwip');
var urlparse = require('url').parse;
/* /*
* Skin retrieval methods are based on @jomo's CLI Crafatar implementation. * Skin retrieval methods are based on @jomo's CLI Crafatar implementation.
* https://github.com/jomo/Crafatar * https://github.com/jomo/Crafatar
*/ */
function extract_face(inname, outname, callback) { function extract_face(buffer, outname, callback) {
var outfile = fs.createWriteStream(outname); lwip.open(buffer, "png", function(err, image) {
lwip.open(inname, function(err, image) { if (err) {
if (err) throw err; console.log('c ' + buffer.length);
throw err;
}
image.batch() image.batch()
.crop(8, 8, 15, 15) .crop(8, 8, 15, 15)
.writeFile(outname, function(err) { .writeFile(outname, function(err) {
@ -25,24 +23,28 @@ function extract_face(inname, outname, callback) {
module.exports = { module.exports = {
get_profile: function(uuid, callback) { get_profile: function(uuid, callback) {
https.get("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid, function(res) { request.get({
if (res.statusCode == "204") { url: "https://sessionserver.mojang.com/session/minecraft/profile/" + uuid,
callback(null); timeout: 1000 // ms
return null; }, function (error, response, body) {
} if (!error && response.statusCode == 200) {
res.on('data', function(d) { callback(JSON.parse(body));
var profile = JSON.parse(d); } else {
if (profile.error) { if (error) {
// usually this is something like TooManyRequestsException console.error(error);
console.error(profile.error); } else if (response.statusCode == 204 || response.statusCode == 404) {
callback(null); // we get 204 No Content when UUID doesn't exist (including 404 in case they change that)
} else if (response.statusCode == 429) {
// Too Many Requests
console.warn("Too many requests for " + uuid);
console.warn(body);
} else { } else {
callback(profile); console.error("Unknown error:");
console.error(response);
console.error(body);
} }
}); callback(null);
}
}).on('error', function(err) {
throw err;
}); });
}, },
@ -60,26 +62,33 @@ module.exports = {
return url; return url;
}, },
skin_file: function(url, filename, callback) { skin_file: function(url, outname, callback) {
var tmpname = "skins/tmp/" + filename; request.get({
var outname = "skins/" + filename; url: url,
var tmpfile = fs.createWriteStream(tmpname); encoding: null, // encoding must be null so we get a buffer
var prot = http; timeout: 1000 // ms
if (urlparse(url).protocol == "https") prot = https; }, function (error, response, body) {
prot.get(url, function(res) { if (!error && response.statusCode == 200) {
res.on('data', function(data) { extract_face(body, outname, function() {
tmpfile.write(data); callback();
}).on('end', function() {
tmpfile.end();
extract_face(tmpname, outname, function() {
fs.unlink(tmpname, function(err) { // unlink = delete
if (err) console.error(err);
});
callback(); // outside unlink callback cause we don't have to wait until it's deleted
}); });
}); } else {
}).on('error', function(err) { if (error) {
throw err; console.error(error);
} else if (response.statusCode == 404) {
console.warn("Texture not found: " + url);
} else if (response.statusCode == 429) {
// Too Many Requests
// Never got this, seems like textures aren't limited
console.warn("Too many requests for " + url);
console.warn(body);
} else {
console.error("Unknown error:");
console.error(response);
console.error(body);
}
callback(null);
}
}); });
}, },

View File