diff --git a/server/controllers/api/videos/transcoding.ts b/server/controllers/api/videos/transcoding.ts index da3ea3c9c..a360a8b6a 100644 --- a/server/controllers/api/videos/transcoding.ts +++ b/server/controllers/api/videos/transcoding.ts @@ -4,6 +4,7 @@ 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' +import { Hooks } from '@server/lib/plugins/hooks' const lTags = loggerTagsFactory('api', 'video') const transcodingRouter = express.Router() @@ -30,7 +31,15 @@ async function createTranscoding (req: express.Request, res: express.Response) { const body: VideoTranscodingCreate = req.body const { resolution: maxResolution, isPortraitMode, audioStream } = await video.probeMaxQualityFile() - const resolutions = computeLowerResolutionsToTranscode(maxResolution, 'vod').concat([ maxResolution ]) + const resolutions = await Hooks.wrapObject( + computeLowerResolutionsToTranscode(maxResolution, 'vod').concat([ maxResolution ]), + 'filter:transcoding.manual.lower-resolutions-to-transcode.result', + body + ) + + if (resolutions.length === 0) { + return res.sendStatus(HttpStatusCode.NO_CONTENT_204) + } video.state = VideoState.TO_TRANSCODE await video.save() diff --git a/server/lib/job-queue/handlers/video-transcoding.ts b/server/lib/job-queue/handlers/video-transcoding.ts index 1b34ced14..d3fb7778b 100644 --- a/server/lib/job-queue/handlers/video-transcoding.ts +++ b/server/lib/job-queue/handlers/video-transcoding.ts @@ -26,6 +26,7 @@ import { optimizeOriginalVideofile, transcodeNewWebTorrentResolution } from '../../transcoding/transcoding' +import { Hooks } from '@server/lib/plugins/hooks' type HandlerFunction = (job: Job, payload: VideoTranscodingPayload, video: MVideoFullLight, user: MUser) => Promise @@ -269,7 +270,12 @@ async function createLowerResolutionsJobs (options: { const { video, user, videoFileResolution, isPortraitMode, isNewVideo, hasAudio, type } = options // Create transcoding jobs if there are enabled resolutions - const resolutionsEnabled = computeLowerResolutionsToTranscode(videoFileResolution, 'vod') + const resolutionsEnabled = await Hooks.wrapObject( + computeLowerResolutionsToTranscode(videoFileResolution, 'vod'), + 'filter:transcoding.auto.lower-resolutions-to-transcode.result', + options + ) + const resolutionCreated: string[] = [] for (const resolution of resolutionsEnabled) { diff --git a/server/lib/live/live-manager.ts b/server/lib/live/live-manager.ts index 41f89a2a4..bd47b01f9 100644 --- a/server/lib/live/live-manager.ts +++ b/server/lib/live/live-manager.ts @@ -29,6 +29,7 @@ import { PeerTubeSocket } from '../peertube-socket' import { LiveQuotaStore } from './live-quota-store' import { cleanupPermanentLive } from './live-utils' import { MuxingSession } from './shared' +import { Hooks } from '../plugins/hooks' const NodeRtmpSession = require('node-media-server/src/node_rtmp_session') const context = require('node-media-server/src/node_core_ctx') @@ -242,7 +243,11 @@ class LiveManager { inputUrl, Date.now() - now, bitrate, fps, resolution, lTags(sessionId, video.uuid) ) - const allResolutions = this.buildAllResolutionsToTranscode(resolution) + const allResolutions = await Hooks.wrapObject( + this.buildAllResolutionsToTranscode(resolution), + 'filter:transcoding.auto.lower-resolutions-to-transcode.result', + { video } + ) logger.info( 'Will mux/transcode live video of original resolution %d.', resolution, diff --git a/server/tests/fixtures/peertube-plugin-test/main.js b/server/tests/fixtures/peertube-plugin-test/main.js index f62f6a435..c395ac7aa 100644 --- a/server/tests/fixtures/peertube-plugin-test/main.js +++ b/server/tests/fixtures/peertube-plugin-test/main.js @@ -256,8 +256,6 @@ async function register ({ registerHook, registerSetting, settingsManager, stora registerHook({ target: 'filter:job-queue.process.params', handler: (object, context) => { - peertubeHelpers.logger.debug('TOTO.', { object, context }) - if (context.type !== 'video-studio-edition') return object object.data.tasks = [ @@ -274,6 +272,17 @@ async function register ({ registerHook, registerSetting, settingsManager, stora } }) + registerHook({ + target: 'filter:transcoding.auto.lower-resolutions-to-transcode.result', + handler: (object, context) => { + if (context.video.name.includes('transcode-filter')) { + object = [ 100 ] + } + + return object + } + }) + // Upload/import/live attributes for (const target of [ 'filter:api.video.upload.video-attribute.result', diff --git a/server/tests/plugins/filter-hooks.ts b/server/tests/plugins/filter-hooks.ts index 27b72cf7d..33feadab6 100644 --- a/server/tests/plugins/filter-hooks.ts +++ b/server/tests/plugins/filter-hooks.ts @@ -677,6 +677,19 @@ describe('Test plugin filter hooks', function () { }) }) + describe('Transcoding filters', async function () { + + it('Should run filter:transcoding.auto.lower-resolutions-to-transcode.result', async function () { + const { uuid } = await servers[0].videos.quickUpload({ name: 'transcode-filter' }) + + await waitJobs(servers) + + const video = await servers[0].videos.get({ id: uuid }) + expect(video.files).to.have.lengthOf(2) + expect(video.files.find(f => f.resolution.id === 100 as any)).to.exist + }) + }) + after(async function () { await cleanupTests(servers) }) diff --git a/shared/models/plugins/server/server-hook.model.ts b/shared/models/plugins/server/server-hook.model.ts index a8e31f576..08da95177 100644 --- a/shared/models/plugins/server/server-hook.model.ts +++ b/shared/models/plugins/server/server-hook.model.ts @@ -93,7 +93,10 @@ export const serverFilterHookObject = { 'filter:html.embed.video-playlist.allowed.result': true, 'filter:job-queue.process.params': true, - 'filter:job-queue.process.result': true + 'filter:job-queue.process.result': true, + + 'filter:transcoding.manual.lower-resolutions-to-transcode.result': true, + 'filter:transcoding.auto.lower-resolutions-to-transcode.result': true } export type ServerFilterHookName = keyof typeof serverFilterHookObject