Turn audio into a shareable video. forked from nypublicradio/audiogram

remote.js 1.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. var AWS = require("aws-sdk"),
  2. fs = require("fs");
  3. module.exports = function(bucket, storagePath) {
  4. var s3 = new AWS.S3({
  5. params: { Bucket: bucket },
  6. endpoint: process.env.S3_ENDPOINT || 's3.amazonaws.com'
  7. });
  8. // Test credentials
  9. s3.headBucket({}, function(err){ if (err) { throw err; } });
  10. function upload(source, key, cb) {
  11. var params = {
  12. Key: storagePath + key,
  13. Body: fs.createReadStream(source)
  14. };
  15. // gzipping results in inconsistent file size :(
  16. s3.putObject(params, cb);
  17. }
  18. function download(key, destination, cb) {
  19. var file = fs.createWriteStream(destination)
  20. .on("error", cb)
  21. .on("close", cb);
  22. s3.getObject({ Key: storagePath + key })
  23. .createReadStream()
  24. .pipe(file);
  25. }
  26. function clean(cb) {
  27. s3.listObjects({ Prefix: storagePath }, function(err, data){
  28. if (err || !data.Contents || !data.Contents.length) {
  29. return cb(err);
  30. }
  31. var objects = data.Contents.map(function(obj) {
  32. return { Key: obj.Key };
  33. });
  34. deleteObjects(objects, !!data.IsTruncated, cb);
  35. });
  36. }
  37. function deleteObjects(objects, truncated, cb) {
  38. s3.deleteObjects({ Delete: { Objects: objects } }, function(err, data){
  39. if (err) {
  40. return cb(err);
  41. }
  42. if (truncated) {
  43. return clean(cb);
  44. }
  45. return cb(null);
  46. });
  47. }
  48. // TODO make this more configurable
  49. function getURL(id) {
  50. return "https://" + bucket + "/" + storagePath + "video/" + id + ".mp4";
  51. }
  52. return {
  53. upload: upload,
  54. download: download,
  55. getURL: getURL,
  56. clean: clean
  57. };
  58. };