2 import { logger, loggerTagsFactory } from '@server/helpers/logger'
3 import { sequelizeTypescript } from '@server/initializers/database'
4 import { autoBlacklistVideoIfNeeded } from '@server/lib/video-blacklist'
5 import { VideoModel } from '@server/models/video/video'
6 import { MThumbnail, MVideoFullLight, MVideoThumbnail } from '@server/types/models'
7 import { VideoObject } from '@shared/models'
8 import { APVideoAbstractBuilder } from './abstract-builder'
9 import { getVideoAttributesFromObject } from './object-to-model-attributes'
11 export class APVideoCreator extends APVideoAbstractBuilder {
12 protected lTags = loggerTagsFactory('ap', 'video', 'create')
14 constructor (protected readonly videoObject: VideoObject) {
18 async create (waitThumbnail = false) {
19 logger.debug('Adding remote video %s.', this.videoObject.id, this.lTags(this.videoObject.uuid))
21 const channelActor = await this.getOrCreateVideoChannelFromVideoObject()
22 const channel = channelActor.VideoChannel
24 const videoData = await getVideoAttributesFromObject(channel, this.videoObject, this.videoObject.to)
25 const video = VideoModel.build(videoData) as MVideoThumbnail
27 const promiseThumbnail = this.tryToGenerateThumbnail(video)
29 let thumbnailModel: MThumbnail
30 if (waitThumbnail === true) {
31 thumbnailModel = await promiseThumbnail
34 const { autoBlacklisted, videoCreated } = await sequelizeTypescript.transaction(async t => {
36 const videoCreated = await video.save({ transaction: t }) as MVideoFullLight
37 videoCreated.VideoChannel = channel
39 if (thumbnailModel) await videoCreated.addAndSaveThumbnail(thumbnailModel, t)
41 await this.setPreview(videoCreated, t)
42 await this.setWebTorrentFiles(videoCreated, t)
43 await this.setStreamingPlaylists(videoCreated, t)
44 await this.setTags(videoCreated, t)
45 await this.setTrackers(videoCreated, t)
46 await this.insertOrReplaceCaptions(videoCreated, t)
47 await this.insertOrReplaceLive(videoCreated, t)
49 // We added a video in this channel, set it as updated
50 await channel.setAsUpdated(t)
52 const autoBlacklisted = await autoBlacklistVideoIfNeeded({
60 logger.info('Remote video with uuid %s inserted.', this.videoObject.uuid, this.lTags(videoCreated.uuid))
62 return { autoBlacklisted, videoCreated }
64 // FIXME: Use rollback hook when https://github.com/sequelize/sequelize/pull/13038 is released
66 if (thumbnailModel) await thumbnailModel.removeThumbnail()
72 if (waitThumbnail === false) {
73 // Error is already caught above
74 // eslint-disable-next-line @typescript-eslint/no-floating-promises
75 promiseThumbnail.then(thumbnailModel => {
76 if (!thumbnailModel) return
78 thumbnailModel = videoCreated.id
80 return thumbnailModel.save()
84 return { autoBlacklisted, videoCreated }