diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/lib/job-queue/handlers/video-transcoding.ts | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/server/lib/job-queue/handlers/video-transcoding.ts b/server/lib/job-queue/handlers/video-transcoding.ts index b3149dde8..5a93c4ed1 100644 --- a/server/lib/job-queue/handlers/video-transcoding.ts +++ b/server/lib/job-queue/handlers/video-transcoding.ts | |||
@@ -15,7 +15,7 @@ import { | |||
15 | } from '../../../../shared' | 15 | } from '../../../../shared' |
16 | import { retryTransactionWrapper } from '../../../helpers/database-utils' | 16 | import { retryTransactionWrapper } from '../../../helpers/database-utils' |
17 | import { computeResolutionsToTranscode } from '../../../helpers/ffprobe-utils' | 17 | import { computeResolutionsToTranscode } from '../../../helpers/ffprobe-utils' |
18 | import { logger } from '../../../helpers/logger' | 18 | import { logger, loggerTagsFactory } from '../../../helpers/logger' |
19 | import { CONFIG } from '../../../initializers/config' | 19 | import { CONFIG } from '../../../initializers/config' |
20 | import { VideoModel } from '../../../models/video/video' | 20 | import { VideoModel } from '../../../models/video/video' |
21 | import { | 21 | import { |
@@ -34,14 +34,16 @@ const handlers: { [ id in VideoTranscodingPayload['type'] ]: HandlerFunction } = | |||
34 | 'optimize-to-webtorrent': handleWebTorrentOptimizeJob | 34 | 'optimize-to-webtorrent': handleWebTorrentOptimizeJob |
35 | } | 35 | } |
36 | 36 | ||
37 | const lTags = loggerTagsFactory('transcoding') | ||
38 | |||
37 | async function processVideoTranscoding (job: Bull.Job) { | 39 | async function processVideoTranscoding (job: Bull.Job) { |
38 | const payload = job.data as VideoTranscodingPayload | 40 | const payload = job.data as VideoTranscodingPayload |
39 | logger.info('Processing video file in job %d.', job.id) | 41 | logger.info('Processing transcoding job %d.', job.id, lTags(payload.videoUUID)) |
40 | 42 | ||
41 | const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(payload.videoUUID) | 43 | const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(payload.videoUUID) |
42 | // No video, maybe deleted? | 44 | // No video, maybe deleted? |
43 | if (!video) { | 45 | if (!video) { |
44 | logger.info('Do not process job %d, video does not exist.', job.id) | 46 | logger.info('Do not process job %d, video does not exist.', job.id, lTags(payload.videoUUID)) |
45 | return undefined | 47 | return undefined |
46 | } | 48 | } |
47 | 49 | ||
@@ -63,6 +65,8 @@ async function processVideoTranscoding (job: Bull.Job) { | |||
63 | // --------------------------------------------------------------------------- | 65 | // --------------------------------------------------------------------------- |
64 | 66 | ||
65 | async function handleHLSJob (job: Bull.Job, payload: HLSTranscodingPayload, video: MVideoFullLight, user: MUser) { | 67 | async function handleHLSJob (job: Bull.Job, payload: HLSTranscodingPayload, video: MVideoFullLight, user: MUser) { |
68 | logger.info('Handling HLS transcoding job for %s.', video.uuid, lTags(video.uuid)) | ||
69 | |||
66 | const videoFileInput = payload.copyCodecs | 70 | const videoFileInput = payload.copyCodecs |
67 | ? video.getWebTorrentFile(payload.resolution) | 71 | ? video.getWebTorrentFile(payload.resolution) |
68 | : video.getMaxQualityFile() | 72 | : video.getMaxQualityFile() |
@@ -80,6 +84,8 @@ async function handleHLSJob (job: Bull.Job, payload: HLSTranscodingPayload, vide | |||
80 | }) | 84 | }) |
81 | }) | 85 | }) |
82 | 86 | ||
87 | logger.info('HLS transcoding job for %s ended.', video.uuid, lTags(video.uuid)) | ||
88 | |||
83 | await retryTransactionWrapper(onHlsPlaylistGeneration, video, user, payload) | 89 | await retryTransactionWrapper(onHlsPlaylistGeneration, video, user, payload) |
84 | } | 90 | } |
85 | 91 | ||
@@ -89,28 +95,38 @@ async function handleNewWebTorrentResolutionJob ( | |||
89 | video: MVideoFullLight, | 95 | video: MVideoFullLight, |
90 | user: MUserId | 96 | user: MUserId |
91 | ) { | 97 | ) { |
98 | logger.info('Handling WebTorrent transcoding job for %s.', video.uuid, lTags(video.uuid)) | ||
99 | |||
92 | await transcodeNewWebTorrentResolution(video, payload.resolution, payload.isPortraitMode || false, job) | 100 | await transcodeNewWebTorrentResolution(video, payload.resolution, payload.isPortraitMode || false, job) |
93 | 101 | ||
102 | logger.info('WebTorrent transcoding job for %s ended.', video.uuid, lTags(video.uuid)) | ||
103 | |||
94 | await retryTransactionWrapper(onNewWebTorrentFileResolution, video, user, payload) | 104 | await retryTransactionWrapper(onNewWebTorrentFileResolution, video, user, payload) |
95 | } | 105 | } |
96 | 106 | ||
97 | async function handleWebTorrentMergeAudioJob (job: Bull.Job, payload: MergeAudioTranscodingPayload, video: MVideoFullLight, user: MUserId) { | 107 | async function handleWebTorrentMergeAudioJob (job: Bull.Job, payload: MergeAudioTranscodingPayload, video: MVideoFullLight, user: MUserId) { |
108 | logger.info('Handling merge audio transcoding job for %s.', video.uuid, lTags(video.uuid)) | ||
109 | |||
98 | await mergeAudioVideofile(video, payload.resolution, job) | 110 | await mergeAudioVideofile(video, payload.resolution, job) |
99 | 111 | ||
112 | logger.info('Merge audio transcoding job for %s ended.', video.uuid, lTags(video.uuid)) | ||
113 | |||
100 | await retryTransactionWrapper(onVideoFileOptimizer, video, payload, 'video', user) | 114 | await retryTransactionWrapper(onVideoFileOptimizer, video, payload, 'video', user) |
101 | } | 115 | } |
102 | 116 | ||
103 | async function handleWebTorrentOptimizeJob (job: Bull.Job, payload: OptimizeTranscodingPayload, video: MVideoFullLight, user: MUserId) { | 117 | async function handleWebTorrentOptimizeJob (job: Bull.Job, payload: OptimizeTranscodingPayload, video: MVideoFullLight, user: MUserId) { |
118 | logger.info('Handling optimize transcoding job for %s.', video.uuid, lTags(video.uuid)) | ||
119 | |||
104 | const { transcodeType } = await optimizeOriginalVideofile(video, video.getMaxQualityFile(), job) | 120 | const { transcodeType } = await optimizeOriginalVideofile(video, video.getMaxQualityFile(), job) |
105 | 121 | ||
122 | logger.info('Optimize transcoding job for %s ended.', video.uuid, lTags(video.uuid)) | ||
123 | |||
106 | await retryTransactionWrapper(onVideoFileOptimizer, video, payload, transcodeType, user) | 124 | await retryTransactionWrapper(onVideoFileOptimizer, video, payload, transcodeType, user) |
107 | } | 125 | } |
108 | 126 | ||
109 | // --------------------------------------------------------------------------- | 127 | // --------------------------------------------------------------------------- |
110 | 128 | ||
111 | async function onHlsPlaylistGeneration (video: MVideoFullLight, user: MUser, payload: HLSTranscodingPayload) { | 129 | async function onHlsPlaylistGeneration (video: MVideoFullLight, user: MUser, payload: HLSTranscodingPayload) { |
112 | if (video === undefined) return undefined | ||
113 | |||
114 | if (payload.isMaxQuality && CONFIG.TRANSCODING.WEBTORRENT.ENABLED === false) { | 130 | if (payload.isMaxQuality && CONFIG.TRANSCODING.WEBTORRENT.ENABLED === false) { |
115 | // Remove webtorrent files if not enabled | 131 | // Remove webtorrent files if not enabled |
116 | for (const file of video.VideoFiles) { | 132 | for (const file of video.VideoFiles) { |
@@ -141,9 +157,6 @@ async function onVideoFileOptimizer ( | |||
141 | transcodeType: TranscodeOptionsType, | 157 | transcodeType: TranscodeOptionsType, |
142 | user: MUserId | 158 | user: MUserId |
143 | ) { | 159 | ) { |
144 | if (videoArg === undefined) return undefined | ||
145 | |||
146 | // Outside the transaction (IO on disk) | ||
147 | const { resolution, isPortraitMode } = await videoArg.getMaxQualityResolution() | 160 | const { resolution, isPortraitMode } = await videoArg.getMaxQualityResolution() |
148 | 161 | ||
149 | // Maybe the video changed in database, refresh it | 162 | // Maybe the video changed in database, refresh it |
@@ -241,7 +254,7 @@ async function createLowerResolutionsJobs (options: { | |||
241 | 254 | ||
242 | // Create transcoding jobs if there are enabled resolutions | 255 | // Create transcoding jobs if there are enabled resolutions |
243 | const resolutionsEnabled = computeResolutionsToTranscode(videoFileResolution, 'vod') | 256 | const resolutionsEnabled = computeResolutionsToTranscode(videoFileResolution, 'vod') |
244 | const resolutionCreated: number[] = [] | 257 | const resolutionCreated: string[] = [] |
245 | 258 | ||
246 | for (const resolution of resolutionsEnabled) { | 259 | for (const resolution of resolutionsEnabled) { |
247 | let dataInput: VideoTranscodingPayload | 260 | let dataInput: VideoTranscodingPayload |
@@ -255,6 +268,8 @@ async function createLowerResolutionsJobs (options: { | |||
255 | isPortraitMode, | 268 | isPortraitMode, |
256 | isNewVideo | 269 | isNewVideo |
257 | } | 270 | } |
271 | |||
272 | resolutionCreated.push('webtorrent-' + resolution) | ||
258 | } | 273 | } |
259 | 274 | ||
260 | if (CONFIG.TRANSCODING.HLS.ENABLED && type === 'hls') { | 275 | if (CONFIG.TRANSCODING.HLS.ENABLED && type === 'hls') { |
@@ -267,12 +282,12 @@ async function createLowerResolutionsJobs (options: { | |||
267 | isMaxQuality: false, | 282 | isMaxQuality: false, |
268 | isNewVideo | 283 | isNewVideo |
269 | } | 284 | } |
285 | |||
286 | resolutionCreated.push('hls-' + resolution) | ||
270 | } | 287 | } |
271 | 288 | ||
272 | if (!dataInput) continue | 289 | if (!dataInput) continue |
273 | 290 | ||
274 | resolutionCreated.push(resolution) | ||
275 | |||
276 | const jobOptions = { | 291 | const jobOptions = { |
277 | priority: await getTranscodingJobPriority(user) | 292 | priority: await getTranscodingJobPriority(user) |
278 | } | 293 | } |
@@ -281,14 +296,14 @@ async function createLowerResolutionsJobs (options: { | |||
281 | } | 296 | } |
282 | 297 | ||
283 | if (resolutionCreated.length === 0) { | 298 | if (resolutionCreated.length === 0) { |
284 | logger.info('No transcoding jobs created for video %s (no resolutions).', video.uuid) | 299 | logger.info('No transcoding jobs created for video %s (no resolutions).', video.uuid, lTags(video.uuid)) |
285 | 300 | ||
286 | return false | 301 | return false |
287 | } | 302 | } |
288 | 303 | ||
289 | logger.info( | 304 | logger.info( |
290 | 'New resolutions %s transcoding jobs created for video %s and origin file resolution of %d.', type, video.uuid, videoFileResolution, | 305 | 'New resolutions %s transcoding jobs created for video %s and origin file resolution of %d.', type, video.uuid, videoFileResolution, |
291 | { resolutionCreated } | 306 | { resolutionCreated, ...lTags(video.uuid) } |
292 | ) | 307 | ) |
293 | 308 | ||
294 | return true | 309 | return true |