Import magnets with webtorrent
[oweals/peertube.git] / server / helpers / captions-utils.ts
1 import { renamePromise, unlinkPromise } from './core-utils'
2 import { join } from 'path'
3 import { CONFIG } from '../initializers'
4 import { VideoCaptionModel } from '../models/video/video-caption'
5 import * as srt2vtt from 'srt-to-vtt'
6 import { createReadStream, createWriteStream } from 'fs'
7
8 async 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
27 export {
28   moveAndProcessCaptionFile
29 }
30
31 // ---------------------------------------------------------------------------
32
33 function 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 }