]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/controllers/api/videos/captions.ts
Automatically update playlist thumbnails
[github/Chocobozzz/PeerTube.git] / server / controllers / api / videos / captions.ts
CommitLineData
40e87e9e
C
1import * as express from 'express'
2import { asyncMiddleware, asyncRetryTransactionMiddleware, authenticate } from '../../../middlewares'
6e46de09 3import { addVideoCaptionValidator, deleteVideoCaptionValidator, listVideoCaptionsValidator } from '../../../middlewares/validators'
40e87e9e 4import { createReqFiles } from '../../../helpers/express-utils'
74dc3bca 5import { MIMETYPES } from '../../../initializers/constants'
40e87e9e
C
6import { getFormattedObjects } from '../../../helpers/utils'
7import { VideoCaptionModel } from '../../../models/video/video-caption'
40e87e9e
C
8import { logger } from '../../../helpers/logger'
9import { federateVideoIfNeeded } from '../../../lib/activitypub'
f4001cf4 10import { moveAndProcessCaptionFile } from '../../../helpers/captions-utils'
6dd9de95 11import { CONFIG } from '../../../initializers/config'
74dc3bca 12import { sequelizeTypescript } from '../../../initializers/database'
40e87e9e
C
13
14const reqVideoCaptionAdd = createReqFiles(
15 [ 'captionfile' ],
14e2014a 16 MIMETYPES.VIDEO_CAPTIONS.MIMETYPE_EXT,
40e87e9e
C
17 {
18 captionfile: CONFIG.STORAGE.CAPTIONS_DIR
19 }
20)
21
22const videoCaptionsRouter = express.Router()
23
24videoCaptionsRouter.get('/:videoId/captions',
25 asyncMiddleware(listVideoCaptionsValidator),
26 asyncMiddleware(listVideoCaptions)
27)
28videoCaptionsRouter.put('/:videoId/captions/:captionLanguage',
29 authenticate,
30 reqVideoCaptionAdd,
31 asyncMiddleware(addVideoCaptionValidator),
32 asyncRetryTransactionMiddleware(addVideoCaption)
33)
34videoCaptionsRouter.delete('/:videoId/captions/:captionLanguage',
35 authenticate,
36 asyncMiddleware(deleteVideoCaptionValidator),
37 asyncRetryTransactionMiddleware(deleteVideoCaption)
38)
39
40// ---------------------------------------------------------------------------
41
42export {
43 videoCaptionsRouter
44}
45
46// ---------------------------------------------------------------------------
47
48async function listVideoCaptions (req: express.Request, res: express.Response) {
49 const data = await VideoCaptionModel.listVideoCaptions(res.locals.video.id)
50
51 return res.json(getFormattedObjects(data, data.length))
52}
53
54async function addVideoCaption (req: express.Request, res: express.Response) {
55 const videoCaptionPhysicalFile = req.files['captionfile'][0]
dae86118 56 const video = res.locals.video
40e87e9e
C
57
58 const videoCaption = new VideoCaptionModel({
59 videoId: video.id,
60 language: req.params.captionLanguage
61 })
62 videoCaption.Video = video
63
64 // Move physical file
f4001cf4 65 await moveAndProcessCaptionFile(videoCaptionPhysicalFile, videoCaption)
40e87e9e
C
66
67 await sequelizeTypescript.transaction(async t => {
68 await VideoCaptionModel.insertOrReplaceLanguage(video.id, req.params.captionLanguage, t)
69
70 // Update video update
71 await federateVideoIfNeeded(video, false, t)
72 })
73
74 return res.status(204).end()
75}
76
77async function deleteVideoCaption (req: express.Request, res: express.Response) {
dae86118
C
78 const video = res.locals.video
79 const videoCaption = res.locals.videoCaption
40e87e9e
C
80
81 await sequelizeTypescript.transaction(async t => {
82 await videoCaption.destroy({ transaction: t })
83
84 // Send video update
85 await federateVideoIfNeeded(video, false, t)
86 })
87
88 logger.info('Video caption %s of video %s deleted.', videoCaption.language, video.uuid)
89
90 return res.type('json').status(204).end()
91}