import { Transaction } from 'sequelize/types'
-import { resetSequelizeInstance } from '@server/helpers/database-utils'
+import { resetSequelizeInstance, runInReadCommittedTransaction } from '@server/helpers/database-utils'
import { logger, loggerTagsFactory, LoggerTagsFn } from '@server/helpers/logger'
-import { sequelizeTypescript } from '@server/initializers/database'
import { Notifier } from '@server/lib/notifier'
import { PeerTubeSocket } from '@server/lib/peertube-socket'
import { autoBlacklistVideoIfNeeded } from '@server/lib/video-blacklist'
-import { VideoCaptionModel } from '@server/models/video/video-caption'
import { VideoLiveModel } from '@server/models/video/video-live'
import { MActor, MChannelAccountLight, MChannelId, MVideoAccountLightBlacklistAllFiles, MVideoFullLight } from '@server/types/models'
import { VideoObject, VideoPrivacy } from '@shared/models'
-import { APVideoAbstractBuilder, getVideoAttributesFromObject } from './shared'
+import { APVideoAbstractBuilder, getVideoAttributesFromObject, updateVideoRates } from './shared'
export class APVideoUpdater extends APVideoAbstractBuilder {
private readonly wasPrivateVideo: boolean
const thumbnailModel = await this.tryToGenerateThumbnail(this.video)
- const videoUpdated = await sequelizeTypescript.transaction(async t => {
- this.checkChannelUpdateOrThrow(channelActor)
+ this.checkChannelUpdateOrThrow(channelActor)
- const videoUpdated = await this.updateVideo(channelActor.VideoChannel, t, overrideTo)
+ const videoUpdated = await this.updateVideo(channelActor.VideoChannel, undefined, overrideTo)
- if (thumbnailModel) await videoUpdated.addAndSaveThumbnail(thumbnailModel, t)
+ if (thumbnailModel) await videoUpdated.addAndSaveThumbnail(thumbnailModel)
- await this.setPreview(videoUpdated, t)
+ await runInReadCommittedTransaction(async t => {
await this.setWebTorrentFiles(videoUpdated, t)
await this.setStreamingPlaylists(videoUpdated, t)
- await this.setTags(videoUpdated, t)
- await this.setTrackers(videoUpdated, t)
- await this.setCaptions(videoUpdated, t)
- await this.setOrDeleteLive(videoUpdated, t)
-
- return videoUpdated
})
+ await Promise.all([
+ runInReadCommittedTransaction(t => this.setTags(videoUpdated, t)),
+ runInReadCommittedTransaction(t => this.setTrackers(videoUpdated, t)),
+ this.setOrDeleteLive(videoUpdated),
+ this.setPreview(videoUpdated)
+ ])
+
+ await runInReadCommittedTransaction(t => this.setCaptions(videoUpdated, t))
+
await autoBlacklistVideoIfNeeded({
video: videoUpdated,
user: undefined,
transaction: undefined
})
+ await updateVideoRates(videoUpdated, this.videoObject)
+
// Notify our users?
if (this.wasPrivateVideo || this.wasUnlistedVideo) {
Notifier.Instance.notifyOnNewVideoIfNeeded(videoUpdated)
if (videoUpdated.isLive) {
PeerTubeSocket.Instance.sendVideoLiveNewState(videoUpdated)
- PeerTubeSocket.Instance.sendVideoViewsUpdate(videoUpdated)
}
logger.info('Remote video with uuid %s updated', this.videoObject.uuid, this.lTags())
}
}
- private updateVideo (channel: MChannelId, transaction: Transaction, overrideTo?: string[]) {
+ private updateVideo (channel: MChannelId, transaction?: Transaction, overrideTo?: string[]) {
const to = overrideTo || this.videoObject.to
const videoData = getVideoAttributesFromObject(channel, this.videoObject, to)
this.video.name = videoData.name
}
private async setCaptions (videoUpdated: MVideoFullLight, t: Transaction) {
- await VideoCaptionModel.deleteAllCaptionsOfRemoteVideo(videoUpdated.id, t)
-
await this.insertOrReplaceCaptions(videoUpdated, t)
}
- private async setOrDeleteLive (videoUpdated: MVideoFullLight, transaction: Transaction) {
+ private async setOrDeleteLive (videoUpdated: MVideoFullLight, transaction?: Transaction) {
+ if (!this.video.isLive) return
+
if (this.video.isLive) return this.insertOrReplaceLive(videoUpdated, transaction)
// Delete existing live if it exists