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 { logger } from '../../../helpers/logger'
9 import { federateVideoIfNeeded } from '../../../lib/activitypub'
10 import { moveAndProcessCaptionFile } from '../../../helpers/captions-utils'
12 const reqVideoCaptionAdd = createReqFiles(
14 MIMETYPES.VIDEO_CAPTIONS.MIMETYPE_EXT,
16 captionfile: CONFIG.STORAGE.CAPTIONS_DIR
20 const videoCaptionsRouter = express.Router()
22 videoCaptionsRouter.get('/:videoId/captions',
23 asyncMiddleware(listVideoCaptionsValidator),
24 asyncMiddleware(listVideoCaptions)
26 videoCaptionsRouter.put('/:videoId/captions/:captionLanguage',
29 asyncMiddleware(addVideoCaptionValidator),
30 asyncRetryTransactionMiddleware(addVideoCaption)
32 videoCaptionsRouter.delete('/:videoId/captions/:captionLanguage',
34 asyncMiddleware(deleteVideoCaptionValidator),
35 asyncRetryTransactionMiddleware(deleteVideoCaption)
38 // ---------------------------------------------------------------------------
44 // ---------------------------------------------------------------------------
46 async function listVideoCaptions (req: express.Request, res: express.Response) {
47 const data = await VideoCaptionModel.listVideoCaptions(res.locals.video.id)
49 return res.json(getFormattedObjects(data, data.length))
52 async function addVideoCaption (req: express.Request, res: express.Response) {
53 const videoCaptionPhysicalFile = req.files['captionfile'][0]
54 const video = res.locals.video
56 const videoCaption = new VideoCaptionModel({
58 language: req.params.captionLanguage
60 videoCaption.Video = video
63 await moveAndProcessCaptionFile(videoCaptionPhysicalFile, videoCaption)
65 await sequelizeTypescript.transaction(async t => {
66 await VideoCaptionModel.insertOrReplaceLanguage(video.id, req.params.captionLanguage, t)
68 // Update video update
69 await federateVideoIfNeeded(video, false, t)
72 return res.status(204).end()
75 async function deleteVideoCaption (req: express.Request, res: express.Response) {
76 const video = res.locals.video
77 const videoCaption = res.locals.videoCaption
79 await sequelizeTypescript.transaction(async t => {
80 await videoCaption.destroy({ transaction: t })
83 await federateVideoIfNeeded(video, false, t)
86 logger.info('Video caption %s of video %s deleted.', videoCaption.language, video.uuid)
88 return res.type('json').status(204).end()