X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fhelpers%2Fcaptions-utils.ts;h=f6e5b9784b0876bc2f4e93953722ad8dd6e09cb3;hb=405c83f9af377a663a4c8e9ad025fd5c10496922;hp=2830ae01776a3cef82883f302d2510a32ea26f9e;hpb=8d5e65349deebd499c0be10fe02d535a77d58ddb;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/helpers/captions-utils.ts b/server/helpers/captions-utils.ts index 2830ae017..f6e5b9784 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 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/typings/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')) { 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) + ) }