]>
Commit | Line | Data |
---|---|---|
ab14f0e0 | 1 | import { remove } from 'fs-extra' |
1772b383 C |
2 | import { throttle } from 'lodash' |
3 | import { ConfigManager, downloadFile, logger } from 'packages/peertube-runner/shared' | |
4 | import { join } from 'path' | |
5 | import { buildUUID } from '@shared/extra-utils' | |
ab14f0e0 | 6 | import { FFmpegEdition, FFmpegLive, FFmpegVOD, getDefaultAvailableEncoders, getDefaultEncodersToTry } from '@shared/ffmpeg' |
1772b383 C |
7 | import { RunnerJob, RunnerJobPayload } from '@shared/models' |
8 | import { PeerTubeServer } from '@shared/server-commands' | |
9 | import { getTranscodingLogger } from './transcoding-logger' | |
1772b383 C |
10 | |
11 | export type JobWithToken <T extends RunnerJobPayload = RunnerJobPayload> = RunnerJob<T> & { jobToken: string } | |
12 | ||
13 | export type ProcessOptions <T extends RunnerJobPayload = RunnerJobPayload> = { | |
14 | server: PeerTubeServer | |
15 | job: JobWithToken<T> | |
16 | runnerToken: string | |
17 | } | |
18 | ||
19 | export 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 | ||
39 | export 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 |
52 | export 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 | ||
77 | export function buildFFmpegLive () { | |
5e47f6ab C |
78 | return new FFmpegLive(getCommonFFmpegOptions()) |
79 | } | |
80 | ||
81 | export function buildFFmpegEdition () { | |
82 | return new FFmpegEdition(getCommonFFmpegOptions()) | |
83 | } | |
84 | ||
85 | function 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 | } |