From bd911b54b555b11df7e9849cf92d358bccfecf6e Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 8 Aug 2022 15:48:17 +0200 Subject: Use bullmq job dependency --- server/controllers/api/videos/update.ts | 64 +++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 23 deletions(-) (limited to 'server/controllers/api/videos/update.ts') diff --git a/server/controllers/api/videos/update.ts b/server/controllers/api/videos/update.ts index 1545a2232..ab1a23d9a 100644 --- a/server/controllers/api/videos/update.ts +++ b/server/controllers/api/videos/update.ts @@ -1,7 +1,7 @@ import express from 'express' import { Transaction } from 'sequelize/types' import { changeVideoChannelShare } from '@server/lib/activitypub/share' -import { JobQueue } from '@server/lib/job-queue' +import { CreateJobArgument, JobQueue } from '@server/lib/job-queue' import { buildVideoThumbnailsFromReq, setVideoTags } from '@server/lib/video' import { openapiOperationDoc } from '@server/middlewares/doc' import { FilteredModelAttributes } from '@server/types' @@ -13,8 +13,6 @@ import { createReqFiles } from '../../../helpers/express-utils' import { logger, loggerTagsFactory } from '../../../helpers/logger' import { MIMETYPES } from '../../../initializers/constants' import { sequelizeTypescript } from '../../../initializers/database' -import { federateVideoIfNeeded } from '../../../lib/activitypub/videos' -import { Notifier } from '../../../lib/notifier' import { Hooks } from '../../../lib/plugins/hooks' import { autoBlacklistVideoIfNeeded } from '../../../lib/video-blacklist' import { asyncMiddleware, asyncRetryTransactionMiddleware, authenticate, videosUpdateValidator } from '../../../middlewares' @@ -139,13 +137,9 @@ async function updateVideo (req: express.Request, res: express.Response) { return { videoInstanceUpdated, isNewVideo } }) - const refreshedVideo = await updateTorrentsMetadataIfNeeded(videoInstanceUpdated, videoInfoToUpdate) + Hooks.runAction('action:api.video.updated', { video: videoInstanceUpdated, body: req.body, req, res }) - await sequelizeTypescript.transaction(t => federateVideoIfNeeded(refreshedVideo, isNewVideo, t)) - - if (wasConfidentialVideo) Notifier.Instance.notifyOnNewVideoIfNeeded(refreshedVideo) - - Hooks.runAction('action:api.video.updated', { video: refreshedVideo, body: req.body, req, res }) + await addVideoJobsAfterUpdate({ video: videoInstanceUpdated, videoInfoToUpdate, wasConfidentialVideo, isNewVideo }) } catch (err) { // Force fields we want to update // If the transaction is retried, sequelize will think the object has not changed @@ -192,25 +186,49 @@ function updateSchedule (videoInstance: MVideoFullLight, videoInfoToUpdate: Vide } } -async function updateTorrentsMetadataIfNeeded (video: MVideoFullLight, videoInfoToUpdate: VideoUpdate) { - if (video.isLive || !videoInfoToUpdate.name) return video +async function addVideoJobsAfterUpdate (options: { + video: MVideoFullLight + videoInfoToUpdate: VideoUpdate + wasConfidentialVideo: boolean + isNewVideo: boolean +}) { + const { video, videoInfoToUpdate, wasConfidentialVideo, isNewVideo } = options + const jobs: CreateJobArgument[] = [] + + if (!video.isLive && videoInfoToUpdate.name) { - for (const file of (video.VideoFiles || [])) { - const payload: ManageVideoTorrentPayload = { action: 'update-metadata', videoId: video.id, videoFileId: file.id } + for (const file of (video.VideoFiles || [])) { + const payload: ManageVideoTorrentPayload = { action: 'update-metadata', videoId: video.id, videoFileId: file.id } - const job = await JobQueue.Instance.createJobWithPromise({ type: 'manage-video-torrent', payload }) - await JobQueue.Instance.waitJob(job) - } + jobs.push({ type: 'manage-video-torrent', payload }) + } - const hls = video.getHLSPlaylist() + const hls = video.getHLSPlaylist() - for (const file of (hls?.VideoFiles || [])) { - const payload: ManageVideoTorrentPayload = { action: 'update-metadata', streamingPlaylistId: hls.id, videoFileId: file.id } + for (const file of (hls?.VideoFiles || [])) { + const payload: ManageVideoTorrentPayload = { action: 'update-metadata', streamingPlaylistId: hls.id, videoFileId: file.id } - const job = await JobQueue.Instance.createJobWithPromise({ type: 'manage-video-torrent', payload }) - await JobQueue.Instance.waitJob(job) + jobs.push({ type: 'manage-video-torrent', payload }) + } + } + + jobs.push({ + type: 'federate-video', + payload: { + videoUUID: video.uuid, + isNewVideo + } + }) + + if (wasConfidentialVideo) { + jobs.push({ + type: 'notify', + payload: { + action: 'new-video', + videoUUID: video.uuid + } + }) } - // Refresh video since files have changed - return VideoModel.loadFull(video.id) + return JobQueue.Instance.createSequentialJobFlow(...jobs) } -- cgit v1.2.3