Twitter video upload function
tamasvar opened this issue · 5 comments
Which node are you reporting an issue on?
node-red-node-twitter
I would like to be able to upload larger files to Twitter. this already works in node.js
The node.js code must be converted to node-red
node.js:
const Twitter = require("twitter")
const dotenv = require("dotenv")
const fs = require("fs")
dotenv.config()
const client = new Twitter({
consumer_key: process.env.CONSUMER_KEY,
consumer_secret: process.env.CONSUMER_SECRET,
access_token_key: process.env.ACCESS_TOKEN_KEY,
access_token_secret: process.env.ACCESS_TOKEN_SECRET
})
const pathToFile = "./media/homer.gif"
const mediaType = "image/gif"
const mediaData = fs.readFileSync(pathToFile)
const mediaSize = fs.statSync(pathToFile).size
initializeMediaUpload()
.then(appendFileChunk)
.then(finalizeUpload)
.then(publishStatusUpdate)
function initializeMediaUpload() {
return new Promise(function(resolve, reject) {
client.post("media/upload", {
command: "INIT",
total_bytes: mediaSize,
media_type: mediaType
}, function(error, data, response) {
if (error) {
console.log(error)
reject(error)
} else {
resolve(data.media_id_string)
}
})
})
}
function appendFileChunk(mediaId) {
return new Promise(function(resolve, reject) {
client.post("media/upload", {
command: "APPEND",
media_id: mediaId,
media: mediaData,
segment_index: 0
}, function(error, data, response) {
if (error) {
console.log(error)
reject(error)
} else {
resolve(mediaId)
}
})
})
}
function finalizeUpload(mediaId) {
return new Promise(function(resolve, reject) {
client.post("media/upload", {
command: "FINALIZE",
media_id: mediaId
}, function(error, data, response) {
if (error) {
console.log(error)
reject(error)
} else {
resolve(mediaId)
}
})
})
}
function publishStatusUpdate(mediaId) {
return new Promise(function(resolve, reject) {
client.post("statuses/update", {
status: "I tweeted from Node.js!",
media_ids: mediaId
}, function(error, data, response) {
if (error) {
console.log(error)
reject(error)
} else {
console.log("Successfully uploaded media and tweeted!")
resolve(data)
}
})
})
}
'''
var mediaPromise;
if (msg.media && Buffer.isBuffer(msg.media)) {
mediaPromise = node.twitterConfig.post("https://upload.twitter.com/1.1/media/upload.json",{
command: "INIT",
total_bytes: msg.mediaSize,
media_type: msg.mediaType
}).then(function(result) {
if (result.status === 200) {
return result.body.media_id_string;
} else {
throw new Error(result.body.errors[0]);
}
});
mediaPromise = node.twitterConfig.post("https://upload.twitter.com/1.1/media/upload.json",{
command: "APPEND",
media_id: mediaId,
media: msg.media,
segment_index: 0
}).then(function(result) {
if (result.status === 200) {
return result.media_id;
} else {
throw new Error(result.body.errors[0]);
}
});
mediaPromise = node.twitterConfig.post("https://upload.twitter.com/1.1/media/upload.json",{
command: "FINALIZE",
media_id: mediaId
}).then(function(result) {
if (result.status === 200) {
return result.media_id;
} else {
throw new Error(result.body.errors[0]);
}
});
} else {
mediaPromise = Promise.resolve();
}
mediaPromise.then(function(mediaId) {
var params = msg.params || {};
params.status = msg.payload;
if (mediaId) {
params.media_ids = mediaId;
}
node.twitterConfig.post("https://api.twitter.com/1.1/statuses/update.json",{},params).then(function(result) {
if (result.status === 200) {
node.status({});
} else {
node.status({fill:"red",shape:"ring",text:"twitter.status.failed"});
if ('error' in result.body && typeof result.body.error === 'string') {
node.error(result.body.error,msg);
} else {
node.error(result.body.errors[0].message,msg);
}
}
}).catch(function(err) {
node.status({fill:"red",shape:"ring",text:"twitter.status.failed"});
node.error(err,msg);
})
}).catch(function(err) {
node.status({fill:"red",shape:"ring",text:"twitter.status.failed"});
node.error(err,msg);
}); '''
If you want to submit code to the project, please do so as a pull request. It means we can review it in context of the existing code and we can check it out and test it.
Please let us know if you need a pointer to a guide on how to raise a pull request.
I know that the code doesn't work yet, that's why I wrote it here in case someone could fix it so that it works
It will still be better presented as a (draft) pull request, so that people can test and examine the code in context. As it is we don't know where this would fit into the existing code.