feat(notes): support vidéo + transcodage audio AAC universel

Audio : ffmpeg transcode toute entrée (webm/ogg/m4a) vers AAC/m4a
au moment de l'upload → lecture Safari iOS garantie.

Vidéo : nouveau save_video(), webm transcodé en H.264/mp4, mp4/quicktime
stocké directement. Lecteur <video> inline dans NoteCard.

Frontend :
- Bouton vidéo (fa-video) dans les actions de chaque note
- Icônes fa-image / fa-microphone / fa-video / fa-location-dot dans la méta
- Filtres rapides : Photo / Audio / Vidéo / GPS (avec icônes fa)
- Boutons actions migrés vers icônes Font Awesome
- client_max_body_size nginx : 15m → 200m pour les vidéos

v0.5.4

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-25 16:31:05 +02:00
parent 11b5c6c92e
commit 6c9ebcaab7
7 changed files with 152 additions and 34 deletions
+3 -1
View File
@@ -2,7 +2,7 @@ export interface NoteAttachment {
id: string
file_path: string | null
thumbnail_path: string | null
file_type: 'image' | 'audio' | null
file_type: 'image' | 'audio' | 'video' | null
original_name: string | null
created_at: string
}
@@ -34,6 +34,7 @@ export interface NoteFilters {
tag?: string
has_photo?: boolean
has_audio?: boolean
has_video?: boolean
has_gps?: boolean
}
@@ -46,6 +47,7 @@ export async function fetchNotes(filters: NoteFilters = {}): Promise<Note[]> {
if (filters.tag) params.set('tag', filters.tag)
if (filters.has_photo !== undefined) params.set('has_photo', String(filters.has_photo))
if (filters.has_audio !== undefined) params.set('has_audio', String(filters.has_audio))
if (filters.has_video !== undefined) params.set('has_video', String(filters.has_video))
if (filters.has_gps !== undefined) params.set('has_gps', String(filters.has_gps))
const res = await fetch(`${BASE}/?${params}`)
if (!res.ok) throw new Error('Erreur chargement notes')