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