X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fjob-queue%2Fhandlers%2Fmanage-video-torrent.ts;h=cef93afda011cfd932df166112272a20817b7970;hb=a32bf8cd20212b903d3fa478e629f051eb77fecc;hp=5cb4287e14918c19331275b3ff20be89bbeee03d;hpb=f012319a644fe8d9d33f2f567fa828442a3b39fd;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/job-queue/handlers/manage-video-torrent.ts b/server/lib/job-queue/handlers/manage-video-torrent.ts index 5cb4287e1..cef93afda 100644 --- a/server/lib/job-queue/handlers/manage-video-torrent.ts +++ b/server/lib/job-queue/handlers/manage-video-torrent.ts @@ -1,5 +1,7 @@ -import { Job } from 'bull' +import { Job } from 'bullmq' +import { extractVideo } from '@server/helpers/video' import { createTorrentAndSetInfoHash, updateTorrentMetadata } from '@server/helpers/webtorrent' +import { VideoPathManager } from '@server/lib/video-path-manager' import { VideoModel } from '@server/models/video/video' import { VideoFileModel } from '@server/models/video/video-file' import { VideoStreamingPlaylistModel } from '@server/models/video/video-streaming-playlist' @@ -8,7 +10,7 @@ import { logger } from '../../../helpers/logger' async function processManageVideoTorrent (job: Job) { const payload = job.data as ManageVideoTorrentPayload - logger.info('Processing torrent in job %d.', job.id) + logger.info('Processing torrent in job %s.', job.id) if (payload.action === 'create') return doCreateAction(payload) if (payload.action === 'update-metadata') return doUpdateMetadataAction(payload) @@ -28,17 +30,25 @@ async function doCreateAction (payload: ManageVideoTorrentPayload & { action: 'c loadFileOrLog(payload.videoFileId) ]) - await createTorrentAndSetInfoHash(video, file) + if (!video || !file) return - // Refresh videoFile because the createTorrentAndSetInfoHash could be long - const refreshedFile = await VideoFileModel.loadWithVideo(file.id) - // File does not exist anymore, remove the generated torrent - if (!refreshedFile) return file.removeTorrent() + const fileMutexReleaser = await VideoPathManager.Instance.lockFiles(video.uuid) - refreshedFile.infoHash = file.infoHash - refreshedFile.torrentFilename = file.torrentFilename + try { + await createTorrentAndSetInfoHash(video, file) - return refreshedFile.save() + // Refresh videoFile because the createTorrentAndSetInfoHash could be long + const refreshedFile = await VideoFileModel.loadWithVideo(file.id) + // File does not exist anymore, remove the generated torrent + if (!refreshedFile) return file.removeTorrent() + + refreshedFile.infoHash = file.infoHash + refreshedFile.torrentFilename = file.torrentFilename + + await refreshedFile.save() + } finally { + fileMutexReleaser() + } } async function doUpdateMetadataAction (payload: ManageVideoTorrentPayload & { action: 'update-metadata' }) { @@ -48,9 +58,18 @@ async function doUpdateMetadataAction (payload: ManageVideoTorrentPayload & { ac loadFileOrLog(payload.videoFileId) ]) - await updateTorrentMetadata(video || streamingPlaylist, file) + if ((!video && !streamingPlaylist) || !file) return - await file.save() + const extractedVideo = extractVideo(video || streamingPlaylist) + const fileMutexReleaser = await VideoPathManager.Instance.lockFiles(extractedVideo.uuid) + + try { + await updateTorrentMetadata(video || streamingPlaylist, file) + + await file.save() + } finally { + fileMutexReleaser() + } } async function loadVideoOrLog (videoId: number) { @@ -78,7 +97,7 @@ async function loadStreamingPlaylistOrLog (streamingPlaylistId: number) { async function loadFileOrLog (videoFileId: number) { if (!videoFileId) return undefined - const file = await VideoFileModel.loadWithVideo(videoFileId) + const file = await VideoFileModel.load(videoFileId) if (!file) { logger.debug('Do not process torrent for file %d: does not exist anymore.', videoFileId)