UNPKG

@speakr/speakr-module-services

Version:
284 lines (258 loc) • 9.55 kB
'use strict'; const db = require('../../db'); const fs = require('fs'); const path = require('path'); const env = require('../../env/'); const AWS = require('aws-sdk'); // const ffmpeg = require('fluent-ffmpeg'); // const ffmpegStatic = require('ffmpeg-static'); // // ffmpeg.setFfmpegPath(ffmpegStatic.path); const BUCKET_NAME = env.AWS_S3_BUCKET || 'initiatives-media'; AWS.config = { accessKeyId: env.AWS_S3_ACCESS_KEY, secretAccessKey: env.AWS_S3_SECRET_KEY, region: env.AWS_REGION }; const s3 = new AWS.S3(); module.exports = { convertAndUpload, formatResponse, formatThumbnail, formatResponseInfluencersApp, uploadAccountImport }; function convertAndUpload(options) { options.localPath = path.join(__dirname, `../../../../../tmp/${options.req.file.filename}`); console.log('1 STARTING UPLOAD') return new Promise(( resolve, reject ) => { const platform = options.req.body.platform; console.log('2 SKIPPING IMG CONVERSION'); return setDimension(options, resolve, reject); // if (platform === 'Twitter' || platform === 'Facebook' ) { // return getDimension(options, resolve, reject); // } else { // console.log('2 SKIPPING IMG CONVERSION'); // return setDimension(options, resolve, reject); // } }) } // function getDimension(options, resolve, reject) { // // 6: Checking file type to be converted and getting dimensions // let mime = options.req.file.mimetype; // let file = options.req.file; // // console.log('2 PROBING IMAGE'); // if(mime === 'image/png' || mime === 'image/jpeg'){ // ffmpeg.ffprobe(options.localPath, function (err, metadata) { // if (err) { // console.log('ERR IN PROBE', err); // return reject(err); // } // console.log('3 PROBE SUCCESSFUL'); // options.imageWidth = metadata.streams[0].width; // options.imageHeight = metadata.streams[0].height; // return convertDimension(options, resolve, reject); // }) // } else { // return setDimension(options, resolve, reject); // } // } else if (mime === 'image/gif') { // if(file.size > 4000000){ // console.log('\n Twitter upload might fail due to large gif'); // return reject("GIF too large"); // } else { // return setDimension(options, resolve, reject) // } // } else if (mime === 'video/mp4') { // if(file.size > 536000000){ // console.log('\n Twitter upload might fail due to large gif'); // return reject(); // } // return ffmpeg.ffprobe(options.localPath, function (err, metadata) { // console.log(metadata); // if (err) { // console.log('ERR IN PROBE', err); // return reject(err); // } // //Checks duration // if(metadata.streams[0].duration > 140){ // console.log('\n Upload Fail: Video is too long!'); // return reject("Video is too long"); // } // // Checks dimensions // if(metadata.streams[0].width > 1280){ // console.log('\n Upload Fail: Video dimension is too wide!'); // return reject("Video dimension is too wide!"); // } // if(metadata.streams[0].height > 1024){ // console.log('\n Upload Fail: Video dimension is too tall!'); // return reject("Video dimension is too wide!"); // } // // Checks for video aspect ratio // if(!(0.33 < (metadata.streams[0].width/metadata.streams[0].height) < 3)){ // console.log('\n Upload Fail: Video dimension is incorrect!'); // return reject("Video dimension is incorrect!"); // } // //checks frame rate // if(parseInt(metadata.streams[0].avg_frame_rate) > 40){ // console.log('\n Upload Fail: Video frame rate is too high!'); // return reject("Video frame rate is too high!"); // } // return setDimension(options, resolve, reject) // }); // } //} // function convertDimension(options, resolve, reject){ // // 7: Converting the img and saving it locally // console.log('4 CONVERTING IMG') // if(options.imageHeight === options.imageWidth){ // return options.convertedImage = ffmpeg(options.localPath) // .size('476x476') // .on('end', function() { // console.log('5 TRANSCODING SUCCEEDED, IMAGE NOW SQUARE!'); // return setDimension(options, resolve, reject); // }) // .on('error', function(err) { // console.log('\n An error occurred: ' + err.message); // }) // .save(`./tmp/tmpConvertedImg.png`); // } else if (options.imageHeight > options.imageWidth) { // return options.convertedImage = ffmpeg(options.localPath) // .size('316x476') // .on('end', function() { // console.log('5 TRANSCODING SUCCEEDED, IMAGE NOW PORTRAIT!'); // return setDimension(options, resolve, reject); // }) // .on('error', function(err) { // console.log('\n An error occurred: ' + err.message); // }) // .save(`./tmp/tmpConvertedImg.png`); // } else { // return options.convertedImage = ffmpeg(options.localPath) // .size('714x476') // .on('end', function() { // console.log('5 TRANSCODING SUCCEEDED, IMAGE NOW LANDSCAPE!'); // return setDimension(options, resolve, reject); // }) // .on('error', function(err) { // console.log('\n An error occurred: ' + err.message); // }) // .save(`./tmp/tmpConvertedImg.png`); // } // } function setDimension(options, resolve, reject) { //8: Reading files locally and throwing up on s3 console.log('6 SETTING CONVERTED IMG'); if(options.convertedImage){ console.log('7 IMAGE CONVERTED!'); options.fileBuffer = fs.readFileSync(path.join(__dirname, `../../../../../tmp/tmpConvertedImg.png`)); } else { console.log('7 IMAGE NOT CONVERTED'); options.fileBuffer = fs.readFileSync(options.localPath); } return setS3(options, resolve, reject); } function setS3(options, resolve, reject){ console.log('9 PUTTING CONVERTED IMAGE ON S3'); let localname = options.req.file.filename; let originalname = options.req.file.originalname; let mime = options.req.file.mimetype; if(options.req.body.from_influencer_app){ options.awsname = `initiativeID-${options.req.body.creative_id_hash}-${new Date(Date.now()).getTime()}${path.extname(originalname)}`; } else { options.awsname = `initiativeID-${options.req.params.id_hash}-${new Date(Date.now()).getTime()}${path.extname(originalname)}`; } return s3.putObject({ ACL: 'public-read', Bucket: BUCKET_NAME, Key: options.awsname, Body: options.fileBuffer, ContentType: mime }, (err, res) => { if (err) { console.log(err); return reject(err) } console.log('10 WROTE FILE TO S3', options.awsname); return resolve(options); }); } function formatResponse(options) { //9: Formatting response let originalname = options.req.file.originalname; let mediaUrl = `https://s3.amazonaws.com/initiatives-media/${options.awsname}`; let contentType = options.req.params.media_type; let config = (contentType === 'image') ? {image_link: mediaUrl} : {video_link: mediaUrl}; let id_hash = options.req.params.id_hash; options.media = { mediaUrl, contentType, config, id_hash }; console.log('11 RESPONSE', options.media ); return Promise.resolve(options); } function formatThumbnail(options) { //9: Formatting response let originalname = options.req.file.originalname; let mediaUrl = `https://s3.amazonaws.com/initiatives-media/${options.awsname}`; let contentType = options.req.params.media_type; let config = {video_thumbnail_link: mediaUrl}; let id_hash = options.req.params.id_hash; options.media = { mediaUrl, contentType, config, id_hash }; console.log('11 RESPONSE', options.media ); return Promise.resolve(options); } function formatResponseInfluencersApp(options) { //9: Formatting response let originalname = options.req.file.originalname; let mediaUrl = `https://s3.amazonaws.com/initiatives-media/${options.awsname}`; let contentType = options.req.body.contentType.toLowerCase(); let config = (contentType === 'image') ? {image_link: mediaUrl} : {video_link: mediaUrl}; let id_hash = options.req.body.creative_id_hash; options.media = { mediaUrl, contentType, config, id_hash }; console.log('11 RESPONSE', options.media ); return Promise.resolve(options); } function uploadAccountImport(options) { const { user_hash, network_id } = options.req.params; const { filename, mimetype, originalname } = options.req.file; const keyName = originalname.split(" ").join("_"); const enviroment = env.NODE_ENV; const awsname = `faveme/${enviroment}/Speakr/imported_accounts/${keyName}` const fileBuffer = fs.readFileSync(path.join(__dirname, `../../../../../tmp/${filename}`)); return new Promise((resolve, reject) => { s3.putObject({ ACL: 'public-read', Bucket: 'faveme', Key: awsname, Body: fileBuffer, }, (err, res) => { if (err) { return reject(err) } return resolve(res); }) }).then((aws) => { const mediaUrl = `https://s3-us-west-2.amazonaws.com/${awsname}`; fs.unlinkSync(path.join(__dirname, `../../../../../tmp/${filename}`)); options.media = { mediaUrl, keyName }; return Promise.resolve(options); }) .catch(err => Promise.reject(err)); }