将节点中的一系列大文件上载到Web API

时间:2016-10-25 03:22:38

标签: node.js rest api request mixcloud

我正在尝试创建一个节点脚本来遍历大文件的文件夹(包含1小时音乐集的mp3),并通过他们的API将它们上传到Mixcloud。它的工作原理除了它达到API速率限制并需要等待x秒 - 我设置一个超时并循环回到开始,但在设定的时间后,进程退出并且不记录任何有用的输出。这是由于我的代码中的错误,还是我运行它的方式?我目前正在使用sudo nohup node index.js > log.log运行它,这是不正确的?我的最终目标是一个脚本,可以在我们广播电台每天结束时运行并上传存档文件。

const restler = require('restler');
const fs = require('fs');
const readDir = require('readdir');
const powerOff = require('power-off');

const options = {
  folder: 'files',
  completefolder: 'complete',
  accesstoken: 'xxxxxxxxxxxxxxxxxxxxxxx'
}

// shut down computer
const shutDown = () => {powerOff((err, stderr, stdout) => {
      if(!err && !stderr) {
          console.log(stdout);
      }
  })
};

// uploadFile uploads file with restler to mixcloud, if api returns rate limiting object, try again in x seconds
const uploadFile = (folder, filename) => {
  const filepath = `./${folder}/${filename}`
  fs.stat(`./${folder}/${filename}`, function(err, stats) {
      const size = stats.size;
      restler.post(`https://api.mixcloud.com/upload/?access_token=${options.accesstoken}`, {
          multipart: true,
          data: {
              "mp3": restler.file(`./${folder}/${filename}`, null, size, null, 'audio/mpeg'),
              "name": filename,
              // "unlisted": true

              // more data can be added here depending on changes in workflow, automate images etc
          }
      }).on("complete", function(data) {
          const returned = JSON.parse(data);
          if (returned.error) {
            if (returned.error.type == "RateLimitException") {
              // try again in x seconds
              console.log(`uploading too fast, retrying upload of ${filename}after ${returned.error.retry_after} seconds`);
              setTimeout(() => {(folder, filename) => uploadFile}, returned.error.retry_after*1000);
            }
            else {
              console.log('non-rate-limiting error');
              console.log(returned);
            }
          }
          else {
            console.log('Success!');
            console.log(returned);
            // move uploaded files into completed folder
            fs.rename(`./${folder}/${filename}`, `./${options.completefolder}/${filename}`, (err)=> {
              if (err) {
                console.log(err)
              }
              else {
                counter += 1;
                console.log(counter);
                if (counter === files.length) {
                  console.log('done');
                  shutDown();
                }
              }
            })
          }
      });
  });
};

// get all mp3s and upload all of them
const files = readDir.readSync(`./${options.folder}`, ['**.mp3'] );
let counter = 0;
for (var i = 0; i < files.length; i++) {
  uploadFile(options.folder, files[i])
};

0 个答案:

没有答案