}
protected async insertOrReplaceCaptions (video: MVideoFullLight, t: Transaction) {
- const videoCaptionsPromises = getCaptionAttributesFromObject(video, this.videoObject)
- .map(a => new VideoCaptionModel(a) as MVideoCaption)
- .map(c => VideoCaptionModel.insertOrReplaceLanguage(c, t))
+ const existingCaptions = await VideoCaptionModel.listVideoCaptions(video.id, t)
- await Promise.all(videoCaptionsPromises)
+ let captionsToCreate = getCaptionAttributesFromObject(video, this.videoObject)
+ .map(a => new VideoCaptionModel(a) as MVideoCaption)
+
+ for (const existingCaption of existingCaptions) {
+ // Only keep captions that do not already exist
+ const filtered = captionsToCreate.filter(c => !c.isEqual(existingCaption))
+
+ // This caption already exists, we don't need to destroy and create it
+ if (filtered.length !== captionsToCreate.length) {
+ captionsToCreate = filtered
+ continue
+ }
+
+ // Destroy this caption that does not exist anymore
+ await existingCaption.destroy({ transaction: t })
+ }
+
+ for (const captionToCreate of captionsToCreate) {
+ await captionToCreate.save({ transaction: t })
+ }
}
protected async insertOrReplaceLive (video: MVideoFullLight, transaction: Transaction) {
return undefined
}
- static loadByVideoIdAndLanguage (videoId: string | number, language: string): Promise<MVideoCaptionVideo> {
+ static loadByVideoIdAndLanguage (videoId: string | number, language: string, transaction?: Transaction): Promise<MVideoCaptionVideo> {
const videoInclude = {
model: VideoModel.unscoped(),
attributes: [ 'id', 'remote', 'uuid' ],
- where: buildWhereIdOrUUID(videoId)
+ where: buildWhereIdOrUUID(videoId),
+ transaction
}
const query = {
}
static async insertOrReplaceLanguage (caption: MVideoCaption, transaction: Transaction) {
- const existing = await VideoCaptionModel.loadByVideoIdAndLanguage(caption.videoId, caption.language)
+ const existing = await VideoCaptionModel.loadByVideoIdAndLanguage(caption.videoId, caption.language, transaction)
+
// Delete existing file
if (existing) await existing.destroy({ transaction })
return caption.save({ transaction })
}
- static listVideoCaptions (videoId: number): Promise<MVideoCaptionVideo[]> {
+ static listVideoCaptions (videoId: number, transaction: Transaction): Promise<MVideoCaptionVideo[]> {
const query = {
order: [ [ 'language', 'ASC' ] ] as OrderItem[],
where: {
videoId
- }
+ },
+ transaction
}
return VideoCaptionModel.scope(ScopeNames.WITH_VIDEO_UUID_AND_REMOTE).findAll(query)
return this.fileUrl
}
+
+ isEqual (this: MVideoCaption, other: MVideoCaption) {
+ if (this.fileUrl) return this.fileUrl === other.fileUrl
+
+ return this.filename === other.filename
+ }
}