X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fhelpers%2Fcaptions-utils.ts;h=ca03f7a4903cd0b6efb6053110d680d6c4bbc1f0;hb=2539932e16129992a2c0889b4ff527c265a8e2c7;hp=0fb11a1251a694116c6feceff681399f7f33bf17;hpb=88108880bbdba473cfe36ecbebc1c3c4f972e102;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/helpers/captions-utils.ts b/server/helpers/captions-utils.ts index 0fb11a125..ca03f7a49 100644 --- a/server/helpers/captions-utils.ts +++ b/server/helpers/captions-utils.ts @@ -1,23 +1,25 @@ +import { createReadStream, createWriteStream, move, remove } from 'fs-extra' import { join } from 'path' -import { CONFIG } from '../initializers' -import { VideoCaptionModel } from '../models/video/video-caption' import * as srt2vtt from 'srt-to-vtt' -import { createReadStream, createWriteStream, remove, move } from 'fs-extra' +import { MVideoCaption } from '@server/types/models' +import { CONFIG } from '../initializers/config' +import { pipelinePromise } from './core-utils' +import { Transform } from 'stream' -async function moveAndProcessCaptionFile (physicalFile: { filename: string, path: string }, videoCaption: VideoCaptionModel) { +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')) { await convertSrtToVtt(physicalFile.path, destination) await remove(physicalFile.path) - } else { // Just move the vtt file + } else if (physicalFile.path !== destination) { // Just move the vtt file await move(physicalFile.path, destination, { overwrite: true }) } // 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((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) + ) }