X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Fapi%2Fvideos%2Ftranscoding.ts;h=8c9a5322b78a29b7f15efd3aa6cba59eec5950fc;hb=44e702ded455c118f9908b70d25e7c7e5512abe9;hp=7d924c5ac4b4f863d891bcfd0ea107bc9a294bec;hpb=64fd6158fd276f258bcfc4bb0c8fc2f64a220a11;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/api/videos/transcoding.ts b/server/controllers/api/videos/transcoding.ts index 7d924c5ac..8c9a5322b 100644 --- a/server/controllers/api/videos/transcoding.ts +++ b/server/controllers/api/videos/transcoding.ts @@ -1,10 +1,12 @@ +import Bluebird from 'bluebird' import express from 'express' import { computeResolutionsToTranscode } from '@server/helpers/ffmpeg' import { logger, loggerTagsFactory } from '@server/helpers/logger' -import { addTranscodingJob } from '@server/lib/video' +import { JobQueue } from '@server/lib/job-queue' +import { Hooks } from '@server/lib/plugins/hooks' +import { buildTranscodingJob } from '@server/lib/video' import { HttpStatusCode, UserRight, VideoState, VideoTranscodingCreate } from '@shared/models' import { asyncMiddleware, authenticate, createTranscodingValidator, ensureUserHasRight } from '../../../middlewares' -import { Hooks } from '@server/lib/plugins/hooks' const lTags = loggerTagsFactory('api', 'video') const transcodingRouter = express.Router() @@ -30,9 +32,10 @@ async function createTranscoding (req: express.Request, res: express.Response) { const body: VideoTranscodingCreate = req.body - const { resolution: maxResolution, audioStream } = await video.probeMaxQualityFile() + const { resolution: maxResolution, hasAudio } = await video.probeMaxQualityFile() + const resolutions = await Hooks.wrapObject( - computeResolutionsToTranscode({ inputResolution: maxResolution, type: 'vod', includeInputResolution: true }), + computeResolutionsToTranscode({ input: maxResolution, type: 'vod', includeInput: true, strictLower: false, hasAudio }), 'filter:transcoding.manual.resolutions-to-transcode.result', body ) @@ -44,29 +47,82 @@ async function createTranscoding (req: express.Request, res: express.Response) { video.state = VideoState.TO_TRANSCODE await video.save() - for (const resolution of resolutions) { + const childrenResolutions = resolutions.filter(r => r !== maxResolution) + + logger.info('Manually creating transcoding jobs for %s.', body.transcodingType, { childrenResolutions, maxResolution }) + + const children = await Bluebird.mapSeries(childrenResolutions, resolution => { if (body.transcodingType === 'hls') { - await addTranscodingJob({ - type: 'new-resolution-to-hls', + return buildHLSJobOption({ videoUUID: video.uuid, + hasAudio, resolution, - hasAudio: !!audioStream, - copyCodecs: false, - isNewVideo: false, - autoDeleteWebTorrentIfNeeded: false, - isMaxQuality: maxResolution === resolution + isMaxQuality: false }) - } else if (body.transcodingType === 'webtorrent') { - await addTranscodingJob({ - type: 'new-resolution-to-webtorrent', + } + + if (body.transcodingType === 'webtorrent') { + return buildWebTorrentJobOption({ videoUUID: video.uuid, - isNewVideo: false, - resolution, - hasAudio: !!audioStream, - createHLSIfNeeded: false + hasAudio, + resolution }) } - } + }) + + const parent = body.transcodingType === 'hls' + ? await buildHLSJobOption({ + videoUUID: video.uuid, + hasAudio, + resolution: maxResolution, + isMaxQuality: false + }) + : await buildWebTorrentJobOption({ + videoUUID: video.uuid, + hasAudio, + resolution: maxResolution + }) + + // Porcess the last resolution after the other ones to prevent concurrency issue + // Because low resolutions use the biggest one as ffmpeg input + await JobQueue.Instance.createJobWithChildren(parent, children) return res.sendStatus(HttpStatusCode.NO_CONTENT_204) } + +function buildHLSJobOption (options: { + videoUUID: string + hasAudio: boolean + resolution: number + isMaxQuality: boolean +}) { + const { videoUUID, hasAudio, resolution, isMaxQuality } = options + + return buildTranscodingJob({ + type: 'new-resolution-to-hls', + videoUUID, + resolution, + hasAudio, + copyCodecs: false, + isNewVideo: false, + autoDeleteWebTorrentIfNeeded: false, + isMaxQuality + }) +} + +function buildWebTorrentJobOption (options: { + videoUUID: string + hasAudio: boolean + resolution: number +}) { + const { videoUUID, hasAudio, resolution } = options + + return buildTranscodingJob({ + type: 'new-resolution-to-webtorrent', + videoUUID, + isNewVideo: false, + resolution, + hasAudio, + createHLSIfNeeded: false + }) +}