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
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
skins/
|
||||
*.log
|
||||
node_modules/
|
||||
.DS_Store
|
||||
|
||||
@ -13,6 +13,7 @@
|
||||
"serve-favicon": "~2.1.3",
|
||||
"debug": "~2.0.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);
|
||||
if (skinurl) {
|
||||
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');
|
||||
skins.resize_img("skins/" + filename, size, function(data) {
|
||||
// tell browser to cache image locally for 10 minutes
|
||||
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);
|
||||
});
|
||||
});
|
||||
|
||||
97
skins.js
97
skins.js
@ -1,19 +1,17 @@
|
||||
var http = require('http');
|
||||
var https = require('https');
|
||||
var fs = require('fs');
|
||||
var request = require('request');
|
||||
var lwip = require('lwip');
|
||||
var urlparse = require('url').parse;
|
||||
|
||||
|
||||
/*
|
||||
* Skin retrieval methods are based on @jomo's CLI Crafatar implementation.
|
||||
* https://github.com/jomo/Crafatar
|
||||
*/
|
||||
|
||||
function extract_face(inname, outname, callback) {
|
||||
var outfile = fs.createWriteStream(outname);
|
||||
lwip.open(inname, function(err, image) {
|
||||
if (err) throw err;
|
||||
function extract_face(buffer, outname, callback) {
|
||||
lwip.open(buffer, "png", function(err, image) {
|
||||
if (err) {
|
||||
console.log('c ' + buffer.length);
|
||||
throw err;
|
||||
}
|
||||
image.batch()
|
||||
.crop(8, 8, 15, 15)
|
||||
.writeFile(outname, function(err) {
|
||||
@ -25,24 +23,28 @@ function extract_face(inname, outname, callback) {
|
||||
|
||||
module.exports = {
|
||||
get_profile: function(uuid, callback) {
|
||||
https.get("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid, function(res) {
|
||||
if (res.statusCode == "204") {
|
||||
callback(null);
|
||||
return null;
|
||||
}
|
||||
res.on('data', function(d) {
|
||||
var profile = JSON.parse(d);
|
||||
if (profile.error) {
|
||||
// usually this is something like TooManyRequestsException
|
||||
console.error(profile.error);
|
||||
callback(null);
|
||||
request.get({
|
||||
url: "https://sessionserver.mojang.com/session/minecraft/profile/" + uuid,
|
||||
timeout: 1000 // ms
|
||||
}, function (error, response, body) {
|
||||
if (!error && response.statusCode == 200) {
|
||||
callback(JSON.parse(body));
|
||||
} else {
|
||||
if (error) {
|
||||
console.error(error);
|
||||
} else if (response.statusCode == 204 || response.statusCode == 404) {
|
||||
// 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 {
|
||||
callback(profile);
|
||||
console.error("Unknown error:");
|
||||
console.error(response);
|
||||
console.error(body);
|
||||
}
|
||||
});
|
||||
|
||||
}).on('error', function(err) {
|
||||
throw err;
|
||||
callback(null);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
@ -60,26 +62,33 @@ module.exports = {
|
||||
return url;
|
||||
},
|
||||
|
||||
skin_file: function(url, filename, callback) {
|
||||
var tmpname = "skins/tmp/" + filename;
|
||||
var outname = "skins/" + filename;
|
||||
var tmpfile = fs.createWriteStream(tmpname);
|
||||
var prot = http;
|
||||
if (urlparse(url).protocol == "https") prot = https;
|
||||
prot.get(url, function(res) {
|
||||
res.on('data', function(data) {
|
||||
tmpfile.write(data);
|
||||
}).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
|
||||
skin_file: function(url, outname, callback) {
|
||||
request.get({
|
||||
url: url,
|
||||
encoding: null, // encoding must be null so we get a buffer
|
||||
timeout: 1000 // ms
|
||||
}, function (error, response, body) {
|
||||
if (!error && response.statusCode == 200) {
|
||||
extract_face(body, outname, function() {
|
||||
callback();
|
||||
});
|
||||
});
|
||||
}).on('error', function(err) {
|
||||
throw err;
|
||||
} else {
|
||||
if (error) {
|
||||
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