Here’s one of the versions of code that uploads (Node JS)
// npm install twitter
const Twitter = require('twitter');
const TAPI = new Twitter({
consumer_key: Config.twitter.consumerKey,
consumer_secret: Config.twitter.consumerSecret,
access_token_key: Config.twitter.accessTokenKey,
access_token_secret: Config.twitter.accessTokenSecret,
});
function uploadMovie(pathToVideo, completionFn, errorFn)
{
const mediaType = 'video/mp4';
const mediaData = fs.readFileSync(pathToVideo);
const mediaSize = fs.statSync(pathToVideo).size;
const CHUNK_SIZE = 102400;
var init = {
command: 'INIT',
total_bytes: mediaSize,
media_type: mediaType,
media_category: 'tweet_video'
};
sendToTwitter(init, initResult => {
var segmentIndex = 0;
var srcOffset = 0;
var lastSent = false;
function nextChunk()
{
if(lastSent) {
var finalize = {
command: 'FINALIZE',
media_id: initResult.media_id_string
};
sendToTwitter(finalize, result => {
waitForReady(result.media_id_string);
},
(error, response) => {
if(response && response.body){
try{
response = JSON.parse(response.body);
errorFn(response.error);
}
catch(e) {
errorFn('failed and i cant tell you why');
}
}
else {
errorFn('failed and i cant tell you why');
}
});
}
else {
var last = srcOffset + CHUNK_SIZE;
if(last >= mediaData.length) {
last = mediaData.length;
lastSent = true;
}
var toSend = mediaData.slice(srcOffset, last);
srcOffset += CHUNK_SIZE;
var append = {
command: 'APPEND',
media_id: initResult.media_id_string,
media: toSend,
segment_index: segmentIndex++
};
sendToTwitter(append, nextChunk, error => {
errorFn('failed');
});
}
}
nextChunk();
});
function waitForReady(mediaId)
{
var params = {
command: 'STATUS',
media_id: mediaId
};
TAPI.get('media/upload', params, (error, data, response) => {
if (error) {
errorFn(error, response);
}
else {
try {
response = JSON.parse(response.body);
}
catch(e) {
return errorFn('failed and i cant tell you why');
}
if(response.processing_info.state == 'succeeded') {
return completionFn(result.media_id_string);
}
else if(response.processing_info.state == 'failed') {
return errorFn(response.processing_info.error.name + ' :: ' + response.processing_info.error.message);
}
else {
setTimeout(() => waitForReady(mediaId), 500);
}
}
});
}
function sendToTwitter(params, completionFn, errorFn)
{
TAPI.post('media/upload', params, (error, data, response) => {
if (error) {
errorFn(error, response);
}
else {
completionFn(data);
}
});
}
}