如何使用节点将分块视频上传到twitter

时间:2015-09-29 06:11:46

标签: javascript node.js video twitter twitter-rest-api

如何使用带节点的POST media/upload (chunked)端点将视频上传到Twitter?

2 个答案:

答案 0 :(得分:6)

这将完成以上链接中列出的所有步骤:INIT,APPEND,FINALIZE和STATUS

var bufferLength, filePath, finished, fs, oauthCredentials, offset, request, segment_index, theBuffer;

request = require('request');
fs = require('fs');
filePath = '/thevideo.mp4';
bufferLength = 1000000;
theBuffer = new Buffer(bufferLength);
offset = 0;
segment_index = 0;
finished = 0;
oauthCredentials = {
    consumer_key: '',
    consumer_secret: '',
    token: '',
    token_secret: ''
};

fs.stat(filePath, function(err, stats) {
    var formData, normalAppendCallback, options;

    formData = {
        command: "INIT",
        media_type: 'video/mp4',
        total_bytes: stats.size
    };
    options = {
        url: 'https://upload.twitter.com/1.1/media/upload.json',
        oauth: oauthCredentials,
        formData: formData
    };

    normalAppendCallback = function(media_id) {
        return function(err, response, body) {

            finished++;
            if (finished === segment_index) {

                options.formData = {
                    command: 'FINALIZE',
                    media_id: media_id
                };
                request.post(options, function(err, response, body) {
                    console.log('FINALIZED',response.statusCode,body);

                    delete options.formData;

                    //Note: This is not working as expected yet.
                    options.qs = {
                        command: 'STATUS',
                        media_id: media_id
                    };
                    request.get(options, function(err, response, body) {
                        console.log('STATUS: ', response.statusCode, body);
                    });
                });
            }
        };
    };


    request.post(options, function(err, response, body) {
        var media_id;
        media_id = JSON.parse(body).media_id_string;

        fs.open(filePath, 'r', function(err, fd) {
            var bytesRead, data;

            while (offset < stats.size) {

                bytesRead = fs.readSync(fd, theBuffer, 0, bufferLength, null);
                data = bytesRead < bufferLength ? theBuffer.slice(0, bytesRead) : theBuffer;
                options.formData = {
                    command: "APPEND",
                    media_id: media_id,
                    segment_index: segment_index,
                    media_data: data.toString('base64')
                };
                request.post(options, normalAppendCallback(media_id));
                offset += bufferLength;
                segment_index++
            }
        });
    });
});

答案 1 :(得分:1)

请试试这个

const splitFile = require('split-file');
var Twitter = require('twitter');

const pathToMovie = __dirname + '/test/152.mp4';
const mediaType = 'video/mp4'; // `'video/mp4'` is also supported
var mediaData, Names;
const mediaSize = require('fs').statSync(pathToMovie).size;
/*Twitter support Maximum  15MB video files. So we need to split this file in to three files */
splitFile.splitFile(pathToMovie, 3)
  .then((names) => {
    Names = names;
    init();
  })
  .catch((err) => {
    console.log('Error: ', err);
  });





const client = new Twitter({
  consumer_key: '<your consumer_key >',
  consumer_secret: '<your consumer_secret >',
  access_token_key: '<your access_token_key >',
  access_token_secret: '<access_token_secret>'
});


function init() {
  initTweetUpload(mediaSize,  mediaType) // Declare that you wish to upload some media
    .then(appendTweetUpload) // Send the data for the media
    .then(appendTweetUpload) // Send the data for the media
    .then(appendTweetUpload) // Send the data for the media
    .then(finalizeTweetUpload) // Declare that you are done uploading chunks
    .then(function(data) {
      var status = {
        media_ids: data,
        status: 'From my node'
      }
      client.post('statuses/update', status, function(error, tweet, response) {
        console.log(error)
        console.log(tweet)
      });
    });
}

function initTweetUpload(mediaSize,  mediaType) {
  return makePost('media/upload', {
    command: 'INIT',
    total_bytes: mediaSize,
    media_type: mediaType,
  }).then(data => data.media_id_string);
}

var i = 0;

function appendTweetUpload(mediaId) {
  var p = Names.shift();
  /*mediaData is the  raw binary file content being uploaded ,It must be <= 5 MB*/
  const mediaData = require('fs').readFileSync(p);
  return makePost('media/upload', {
    command: 'APPEND',
    media_id: mediaId,
    media: mediaData,
    segment_index: i++
  }).then(data => mediaId);
}

function finalizeTweetUpload(mediaId) {
  return makePost('media/upload', {
    command: 'FINALIZE',
    media_id: mediaId
  }).then(data => mediaId);
}

function makePost(endpoint, params) {
  // params.media_category = 'tweet_video';
  return new Promise((resolve, reject) => {
    client.post(endpoint, params, (error, data, response) => {
      if (error) {
        reject(error);
      } else {
        resolve(data);
      }
    });
  });
}

依赖

  1. https://www.npmjs.com/package/twitter
  2. https://www.npmjs.com/package/split-file