How to set up a ListenBrainz development environment

One of the first rites of passage when working on a new project is creating your development environment. It always seems simple, but sometimes there are bumps along the way. The first activity I did to begin contributing to ListenBrainz was create my development environment. I wasn’t successful with the documentation in the README, so I had to play around and work with the project before I was even running it.

The first part of this post details how to set up your own development environment. Then, the second half talks about the solution I came up with and my first contribution back to the project.

Continue reading “How to set up a ListenBrainz development environment”

Picard 2.0 beta announcement

Hello people,

We saw a flurry of updates to Picard these last few months and I am happy to announce that Picard 2.0 is finally in beta. You can find it here – Picard 2.0.0beta1

If you have been following our Picard related blogs, you will know that we switched up our dependencies a bit. What this means is that Picard should look better and in general feel more responsive.

We also decided to release a new stable version of Picard before the beginning of the summer.

To help us, advanced users, translators and developers are encouraged to:

A simplified list of changes made since 1.4 can be read here.

Be aware that downgrading from 2.0 to 1.4 may lead to configuration compatibility issues – ensure that you have saved your Picard configuration before using 2.0 if you intend to go back to 1.4.



Libdiscid 0.6.2 and python-discid 1.1.1 released

Libdiscid 0.6.2 includes these changes:

  • ISRC and MCN support on BSD (Zastai)
  • LIB-60: fix make check for default device on generic/unknown platform
  • make Doxygen output reproducible (no timestamps; Sebastinas)
  • remove newline for Linux device “1” from proc (Zastai)

The download can be found at

Python-discid 1.1.1 includes these changes:

The download can be found at

Announcing python-musicbrainzngs, release 0.6

From the better late than never department…

After more than 2 years we’ve finally released version 0.6 of python-musicbrainzngs, a library for accessing the Musicbrainz webservice from python.

After such a long time we have perhaps too many new changes to describe. Some major changes include:

  • Better handling of authentication private user collections
  • Support for loading all types of user collections (artist, event, place, recording, release, work)
  • Work attributes
  • Support for the Cover Art Archive
  • Support for Events, Instruments, Places, and Series

And numerous other bug fixes and small changes. See the CHANGES file  for more information.

This release contains contributions by Alastair Porter, Corey Farwell, Ian McEwen, Jérémie Detrey, Johannes Dewender, Pavan Chander, Rui Gonçalves, Ryan Helinski, Shadab Zafar, and Wieland Hoffmann. Thank you everyone!


The new version can be downloaded from github, pypi, or installed with pip

About next stable Picard release

Picard team decided to release a new stable version of Picard before the end of the summer.
To help us, advanced users, translators and developers are encouraged to:

Exact release date is not yet known, and features aren’t yet frozen, but the only important change we’ll try to get in before final release is OAuth support (PICARD-305), we still accept minor patches until feature freeze is announced.

Since Picard is now using some translation resources from MusicBrainz project, translators should make sure following resources are up-to-date:

A simplified list of changes made since 1.2 can be read there.

Be aware that downgrading from 1.3 to 1.2 may lead to configuration compatibility issues, better save your configuration before using 1.3 branch if you intent to go back to 1.2.



Announcing python-musicbrainzngs, release 0.5

We’ve just release a new version of python-musicbrainzngs, a library for accessing the Musicbrainz webservice from python.
Version 0.5 comes with a lot of new features, including:

  • Support for URL entities
  • Support for Area entities
  • Support the experimental JSON webservice
  • Support fuzzy disc lookup by TOC
  • add a -count element to browse and search requests
  • added support for link type UUIDs
  • deprecated puid and echoprint support

And a number of bug fixes and other small changes. See the CHANGES file  for more information.

For consistency with online repositories and distribution packages, we’ve renamed some URLs. You can now find the library on github and readthedocs at:

You will be automatically redirected if you access the old urls.

Thanks to Johannes Dewender, Ian McEwen, Wieland Hoffmann, Simon Chopin and Ryan Helinski for contributing to this release.

The new version can be downloaded from github, pypi, or installed with pip

python-discid 1.1.0 (and 1.0.3) released

New versions of python-discid are available.

Changes in 1.1.0

  • feature: #36 add Disc.toc_string
  • #38 remove DiscId (deprecated since 0.5.0)

Changes in 1.0.3

  • fix: #37 test_emptyness: Assertion disc->success failed

Python-discid 1.0.3 is a bugfix version for the recent libdicid 0.6.0 release and python-discid 1.1.0 adds the TOC string, which is also part of new libdiscid versions. The TOC can be used for fuzzy searches in the web service.
The toc string feature was backported and can be used together with any version of libdiscid >= 0.2.2.

The bugfix for 1.0.3 is only relevant for running the test suite (which is done at install time usually). It shouldn’t affect normal operation. If you don’t have any problems, you don’t need to upgrade.

The DiscId class was already deprecated in the 0.5.0 beta, but still works in 1.0.x releases.
The correct usage is to create a Disc object with read() or put().
See also basic usage of python-discid.

Downloads are available at pypi. Packages are available for some linux distributions.
Recent stable and git versions of python-discid and other MusicBrainz client libraries and tools are now available for many Ubuntu versions at the MusicBrainz Stable and PPAs.

python-discid 1.0.0 (and 1.0.2) released

In februar I announced a beta version of the first python binding of libdiscid. A couple months have passed and I can now announce the first stable release of python-discid.

The main purpose is the calculation of MusicBrainz Disc IDs from a CD-AUDIO disc or a TOC of such a disc, but reading of ISRCs and the MCN (EAN/UPC) are also supported.
Disc IDs can be submitted without further dependencies. For lookup and ISRC submission it is recommended to use it together with python-musicbrainzngs.
Python 2 >= 2.6 or Python 3 >= 3.1 as well as libdiscid >= 0.2.2 are required. Newer libdiscid features need a newer libdiscid, but there are methods available to check for these conditions.

If you still have a program using python-musicbrainz2, I recommend upgrading to the combination of python-discid and python-musicbrainzngs, since python-musicbrainz2 uses a deprecated web service and is not actively maintained anymore.

The main website and API documentation is at readthedocs, the repository and bugtracker are at GitHub.
Official source tarballs are available on pypi and releases are announced in this blog. There are several linux packages available and listed in the documentation.

If you have been using a pre-release version of python-discid you will have to update your code.
Compared to python-discid 0.5.0 you now have to use discid.get_default_device(), rather than discid.DEFAULT_DEVICE. If you were using 0.4.0, you should also stop using DiscId() directly or a DeprecationWarning is displayed.

There is also a patch release 1.0.2 available, which has no code changes compared to 1.0.0.
There was an intermediate 1.0.1, which tried to make some convenience changes for beta users, but failed. 1.0.1 was never available as a tarball, but the tag and changelog exists.

User agent based throttling is now live

Yesterday we talked about rolling out our throttling based on User-Agent strings. A few minutes ago we pushed this feature live on our servers so now the updated rules are in effect. python-musicbrainz/0.7.3 users are now allowed 500 requests every 10 seconds and every single one of these requests is constantly being used. No surprise here. 🙂

For the exact details on what is throttled and how to get around your application being throttled, see our rate limiting documentation.

Dear python-musicbrainz/0.7.3 application, we need to talk!

An application that uses our python-musicbrainz/0.7.3 client library has been putting undue load on our servers all at once. This application looks up something at MusicBrainz at 03:00UTC causing our servers to be overloaded at that time each day.

To protect our servers from being overloaded we’re going to block this application from 3:00 UTC – 4:00 UTC. We’re hoping that this will alllow us to identify the application and start a dialog with the application authors. Once we have established communication with the authors and worked up a plan to fix this, we’re going to release the block.

We really dislike blocking applications, but if applications are being inconsiderate of our resources, we’re left with few options. We hope to hear from the application authors soon so we can resolve this issue. Also, we’re moving forward with our plans to require User-Agent strings that properly identify applications using our service to fix this problem going forward.

If you are the author of said application, please leave a comment with information on how we can get in touch with you.