From 53c83090f351e3c92119c30f5f1551d718fb6fec Mon Sep 17 00:00:00 2001 From: Rostyslav Marchuk Date: Wed, 27 Apr 2022 15:35:59 +0300 Subject: [PATCH 1/2] Added function that generates several posters --- domains/Video/Service/handlers/convertFile.js | 12 +++++- .../Service/handlers/getSeveralPosters.js | 20 ++++++++++ domains/Video/Service/handlers/index.js | 6 ++- .../Service/handlers/uploadSeveralPosters.js | 40 +++++++++++++++++++ domains/Video/handlers/onCovertEnd.handler.js | 32 ++++++++------- 5 files changed, 92 insertions(+), 18 deletions(-) create mode 100644 domains/Video/Service/handlers/getSeveralPosters.js create mode 100644 domains/Video/Service/handlers/uploadSeveralPosters.js diff --git a/domains/Video/Service/handlers/convertFile.js b/domains/Video/Service/handlers/convertFile.js index cb2b090..37b8397 100644 --- a/domains/Video/Service/handlers/convertFile.js +++ b/domains/Video/Service/handlers/convertFile.js @@ -10,6 +10,7 @@ const Handlers = require('../../handlers') const getPosterImage = require('./getPosterImage') const convert = require('./convert') const clearTemporaryFiles = require('./clearTemporaryFiles') +const getSeveralPosters = require('./getSeveralPosters') const convertFile = async (id, res) => { // Extracting request data from storage for this session @@ -34,11 +35,18 @@ const convertFile = async (id, res) => { // Moving uploaded file to processing folder fileService.moveFileToAnotherFolder(FOLDERS.UPLOAD_DIRECTORY) - getPosterImage( + // getPosterImage( + // ffmpeg, + // FOLDERS.UPLOAD_DIRECTORY, + // FOLDERS.POSTERS_DIRECTORY, + // file + // ) + getSeveralPosters( ffmpeg, FOLDERS.UPLOAD_DIRECTORY, FOLDERS.POSTERS_DIRECTORY, - file + file, + videoDuration ) // Converting video using request data convert( diff --git a/domains/Video/Service/handlers/getSeveralPosters.js b/domains/Video/Service/handlers/getSeveralPosters.js new file mode 100644 index 0000000..fc4ee4c --- /dev/null +++ b/domains/Video/Service/handlers/getSeveralPosters.js @@ -0,0 +1,20 @@ +const getSeveralPosters = ( + ffmpeg, + sourceFolderPath, + processedFolderPath, + file, + videoDuration +) => { + const posterTimemarks = [ + videoDuration * 0.25, + videoDuration * 0.5, + videoDuration * 0.75 + ] + return ffmpeg(`${sourceFolderPath}${file.name}`).screenshots({ + timestamps: posterTimemarks, + filename: '%f-poster-%i.png', + folder: processedFolderPath + }) +} + +module.exports = getSeveralPosters diff --git a/domains/Video/Service/handlers/index.js b/domains/Video/Service/handlers/index.js index 6375c33..fef131e 100644 --- a/domains/Video/Service/handlers/index.js +++ b/domains/Video/Service/handlers/index.js @@ -5,6 +5,8 @@ const getVideos = require('./getVideos') const convertFile = require('./convertFile') const addSubtitles = require('./addSubtitles') const uploadWithoutConvert = require('./uploadWithoutConvert') +const uploadSeveralPosters = require('./uploadSeveralPosters') +const getSeveralPosters = require('./getSeveralPosters') module.exports = { uploadVideo, @@ -13,5 +15,7 @@ module.exports = { getVideos, convertFile, addSubtitles, - uploadWithoutConvert + uploadWithoutConvert, + uploadSeveralPosters, + getSeveralPosters } diff --git a/domains/Video/Service/handlers/uploadSeveralPosters.js b/domains/Video/Service/handlers/uploadSeveralPosters.js new file mode 100644 index 0000000..f3a60f4 --- /dev/null +++ b/domains/Video/Service/handlers/uploadSeveralPosters.js @@ -0,0 +1,40 @@ +const { FOLDERS } = require('../../../../constants') + +const uploadSeveralPosters = async ( + videoFileName, + fileService, + appName, + appId +) => { + const posterFileNames = [ + `${videoFileName}-poster-1.png`, + `${videoFileName}-poster-2.png`, + `${videoFileName}-poster-3.png` + ] + + const postersUploadPromises = await Promise.allSettled( + posterFileNames.map((posterName) => + fileService.uploadFileToStorage(FOLDERS.POSTERS_DIRECTORY, posterName, { + destination: `${appName}_${appId}/posters/${posterName}` + }) + ) + ) + + const posterLinksAndPathsArray = [] + postersUploadPromises.forEach(({ value }, index) => { + posterLinksAndPathsArray.push({ + link: value.link, + path: `${appName}_${appId}/posters/${posterFileNames[index]}` + }) + }) + + const postersDeletePromises = await Promise.allSettled( + posterFileNames.map((posterName) => + fileService.deleteFileFromFolder(FOLDERS.POSTERS_DIRECTORY, posterName) + ) + ) + + return posterLinksAndPathsArray +} + +module.exports = uploadSeveralPosters diff --git a/domains/Video/handlers/onCovertEnd.handler.js b/domains/Video/handlers/onCovertEnd.handler.js index 09e7728..19feb73 100644 --- a/domains/Video/handlers/onCovertEnd.handler.js +++ b/domains/Video/handlers/onCovertEnd.handler.js @@ -1,5 +1,6 @@ const { COLLECTIONS, FOLDERS } = require('../../../constants') const { Storage } = require('../../ServerStorage') +const uploadSeveralPosters = require('../Service/handlers/uploadSeveralPosters') const createGeneralVideoStatisticEntry = require('./createGeneralVideoStatisticEntry') module.exports = (response, fileService, dbService, storageItem, sessionId) => { @@ -23,20 +24,14 @@ module.exports = (response, fileService, dbService, storageItem, sessionId) => { } ) ).link - const posterLink = ( - await fileService.uploadFileToStorage( - FOLDERS.POSTERS_DIRECTORY, - `${file.name}-poster.png`, - { - destination: `${appName}_${appId}/posters/${file.name}-poster.png` - } - ) - ).link - await fileService.deleteFileFromFolder( - FOLDERS.POSTERS_DIRECTORY, - `${file.name}-poster.png` + const posterLinksAndPaths = await uploadSeveralPosters( + file.name, + fileService, + appName, + appId ) + // Adding metadata about video to database collection const newDoc = await dbService.createDocument( COLLECTIONS.VIDEOS, @@ -45,8 +40,10 @@ module.exports = (response, fileService, dbService, storageItem, sessionId) => { chapters, link, withSubtitles, - posterLink, - posterPath: `${appName}_${appId}/posters/${file.name}-poster.png`, + posterLink: posterLinksAndPaths[0].link, + posterPath: posterLinksAndPaths[0].path, + // posterLink, + // posterPath: `${appName}_${appId}/posters/${file.name}-poster.png`, path: `${appName}_${appId}/videos/${file.name}.${toFormat}`, filename: `${file.name}.${toFormat}`, format: `video/${toFormat}` @@ -72,7 +69,12 @@ module.exports = (response, fileService, dbService, storageItem, sessionId) => { videoId: newDoc }) // Sending video link to client and closing SSE channel - response.write(`event: videoId\ndata: ${newDoc}\n\n`) + response.write( + `event: videoId\ndata: ${JSON.stringify({ + videoId: newDoc, + posters: posterLinksAndPaths + })}\n\n` + ) response.end() // Deleting files from local folders if (!withSubtitles) { From ed96d18122e37f66c17d20bb14ddc33ff61d4aec Mon Sep 17 00:00:00 2001 From: Rostyslav Marchuk Date: Wed, 27 Apr 2022 16:02:10 +0300 Subject: [PATCH 2/2] Removed commented code --- domains/Video/Service/handlers/convertFile.js | 9 +++------ domains/Video/handlers/onCovertEnd.handler.js | 2 -- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/domains/Video/Service/handlers/convertFile.js b/domains/Video/Service/handlers/convertFile.js index 37b8397..9856170 100644 --- a/domains/Video/Service/handlers/convertFile.js +++ b/domains/Video/Service/handlers/convertFile.js @@ -35,12 +35,8 @@ const convertFile = async (id, res) => { // Moving uploaded file to processing folder fileService.moveFileToAnotherFolder(FOLDERS.UPLOAD_DIRECTORY) - // getPosterImage( - // ffmpeg, - // FOLDERS.UPLOAD_DIRECTORY, - // FOLDERS.POSTERS_DIRECTORY, - // file - // ) + + // Generating posters getSeveralPosters( ffmpeg, FOLDERS.UPLOAD_DIRECTORY, @@ -48,6 +44,7 @@ const convertFile = async (id, res) => { file, videoDuration ) + // Converting video using request data convert( ffmpeg, diff --git a/domains/Video/handlers/onCovertEnd.handler.js b/domains/Video/handlers/onCovertEnd.handler.js index 19feb73..46179fc 100644 --- a/domains/Video/handlers/onCovertEnd.handler.js +++ b/domains/Video/handlers/onCovertEnd.handler.js @@ -42,8 +42,6 @@ module.exports = (response, fileService, dbService, storageItem, sessionId) => { withSubtitles, posterLink: posterLinksAndPaths[0].link, posterPath: posterLinksAndPaths[0].path, - // posterLink, - // posterPath: `${appName}_${appId}/posters/${file.name}-poster.png`, path: `${appName}_${appId}/videos/${file.name}.${toFormat}`, filename: `${file.name}.${toFormat}`, format: `video/${toFormat}`