]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/helpers/captions-utils.ts
Added translation using Weblate (Latin)
[github/Chocobozzz/PeerTube.git] / server / helpers / captions-utils.ts
index 7cbfb356195e0cb609c581d82bdbcc58fc55fd5e..f6e5b9784b0876bc2f4e93953722ad8dd6e09cb3 100644 (file)
@@ -1,12 +1,14 @@
+import { createReadStream, createWriteStream, move, remove } from 'fs-extra'
 import { join } from 'path'
+import srt2vtt from 'srt-to-vtt'
+import { Transform } from 'stream'
+import { MVideoCaption } from '@server/types/models'
 import { CONFIG } from '../initializers/config'
-import * as srt2vtt from 'srt-to-vtt'
-import { createReadStream, createWriteStream, move, remove } from 'fs-extra'
-import { MVideoCaptionFormattable } from '@server/types/models'
+import { pipelinePromise } from './core-utils'
 
-async function moveAndProcessCaptionFile (physicalFile: { filename: string, path: string }, videoCaption: MVideoCaptionFormattable) {
+async function moveAndProcessCaptionFile (physicalFile: { filename: string, path: string }, videoCaption: MVideoCaption) {
   const videoCaptionsDir = CONFIG.STORAGE.CAPTIONS_DIR
-  const destination = join(videoCaptionsDir, videoCaption.getCaptionName())
+  const destination = join(videoCaptionsDir, videoCaption.filename)
 
   // Convert this srt file to vtt
   if (physicalFile.path.endsWith('.srt')) {
@@ -17,7 +19,7 @@ async function moveAndProcessCaptionFile (physicalFile: { filename: string, path
   }
 
   // This is important in case if there is another attempt in the retry process
-  physicalFile.filename = videoCaption.getCaptionName()
+  physicalFile.filename = videoCaption.filename
   physicalFile.path = destination
 }
 
@@ -30,17 +32,22 @@ export {
 // ---------------------------------------------------------------------------
 
 function convertSrtToVtt (source: string, destination: string) {
-  return new Promise<void>((res, rej) => {
-    const file = createReadStream(source)
-    const converter = srt2vtt()
-    const writer = createWriteStream(destination)
+  const fixVTT = new Transform({
+    transform: (chunk, _encoding, cb) => {
+      let block: string = chunk.toString()
 
-    for (const s of [ file, converter, writer ]) {
-      s.on('error', err => rej(err))
-    }
+      block = block.replace(/(\d\d:\d\d:\d\d)(\s)/g, '$1.000$2')
+                   .replace(/(\d\d:\d\d:\d\d),(\d)(\s)/g, '$1.00$2$3')
+                   .replace(/(\d\d:\d\d:\d\d),(\d\d)(\s)/g, '$1.0$2$3')
 
-    return file.pipe(converter)
-               .pipe(writer)
-               .on('finish', () => res())
+      return cb(undefined, block)
+    }
   })
+
+  return pipelinePromise(
+    createReadStream(source),
+    srt2vtt(),
+    fixVTT,
+    createWriteStream(destination)
+  )
 }