]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/lib/jobs/handlers/video-file-optimizer.ts
Fix integrity issues with after destroy hook
[github/Chocobozzz/PeerTube.git] / server / lib / jobs / handlers / video-file-optimizer.ts
CommitLineData
f5028693 1import * as Bluebird from 'bluebird'
40298b02
C
2
3import { database as db } from '../../../initializers/database'
4import { logger, computeResolutionsToTranscode } from '../../../helpers'
5import { VideoInstance } from '../../../models'
6import { addVideoToFriends } from '../../friends'
7import { JobScheduler } from '../job-scheduler'
8
f5028693
C
9async function process (data: { videoUUID: string }, jobId: number) {
10 const video = await db.Video.loadByUUIDAndPopulateAuthorAndPodAndTags(data.videoUUID)
11 // No video, maybe deleted?
12 if (!video) {
13 logger.info('Do not process job %d, video does not exist.', jobId, { videoUUID: video.uuid })
14 return undefined
15 }
16
17 await video.optimizeOriginalVideofile()
031094f7 18
f5028693 19 return video
40298b02
C
20}
21
22function onError (err: Error, jobId: number) {
23 logger.error('Error when optimized video file in job %d.', jobId, err)
24 return Promise.resolve()
25}
26
f5028693 27async function onSuccess (jobId: number, video: VideoInstance) {
031094f7
C
28 if (video === undefined) return undefined
29
40298b02
C
30 logger.info('Job %d is a success.', jobId)
31
f5028693
C
32 const remoteVideo = await video.toAddRemoteJSON()
33
34 // Now we'll add the video's meta data to our friends
35 await addVideoToFriends(remoteVideo, null)
36
37 const originalFileHeight = await video.getOriginalFileHeight()
38 // Create transcoding jobs if there are enabled resolutions
39
40 const resolutionsEnabled = computeResolutionsToTranscode(originalFileHeight)
41 logger.info(
42 'Resolutions computed for video %s and origin file height of %d.', video.uuid, originalFileHeight,
43 { resolutions: resolutionsEnabled }
44 )
45
46 if (resolutionsEnabled.length !== 0) {
47 try {
48 await db.sequelize.transaction(async t => {
49 const tasks: Bluebird<any>[] = []
50
51 for (const resolution of resolutionsEnabled) {
40298b02
C
52 const dataInput = {
53 videoUUID: video.uuid,
54 resolution
55 }
56
57 const p = JobScheduler.Instance.createJob(t, 'videoFileTranscoder', dataInput)
58 tasks.push(p)
f5028693 59 }
40298b02 60
f5028693 61 await Promise.all(tasks)
40298b02 62 })
40298b02
C
63
64 logger.info('Transcoding jobs created for uuid %s.', video.uuid, { resolutionsEnabled })
f5028693
C
65 } catch (err) {
66 logger.warn('Cannot transcode the video.', err)
67 }
68 } else {
69 logger.info('No transcoding jobs created for video %s (no resolutions enabled).')
70 return undefined
71 }
40298b02
C
72}
73
74// ---------------------------------------------------------------------------
75
76export {
77 process,
78 onError,
79 onSuccess
80}