From 8e361077a809cd16e7da198c6525b48ba8f7dfa8 Mon Sep 17 00:00:00 2001 From: Mikael Finstad Date: Wed, 15 May 2024 15:07:54 +0200 Subject: [PATCH] fix crashes --- src/renderer/src/ffmpeg.ts | 13 +++++++++++-- src/renderer/src/hooks/useWaveform.ts | 7 ++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/renderer/src/ffmpeg.ts b/src/renderer/src/ffmpeg.ts index 02342205..3924d00a 100644 --- a/src/renderer/src/ffmpeg.ts +++ b/src/renderer/src/ffmpeg.ts @@ -28,6 +28,15 @@ export class RefuseOverwriteError extends Error { } } +export function fixRemoteBuffer(buffer: Buffer) { + // if we don't do this when creating a Blob, we get: + // "Failed to construct 'Blob': The provided ArrayBufferView value must not be resizable." + // maybe when moving away from @electron/remote, it's not needed anymore? + const buffer2 = Buffer.allocUnsafe(buffer.length); + buffer.copy(buffer2); + return buffer2; +} + export function logStdoutStderr({ stdout, stderr }: { stdout: Buffer, stderr: Buffer }) { if (stdout.length > 0) { console.log('%cSTDOUT:', 'color: green; font-weight: bold'); @@ -492,7 +501,7 @@ async function renderThumbnail(filePath: string, timestamp: number) { const { stdout } = await runFfmpeg(args); - const blob = new Blob([stdout], { type: 'image/jpeg' }); + const blob = new Blob([fixRemoteBuffer(stdout)], { type: 'image/jpeg' }); return URL.createObjectURL(blob); } @@ -507,7 +516,7 @@ export async function extractSubtitleTrack(filePath: string, streamId: number) { const { stdout } = await runFfmpeg(args); - const blob = new Blob([stdout], { type: 'text/vtt' }); + const blob = new Blob([fixRemoteBuffer(stdout)], { type: 'text/vtt' }); return URL.createObjectURL(blob); } diff --git a/src/renderer/src/hooks/useWaveform.ts b/src/renderer/src/hooks/useWaveform.ts index b702e1a7..f71f32d2 100644 --- a/src/renderer/src/hooks/useWaveform.ts +++ b/src/renderer/src/hooks/useWaveform.ts @@ -3,7 +3,7 @@ import sortBy from 'lodash/sortBy'; import { useThrottle } from '@uidotdev/usehooks'; import { waveformColorDark, waveformColorLight } from '../colors'; -import { renderWaveformPng } from '../ffmpeg'; +import { fixRemoteBuffer, renderWaveformPng } from '../ffmpeg'; import { RenderableWaveform } from '../types'; import { FFprobeStream } from '../../../../ffprobe'; @@ -73,12 +73,9 @@ export default ({ darkMode, filePath, relevantTime, duration, waveformEnabled, a return w; } - // if we don't do this, we get Failed to construct 'Blob': The provided ArrayBufferView value must not be resizable. - const buffer2 = Buffer.allocUnsafe(buffer.length); - buffer.copy(buffer2); return { ...w, - url: URL.createObjectURL(new Blob([buffer2], { type: 'image/png' })), + url: URL.createObjectURL(new Blob([fixRemoteBuffer(buffer)], { type: 'image/png' })), }; })); } catch (err) {