@speakr/speakr-module-services
Version:
SPEAKR Shared Service Module
284 lines (258 loc) • 9.55 kB
JavaScript
;
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));
}