assetdownload.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. const fs = require('fs')
  2. const request = require('request')
  3. const path = require('path')
  4. const mkpath = require('mkdirp');
  5. const async = require('async')
  6. function Asset(from, to, size){
  7. this.from = from
  8. this.to = to
  9. this.size = size
  10. }
  11. exports.getMojangAssets = function(version, basePath){
  12. const name = version + '.json'
  13. const indexURL = 'https://s3.amazonaws.com/Minecraft.Download/indexes/' + name
  14. const resourceURL = 'http://resources.download.minecraft.net/'
  15. const localPath = path.join(basePath, 'assets')
  16. const indexPath = path.join(localPath, 'indexes')
  17. const objectPath = path.join(localPath, 'objects')
  18. request.head(indexURL, function (err, res, body) {
  19. console.log('Downloading ' + version + ' asset index.')
  20. mkpath.sync(indexPath)
  21. const stream = request(indexURL).pipe(fs.createWriteStream(path.join(indexPath, name)))
  22. stream.on('finish', function() {
  23. const data = JSON.parse(fs.readFileSync(path.join(indexPath, name), 'utf-8'))
  24. const assetArr = []
  25. let datasize = 0;
  26. Object.keys(data['objects']).forEach(function(key, index){
  27. const ob = data['objects'][key]
  28. const hash = String(ob['hash'])
  29. const assetName = path.join(hash.substring(0, 2), hash)
  30. const urlName = hash.substring(0, 2) + "/" + hash
  31. const ast = new Asset(resourceURL + urlName, path.join(objectPath, assetName), ob['size'])
  32. datasize += ob['size']
  33. assetArr.push(ast)
  34. })
  35. let acc = 0;
  36. async.eachLimit(assetArr, 5, function(asset, cb){
  37. mkpath.sync(path.join(asset.to, ".."))
  38. let req = request(asset.from)
  39. let writeStream = fs.createWriteStream(asset.to)
  40. req.pipe(writeStream)
  41. req.on('data', function(chunk){
  42. acc += chunk.length
  43. console.log('Progress', acc/datasize)
  44. })
  45. writeStream.on('close', function(){
  46. cb()
  47. })
  48. }, function(err){
  49. if(err){
  50. console.log('A file failed to process');
  51. } else {
  52. console.log('All files have been processed successfully');
  53. }
  54. })
  55. })
  56. })
  57. }