]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/lib/job-queue/handlers/video-file-import.ts
Bumped to version v5.2.1
[github/Chocobozzz/PeerTube.git] / server / lib / job-queue / handlers / video-file-import.ts
CommitLineData
5a921e7b 1import { Job } from 'bullmq'
30842128 2import { copy, stat } from 'fs-extra'
d7a25329 3import { createTorrentAndSetInfoHash } from '@server/helpers/webtorrent'
0305db28
JB
4import { CONFIG } from '@server/initializers/config'
5import { federateVideoIfNeeded } from '@server/lib/activitypub/videos'
6import { generateWebTorrentVideoFilename } from '@server/lib/paths'
bd911b54 7import { buildMoveToObjectStorageJob } from '@server/lib/video'
0305db28 8import { VideoPathManager } from '@server/lib/video-path-manager'
c729caf6
C
9import { VideoModel } from '@server/models/video/video'
10import { VideoFileModel } from '@server/models/video/video-file'
2451916e 11import { MVideoFullLight } from '@server/types/models'
c729caf6 12import { getLowercaseExtension } from '@shared/core-utils'
0c9668f7 13import { getVideoStreamDimensionsInfo, getVideoStreamFPS } from '@shared/ffmpeg'
0305db28 14import { VideoFileImportPayload, VideoStorage } from '@shared/models'
daf6e480 15import { logger } from '../../../helpers/logger'
bd911b54 16import { JobQueue } from '../job-queue'
30842128 17
41fb13c3 18async function processVideoFileImport (job: Job) {
30842128 19 const payload = job.data as VideoFileImportPayload
bd911b54 20 logger.info('Processing video file import in job %s.', job.id)
30842128 21
4fae2b1f 22 const video = await VideoModel.loadFull(payload.videoUUID)
30842128
C
23 // No video, maybe deleted?
24 if (!video) {
25 logger.info('Do not process job %d, video does not exist.', job.id)
26 return undefined
27 }
28
29 await updateVideoFile(video, payload.filePath)
30
0305db28 31 if (CONFIG.OBJECT_STORAGE.ENABLED) {
bd911b54 32 await JobQueue.Instance.createJob(await buildMoveToObjectStorageJob({ video, previousVideoState: video.state }))
0305db28
JB
33 } else {
34 await federateVideoIfNeeded(video, false)
69eddafb 35 }
77d7e851 36
30842128
C
37 return video
38}
39
40// ---------------------------------------------------------------------------
41
42export {
43 processVideoFileImport
44}
45
46// ---------------------------------------------------------------------------
47
90a8bd30 48async function updateVideoFile (video: MVideoFullLight, inputFilePath: string) {
c729caf6 49 const { resolution } = await getVideoStreamDimensionsInfo(inputFilePath)
30842128 50 const { size } = await stat(inputFilePath)
c729caf6 51 const fps = await getVideoStreamFPS(inputFilePath)
30842128 52
ea54cd04 53 const fileExt = getLowercaseExtension(inputFilePath)
30842128 54
679c12e6 55 const currentVideoFile = video.VideoFiles.find(videoFile => videoFile.resolution === resolution)
30842128
C
56
57 if (currentVideoFile) {
58 // Remove old file and old torrent
1bb4c9ab 59 await video.removeWebTorrentFile(currentVideoFile)
30842128
C
60 // Remove the old video file from the array
61 video.VideoFiles = video.VideoFiles.filter(f => f !== currentVideoFile)
62
2451916e 63 await currentVideoFile.destroy()
30842128
C
64 }
65
2451916e 66 const newVideoFile = new VideoFileModel({
679c12e6 67 resolution,
2451916e 68 extname: fileExt,
679c12e6 69 filename: generateWebTorrentVideoFilename(resolution, fileExt),
0305db28 70 storage: VideoStorage.FILE_SYSTEM,
2451916e
C
71 size,
72 fps,
73 videoId: video.id
74 })
30842128 75
0305db28 76 const outputPath = VideoPathManager.Instance.getFSVideoFileOutputPath(video, newVideoFile)
2451916e 77 await copy(inputFilePath, outputPath)
30842128 78
2451916e 79 video.VideoFiles.push(newVideoFile)
8efc27bf 80 await createTorrentAndSetInfoHash(video, newVideoFile)
30842128 81
2451916e 82 await newVideoFile.save()
30842128 83}