+// ---------------------------------------------------------------------------
+// Job handlers
+// ---------------------------------------------------------------------------
+
+async function handleHLSJob (job: Bull.Job, payload: HLSTranscodingPayload, video: MVideoFullLight, user: MUser) {
+ const videoFileInput = payload.copyCodecs
+ ? video.getWebTorrentFile(payload.resolution)
+ : video.getMaxQualityFile()
+
+ const videoOrStreamingPlaylist = videoFileInput.getVideoOrStreamingPlaylist()
+ const videoInputPath = getVideoFilePath(videoOrStreamingPlaylist, videoFileInput)
+
+ await generateHlsPlaylistResolution({
+ video,
+ videoInputPath,
+ resolution: payload.resolution,
+ copyCodecs: payload.copyCodecs,
+ isPortraitMode: payload.isPortraitMode || false,
+ job
+ })
+
+ await retryTransactionWrapper(onHlsPlaylistGeneration, video, user, payload)
+}
+
+async function handleNewWebTorrentResolutionJob (
+ job: Bull.Job,
+ payload: NewResolutionTranscodingPayload,
+ video: MVideoFullLight,
+ user: MUserId
+) {
+ await transcodeNewWebTorrentResolution(video, payload.resolution, payload.isPortraitMode || false, job)
+
+ await retryTransactionWrapper(onNewWebTorrentFileResolution, video, user, payload)
+}
+
+async function handleWebTorrentMergeAudioJob (job: Bull.Job, payload: MergeAudioTranscodingPayload, video: MVideoFullLight, user: MUserId) {
+ await mergeAudioVideofile(video, payload.resolution, job)
+
+ await retryTransactionWrapper(onVideoFileOptimizer, video, payload, 'video', user)
+}
+
+async function handleWebTorrentOptimizeJob (job: Bull.Job, payload: OptimizeTranscodingPayload, video: MVideoFullLight, user: MUserId) {
+ const transcodeType = await optimizeOriginalVideofile(video, video.getMaxQualityFile(), job)
+
+ await retryTransactionWrapper(onVideoFileOptimizer, video, payload, transcodeType, user)
+}
+
+// ---------------------------------------------------------------------------
+
+async function onHlsPlaylistGeneration (video: MVideoFullLight, user: MUser, payload: HLSTranscodingPayload) {