]>
Commit | Line | Data |
---|---|---|
5a921e7b | 1 | import { Job } from 'bullmq' |
849f0fd3 | 2 | import { extractVideo } from '@server/helpers/video' |
f012319a | 3 | import { createTorrentAndSetInfoHash, updateTorrentMetadata } from '@server/helpers/webtorrent' |
849f0fd3 | 4 | import { VideoPathManager } from '@server/lib/video-path-manager' |
f012319a C |
5 | import { VideoModel } from '@server/models/video/video' |
6 | import { VideoFileModel } from '@server/models/video/video-file' | |
7 | import { VideoStreamingPlaylistModel } from '@server/models/video/video-streaming-playlist' | |
8 | import { ManageVideoTorrentPayload } from '@shared/models' | |
9 | import { logger } from '../../../helpers/logger' | |
10 | ||
11 | async function processManageVideoTorrent (job: Job) { | |
12 | const payload = job.data as ManageVideoTorrentPayload | |
bd911b54 | 13 | logger.info('Processing torrent in job %s.', job.id) |
f012319a C |
14 | |
15 | if (payload.action === 'create') return doCreateAction(payload) | |
16 | if (payload.action === 'update-metadata') return doUpdateMetadataAction(payload) | |
17 | } | |
18 | ||
19 | // --------------------------------------------------------------------------- | |
20 | ||
21 | export { | |
22 | processManageVideoTorrent | |
23 | } | |
24 | ||
25 | // --------------------------------------------------------------------------- | |
26 | ||
27 | async function doCreateAction (payload: ManageVideoTorrentPayload & { action: 'create' }) { | |
28 | const [ video, file ] = await Promise.all([ | |
29 | loadVideoOrLog(payload.videoId), | |
30 | loadFileOrLog(payload.videoFileId) | |
31 | ]) | |
32 | ||
52fe4b67 C |
33 | if (!video || !file) return |
34 | ||
849f0fd3 | 35 | const fileMutexReleaser = await VideoPathManager.Instance.lockFiles(video.uuid) |
f012319a | 36 | |
849f0fd3 C |
37 | try { |
38 | await createTorrentAndSetInfoHash(video, file) | |
f012319a | 39 | |
849f0fd3 C |
40 | // Refresh videoFile because the createTorrentAndSetInfoHash could be long |
41 | const refreshedFile = await VideoFileModel.loadWithVideo(file.id) | |
42 | // File does not exist anymore, remove the generated torrent | |
43 | if (!refreshedFile) return file.removeTorrent() | |
f012319a | 44 | |
849f0fd3 C |
45 | refreshedFile.infoHash = file.infoHash |
46 | refreshedFile.torrentFilename = file.torrentFilename | |
47 | ||
48 | await refreshedFile.save() | |
49 | } finally { | |
50 | fileMutexReleaser() | |
51 | } | |
f012319a C |
52 | } |
53 | ||
54 | async function doUpdateMetadataAction (payload: ManageVideoTorrentPayload & { action: 'update-metadata' }) { | |
55 | const [ video, streamingPlaylist, file ] = await Promise.all([ | |
56 | loadVideoOrLog(payload.videoId), | |
57 | loadStreamingPlaylistOrLog(payload.streamingPlaylistId), | |
58 | loadFileOrLog(payload.videoFileId) | |
59 | ]) | |
60 | ||
52fe4b67 C |
61 | if ((!video && !streamingPlaylist) || !file) return |
62 | ||
849f0fd3 C |
63 | const extractedVideo = extractVideo(video || streamingPlaylist) |
64 | const fileMutexReleaser = await VideoPathManager.Instance.lockFiles(extractedVideo.uuid) | |
f012319a | 65 | |
849f0fd3 C |
66 | try { |
67 | await updateTorrentMetadata(video || streamingPlaylist, file) | |
68 | ||
69 | await file.save() | |
70 | } finally { | |
71 | fileMutexReleaser() | |
72 | } | |
f012319a C |
73 | } |
74 | ||
75 | async function loadVideoOrLog (videoId: number) { | |
76 | if (!videoId) return undefined | |
77 | ||
78 | const video = await VideoModel.load(videoId) | |
79 | if (!video) { | |
80 | logger.debug('Do not process torrent for video %d: does not exist anymore.', videoId) | |
81 | } | |
82 | ||
83 | return video | |
84 | } | |
85 | ||
86 | async function loadStreamingPlaylistOrLog (streamingPlaylistId: number) { | |
87 | if (!streamingPlaylistId) return undefined | |
88 | ||
89 | const streamingPlaylist = await VideoStreamingPlaylistModel.loadWithVideo(streamingPlaylistId) | |
90 | if (!streamingPlaylist) { | |
91 | logger.debug('Do not process torrent for streaming playlist %d: does not exist anymore.', streamingPlaylistId) | |
92 | } | |
93 | ||
94 | return streamingPlaylist | |
95 | } | |
96 | ||
97 | async function loadFileOrLog (videoFileId: number) { | |
98 | if (!videoFileId) return undefined | |
99 | ||
3545e72c | 100 | const file = await VideoFileModel.load(videoFileId) |
f012319a C |
101 | |
102 | if (!file) { | |
103 | logger.debug('Do not process torrent for file %d: does not exist anymore.', videoFileId) | |
104 | } | |
105 | ||
106 | return file | |
107 | } |