Repository navigation
Highlights
tracks.analyze()starts Lexicon's audio analyzer on explicit track IDs through the Local API's control endpoint- API spec updated to Lexicon 1.11.13, with the control-endpoint findings recorded in
docs/api-issues.md - Integration harness hardened: waits for the Lexicon process to exit, moves the SQLite sidecars with the database, and fails loudly on a bad launch; its lifecycle unit tests now run in CI
Breaking change
Lexicon()probes the API on construction and raisesLexiconConnectionErrorwhen Lexicon is not running. Passverify_connection=Falseto build a client without a running Lexicon.
New Features
tracks.analyze(track_ids, *, analyze_key, analyze_beatgrid, analyze_waveform, analyze_energy, do_not_overwrite, tempo_range); options left asNoneuse Lexicon's own settings.TempoRangeandTEMPO_RANGES(the eight tempo-range presets) are exported from the package root.tracks.update_tempogrid(track_id, tempomarkers)replaces the beatgrid while keeping each cuepoint on the same beatcolor_rgb(name)returns the RGB tuple for a Lexicon color nameTempoMarkerUpdateandCuePointUpdatere-exported from the package roottracks.search()no longer requires a sort
Notes on tracks.analyze()
- Tested against Lexicon 1.11.13. It sends the internal action id
AudioAnalyzer_Analyzebecause that release rejects the documentedTrackBrowser_AnalyzeStart. - Analysis runs in the background and the API has no completion signal; poll
tracks.get(). tempo_rangeis written to Lexicon's stored analysis setting and persists after the call. It must be one of the analyze dialog's presets.
Internal
- Lifecycle helpers moved to
tests/integration/lifecycle.pywith 21 unit tests that run on Linux CI - Local lint guards: pre-commit hook and editor hook running ruff
Full Changelog: v0.3.0...v0.4.0