Verified Commit 57a0a9cd authored by Chocobozzz's avatar Chocobozzz
Browse files

Optimize AP video captions update

parent 4ead40e7
...@@ -75,11 +75,28 @@ export abstract class APVideoAbstractBuilder { ...@@ -75,11 +75,28 @@ export abstract class APVideoAbstractBuilder {
} }
protected async insertOrReplaceCaptions (video: MVideoFullLight, t: Transaction) { protected async insertOrReplaceCaptions (video: MVideoFullLight, t: Transaction) {
const videoCaptionsPromises = getCaptionAttributesFromObject(video, this.videoObject) const existingCaptions = await VideoCaptionModel.listVideoCaptions(video.id, t)
.map(a => new VideoCaptionModel(a) as MVideoCaption)
.map(c => VideoCaptionModel.insertOrReplaceLanguage(c, 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) { protected async insertOrReplaceLive (video: MVideoFullLight, transaction: Transaction) {
......
...@@ -109,11 +109,12 @@ export class VideoCaptionModel extends Model<Partial<AttributesOnly<VideoCaption ...@@ -109,11 +109,12 @@ export class VideoCaptionModel extends Model<Partial<AttributesOnly<VideoCaption
return undefined return undefined
} }
static loadByVideoIdAndLanguage (videoId: string | number, language: string): Promise<MVideoCaptionVideo> { static loadByVideoIdAndLanguage (videoId: string | number, language: string, transaction?: Transaction): Promise<MVideoCaptionVideo> {
const videoInclude = { const videoInclude = {
model: VideoModel.unscoped(), model: VideoModel.unscoped(),
attributes: [ 'id', 'remote', 'uuid' ], attributes: [ 'id', 'remote', 'uuid' ],
where: buildWhereIdOrUUID(videoId) where: buildWhereIdOrUUID(videoId),
transaction
} }
const query = { const query = {
...@@ -145,19 +146,21 @@ export class VideoCaptionModel extends Model<Partial<AttributesOnly<VideoCaption ...@@ -145,19 +146,21 @@ export class VideoCaptionModel extends Model<Partial<AttributesOnly<VideoCaption
} }
static async insertOrReplaceLanguage (caption: MVideoCaption, transaction: Transaction) { 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 // Delete existing file
if (existing) await existing.destroy({ transaction }) if (existing) await existing.destroy({ transaction })
return caption.save({ transaction }) return caption.save({ transaction })
} }
static listVideoCaptions (videoId: number): Promise<MVideoCaptionVideo[]> { static listVideoCaptions (videoId: number, transaction: Transaction): Promise<MVideoCaptionVideo[]> {
const query = { const query = {
order: [ [ 'language', 'ASC' ] ] as OrderItem[], order: [ [ 'language', 'ASC' ] ] as OrderItem[],
where: { where: {
videoId videoId
} },
transaction
} }
return VideoCaptionModel.scope(ScopeNames.WITH_VIDEO_UUID_AND_REMOTE).findAll(query) return VideoCaptionModel.scope(ScopeNames.WITH_VIDEO_UUID_AND_REMOTE).findAll(query)
...@@ -211,4 +214,10 @@ export class VideoCaptionModel extends Model<Partial<AttributesOnly<VideoCaption ...@@ -211,4 +214,10 @@ export class VideoCaptionModel extends Model<Partial<AttributesOnly<VideoCaption
return this.fileUrl return this.fileUrl
} }
isEqual (this: MVideoCaption, other: MVideoCaption) {
if (this.fileUrl) return this.fileUrl === other.fileUrl
return this.filename === other.filename
}
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment