Claude
da474d978d
feat(02-03): add waveform extraction module and HTTP endpoint
...
- Create lightsync/audio/waveform.py with extract_peaks() (AUD-05)
- MP3 via ffmpeg pipe, WAV/FLAC/OGG via soundfile+numpy
- Add GET /api/audio/waveform endpoint with asyncio.to_thread
- peaks param clamped 100-5000, returns {peaks, count, file}
2026-04-06 13:11:38 +00:00
Claude
5f75a19868
feat(02-01): implement MPVEngine with position polling and lifespan integration
...
- Create lightsync/audio/__init__.py package marker
- Create lightsync/audio/engine.py with MPVEngine class
- Headless mpv wrapper (vo=null, ao from MPV_AO env var default null)
- 10Hz polling loop in daemon thread (time.sleep(0.1), not observe_property)
- Thread-safe get_state() returning position, paused, duration, loaded, file
- load/play/pause/seek/stop methods (AUD-01, AUD-03)
- apply_timer_fix() with sys.platform == win32 guard (INF-03)
- Update main.py lifespan to create/start/stop MPVEngine
- MPV_AO env var controls audio output (default null for server mode)
- engine exposed via app.state.engine for API routes
2026-04-06 13:03:43 +00:00