diff --git a/src/api/ffmpeg.ts b/src/api/ffmpeg.ts index b2791e11c..b5a830f01 100644 --- a/src/api/ffmpeg.ts +++ b/src/api/ffmpeg.ts @@ -3,14 +3,22 @@ import { ElectronFile } from '../types'; export async function runFFmpegCmd( cmd: string[], - inputFile: ElectronFile, + inputFile: File | ElectronFile, outputFileName: string ) { - const fileData = await ipcRenderer.invoke( + let inputFilePath = null; + let inputFileData = null; + if (inputFile instanceof File) { + inputFileData = new Uint8Array(await inputFile.arrayBuffer()); + } else { + inputFilePath = inputFile.path; + } + const outputFileData = await ipcRenderer.invoke( 'run-ffmpeg-cmd', cmd, - inputFile.path, + inputFilePath, + inputFileData, outputFileName ); - return new File([fileData], outputFileName); + return new File([outputFileData], outputFileName); } diff --git a/src/services/ffmpeg.ts b/src/services/ffmpeg.ts index ae8041a96..9d09f21c2 100644 --- a/src/services/ffmpeg.ts +++ b/src/services/ffmpeg.ts @@ -3,7 +3,7 @@ import path from 'path'; const shellescape = require('any-shell-escape'); import util from 'util'; import log from 'electron-log'; -import { readFile, rmSync } from 'promise-fs'; +import { readFile, rmSync, writeFile } from 'promise-fs'; import { logErrorSentry } from './sentry'; import { generateTempName, getTempDirPath } from '../utils/temp'; @@ -20,13 +20,22 @@ function getFFmpegStaticPath() { export async function runFFmpegCmd( cmd: string[], inputFilePath: string, + inputFileData: Uint8Array, + inputFileName: string, outputFileName: string ) { - let tempOutputFilePath: string; + let outputFilePath: string; try { const tempDirPath = await getTempDirPath(); const tempName = generateTempName(10); - tempOutputFilePath = path.join( + if (!inputFilePath) { + inputFilePath = path.join( + tempDirPath, + tempName + '-' + inputFileName + ); + await writeFile(inputFilePath, inputFileData); + } + outputFilePath = path.join( tempDirPath, tempName + '-' + outputFileName ); @@ -37,7 +46,7 @@ export async function runFFmpegCmd( } else if (cmdPart === INPUT_PATH_PLACEHOLDER) { return inputFilePath; } else if (cmdPart === OUTPUT_PATH_PLACEHOLDER) { - return tempOutputFilePath; + return outputFilePath; } else { return cmdPart; } @@ -45,13 +54,13 @@ export async function runFFmpegCmd( cmd = shellescape(cmd); log.info('cmd', cmd); await execAsync(cmd); - return new Uint8Array(await readFile(tempOutputFilePath)); + return new Uint8Array(await readFile(outputFilePath)); } catch (e) { logErrorSentry(e, 'ffmpeg run command error'); throw e; } finally { try { - rmSync(tempOutputFilePath); + rmSync(outputFilePath); } catch (e) { logErrorSentry(e, 'failed to remove tempOutputFile'); } diff --git a/src/utils/ipcComms.ts b/src/utils/ipcComms.ts index 57429e203..67ebed060 100644 --- a/src/utils/ipcComms.ts +++ b/src/utils/ipcComms.ts @@ -129,8 +129,21 @@ export default function setupIpcComs( ipcMain.handle( 'run-ffmpeg-cmd', - (_, cmd: string[], inputFilePath: string, outputFileName: string) => { - return runFFmpegCmd(cmd, inputFilePath, outputFileName); + ( + _, + cmd: string[], + inputFilePath, + inputFileData, + inputFileName, + outputFileName + ) => { + return runFFmpegCmd( + cmd, + inputFilePath, + inputFileData, + inputFileName, + outputFileName + ); } ); }