]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Add plugin hook on transcoding resolutions building
authorChocobozzz <me@florianbigard.com>
Tue, 2 Aug 2022 14:05:44 +0000 (16:05 +0200)
committerChocobozzz <me@florianbigard.com>
Tue, 2 Aug 2022 14:05:44 +0000 (16:05 +0200)
server/controllers/api/videos/transcoding.ts
server/lib/job-queue/handlers/video-transcoding.ts
server/lib/live/live-manager.ts
server/tests/fixtures/peertube-plugin-test/main.js
server/tests/plugins/filter-hooks.ts
shared/models/plugins/server/server-hook.model.ts

index da3ea3c9c0abce4bb238933fbeddad2771e8399c..a360a8b6a1a38088f08060e63ae32888a43d09e1 100644 (file)
@@ -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()
index 1b34ced14db38a8ac49eacfe27676c07bbbaa45b..d3fb7778b76487e214e216fa2445644260ebfd50 100644 (file)
@@ -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<void>
 
@@ -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) {
index 41f89a2a494ee4efefd103b7ca9be1402e8dcbe6..bd47b01f9f322c4c7c9dfd3030af5efcdc71de0c 100644 (file)
@@ -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,
index f62f6a43570bd660b3a6a6d852b5b1bacdbafd52..c395ac7aa548e6cd46cfebb5c360f584da487a27 100644 (file)
@@ -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',
index 27b72cf7db72424c94eeaf51df2d69bc1d92c873..33feadab61f71ffe7b09348e014793d1bf999838 100644 (file)
@@ -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)
   })
index a8e31f576d118a94117dcc53ce03598153f06bed..08da95177eed7aee8b0513b06c400efdcc712310 100644 (file)
@@ -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