From ad5db1044c8599eaaaa2a578b350777ae996b068 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 18 Nov 2021 14:35:08 +0100 Subject: Add ability to run transcoding jobs --- server/middlewares/validators/videos/index.ts | 1 + .../middlewares/validators/videos/video-files.ts | 21 +-------- .../validators/videos/video-transcoding.ts | 55 ++++++++++++++++++++++ 3 files changed, 58 insertions(+), 19 deletions(-) create mode 100644 server/middlewares/validators/videos/video-transcoding.ts (limited to 'server/middlewares') diff --git a/server/middlewares/validators/videos/index.ts b/server/middlewares/validators/videos/index.ts index fd1d58093..f365d8ee1 100644 --- a/server/middlewares/validators/videos/index.ts +++ b/server/middlewares/validators/videos/index.ts @@ -9,4 +9,5 @@ export * from './video-ownership-changes' export * from './video-watch' export * from './video-rates' export * from './video-shares' +export * from './video-transcoding' export * from './videos' diff --git a/server/middlewares/validators/videos/video-files.ts b/server/middlewares/validators/videos/video-files.ts index 282594ab6..c1fa77502 100644 --- a/server/middlewares/validators/videos/video-files.ts +++ b/server/middlewares/validators/videos/video-files.ts @@ -1,6 +1,6 @@ import express from 'express' -import { MUser, MVideo } from '@server/types/models' -import { HttpStatusCode, UserRight } from '../../../../shared' +import { MVideo } from '@server/types/models' +import { HttpStatusCode } from '../../../../shared' import { logger } from '../../../helpers/logger' import { areValidationErrors, doesVideoExist, isValidVideoIdParam } from '../shared' @@ -14,9 +14,7 @@ const videoFilesDeleteWebTorrentValidator = [ if (!await doesVideoExist(req.params.id, res)) return const video = res.locals.videoAll - const user = res.locals.oauth.token.User - if (!checkUserCanDeleteFiles(user, res)) return if (!checkLocalVideo(video, res)) return if (!video.hasWebTorrentFiles()) { @@ -47,9 +45,7 @@ const videoFilesDeleteHLSValidator = [ if (!await doesVideoExist(req.params.id, res)) return const video = res.locals.videoAll - const user = res.locals.oauth.token.User - if (!checkUserCanDeleteFiles(user, res)) return if (!checkLocalVideo(video, res)) return if (!video.getHLSPlaylist()) { @@ -89,16 +85,3 @@ function checkLocalVideo (video: MVideo, res: express.Response) { return true } - -function checkUserCanDeleteFiles (user: MUser, res: express.Response) { - if (user.hasRight(UserRight.MANAGE_VIDEO_FILES) !== true) { - res.fail({ - status: HttpStatusCode.FORBIDDEN_403, - message: 'User cannot update video files' - }) - - return false - } - - return true -} diff --git a/server/middlewares/validators/videos/video-transcoding.ts b/server/middlewares/validators/videos/video-transcoding.ts new file mode 100644 index 000000000..34f231d45 --- /dev/null +++ b/server/middlewares/validators/videos/video-transcoding.ts @@ -0,0 +1,55 @@ +import express from 'express' +import { body } from 'express-validator' +import { isValidCreateTranscodingType } from '@server/helpers/custom-validators/video-transcoding' +import { CONFIG } from '@server/initializers/config' +import { VideoJobInfoModel } from '@server/models/video/video-job-info' +import { HttpStatusCode } from '@shared/models' +import { logger } from '../../../helpers/logger' +import { areValidationErrors, doesVideoExist, isValidVideoIdParam } from '../shared' + +const createTranscodingValidator = [ + isValidVideoIdParam('videoId'), + + body('transcodingType') + .custom(isValidCreateTranscodingType).withMessage('Should have a valid transcoding type'), + + async (req: express.Request, res: express.Response, next: express.NextFunction) => { + logger.debug('Checking createTranscodingValidator parameters', { parameters: req.body }) + + if (areValidationErrors(req, res)) return + if (!await doesVideoExist(req.params.videoId, res, 'all')) return + + const video = res.locals.videoAll + + if (video.remote) { + return res.fail({ + status: HttpStatusCode.BAD_REQUEST_400, + message: 'Cannot run transcoding job on a remote video' + }) + } + + if (CONFIG.TRANSCODING.ENABLED !== true) { + return res.fail({ + status: HttpStatusCode.BAD_REQUEST_400, + message: 'Cannot run transcoding job because transcoding is disabled on this instance' + }) + } + + // Prefer using job info table instead of video state because before 4.0 failed transcoded video were stuck in "TO_TRANSCODE" state + const info = await VideoJobInfoModel.load(video.id) + if (info && info.pendingTranscode !== 0) { + return res.fail({ + status: HttpStatusCode.CONFLICT_409, + message: 'This video is already being transcoded' + }) + } + + return next() + } +] + +// --------------------------------------------------------------------------- + +export { + createTranscodingValidator +} -- cgit v1.2.3