1 import { remove } from 'fs-extra'
2 import { join } from 'path'
3 import { buildUUID } from '@shared/extra-utils'
5 RunnerJobVODAudioMergeTranscodingPayload,
6 RunnerJobVODHLSTranscodingPayload,
7 RunnerJobVODWebVideoTranscodingPayload,
8 VODAudioMergeTranscodingSuccess,
9 VODHLSTranscodingSuccess,
10 VODWebVideoTranscodingSuccess
11 } from '@shared/models'
12 import { ConfigManager } from '../../../shared/config-manager'
13 import { buildFFmpegVOD, downloadInputFile, ProcessOptions } from './common'
15 export async function processWebVideoTranscoding (options: ProcessOptions<RunnerJobVODWebVideoTranscodingPayload>) {
16 const { server, job, runnerToken } = options
17 const payload = job.payload
19 const inputPath = await downloadInputFile({ url: payload.input.videoFileUrl, runnerToken, job })
21 const ffmpegVod = buildFFmpegVOD({ job, server, runnerToken })
23 const outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), `output-${buildUUID()}.mp4`)
26 await ffmpegVod.transcode({
33 inputFileMutexReleaser: () => {},
35 resolution: payload.output.resolution,
36 fps: payload.output.fps
39 const successBody: VODWebVideoTranscodingSuccess = {
43 await server.runnerJobs.success({
44 jobToken: job.jobToken,
50 await remove(inputPath)
51 await remove(outputPath)
55 export async function processHLSTranscoding (options: ProcessOptions<RunnerJobVODHLSTranscodingPayload>) {
56 const { server, job, runnerToken } = options
57 const payload = job.payload
59 const inputPath = await downloadInputFile({ url: payload.input.videoFileUrl, runnerToken, job })
60 const uuid = buildUUID()
62 const outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), `${uuid}-${payload.output.resolution}.m3u8`)
63 const videoFilename = `${uuid}-${payload.output.resolution}-fragmented.mp4`
64 const videoPath = join(join(ConfigManager.Instance.getTranscodingDirectory(), videoFilename))
66 const ffmpegVod = buildFFmpegVOD({ job, server, runnerToken })
69 await ffmpegVod.transcode({
73 hlsPlaylist: { videoFilename },
76 inputFileMutexReleaser: () => {},
78 resolution: payload.output.resolution,
79 fps: payload.output.fps
82 const successBody: VODHLSTranscodingSuccess = {
83 resolutionPlaylistFile: outputPath,
87 await server.runnerJobs.success({
88 jobToken: job.jobToken,
94 await remove(inputPath)
95 await remove(outputPath)
96 await remove(videoPath)
100 export async function processAudioMergeTranscoding (options: ProcessOptions<RunnerJobVODAudioMergeTranscodingPayload>) {
101 const { server, job, runnerToken } = options
102 const payload = job.payload
104 const audioPath = await downloadInputFile({ url: payload.input.audioFileUrl, runnerToken, job })
105 const inputPath = await downloadInputFile({ url: payload.input.previewFileUrl, runnerToken, job })
107 const outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), `output-${buildUUID()}.mp4`)
109 const ffmpegVod = buildFFmpegVOD({ job, server, runnerToken })
112 await ffmpegVod.transcode({
120 inputFileMutexReleaser: () => {},
122 resolution: payload.output.resolution,
123 fps: payload.output.fps
126 const successBody: VODAudioMergeTranscodingSuccess = {
127 videoFile: outputPath
130 await server.runnerJobs.success({
131 jobToken: job.jobToken,
137 await remove(audioPath)
138 await remove(inputPath)
139 await remove(outputPath)