aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/helpers/captions-utils.ts
diff options
context:
space:
mode:
Diffstat (limited to 'server/helpers/captions-utils.ts')
-rw-r--r--server/helpers/captions-utils.ts47
1 files changed, 47 insertions, 0 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}