Commit Graph
8 Commits
Author SHA1 Message Date
Michael c86887f037 feat: proxy audio backend pour Web Audio API sans CORS
Nouveau endpoint /api/audio/proxy?url=... re-stream l'audio externe
avec Access-Control-Allow-Origin:*. Fallback: direct → proxy → no-cors.
Analyser actif en mode proxy → vraie synchronisation waveform/son.
2026-05-03 21:52:13 +02:00
Michael 59ecd7a747 fix: reprise position + visualizer speech-like
Resume: savedPositionRef appliqué sur loadedmetadata pour survivre
au remontage audio après échec CORS. Analyser: fftSize 256,
smoothing 0.55. Simulation: rythme syllabique avec consonantes.
2026-05-03 21:26:53 +02:00
MichaelandClaude Opus 4.7 3d73ed1e62 fix: onde réelle quand CORS dispo, son + simulation sinon
Approche hybride CORS retry:
- Tentative 1: crossOrigin="anonymous" + createMediaElementSource
  → données de fréquence réelles si le serveur le permet
- Tentative 2 (si CORS bloque): sans crossOrigin, audio direct
  → son fonctionne, visualiseur simulé

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-01 23:22:11 +02:00
MichaelandClaude Opus 4.7 3a90f77d65 fix: son coupé par createMediaElementSource sur audio cross-origin
createMediaElementSource détache l'audio de sa sortie par défaut.
Pour les ressources cross-origin sans CORS, le graphe Web Audio
produit du silence — aucun son.

- Retire createMediaElementSource et tout le pipeline Web Audio
- L'audio joue directement via l'élément <audio> (fiable)
- Le visualiseur utilise une animation simulée (plus de dépendance CORS)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-01 23:17:46 +02:00
MichaelandClaude Opus 4.7 ee04841d9e fix: podcasts ne lisent pas à cause du blocage CORS
crossOrigin="anonymous" sur <audio> forçait le navigateur à exiger
les headers CORS des serveurs audio. Les hébergeurs sans
Access-Control-Allow-Origin bloquaient le chargement entièrement.

- Retire crossOrigin="anonymous" de l'élément <audio>
- Ajoute visualisation simulée dans l'egaliseur quand les données
  de fréquence réelles sont indisponibles (audio cross-origin)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-01 23:09:15 +02:00
MichaelandClaude Opus 4.7 99c9c299de feat: reactive audio visualizer centered below inline player
Replace static CSS eq-bars with a real-time AudioVisualizer component
using the Web Audio API AnalyserNode. The visualizer is now centered
below the progress bar in the inline hero player, with 28 bars and
boosted mid-range frequencies for better speech visualization.

- AudioContext: wire AnalyserNode, expose getFrequencyData, add
  crossOrigin="anonymous" and key on the audio element
- AudioPlayer (inline): remove static eq-bars, add AudioVisualizer
- New AudioVisualizer component: requestAnimationFrame loop,
  smooth decay on pause, configurable bar count/height/gap

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-22 15:22:55 +02:00
MichaelandClaude Sonnet 4.6 5a9a0904a1 fix: audio persistence across navigation + LU badge at 90% + filter continuer section
- AudioPlayer is now purely presentational — no internal <audio> element or state.
  All playback state (currentTime, duration, volume, speed, mute, error, isResuming)
  comes from AudioContext, which holds the persistent <audio> at provider level.
  This prevents audio from cutting when navigating between pages.

- userId is synced into AudioContext via setUserId() so progress saving/loading
  works without the player needing to manage it locally.

- EpisodeCard: isCompleted now triggers at ≥90% listened (progressPercent >= 0.9)
  in addition to the isCompleted flag, so the LU badge appears correctly.
  Progress bar also hidden when ≥90%.

- Dashboard: episodesInProgress now excludes episodes at ≥90% listened,
  removing them from the "Continuer l'écoute" section once effectively finished.
  setUserId() called after user loads to wire context progress saving.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 15:08:04 +02:00
Michael 17f2496dda feat: implement global audio player with playback controls, progress tracking, and persistent settings 2026-04-16 15:34:09 +02:00