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