Add plugin hook on transcoding resolutions building

pull/5170/head
Chocobozzz 2022-08-02 16:05:44 +02:00
parent 22df69fdec
commit ebb9e53ada
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
6 changed files with 51 additions and 6 deletions

View 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()

View 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) {

View 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,

View 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',

View 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)
})

View 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