- lookupRecordingWithTags, extractBpmFromTags, extractTimeSigFromTags, getMusicBrainzRecording added to MB client
- upsertSong preserves existing BPM via COALESCE on conflict
- updateSongBpm helper for async enrichment writes
- AnalysisInput gains confirmedBpm / confirmedTimeSigNum fields
- POST /api/analyze fetches confirmed BPM from DB then MB tags before generation
- All three AI providers use confirmedBpm as authoritative and build enriched userMessage
- POST /api/tracks auto-registration now fetches tags via getMusicBrainzRecording
- Updated User-Agent and MB client fallback URL to Gitea
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Defensive default for count_in in TempoMapEditor prevents crash when AI omits field
- Fix hardcoded GitHub registry URL → git.avezzano.io/the_og/clicktrack-registry
- Add response_format json_schema to Ollama provider so count_in is always required
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Multi-provider AI analysis (Anthropic, OpenAI, Ollama, Algorithmic)
- server-only guards on all provider files; client bundle fix
- /settings page with provider status, Ollama model picker, preferences
- Song search box on /analyze replacing raw MBID input (debounced, keyboard nav)
- Auto-register song via MusicBrainz on POST /api/tracks (no more 404)
- Fix WAV duration bug: last section songEnd was double-counting elapsed time
- Registry sync comment updated for self-hosted HTTPS git servers
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>