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