]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/lib/activitypub/videos/shared/creator.ts
Refactor AP playlists
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / videos / shared / creator.ts
1
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'
10
11 export class APVideoCreator extends APVideoAbstractBuilder {
12 protected lTags = loggerTagsFactory('ap', 'video', 'create')
13
14 constructor (protected readonly videoObject: VideoObject) {
15 super()
16 }
17
18 async create (waitThumbnail = false) {
19 logger.debug('Adding remote video %s.', this.videoObject.id, this.lTags(this.videoObject.uuid))
20
21 const channelActor = await this.getOrCreateVideoChannelFromVideoObject()
22 const channel = channelActor.VideoChannel
23
24 const videoData = await getVideoAttributesFromObject(channel, this.videoObject, this.videoObject.to)
25 const video = VideoModel.build(videoData) as MVideoThumbnail
26
27 const promiseThumbnail = this.tryToGenerateThumbnail(video)
28
29 let thumbnailModel: MThumbnail
30 if (waitThumbnail === true) {
31 thumbnailModel = await promiseThumbnail
32 }
33
34 const { autoBlacklisted, videoCreated } = await sequelizeTypescript.transaction(async t => {
35 try {
36 const videoCreated = await video.save({ transaction: t }) as MVideoFullLight
37 videoCreated.VideoChannel = channel
38
39 if (thumbnailModel) await videoCreated.addAndSaveThumbnail(thumbnailModel, t)
40
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)
48
49 // We added a video in this channel, set it as updated
50 await channel.setAsUpdated(t)
51
52 const autoBlacklisted = await autoBlacklistVideoIfNeeded({
53 video: videoCreated,
54 user: undefined,
55 isRemote: true,
56 isNew: true,
57 transaction: t
58 })
59
60 logger.info('Remote video with uuid %s inserted.', this.videoObject.uuid, this.lTags(videoCreated.uuid))
61
62 return { autoBlacklisted, videoCreated }
63 } catch (err) {
64 // FIXME: Use rollback hook when https://github.com/sequelize/sequelize/pull/13038 is released
65 // Remove thumbnail
66 if (thumbnailModel) await thumbnailModel.removeThumbnail()
67
68 throw err
69 }
70 })
71
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
77
78 thumbnailModel = videoCreated.id
79
80 return thumbnailModel.save()
81 })
82 }
83
84 return { autoBlacklisted, videoCreated }
85 }
86 }