1 import { UploadFilesForCheck } from 'express'
2 import validator from 'validator'
3 import { CONSTRAINTS_FIELDS } from '@server/initializers/constants'
5 LiveRTMPHLSTranscodingSuccess,
6 RunnerJobSuccessPayload,
8 RunnerJobUpdatePayload,
9 VODAudioMergeTranscodingSuccess,
10 VODHLSTranscodingSuccess,
11 VODWebVideoTranscodingSuccess
12 } from '@shared/models'
13 import { exists, isFileValid, isSafeFilename } from '../misc'
15 const RUNNER_JOBS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.RUNNER_JOBS
17 const runnerJobTypes = new Set([ 'vod-hls-transcoding', 'vod-web-video-transcoding', 'vod-audio-merge-transcoding' ])
18 function isRunnerJobTypeValid (value: RunnerJobType) {
19 return runnerJobTypes.has(value)
22 function isRunnerJobSuccessPayloadValid (value: RunnerJobSuccessPayload, type: RunnerJobType, files: UploadFilesForCheck) {
23 return isRunnerJobVODWebVideoResultPayloadValid(value as VODWebVideoTranscodingSuccess, type, files) ||
24 isRunnerJobVODHLSResultPayloadValid(value as VODHLSTranscodingSuccess, type, files) ||
25 isRunnerJobVODAudioMergeResultPayloadValid(value as VODHLSTranscodingSuccess, type, files) ||
26 isRunnerJobLiveRTMPHLSResultPayloadValid(value as LiveRTMPHLSTranscodingSuccess, type)
29 // ---------------------------------------------------------------------------
31 function isRunnerJobProgressValid (value: string) {
32 return validator.isInt(value + '', RUNNER_JOBS_CONSTRAINTS_FIELDS.PROGRESS)
35 function isRunnerJobUpdatePayloadValid (value: RunnerJobUpdatePayload, type: RunnerJobType, files: UploadFilesForCheck) {
36 return isRunnerJobVODWebVideoUpdatePayloadValid(value, type, files) ||
37 isRunnerJobVODHLSUpdatePayloadValid(value, type, files) ||
38 isRunnerJobVODAudioMergeUpdatePayloadValid(value, type, files) ||
39 isRunnerJobLiveRTMPHLSUpdatePayloadValid(value, type, files)
42 // ---------------------------------------------------------------------------
44 function isRunnerJobTokenValid (value: string) {
45 return exists(value) && validator.isLength(value, RUNNER_JOBS_CONSTRAINTS_FIELDS.TOKEN)
48 function isRunnerJobAbortReasonValid (value: string) {
49 return validator.isLength(value, RUNNER_JOBS_CONSTRAINTS_FIELDS.REASON)
52 function isRunnerJobErrorMessageValid (value: string) {
53 return validator.isLength(value, RUNNER_JOBS_CONSTRAINTS_FIELDS.ERROR_MESSAGE)
56 // ---------------------------------------------------------------------------
60 isRunnerJobSuccessPayloadValid,
61 isRunnerJobUpdatePayloadValid,
62 isRunnerJobTokenValid,
63 isRunnerJobErrorMessageValid,
64 isRunnerJobProgressValid,
65 isRunnerJobAbortReasonValid
68 // ---------------------------------------------------------------------------
70 function isRunnerJobVODWebVideoResultPayloadValid (
71 _value: VODWebVideoTranscodingSuccess,
73 files: UploadFilesForCheck
75 return type === 'vod-web-video-transcoding' &&
76 isFileValid({ files, field: 'payload[videoFile]', mimeTypeRegex: null, maxSize: null })
79 function isRunnerJobVODHLSResultPayloadValid (
80 _value: VODHLSTranscodingSuccess,
82 files: UploadFilesForCheck
84 return type === 'vod-hls-transcoding' &&
85 isFileValid({ files, field: 'payload[videoFile]', mimeTypeRegex: null, maxSize: null }) &&
86 isFileValid({ files, field: 'payload[resolutionPlaylistFile]', mimeTypeRegex: null, maxSize: null })
89 function isRunnerJobVODAudioMergeResultPayloadValid (
90 _value: VODAudioMergeTranscodingSuccess,
92 files: UploadFilesForCheck
94 return type === 'vod-audio-merge-transcoding' &&
95 isFileValid({ files, field: 'payload[videoFile]', mimeTypeRegex: null, maxSize: null })
98 function isRunnerJobLiveRTMPHLSResultPayloadValid (
99 value: LiveRTMPHLSTranscodingSuccess,
102 return type === 'live-rtmp-hls-transcoding' && (!value || (typeof value === 'object' && Object.keys(value).length === 0))
105 // ---------------------------------------------------------------------------
107 function isRunnerJobVODWebVideoUpdatePayloadValid (
108 value: RunnerJobUpdatePayload,
110 _files: UploadFilesForCheck
112 return type === 'vod-web-video-transcoding' &&
113 (!value || (typeof value === 'object' && Object.keys(value).length === 0))
116 function isRunnerJobVODHLSUpdatePayloadValid (
117 value: RunnerJobUpdatePayload,
119 _files: UploadFilesForCheck
121 return type === 'vod-hls-transcoding' &&
122 (!value || (typeof value === 'object' && Object.keys(value).length === 0))
125 function isRunnerJobVODAudioMergeUpdatePayloadValid (
126 value: RunnerJobUpdatePayload,
128 _files: UploadFilesForCheck
130 return type === 'vod-audio-merge-transcoding' &&
131 (!value || (typeof value === 'object' && Object.keys(value).length === 0))
134 function isRunnerJobLiveRTMPHLSUpdatePayloadValid (
135 value: RunnerJobUpdatePayload,
137 files: UploadFilesForCheck
139 let result = type === 'live-rtmp-hls-transcoding' && !!value && !!files
141 result &&= isFileValid({ files, field: 'payload[masterPlaylistFile]', mimeTypeRegex: null, maxSize: null, optional: true })
143 result &&= isFileValid({
145 field: 'payload[resolutionPlaylistFile]',
148 optional: !value.resolutionPlaylistFilename
151 if (files['payload[resolutionPlaylistFile]']) {
152 result &&= isSafeFilename(value.resolutionPlaylistFilename, 'm3u8')
156 isSafeFilename(value.videoChunkFilename, 'ts') &&
159 value.type === 'remove-chunk'
162 value.type === 'add-chunk' &&
163 isFileValid({ files, field: 'payload[videoChunkFile]', mimeTypeRegex: null, maxSize: null })