]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - packages/peertube-runner/server/process/shared/common.ts
Support studio transcoding in peertube runner
[github/Chocobozzz/PeerTube.git] / packages / peertube-runner / server / process / shared / common.ts
CommitLineData
1772b383
C
1import { throttle } from 'lodash'
2import { ConfigManager, downloadFile, logger } from 'packages/peertube-runner/shared'
3import { join } from 'path'
4import { buildUUID } from '@shared/extra-utils'
5e47f6ab 5import { FFmpegEdition, FFmpegLive, FFmpegVOD } from '@shared/ffmpeg'
1772b383
C
6import { RunnerJob, RunnerJobPayload } from '@shared/models'
7import { PeerTubeServer } from '@shared/server-commands'
8import { getTranscodingLogger } from './transcoding-logger'
9import { getAvailableEncoders, getEncodersToTry } from './transcoding-profiles'
5e47f6ab 10import { remove } from 'fs-extra'
1772b383
C
11
12export type JobWithToken <T extends RunnerJobPayload = RunnerJobPayload> = RunnerJob<T> & { jobToken: string }
13
14export type ProcessOptions <T extends RunnerJobPayload = RunnerJobPayload> = {
15 server: PeerTubeServer
16 job: JobWithToken<T>
17 runnerToken: string
18}
19
20export async function downloadInputFile (options: {
21 url: string
22 job: JobWithToken
23 runnerToken: string
24}) {
25 const { url, job, runnerToken } = options
26 const destination = join(ConfigManager.Instance.getTranscodingDirectory(), buildUUID())
27
5e47f6ab
C
28 try {
29 await downloadFile({ url, jobToken: job.jobToken, runnerToken, destination })
30 } catch (err) {
31 remove(destination)
32 .catch(err => logger.error({ err }, `Cannot remove ${destination}`))
33
34 throw err
35 }
1772b383
C
36
37 return destination
38}
39
40export async function updateTranscodingProgress (options: {
41 server: PeerTubeServer
42 runnerToken: string
43 job: JobWithToken
44 progress: number
45}) {
46 const { server, job, runnerToken, progress } = options
47
48 return server.runnerJobs.update({ jobToken: job.jobToken, jobUUID: job.uuid, runnerToken, progress })
49}
50
5e47f6ab
C
51// ---------------------------------------------------------------------------
52
1772b383
C
53export function buildFFmpegVOD (options: {
54 server: PeerTubeServer
55 runnerToken: string
56 job: JobWithToken
57}) {
58 const { server, job, runnerToken } = options
59
60 const updateInterval = ConfigManager.Instance.isTestInstance()
61 ? 500
62 : 60000
63
64 const updateJobProgress = throttle((progress: number) => {
65 if (progress < 0 || progress > 100) progress = undefined
66
67 updateTranscodingProgress({ server, job, runnerToken, progress })
68 .catch(err => logger.error({ err }, 'Cannot send job progress'))
69 }, updateInterval, { trailing: false })
70
1772b383 71 return new FFmpegVOD({
5e47f6ab
C
72 ...getCommonFFmpegOptions(),
73
1772b383
C
74 updateJobProgress
75 })
76}
77
78export function buildFFmpegLive () {
5e47f6ab
C
79 return new FFmpegLive(getCommonFFmpegOptions())
80}
81
82export function buildFFmpegEdition () {
83 return new FFmpegEdition(getCommonFFmpegOptions())
84}
85
86function getCommonFFmpegOptions () {
1772b383
C
87 const config = ConfigManager.Instance.getConfig()
88
5e47f6ab 89 return {
1772b383
C
90 niceness: config.ffmpeg.nice,
91 threads: config.ffmpeg.threads,
92 tmpDirectory: ConfigManager.Instance.getTranscodingDirectory(),
93 profile: 'default',
94 availableEncoders: {
95 available: getAvailableEncoders(),
96 encodersToTry: getEncodersToTry()
97 },
98 logger: getTranscodingLogger()
5e47f6ab 99 }
1772b383 100}