diff --git a/enjoy/src/main/db/handlers/cache-objects-handler.ts b/enjoy/src/main/db/handlers/cache-objects-handler.ts index 06561c40..cdb2fc33 100644 --- a/enjoy/src/main/db/handlers/cache-objects-handler.ts +++ b/enjoy/src/main/db/handlers/cache-objects-handler.ts @@ -1,6 +1,9 @@ import { ipcMain, IpcMainEvent } from "electron"; import { CacheObject } from "@main/db/models"; +import fs from "fs-extra"; +import path from "path"; import db from "@main/db"; +import settings from "@main/settings"; class CacheObjectsHandler { private async get(event: IpcMainEvent, key: string) { @@ -61,11 +64,23 @@ class CacheObjectsHandler { }); } + private async writeFile( + _event: IpcMainEvent, + filename: string, + data: ArrayBuffer + ) { + const output = path.join(settings.cachePath(), filename); + fs.writeFileSync(output, Buffer.from(data)); + + return output.replace(settings.libraryPath(), "enjoy://library"); + } + register() { ipcMain.handle("cache-objects-get", this.get); ipcMain.handle("cache-objects-set", this.set); ipcMain.handle("cache-objects-delete", this.delete); ipcMain.handle("cache-objects-clear", this.clear); + ipcMain.handle("cache-objects-write-file", this.writeFile); } } diff --git a/enjoy/src/preload.ts b/enjoy/src/preload.ts index 71c8b2db..c5f293ba 100644 --- a/enjoy/src/preload.ts +++ b/enjoy/src/preload.ts @@ -426,6 +426,9 @@ contextBridge.exposeInMainWorld("__ENJOY_APP__", { clear: () => { return ipcRenderer.invoke("cache-objects-clear"); }, + writeFile: (filename: string, data: ArrayBuffer) => { + return ipcRenderer.invoke("cache-objects-write-file", filename, data); + }, }, transcriptions: { findOrCreate: (params: any) => { diff --git a/enjoy/src/renderer/components/record-button.tsx b/enjoy/src/renderer/components/record-button.tsx index 6430937a..73b86e03 100644 --- a/enjoy/src/renderer/components/record-button.tsx +++ b/enjoy/src/renderer/components/record-button.tsx @@ -118,7 +118,7 @@ const RecordButtonPopover = (props: { onRecordEnd: (blob: Blob, duration: number) => void; }) => { const containerRef = useRef(); - const { transcodeUsingWasm } = useTranscribe(); + const { transcode } = useTranscribe(); useEffect(() => { if (!containerRef.current) return; @@ -140,7 +140,7 @@ const RecordButtonPopover = (props: { record.on("record-end", async (blob: Blob) => { const duration = Date.now() - startAt; - const output = await transcodeUsingWasm(blob); + const output = await transcode(blob); props.onRecordEnd(output, duration); }); diff --git a/enjoy/src/renderer/context/app-settings-provider.tsx b/enjoy/src/renderer/context/app-settings-provider.tsx index 39d91193..2299509e 100644 --- a/enjoy/src/renderer/context/app-settings-provider.tsx +++ b/enjoy/src/renderer/context/app-settings-provider.tsx @@ -81,7 +81,10 @@ export const AppSettingsProvider = ({ const prepareFfmpeg = async () => { const valid = await EnjoyApp.ffmpeg.check(); setFfmpegValid(valid); - loadFfmpegWASM(); + + if (!valid) { + loadFfmpegWASM(); + } }; const loadFfmpegWASM = async () => { diff --git a/enjoy/src/renderer/hooks/use-transcribe.tsx b/enjoy/src/renderer/hooks/use-transcribe.tsx index f3d062bf..3441099c 100644 --- a/enjoy/src/renderer/hooks/use-transcribe.tsx +++ b/enjoy/src/renderer/hooks/use-transcribe.tsx @@ -24,8 +24,15 @@ export const useTranscribe = () => { ); const { whisperConfig, openai } = useContext(AISettingsProviderContext); - const transcode = async (src: string, options?: string[]) => { + const transcode = async (src: string | Blob, options?: string[]) => { if (ffmpegValid) { + if (src instanceof Blob) { + src = await EnjoyApp.cacheObjects.writeFile( + `${Date.now()}.${src.type.split("/")[1]}`, + await src.arrayBuffer() + ); + } + const output = `enjoy://library/cache/${src.split("/").pop()}.wav`; await EnjoyApp.ffmpeg.transcode(src, output, options); const data = await fetchFile(output); @@ -284,7 +291,6 @@ export const useTranscribe = () => { return { transcode, - transcodeUsingWasm, transcribe, }; }; diff --git a/enjoy/src/types/enjoy-app.d.ts b/enjoy/src/types/enjoy-app.d.ts index bceb874b..07436d74 100644 --- a/enjoy/src/types/enjoy-app.d.ts +++ b/enjoy/src/types/enjoy-app.d.ts @@ -247,6 +247,7 @@ type EnjoyAppType = { set: (key: string, value: any, ttl?: number) => Promise; delete: (key: string) => Promise; clear: () => Promise; + writeFile: (filename: string, data: ArrayBuffer) => Promise; }; transcriptions: { findOrCreate: (params: any) => Promise;