mirror of
https://github.com/azures04/crafatar.git
synced 2026-03-21 23:41:18 +01:00
use 'request' for http actions; remove skins/tmp (was only for debugging); use buffer for skin -> avatar
This commit is contained in:
parent
636f93f752
commit
e2348bbb9d
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
skins/
|
skins/
|
||||||
*.log
|
*.log
|
||||||
node_modules/
|
node_modules/
|
||||||
|
.DS_Store
|
||||||
|
|||||||
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
97
skins.js
97
skins.js
@ -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);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user