aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/helpers
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2018-07-16 14:22:16 +0200
committerChocobozzz <me@florianbigard.com>2018-07-16 14:31:40 +0200
commitf4001cf408a99049d01a356bfb20a62342de06ea (patch)
tree421776dfe64335dca2725ac3ac5f3b3e6b7564c6 /server/helpers
parent16f7022b06fb76c0b00c23c970bc8df605b0ec63 (diff)
downloadPeerTube-f4001cf408a99049d01a356bfb20a62342de06ea.tar.gz
PeerTube-f4001cf408a99049d01a356bfb20a62342de06ea.tar.zst
PeerTube-f4001cf408a99049d01a356bfb20a62342de06ea.zip
Handle .srt subtitles
Diffstat (limited to 'server/helpers')
-rw-r--r--server/helpers/captions-utils.ts47
-rw-r--r--server/helpers/custom-validators/video-captions.ts11
2 files changed, 51 insertions, 7 deletions
diff --git a/server/helpers/captions-utils.ts b/server/helpers/captions-utils.ts
new file mode 100644
index 000000000..8b04f878d
--- /dev/null
+++ b/server/helpers/captions-utils.ts
@@ -0,0 +1,47 @@
1import { renamePromise, unlinkPromise } from './core-utils'
2import { join } from 'path'
3import { CONFIG } from '../initializers'
4import { VideoCaptionModel } from '../models/video/video-caption'
5import * as srt2vtt from 'srt-to-vtt'
6import { createReadStream, createWriteStream } from 'fs'
7
8async function moveAndProcessCaptionFile (physicalFile: { filename: string, path: string }, videoCaption: VideoCaptionModel) {
9 const videoCaptionsDir = CONFIG.STORAGE.CAPTIONS_DIR
10 const destination = join(videoCaptionsDir, videoCaption.getCaptionName())
11
12 // Convert this srt file to vtt
13 if (physicalFile.path.endsWith('.srt')) {
14 await convertSrtToVtt(physicalFile.path, destination)
15 await unlinkPromise(physicalFile.path)
16 } else { // Just move the vtt file
17 await renamePromise(physicalFile.path, destination)
18 }
19
20 // This is important in case if there is another attempt in the retry process
21 physicalFile.filename = videoCaption.getCaptionName()
22 physicalFile.path = destination
23}
24
25// ---------------------------------------------------------------------------
26
27export {
28 moveAndProcessCaptionFile
29}
30
31// ---------------------------------------------------------------------------
32
33function convertSrtToVtt (source: string, destination: string) {
34 return new Promise((res, rej) => {
35 const file = createReadStream(source)
36 const converter = srt2vtt()
37 const writer = createWriteStream(destination)
38
39 for (const s of [ file, converter, writer ]) {
40 s.on('error', err => rej(err))
41 }
42
43 return file.pipe(converter)
44 .pipe(writer)
45 .on('finish', () => res())
46 })
47}
diff --git a/server/helpers/custom-validators/video-captions.ts b/server/helpers/custom-validators/video-captions.ts
index fd4dc740b..6a9c6d75c 100644
--- a/server/helpers/custom-validators/video-captions.ts
+++ b/server/helpers/custom-validators/video-captions.ts
@@ -1,4 +1,4 @@
1import { CONSTRAINTS_FIELDS, VIDEO_LANGUAGES } from '../../initializers' 1import { CONSTRAINTS_FIELDS, VIDEO_CAPTIONS_MIMETYPE_EXT, VIDEO_LANGUAGES, VIDEO_MIMETYPE_EXT } from '../../initializers'
2import { exists, isFileValid } from './misc' 2import { exists, isFileValid } from './misc'
3import { Response } from 'express' 3import { Response } from 'express'
4import { VideoModel } from '../../models/video/video' 4import { VideoModel } from '../../models/video/video'
@@ -8,13 +8,10 @@ function isVideoCaptionLanguageValid (value: any) {
8 return exists(value) && VIDEO_LANGUAGES[ value ] !== undefined 8 return exists(value) && VIDEO_LANGUAGES[ value ] !== undefined
9} 9}
10 10
11const videoCaptionTypes = CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.EXTNAME 11const videoCaptionTypes = Object.keys(VIDEO_CAPTIONS_MIMETYPE_EXT).map(m => `(${m})`)
12 .map(v => v.replace('.', '')) 12const videoCaptionTypesRegex = videoCaptionTypes.join('|')
13 .join('|')
14const videoCaptionsTypesRegex = `text/(${videoCaptionTypes})`
15
16function isVideoCaptionFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], field: string) { 13function isVideoCaptionFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], field: string) {
17 return isFileValid(files, videoCaptionsTypesRegex, field, CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.FILE_SIZE.max) 14 return isFileValid(files, videoCaptionTypesRegex, field, CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.FILE_SIZE.max)
18} 15}
19 16
20async function isVideoCaptionExist (video: VideoModel, language: string, res: Response) { 17async function isVideoCaptionExist (video: VideoModel, language: string, res: Response) {