Henri BAUDESSON 2024-04-30 12:37:02 +08:00 committed by GitHub
commit 5118c6f0f2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 68 additions and 8 deletions

View File

@ -116,7 +116,9 @@ export async function processHLSTranscoding (options: ProcessOptions<RunnerJobVO
const successBody: VODHLSTranscodingSuccess = {
resolutionPlaylistFile: outputPath,
videoFile: videoPath
videoFile: videoPath,
uploadVideoFileUrl: payload.output.videoFileUrl,
uploadResolutionPlaylistFileUrl: payload.output.playlistFileUrl
}
await server.runnerJobs.success({

View File

@ -23,12 +23,19 @@ export interface RunnerJobVODWebVideoTranscodingPayload {
}
}
export interface UploadUrlTranscodingResultPayload {
url: string
fields: { [key: string]: any } | undefined
}
export interface RunnerJobVODHLSTranscodingPayload {
input: {
videoFileUrl: string
}
output: {
videoFileUrl?: UploadUrlTranscodingResultPayload
playlistFileUrl?: UploadUrlTranscodingResultPayload
resolution: number
fps: number
}

View File

@ -1,3 +1,5 @@
import { UploadUrlTranscodingResultPayload } from '@peertube/peertube-models'
export interface RunnerJobSuccessBody {
runnerToken: string
jobToken: string
@ -5,6 +7,12 @@ export interface RunnerJobSuccessBody {
payload: RunnerJobSuccessPayload
}
export interface UploadTranscodingResult {
runnerToken: string
jobToken: string
uploadResultUrl: UploadUrlTranscodingResultPayload
file: string | Blob
}
// ---------------------------------------------------------------------------
export type RunnerJobSuccessPayload =
@ -16,15 +24,19 @@ export type RunnerJobSuccessPayload =
export interface VODWebVideoTranscodingSuccess {
videoFile: Blob | string
uploadVideoFileUrl?: UploadUrlTranscodingResultPayload
}
export interface VODHLSTranscodingSuccess {
videoFile: Blob | string
resolutionPlaylistFile: Blob | string
uploadVideoFileUrl?: UploadUrlTranscodingResultPayload
uploadResolutionPlaylistFileUrl?: UploadUrlTranscodingResultPayload
}
export interface VODAudioMergeTranscodingSuccess {
videoFile: Blob | string
uploadVideoFileUrl?: UploadUrlTranscodingResultPayload
}
export interface LiveRTMPHLSTranscodingSuccess {
@ -33,6 +45,7 @@ export interface LiveRTMPHLSTranscodingSuccess {
export interface VideoStudioTranscodingSuccess {
videoFile: Blob | string
uploadVideoFileUrl?: UploadUrlTranscodingResultPayload
}
export function isWebVideoOrAudioMergeTranscodingPayloadSuccess (

View File

@ -22,6 +22,7 @@ import {
RunnerJobType,
RunnerJobUpdateBody,
RunnerJobVODPayload,
UploadTranscodingResult,
VODHLSTranscodingSuccess,
VODWebVideoTranscodingSuccess
} from '@peertube/peertube-models'
@ -177,7 +178,7 @@ export class RunnerJobsCommand extends AbstractCommand {
})
}
success (options: OverrideCommandOptions & RunnerJobSuccessBody & { jobUUID: string }) {
async success (options: OverrideCommandOptions & RunnerJobSuccessBody & { jobUUID: string }) {
const { payload } = options
const path = '/api/v1/runners/jobs/' + options.jobUUID + '/success'
@ -185,15 +186,31 @@ export class RunnerJobsCommand extends AbstractCommand {
let payloadWithoutFiles = payload
if ((isWebVideoOrAudioMergeTranscodingPayloadSuccess(payload) || isHLSTranscodingPayloadSuccess(payload)) && payload.videoFile) {
attaches[`payload[videoFile]`] = payload.videoFile
payloadWithoutFiles = omit(payloadWithoutFiles as VODWebVideoTranscodingSuccess, [ 'videoFile' ])
if (payload.uploadVideoFileUrl) {
await this.uploadTranscodeResult({
uploadResultUrl: payload.uploadVideoFileUrl,
file: payload.videoFile,
runnerToken: options.runnerToken,
jobToken: options.jobToken
})
} else {
attaches[`payload[videoFile]`] = payload.videoFile
payloadWithoutFiles = omit(payloadWithoutFiles as VODWebVideoTranscodingSuccess, [ 'videoFile' ])
}
}
if (isHLSTranscodingPayloadSuccess(payload) && payload.resolutionPlaylistFile) {
attaches[`payload[resolutionPlaylistFile]`] = payload.resolutionPlaylistFile
payloadWithoutFiles = omit(payloadWithoutFiles as VODHLSTranscodingSuccess, [ 'resolutionPlaylistFile' ])
if (payload.uploadResolutionPlaylistFileUrl) {
await this.uploadTranscodeResult({
uploadResultUrl: payload.uploadResolutionPlaylistFileUrl,
file: payload.resolutionPlaylistFile,
runnerToken: options.runnerToken,
jobToken: options.jobToken
})
} else {
attaches[`payload[resolutionPlaylistFile]`] = payload.resolutionPlaylistFile
payloadWithoutFiles = omit(payloadWithoutFiles as VODHLSTranscodingSuccess, [ 'resolutionPlaylistFile' ])
}
}
return this.postUploadRequest({
@ -211,6 +228,27 @@ export class RunnerJobsCommand extends AbstractCommand {
})
}
uploadTranscodeResult (options: UploadTranscodingResult) {
const { uploadResultUrl, file } = options
const parsedUrl = new URL(uploadResultUrl.url)
const attaches: { [id: string]: any } = {
file
}
return this.postUploadRequest({
url: parsedUrl.origin,
path: parsedUrl.pathname,
fields: {
...uploadResultUrl.fields,
...pick(options, [ 'jobToken', 'runnerToken' ]),
file
},
attaches,
implicitToken: false,
defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
})
}
getJobFile (options: OverrideCommandOptions & { url: string, jobToken: string, runnerToken: string }) {
const { host, protocol, pathname } = new URL(options.url)