X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fjob-queue%2Fhandlers%2Fvideo-file.ts;h=adc0a2a15cbf26d042edb631ff19d9403ba8b6c8;hb=edb4ffc7e0b13659d7c73b120f2c87b27e4c26a1;hp=f5ad076a6d9e0d720dd83cfe61fea2bb7b4599c3;hpb=2186386cca113506791583cb07d6ccacba7af4e0;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/job-queue/handlers/video-file.ts b/server/lib/job-queue/handlers/video-file.ts index f5ad076a6..adc0a2a15 100644 --- a/server/lib/job-queue/handlers/video-file.ts +++ b/server/lib/job-queue/handlers/video-file.ts @@ -1,12 +1,14 @@ -import * as kue from 'kue' +import * as Bull from 'bull' import { VideoResolution, VideoState } from '../../../../shared' import { logger } from '../../../helpers/logger' -import { computeResolutionsToTranscode } from '../../../helpers/utils' import { VideoModel } from '../../../models/video/video' import { JobQueue } from '../job-queue' import { federateVideoIfNeeded } from '../../activitypub' import { retryTransactionWrapper } from '../../../helpers/database-utils' import { sequelizeTypescript } from '../../../initializers' +import * as Bluebird from 'bluebird' +import { computeResolutionsToTranscode } from '../../../helpers/ffmpeg-utils' +import { importVideoFile, transcodeOriginalVideofile, optimizeVideofile } from '../../video-transcoding' export type VideoFilePayload = { videoUUID: string @@ -20,51 +22,43 @@ export type VideoFileImportPayload = { filePath: string } -async function processVideoFileImport (job: kue.Job) { +async function processVideoFileImport (job: Bull.Job) { const payload = job.data as VideoFileImportPayload logger.info('Processing video file import in job %d.', job.id) - const video = await VideoModel.loadByUUIDAndPopulateAccountAndServerAndTags(payload.videoUUID) + const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(payload.videoUUID) // No video, maybe deleted? if (!video) { - logger.info('Do not process job %d, video does not exist.', job.id, { videoUUID: video.uuid }) + logger.info('Do not process job %d, video does not exist.', job.id) return undefined } - await video.importVideoFile(payload.filePath) + await importVideoFile(video, payload.filePath) await onVideoFileTranscoderOrImportSuccess(video) return video } -async function processVideoFile (job: kue.Job) { +async function processVideoFile (job: Bull.Job) { const payload = job.data as VideoFilePayload logger.info('Processing video file in job %d.', job.id) - const video = await VideoModel.loadByUUIDAndPopulateAccountAndServerAndTags(payload.videoUUID) + const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(payload.videoUUID) // No video, maybe deleted? if (!video) { - logger.info('Do not process job %d, video does not exist.', job.id, { videoUUID: video.uuid }) + logger.info('Do not process job %d, video does not exist.', job.id) return undefined } // Transcoding in other resolution if (payload.resolution) { - await video.transcodeOriginalVideofile(payload.resolution, payload.isPortraitMode) + await transcodeOriginalVideofile(video, payload.resolution, payload.isPortraitMode || false) - const options = { - arguments: [ video ], - errorMessage: 'Cannot execute onVideoFileTranscoderOrImportSuccess with many retries.' - } - await retryTransactionWrapper(onVideoFileTranscoderOrImportSuccess, options) + await retryTransactionWrapper(onVideoFileTranscoderOrImportSuccess, video) } else { - await video.optimizeOriginalVideofile() + await optimizeVideofile(video) - const options = { - arguments: [ video, payload.isNewVideo ], - errorMessage: 'Cannot execute onVideoFileOptimizerSuccess with many retries.' - } - await retryTransactionWrapper(onVideoFileOptimizerSuccess, options) + await retryTransactionWrapper(onVideoFileOptimizerSuccess, video, payload.isNewVideo) } return video @@ -75,17 +69,22 @@ async function onVideoFileTranscoderOrImportSuccess (video: VideoModel) { return sequelizeTypescript.transaction(async t => { // Maybe the video changed in database, refresh it - let videoDatabase = await VideoModel.loadByUUIDAndPopulateAccountAndServerAndTags(video.uuid, t) + let videoDatabase = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.uuid, t) // Video does not exist anymore if (!videoDatabase) return undefined + let isNewVideo = false + // We transcoded the video file in another format, now we can publish it - const oldState = videoDatabase.state - videoDatabase.state = VideoState.PUBLISHED - videoDatabase = await videoDatabase.save({ transaction: t }) + if (videoDatabase.state !== VideoState.PUBLISHED) { + isNewVideo = true + + videoDatabase.state = VideoState.PUBLISHED + videoDatabase.publishedAt = new Date() + videoDatabase = await videoDatabase.save({ transaction: t }) + } // If the video was not published, we consider it is a new one for other instances - const isNewVideo = oldState !== VideoState.PUBLISHED await federateVideoIfNeeded(videoDatabase, isNewVideo, t) return undefined @@ -100,7 +99,7 @@ async function onVideoFileOptimizerSuccess (video: VideoModel, isNewVideo: boole return sequelizeTypescript.transaction(async t => { // Maybe the video changed in database, refresh it - const videoDatabase = await VideoModel.loadByUUIDAndPopulateAccountAndServerAndTags(video.uuid, t) + const videoDatabase = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.uuid, t) // Video does not exist anymore if (!videoDatabase) return undefined @@ -112,7 +111,7 @@ async function onVideoFileOptimizerSuccess (video: VideoModel, isNewVideo: boole ) if (resolutionsEnabled.length !== 0) { - const tasks: Promise[] = [] + const tasks: Bluebird[] = [] for (const resolution of resolutionsEnabled) { const dataInput = {