12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- import * as express from 'express'
- import { asyncMiddleware, asyncRetryTransactionMiddleware, authenticate } from '../../../middlewares'
- import { addVideoCaptionValidator, deleteVideoCaptionValidator, listVideoCaptionsValidator } from '../../../middlewares/validators'
- import { createReqFiles } from '../../../helpers/express-utils'
- import { MIMETYPES } from '../../../initializers/constants'
- import { getFormattedObjects } from '../../../helpers/utils'
- import { VideoCaptionModel } from '../../../models/video/video-caption'
- import { logger } from '../../../helpers/logger'
- import { federateVideoIfNeeded } from '../../../lib/activitypub'
- import { moveAndProcessCaptionFile } from '../../../helpers/captions-utils'
- import { CONFIG } from '../../../initializers/config'
- import { sequelizeTypescript } from '../../../initializers/database'
- const reqVideoCaptionAdd = createReqFiles(
- [ 'captionfile' ],
- MIMETYPES.VIDEO_CAPTIONS.MIMETYPE_EXT,
- {
- captionfile: CONFIG.STORAGE.CAPTIONS_DIR
- }
- )
- const videoCaptionsRouter = express.Router()
- videoCaptionsRouter.get('/:videoId/captions',
- asyncMiddleware(listVideoCaptionsValidator),
- asyncMiddleware(listVideoCaptions)
- )
- videoCaptionsRouter.put('/:videoId/captions/:captionLanguage',
- authenticate,
- reqVideoCaptionAdd,
- asyncMiddleware(addVideoCaptionValidator),
- asyncRetryTransactionMiddleware(addVideoCaption)
- )
- videoCaptionsRouter.delete('/:videoId/captions/:captionLanguage',
- authenticate,
- asyncMiddleware(deleteVideoCaptionValidator),
- asyncRetryTransactionMiddleware(deleteVideoCaption)
- )
- // ---------------------------------------------------------------------------
- export {
- videoCaptionsRouter
- }
- // ---------------------------------------------------------------------------
- async function listVideoCaptions (req: express.Request, res: express.Response) {
- const data = await VideoCaptionModel.listVideoCaptions(res.locals.video.id)
- return res.json(getFormattedObjects(data, data.length))
- }
- async function addVideoCaption (req: express.Request, res: express.Response) {
- const videoCaptionPhysicalFile = req.files['captionfile'][0]
- const video = res.locals.video
- const videoCaption = new VideoCaptionModel({
- videoId: video.id,
- language: req.params.captionLanguage
- })
- videoCaption.Video = video
- // Move physical file
- await moveAndProcessCaptionFile(videoCaptionPhysicalFile, videoCaption)
- await sequelizeTypescript.transaction(async t => {
- await VideoCaptionModel.insertOrReplaceLanguage(video.id, req.params.captionLanguage, t)
- // Update video update
- await federateVideoIfNeeded(video, false, t)
- })
- return res.status(204).end()
- }
- async function deleteVideoCaption (req: express.Request, res: express.Response) {
- const video = res.locals.video
- const videoCaption = res.locals.videoCaption
- await sequelizeTypescript.transaction(async t => {
- await videoCaption.destroy({ transaction: t })
- // Send video update
- await federateVideoIfNeeded(video, false, t)
- })
- logger.info('Video caption %s of video %s deleted.', videoCaption.language, video.uuid)
- return res.type('json').status(204).end()
- }
|