1 import * as express from 'express'
2 import { asyncMiddleware, asyncRetryTransactionMiddleware, authenticate } from '../../../middlewares'
3 import { addVideoCaptionValidator, deleteVideoCaptionValidator, listVideoCaptionsValidator } from '../../../middlewares/validators'
4 import { createReqFiles } from '../../../helpers/express-utils'
5 import { CONFIG, MIMETYPES, sequelizeTypescript } from '../../../initializers'
6 import { getFormattedObjects } from '../../../helpers/utils'
7 import { VideoCaptionModel } from '../../../models/video/video-caption'
8 import { VideoModel } from '../../../models/video/video'
9 import { logger } from '../../../helpers/logger'
10 import { federateVideoIfNeeded } from '../../../lib/activitypub'
11 import { moveAndProcessCaptionFile } from '../../../helpers/captions-utils'
13 const reqVideoCaptionAdd = createReqFiles(
15 MIMETYPES.VIDEO_CAPTIONS.MIMETYPE_EXT,
17 captionfile: CONFIG.STORAGE.CAPTIONS_DIR
21 const videoCaptionsRouter = express.Router()
23 videoCaptionsRouter.get('/:videoId/captions',
24 asyncMiddleware(listVideoCaptionsValidator),
25 asyncMiddleware(listVideoCaptions)
27 videoCaptionsRouter.put('/:videoId/captions/:captionLanguage',
30 asyncMiddleware(addVideoCaptionValidator),
31 asyncRetryTransactionMiddleware(addVideoCaption)
33 videoCaptionsRouter.delete('/:videoId/captions/:captionLanguage',
35 asyncMiddleware(deleteVideoCaptionValidator),
36 asyncRetryTransactionMiddleware(deleteVideoCaption)
39 // ---------------------------------------------------------------------------
45 // ---------------------------------------------------------------------------
47 async function listVideoCaptions (req: express.Request, res: express.Response) {
48 const data = await VideoCaptionModel.listVideoCaptions(res.locals.video.id)
50 return res.json(getFormattedObjects(data, data.length))
53 async function addVideoCaption (req: express.Request, res: express.Response) {
54 const videoCaptionPhysicalFile = req.files['captionfile'][0]
55 const video = res.locals.video as VideoModel
57 const videoCaption = new VideoCaptionModel({
59 language: req.params.captionLanguage
61 videoCaption.Video = video
64 await moveAndProcessCaptionFile(videoCaptionPhysicalFile, videoCaption)
66 await sequelizeTypescript.transaction(async t => {
67 await VideoCaptionModel.insertOrReplaceLanguage(video.id, req.params.captionLanguage, t)
69 // Update video update
70 await federateVideoIfNeeded(video, false, t)
73 return res.status(204).end()
76 async function deleteVideoCaption (req: express.Request, res: express.Response) {
77 const video = res.locals.video as VideoModel
78 const videoCaption = res.locals.videoCaption as VideoCaptionModel
80 await sequelizeTypescript.transaction(async t => {
81 await videoCaption.destroy({ transaction: t })
84 await federateVideoIfNeeded(video, false, t)
87 logger.info('Video caption %s of video %s deleted.', videoCaption.language, video.uuid)
89 return res.type('json').status(204).end()