Optimize AP video captions update
This commit is contained in:
parent
4ead40e776
commit
57a0a9cde4
2 changed files with 35 additions and 9 deletions
|
@ -75,11 +75,28 @@ export abstract class APVideoAbstractBuilder {
|
|||
}
|
||||
|
||||
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) {
|
||||
|
|
|
@ -109,11 +109,12 @@ export class VideoCaptionModel extends Model<Partial<AttributesOnly<VideoCaption
|
|||
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 = {
|
||||
|
@ -145,19 +146,21 @@ export class VideoCaptionModel extends Model<Partial<AttributesOnly<VideoCaption
|
|||
}
|
||||
|
||||
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)
|
||||
|
@ -211,4 +214,10 @@ export class VideoCaptionModel extends Model<Partial<AttributesOnly<VideoCaption
|
|||
|
||||
return this.fileUrl
|
||||
}
|
||||
|
||||
isEqual (this: MVideoCaption, other: MVideoCaption) {
|
||||
if (this.fileUrl) return this.fileUrl === other.fileUrl
|
||||
|
||||
return this.filename === other.filename
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue