1 import { throttle } from 'lodash'
2 import { ConfigManager, downloadFile, logger } from 'packages/peertube-runner/shared'
3 import { join } from 'path'
4 import { buildUUID } from '@shared/extra-utils'
5 import { FFmpegEdition, FFmpegLive, FFmpegVOD } from '@shared/ffmpeg'
6 import { RunnerJob, RunnerJobPayload } from '@shared/models'
7 import { PeerTubeServer } from '@shared/server-commands'
8 import { getTranscodingLogger } from './transcoding-logger'
9 import { getAvailableEncoders, getEncodersToTry } from './transcoding-profiles'
10 import { remove } from 'fs-extra'
12 export type JobWithToken <T extends RunnerJobPayload = RunnerJobPayload> = RunnerJob<T> & { jobToken: string }
14 export type ProcessOptions <T extends RunnerJobPayload = RunnerJobPayload> = {
15 server: PeerTubeServer
20 export async function downloadInputFile (options: {
25 const { url, job, runnerToken } = options
26 const destination = join(ConfigManager.Instance.getTranscodingDirectory(), buildUUID())
29 await downloadFile({ url, jobToken: job.jobToken, runnerToken, destination })
32 .catch(err => logger.error({ err }, `Cannot remove ${destination}`))
40 export async function updateTranscodingProgress (options: {
41 server: PeerTubeServer
46 const { server, job, runnerToken, progress } = options
48 return server.runnerJobs.update({ jobToken: job.jobToken, jobUUID: job.uuid, runnerToken, progress })
51 // ---------------------------------------------------------------------------
53 export function buildFFmpegVOD (options: {
54 server: PeerTubeServer
58 const { server, job, runnerToken } = options
60 const updateInterval = ConfigManager.Instance.isTestInstance()
64 const updateJobProgress = throttle((progress: number) => {
65 if (progress < 0 || progress > 100) progress = undefined
67 updateTranscodingProgress({ server, job, runnerToken, progress })
68 .catch(err => logger.error({ err }, 'Cannot send job progress'))
69 }, updateInterval, { trailing: false })
71 return new FFmpegVOD({
72 ...getCommonFFmpegOptions(),
78 export function buildFFmpegLive () {
79 return new FFmpegLive(getCommonFFmpegOptions())
82 export function buildFFmpegEdition () {
83 return new FFmpegEdition(getCommonFFmpegOptions())
86 function getCommonFFmpegOptions () {
87 const config = ConfigManager.Instance.getConfig()
90 niceness: config.ffmpeg.nice,
91 threads: config.ffmpeg.threads,
92 tmpDirectory: ConfigManager.Instance.getTranscodingDirectory(),
95 available: getAvailableEncoders(),
96 encodersToTry: getEncodersToTry()
98 logger: getTranscodingLogger()