2 import { logger, loggerTagsFactory, LoggerTagsFn } 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: LoggerTagsFn
14 constructor (protected readonly videoObject: VideoObject) {
17 this.lTags = loggerTagsFactory('ap', 'video', 'create', this.videoObject.uuid, this.videoObject.id)
20 async create (waitThumbnail = false) {
21 logger.debug('Adding remote video %s.', this.videoObject.id, this.lTags())
23 const channelActor = await this.getOrCreateVideoChannelFromVideoObject()
24 const channel = channelActor.VideoChannel
26 const videoData = getVideoAttributesFromObject(channel, this.videoObject, this.videoObject.to)
27 const video = VideoModel.build(videoData) as MVideoThumbnail
29 const promiseThumbnail = this.tryToGenerateThumbnail(video)
31 let thumbnailModel: MThumbnail
32 if (waitThumbnail === true) {
33 thumbnailModel = await promiseThumbnail
36 const { autoBlacklisted, videoCreated } = await sequelizeTypescript.transaction(async t => {
38 const videoCreated = await video.save({ transaction: t }) as MVideoFullLight
39 videoCreated.VideoChannel = channel
41 if (thumbnailModel) await videoCreated.addAndSaveThumbnail(thumbnailModel, t)
43 await this.setPreview(videoCreated, t)
44 await this.setWebTorrentFiles(videoCreated, t)
45 await this.setStreamingPlaylists(videoCreated, t)
46 await this.setTags(videoCreated, t)
47 await this.setTrackers(videoCreated, t)
48 await this.insertOrReplaceCaptions(videoCreated, t)
49 await this.insertOrReplaceLive(videoCreated, t)
51 // We added a video in this channel, set it as updated
52 await channel.setAsUpdated(t)
54 const autoBlacklisted = await autoBlacklistVideoIfNeeded({
62 logger.info('Remote video with uuid %s inserted.', this.videoObject.uuid, this.lTags())
64 return { autoBlacklisted, videoCreated }
66 // FIXME: Use rollback hook when https://github.com/sequelize/sequelize/pull/13038 is released
68 if (thumbnailModel) await thumbnailModel.removeThumbnail()
74 if (waitThumbnail === false) {
75 // Error is already caught above
76 // eslint-disable-next-line @typescript-eslint/no-floating-promises
77 promiseThumbnail.then(thumbnailModel => {
78 if (!thumbnailModel) return
80 thumbnailModel = videoCreated.id
82 return thumbnailModel.save()
86 return { autoBlacklisted, videoCreated }