fix(audio+gps): lecture audio multi-navigateur + icône GPS dans tuile note

Audio :
- MediaRecorder détecte le format supporté : webm (Chrome/Firefox) ou mp4 (Safari/iOS)
- Extension sauvegardée correctement (.webm ou .m4a) selon le navigateur
- Backend : ALLOWED_AUDIO_PREFIXES remplace le set strict, strip des codec suffixes

GPS (note card) :
- Icône fa-location-dot (accent vert) avec tooltip lat/lon remplace l'emoji 📍

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-25 15:55:35 +02:00
parent 9de8ad5f3e
commit 9aaa5fb562
3 changed files with 16 additions and 10 deletions
+9 -5
View File
@@ -41,19 +41,23 @@ function NoteCard({ note, onEdit, onDelete, onAddPhoto, onAddAudio, onDeleteAtt
async function startRecord() {
try {
const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
const recorder = new MediaRecorder(stream)
// Choisir le format supporté par le navigateur (Safari → mp4, Chrome/Firefox → webm)
const mimeType = ['audio/webm', 'audio/mp4', 'audio/ogg'].find(t => MediaRecorder.isTypeSupported(t)) ?? ''
const recorder = mimeType ? new MediaRecorder(stream, { mimeType }) : new MediaRecorder(stream)
chunksRef.current = []
recorder.ondataavailable = e => { if (e.data.size > 0) chunksRef.current.push(e.data) }
recorder.onstop = () => {
stream.getTracks().forEach(t => t.stop())
const blob = new Blob(chunksRef.current, { type: 'audio/webm' })
onAddAudio(new File([blob], 'enregistrement.webm', { type: 'audio/webm' }))
const type = recorder.mimeType || mimeType || 'audio/webm'
const ext = type.includes('mp4') ? 'm4a' : 'webm'
const blob = new Blob(chunksRef.current, { type })
onAddAudio(new File([blob], `enregistrement.${ext}`, { type }))
}
recorder.start()
recorderRef.current = recorder
setRecording(true)
} catch {
// micro non disponible
// micro non disponible ou permission refusée
}
}
@@ -121,7 +125,7 @@ function NoteCard({ note, onEdit, onDelete, onAddPhoto, onAddAudio, onDeleteAtt
{note.tags.map(t => (
<span key={t} style={{ background: 'var(--bg-5)', color: 'var(--ink-3)', fontSize: 11, fontFamily: 'var(--font-ui)', borderRadius: 999, padding: '1px 7px' }}>{t}</span>
))}
{note.gps_lat && <span style={{ color: 'var(--ok)', fontSize: 11 }}>📍</span>}
{note.gps_lat != null && <i className="fa-solid fa-location-dot" style={{ color: 'var(--ok)', fontSize: 12 }} title={`${note.gps_lat?.toFixed(4)}, ${note.gps_lon?.toFixed(4)}`} />}
</div>
{/* Actions */}