From 20b9b17493d6aa4564b7ab149c6968b87e3e1a88 Mon Sep 17 00:00:00 2001 From: Arthur Barre Date: Thu, 13 Mar 2025 21:26:24 +0100 Subject: [PATCH] fix --- frontend/src/hooks/useAudioRecorder.ts | 90 ++++---- recorder/package-lock.json | 22 ++ recorder/package.json | 15 ++ recorder/recorder.html | 302 +++++++++++++++++++++++++ 4 files changed, 384 insertions(+), 45 deletions(-) create mode 100644 recorder/package-lock.json create mode 100644 recorder/package.json create mode 100644 recorder/recorder.html diff --git a/frontend/src/hooks/useAudioRecorder.ts b/frontend/src/hooks/useAudioRecorder.ts index e60d4d1..1f8e347 100644 --- a/frontend/src/hooks/useAudioRecorder.ts +++ b/frontend/src/hooks/useAudioRecorder.ts @@ -1,72 +1,72 @@ -// useAudioRecorder.ts -import { useState, useCallback, useEffect } from 'react' -import vmsg from 'vmsg' +import { useState, useCallback, useEffect } from "react"; +import vmsg from "vmsg"; -// Initialize the recorder once const recorder = new vmsg.Recorder({ wasmURL: "https://unpkg.com/vmsg@0.3.0/vmsg.wasm" -}) +}); export function useAudioRecorder() { - const [isLoading, setIsLoading] = useState(false) - const [isRecording, setIsRecording] = useState(false) - const [recordings, setRecordings] = useState([]) - const [currentRecording, setCurrentRecording] = useState(null) + const [isLoading, setIsLoading] = useState(false); + const [isRecording, setIsRecording] = useState(false); + const [recordings, setRecordings] = useState([]); + const [currentRecording, setCurrentRecording] = useState(null); const startRecording = useCallback(async () => { - setIsLoading(true) + setIsLoading(true); try { - await recorder.initAudio() - await recorder.initWorker() - recorder.startRecording() - setIsRecording(true) - } catch (e) { - console.error('Failed to start recording:', e) + // Nécessaire sur mobile : initAudio DOIT être dans un handler utilisateur (tap/click) + await recorder.initAudio(); + await recorder.initWorker(); + await recorder.startRecording(); + setIsRecording(true); + } catch (error) { + console.error("Erreur lors du démarrage de l'enregistrement :", error); + throw error; } finally { - setIsLoading(false) + setIsLoading(false); } - }, []) + }, []); const stopRecording = useCallback(async () => { - if (!isRecording) return + if (!isRecording) return; - setIsLoading(true) + setIsLoading(true); try { - const blob = await recorder.stopRecording() - const url = URL.createObjectURL(blob) - setRecordings(prev => [...prev, url]) - setCurrentRecording(url) - return { blob, url } - } catch (e) { - console.error('Failed to stop recording:', e) + const blob = await recorder.stopRecording(); + const url = URL.createObjectURL(blob); + + setRecordings(prev => [...prev, url]); + setCurrentRecording(url); + + return { blob, url }; + } catch (error) { + console.error("Erreur lors de l'arrêt de l'enregistrement :", error); + throw error; } finally { - setIsRecording(false) - setIsLoading(false) + setIsRecording(false); + setIsLoading(false); } - }, [isRecording]) + }, [isRecording]); const toggleRecording = useCallback(async () => { if (isRecording) { - return await stopRecording() + return await stopRecording(); } else { - await startRecording() - return null + return await startRecording(); } - }, [isRecording, startRecording, stopRecording]) + }, [isRecording, startRecording, stopRecording]); const clearRecordings = useCallback(() => { - // Revoke object URLs to prevent memory leaks - recordings.forEach(url => URL.revokeObjectURL(url)) - setRecordings([]) - setCurrentRecording(null) - }, [recordings]) + recordings.forEach(url => URL.revokeObjectURL(url)); + setRecordings([]); + setCurrentRecording(null); + }, [recordings]); - // Clean up object URLs when component unmounts useEffect(() => { return () => { - recordings.forEach(url => URL.revokeObjectURL(url)) - } - }, [recordings]) + recordings.forEach(url => URL.revokeObjectURL(url)); + }; + }, [recordings]); return { isLoading, @@ -77,5 +77,5 @@ export function useAudioRecorder() { stopRecording, toggleRecording, clearRecordings - } -} \ No newline at end of file + }; +} diff --git a/recorder/package-lock.json b/recorder/package-lock.json new file mode 100644 index 0000000..5cbd266 --- /dev/null +++ b/recorder/package-lock.json @@ -0,0 +1,22 @@ +{ + "name": "recorder", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "recorder", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "vmsg": "^0.4.0" + } + }, + "node_modules/vmsg": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/vmsg/-/vmsg-0.4.0.tgz", + "integrity": "sha512-46BBqRSfqdFGUpO2j+Hpz8T9YE5uWG0/PWal1PT+R1o8NEthtjG/XWl4HzbB8hIHpg/UtmKvsxL2OKQBrIYcHQ==", + "license": "CC0-1.0" + } + } +} diff --git a/recorder/package.json b/recorder/package.json new file mode 100644 index 0000000..0f6e14f --- /dev/null +++ b/recorder/package.json @@ -0,0 +1,15 @@ +{ + "name": "recorder", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "vmsg": "^0.4.0" + } +} diff --git a/recorder/recorder.html b/recorder/recorder.html new file mode 100644 index 0000000..db6addf --- /dev/null +++ b/recorder/recorder.html @@ -0,0 +1,302 @@ + + + + + + + Enregistreur Audio + + + + + + +

Enregistreur Audio

+ +
+

Enregistrez votre voix et écoutez le résultat. Les enregistrements sont stockés localement dans votre navigateur. +

+ +
Prêt à enregistrer
+ +
+ +
+ +
+

Vos enregistrements

+
+
+
+ + + + + \ No newline at end of file