X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fvideo-caption.ts;h=6b240f11688fd3edbbeafe916df823630e0bda70;hb=3726c3725506d0f8a26ded34f42d7bcfb5d0e639;hp=a1553ea156ca6a1b458e8fc444b5b1e1fbe75e10;hpb=6302d599cdf98b5a5363a2a1dcdc266447950191;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video-caption.ts b/server/models/video/video-caption.ts index a1553ea15..6b240f116 100644 --- a/server/models/video/video-caption.ts +++ b/server/models/video/video-caption.ts @@ -15,8 +15,9 @@ import { Table, UpdatedAt } from 'sequelize-typescript' -import { buildRemoteVideoBaseUrl } from '@server/helpers/activitypub' -import { MVideoAccountLight, MVideoCaption, MVideoCaptionFormattable, MVideoCaptionVideo } from '@server/types/models' +import { MVideo, MVideoCaption, MVideoCaptionFormattable, MVideoCaptionVideo } from '@server/types/models' +import { buildUUID } from '@shared/extra-utils' +import { AttributesOnly } from '@shared/typescript-utils' import { VideoCaption } from '../../../shared/models/videos/caption/video-caption.model' import { isVideoCaptionLanguageValid } from '../../helpers/custom-validators/video-captions' import { logger } from '../../helpers/logger' @@ -24,7 +25,6 @@ import { CONFIG } from '../../initializers/config' import { CONSTRAINTS_FIELDS, LAZY_STATIC_PATHS, VIDEO_LANGUAGES, WEBSERVER } from '../../initializers/constants' import { buildWhereIdOrUUID, throwIfNotValid } from '../utils' import { VideoModel } from './video' -import { v4 as uuidv4 } from 'uuid' export enum ScopeNames { WITH_VIDEO_UUID_AND_REMOTE = 'WITH_VIDEO_UUID_AND_REMOTE' @@ -58,7 +58,7 @@ export enum ScopeNames { } ] }) -export class VideoCaptionModel extends Model { +export class VideoCaptionModel extends Model>> { @CreatedAt createdAt: Date @@ -91,9 +91,9 @@ export class VideoCaptionModel extends Model { Video: VideoModel @BeforeDestroy - static async removeFiles (instance: VideoCaptionModel) { + static async removeFiles (instance: VideoCaptionModel, options) { if (!instance.Video) { - instance.Video = await instance.$get('Video') + instance.Video = await instance.$get('Video', { transaction: options.transaction }) } if (instance.isOwned()) { @@ -109,7 +109,7 @@ export class VideoCaptionModel extends Model { return undefined } - static loadByVideoIdAndLanguage (videoId: string | number, language: string): Promise { + static loadByVideoIdAndLanguage (videoId: string | number, language: string, transaction?: Transaction): Promise { const videoInclude = { model: VideoModel.unscoped(), attributes: [ 'id', 'remote', 'uuid' ], @@ -122,7 +122,8 @@ export class VideoCaptionModel extends Model { }, include: [ videoInclude - ] + ], + transaction } return VideoCaptionModel.findOne(query) @@ -145,19 +146,21 @@ export class VideoCaptionModel extends Model { } 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 { + static listVideoCaptions (videoId: number, transaction?: Transaction): Promise { const query = { order: [ [ 'language', 'ASC' ] ] as OrderItem[], where: { videoId - } + }, + transaction } return VideoCaptionModel.scope(ScopeNames.WITH_VIDEO_UUID_AND_REMOTE).findAll(query) @@ -179,7 +182,7 @@ export class VideoCaptionModel extends Model { } static generateCaptionName (language: string) { - return `${uuidv4()}-${language}.vtt` + return `${buildUUID()}-${language}.vtt` } isOwned () { @@ -204,13 +207,17 @@ export class VideoCaptionModel extends Model { return remove(CONFIG.STORAGE.CAPTIONS_DIR + this.filename) } - getFileUrl (video: MVideoAccountLight) { + getFileUrl (video: MVideo) { if (!this.Video) this.Video = video as VideoModel if (video.isOwned()) return WEBSERVER.URL + this.getCaptionStaticPath() - if (this.fileUrl) return this.fileUrl - // Fallback if we don't have a file URL - return buildRemoteVideoBaseUrl(video, this.getCaptionStaticPath()) + return this.fileUrl + } + + isEqual (this: MVideoCaption, other: MVideoCaption) { + if (this.fileUrl) return this.fileUrl === other.fileUrl + + return this.filename === other.filename } }