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 { pipelinePromise } from './core-utils' ; async function moveAndProcessCaptionFile ( physicalFile , videoCaption ) { const videoCaptionsDir = CONFIG . STORAGE . CAPTIONS_DIR ; const destination = join ( videoCaptionsDir , videoCaption . filename ) ; if ( physicalFile . path . endsWith ( '.srt' ) ) { await convertSrtToVtt ( physicalFile . path , destination ) ; await remove ( physicalFile . path ) ; } else if ( physicalFile . path !== destination ) { await move ( physicalFile . path , destination , { overwrite : true } ) ; } physicalFile . filename = videoCaption . filename ; physicalFile . path = destination ; } export { moveAndProcessCaptionFile } ; function convertSrtToVtt ( source , destination ) { const fixVTT = new Transform ( { transform : ( chunk , _encoding , cb ) => { let block = chunk . toString ( ) ; 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 cb ( undefined , block ) ; } } ) ; return pipelinePromise ( createReadStream ( source ) , srt2vtt ( ) , fixVTT , createWriteStream ( destination ) ) ; }