Changelog¶
Unreleased¶
New localsearch module, previously named tracker. The tracker module is removed in this release. The new module requires LocalSearch 3.8 or newer. #260
New beets resolve command to resolve playlists against tracks in a Beets library. Thanks to Tomodachi94. #239
Support for Click >= 8.2.0. Thanks to Tomodachi94. #240
The listenbrainz and listenbrainz-history commands now fetch more data in a single request, making them faster. Thanks to Tomodachi94. #253
Tests and build system rework. All tests now run with tox and all installation flows use pip or venv. (The build backend is still our beloved meson-python).
v10.0¶
The
calliope.playlist.PlaylistItemclass replaces the oldercalliope.playlist.Item. The old name is still available as an alias. Thecalliope.playlist.Playlisttype is now a usablelistsubclass instead of atyping.NewTypesubclass.Replace ‘splitstream’ module with a pure-Python alternative, ‘jsonlines’.
Show version number in cpe –help
The
cpe lastfm histogramandcpe listenbrainz histogramcommands now include field names as part of the JSON output. #223
- Improvements in the
trackermodule:
Use static, precompiled queries with parameters. This replaces string concatenation used previously. This protects against SPARQL injection and avoids re-compiling queries each time they are used.
Use full-text search in
albumsandtracksqueries, which makes them significantly faster.The
searchfunctionality can now match against album names.Add
calliope.cache.Cache.close()method, which helps avoid SQLite locking issues and failures intest_cache.py.
v9.1¶
Fix bad code in new
calliope.available_listen_history_providers()function.
v9.0¶
Stable interfaces across modules! The new
calliope.interfacemodule defines two interfaces, ListenHistoryProvider and ContentResolver. These are implemented each in two different modules. This makes it easier to use different backends in the same codebase.The
special_mixexample is updated to demonstrate how this works.Context objects (BandcampContext, LastfmContext, etc.) now take configuration as keyword args. Some previously took a
calliope.config.Configurationobject, which made it hard to override the config in applications.You can load the config yourself with the new
calliope.config.Configuration.get_section()method as needed.There is a new policy for config key names in
calliope.conf: use underscores to separate words, e.g.client_id. The previous (undocumented) policy was to use hyphens (e.g.client-id).The
calliope.configmodule will translate key names on load so that existing configs continue to work.Python examples are now documented using Sphinx + AutoAPI, allowing you to read the docs online.
The
special_mixexample has some bug fixes and documentation improvements.listenbrainz: The listenbrainz-history tracks command now uses
artist_name + track_nameto decide which listens refer to the same track. The code did use therecording_msidbut this seems to change based onalbum_name.spotify: Content resolution now queries 20 candidates per item rather than 300.
cache: Fix a bug where v1 caches didn’t properly migrate to v2.
v8.2¶
v8.1¶
Examples are now included in the
calliope_musicdistribution and installed as a separatecalliope_examplespackage. The “Special Mix” example can now be executed directly after installation:python3 -m calliope_examples.special_mixMeson is now used as the project build system for Python package builds. All setuptools configuration has been removed. There should be no functional difference with this change. #211
v8.0¶
Multiple artists are now returned when you resolve or annotate via MusicBrainz and Spotify. This is a change in the data format for those subcommands: fields such as artist_id are replaced by a artists list. #205
musicbrainz: The
annotate --includeoption now supports all values that the MusicBrainz API supports.
See the full list of keys with
cpe musicbrainz list-includesUse
*to select many keys, e.g.--include=artist.*to select all data related to the artist.Other Musicbrainz improvements:
The
annotatecommand no longer callssearch()unless required.More detailed artist data is returned. #201
Fix crash if
calliope.musicbrainz.annotate()is called without theselect_fnparameter.Fix some implementation gaps around
calliope.cache.CacheLookupResult. #199Remove unneccessary reimplementation of SQLite’s retry-on-busy handling. #202
Bugfixes:
- cli: Quiet ‘unhandled attribute’ warnings from ‘musicbrainzngs’ library
when -v 3. #199
- lastfm-history: Fix database error
listenbrainz: Fix import error of bundled pylistenbrainz package (it’s bundled awaiting https://github.com/metabrainz/pylistenbrainz/pull/10)
- listenbrainz-history: Fix error when artist-msid isn’t returned
More stuff not listed here.
v7.1¶
Fix a bug in cache migration. #197
v7.0¶
- Cache expiry is now supported in calliope.cache module.
The
calliope.cache.Cache.lookup()method now returns(datetime, value)instead of(bool, value). Code calling this function may require changes.The
calliope.cache.Cache.wrap()method now accepts anexpiryparameter.bandcamp: Add export-band and export-album commands. #192
bandcamp: Add wishlist command.
example: Fix collectors/online-to-local.sh. #96
tests: Use Tox to run tests in virtualenv. Minor improvements to Gitlab CI setup and PyPI packaging.
v6.0¶
examples: Add special-mix example.
lastfm-history: Add histogram command
listenbrainz: Fix a bug in ‘week’ histogram generation
v5.0¶
tracker: Support querying remote databases over HTTP.
listenbrainz: Add cpe listenbrainz-history histogram command.
musicbrainz: Documentation improvements and bugfixes.
select: Add named keyword arguments to all constraints.
Default Git branch renamed to ‘main’.
v4.0¶
New cpe listenbrainz command to export playlists from Listenbrainz. #178
New cpe listenbrainz-history command to cache and query listening history from Listenbrainz. #176
spotify: Export and Import tracks, albums or artists from/into the current users’ spotify library By lackhove. #168
Bug fixes.
v3.1¶
v3.0¶
spotify: Use the much improved resolver introduced in 2.0.0 and extend playlist import action to use spotify IDs and URIs and update existing playlists. By lackhove. #155.
spotify: Remove the
--userflag, it did not do what it claimed to do. #158.Document how to get Spotify API keys. #161.
lastfm-history: Move progress bar to stderr. #160.
Other small fixes and documentation improvements.
v2.0¶
Replace –debug with –verbosity CLI option. Thanks to lackhove. #149.
Skip tests if module requirements aren’t installed. Thanks to lackhove. #151.
Update CI image with some follow-up fixes.
musicbrainz: Add a much improved resolver. Thanks to lackhove. #148.
spotify: Small improvements to resolver, add playlist import. #150.
youtube: Fix mass playlist export #85.