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/controllers/api/videos/transcoding.ts | 62 ++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 server/controllers/api/videos/transcoding.ts (limited to 'server/controllers/api/videos/transcoding.ts') diff --git a/server/controllers/api/videos/transcoding.ts b/server/controllers/api/videos/transcoding.ts new file mode 100644 index 000000000..dd6fbd3de --- /dev/null +++ b/server/controllers/api/videos/transcoding.ts @@ -0,0 +1,62 @@ +import express from 'express' +import { computeLowerResolutionsToTranscode } from '@server/helpers/ffprobe-utils' +import { logger, loggerTagsFactory } from '@server/helpers/logger' +import { addTranscodingJob } from '@server/lib/video' +import { HttpStatusCode, UserRight, VideoState, VideoTranscodingCreate } from '@shared/models' +import { asyncMiddleware, authenticate, createTranscodingValidator, ensureUserHasRight } from '../../../middlewares' + +const lTags = loggerTagsFactory('api', 'video') +const transcodingRouter = express.Router() + +transcodingRouter.post('/:videoId/transcoding', + authenticate, + ensureUserHasRight(UserRight.RUN_VIDEO_TRANSCODING), + asyncMiddleware(createTranscodingValidator), + asyncMiddleware(createTranscoding) +) + +// --------------------------------------------------------------------------- + +export { + transcodingRouter +} + +// --------------------------------------------------------------------------- + +async function createTranscoding (req: express.Request, res: express.Response) { + const video = res.locals.videoAll + logger.info('Creating %s transcoding job for %s.', req.body.type, video.url, lTags()) + + const body: VideoTranscodingCreate = req.body + + const { resolution: maxResolution, isPortraitMode } = await video.getMaxQualityResolution() + const resolutions = computeLowerResolutionsToTranscode(maxResolution, 'vod').concat([ maxResolution ]) + + video.state = VideoState.TO_TRANSCODE + await video.save() + + for (const resolution of resolutions) { + if (body.transcodingType === 'hls') { + await addTranscodingJob({ + type: 'new-resolution-to-hls', + videoUUID: video.uuid, + resolution, + isPortraitMode, + copyCodecs: false, + isNewVideo: false, + autoDeleteWebTorrentIfNeeded: false, + isMaxQuality: maxResolution === resolution + }) + } else if (body.transcodingType === 'webtorrent') { + await addTranscodingJob({ + type: 'new-resolution-to-webtorrent', + videoUUID: video.uuid, + isNewVideo: false, + resolution: resolution, + isPortraitMode + }) + } + } + + return res.sendStatus(HttpStatusCode.NO_CONTENT_204) +} -- cgit v1.2.3