assetdownload.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. const fs = require('fs')
  2. const request = require('request')
  3. const path = require('path')
  4. var mkpath = require('mkdirp');
  5. function Asset(from, to, size){
  6. this.from = from
  7. this.to = to
  8. this.size = size
  9. }
  10. exports.getMojangAssets = function(version, basePath){
  11. const name = version + '.json'
  12. const indexURL = 'https://s3.amazonaws.com/Minecraft.Download/indexes/' + name
  13. const resourceURL = 'http://resources.download.minecraft.net/'
  14. const localPath = path.join(basePath, 'assets')
  15. const indexPath = path.join(localPath, 'indexes')
  16. const objectPath = path.join(localPath, 'objects')
  17. request.head(indexURL, function (err, res, body) {
  18. console.log('Downloading ' + version + ' asset index.')
  19. mkpath.sync(indexPath)
  20. let stream = request(indexURL).pipe(fs.createWriteStream(path.join(indexPath, name)))
  21. stream.on('finish', function() {
  22. let data = JSON.parse(fs.readFileSync(path.join(indexPath, name), 'utf-8'))
  23. let assetArr = []
  24. Object.keys(data['objects']).forEach(function(key, index){
  25. let ob = data['objects'][key]
  26. let hash = String(ob['hash'])
  27. let assetName = path.join(hash.substring(0, 2), hash)
  28. let urlName = hash.substring(0, 2) + "/" + hash
  29. let ast = new Asset(resourceURL + urlName, path.join(objectPath, assetName), ob['size'])
  30. assetArr.push(ast)
  31. })
  32. assetArr.forEach(function(item, index){
  33. mkpath.sync(path.join(item.to, ".."))
  34. console.log("downloading asset from " + item.from + " to " + item.to)
  35. request(item.from).pipe(fs.createWriteStream(item.to))
  36. })
  37. })
  38. })
  39. }