Changelog
This changelog is used to track all major changes to Mopidy.
For older releases, see History.
v3.4.2 (2023-11-01)
Deps: Python 3.11 and 3.12 are now included in the testing matrix.
M3U: Stop following symlinks when
file/follow_symlinks
is false. (PR: #2094)zeroconf: Fix exception on shutdown if dbus is not installed.
Docs: Fix crash when building docs on recent Sphinx versions.
Dev: Make stacktraces from deprecation warnings include the offending call site, to help upgrade API usage in extensions.
Dev: Upgrade CI workflows to fix Node.js 12 deprecation notices and avoid Codecov’s bash uploader.
Dev: Make tests pass on macOS. (PR: #2092)
Dev: Incease test coverage of Mopidy-File to 100%. (PR: #2096)
Dev: Added “tox -e ci”, to allow easy CI check before “git push”.
v3.4.1 (2022-12-07)
HTTP: Fix non-optional
allowed_origins
config setting. (PR: #2066)
v3.4.0 (2022-11-28)
Config: Handle DBus “Algorithm plain is not supported” error. (PR: #2061)
File: Fix uppercase
excluded_file_extensions
. (PR: #2063)Add
mopidy.backend.PlaybackProvider.on_source_setup()
which can be implemented by Backend playback providers that want to set GStreamer source properties in thesource-setup
callback. (PR: #2060)HTTP: Improve handling of
allowed_origins
config setting. (PR: #2054)
v3.3.0 (2022-04-29)
Core: Fixes invalid verbosity logging levels. (Fixes: #1947, PR: #2021)
Core: Fix TypeError exception when playing track with unnamed artists. (Fixes: #1991, PR: #2012)
Core: Fix startup crash when loading invalid extensions. (PR: #1990)
Core: Fix error-handling when fetching backend support info. (PR: #1964)
Core: Align values supported by the
field
argument tomopidy.core.LibraryController.get_distinct()
with Mopidy search query fields, with the exception of ‘any’. Deprecated field ‘track’ with the goal of removing it in the next major release, use ‘track_name’ instead. Backends should support both track and track_name until they require a version of Mopidy where track has been removed. (Fixes: #1900, PR: #1899)Core: Add
musicbrainz_albumid
,musicbrainz_artistid
,musicbrainz_trackid
, anddisc_no
to the permitted search query fields. (Fixes: #1900, PR: #1899)Audio: Fix TypeError when handling create output pipeline errors. (Fixes: #1924, PR: #2040)
Config: Fix support for inline comments, a regression introduced during our Python 3 migration. (Fixes: #1868, PR: #2041)
HTTP: Fix missing CORS headers on RPC response. (Fixes: #2028, PR: #2029)
HTTP: Improve CSRF protection Content-Type check. (PR: #1997)
HTTP: Fix support for websocket clients connecting/disconnecting during broadcast. (PR: #1993)
Add Python 3.10 to our test matrix.
Core: Added and improved configuration parsing code for extension developers. (PR: #2010)
v3.2.0 (2021-07-08)
v3.1.1 (2020-12-26)
Fix crash when extracting tags using gst-python >= 1.18. (PR: #1948)
v3.1.0 (2020-12-16)
Add Python 3.9 to our test matrix.
Add
mopidy.backend.PlaybackProvider.should_download()
which can be implemented by playback providers that want to use GStreamer’s download buffering strategy for their URIs. (PR: #1888)Audio: Fix memory leak when converting GStreamer
sample
type tags. (Fixes: #1827, PR: #1929)Turn off strict parsing of
*.pls
playlist files. This was a regression that happened during the migration to Python 3. (PR: #1923)Make the systemd unit that ships with Mopidy wait for an Internet connection before starting Mopidy. When used by distribution packages, this can help avoid that extensions try to connect to cloud services before the machine’s Internet connection is ready for use. (PR: #1946)
v3.0.2 (2020-04-02)
Bugfix release.
Core: Reset stream title on receipt of any
title
audio tag change. (Fixes: #1871, PR: #1875)Core: Hide the methods
mopidy.core.Core.setup()
andmopidy.core.Core.teardown()
from other actors and JSON-RPC API clients. The methods have always been clearly documented as internal. (PR: #1865)Config: Log a warning if unknown config sections are found. (Fixes: #1878, PR: #1890)
Config: Fix crash when reading values from keyring. (PR: #1887)
Various documentation updates.
v3.0.1 (2019-12-22)
Bugfix release.
v3.0.0 (2019-12-22)
The long-awaited Mopidy 3.0 is finally here, just in time for the Mopidy project’s 10th anniversary on December 23rd!
Mopidy 3.0 is a backward-incompatible release in a pretty significant way: Mopidy no longer runs on Python 2.
Mopidy 3.0 requires Python 3.7 or newer.
While extensions have been able to continue working without changes throughout the 1.x and 2.x series of Mopidy, this time is different:
All extensions must be updated to work on Python 3.7 and newer.
Some extensions need to replace their use of a few long-deprecated APIs that we’ve removed. See below for details.
Extension maintainers are also encouraged to update their project’s setup to match our refreshed extension cookiecutter.
In parallel with the development of Mopidy 3.0, we’ve coordinated with a few extension maintainers and upgraded almost 20 of the most popular extensions. These will all be published shortly after the release of Mopidy 3.0.
We’ve also built a new extension registry, where you can quickly track what extensions are ready for Python 3.
In other news, the Mopidy-MPD and Mopidy-Local extensions have grown up and moved out to flourish as independent extension projects. After the move, Mopidy-Local merged with Mopidy-Local-SQLite and Mopidy-Local-Images, which are now both a part of the Mopidy-Local extension.
Dependencies
Python >= 3.7 is now required. Python 2.7 is no longer supported.
GStreamer >= 1.14.0 is now required.
Pykka >= 2.0.1 is now required.
Tornado >= 4.4 is now required. The upper boundary (< 6) has been removed.
We now use a number of constants and functions from
GLib
instead of their deprecated equivalents inGObject
. The exact version of PyGObject and GLib that makes these constants and functions available in the new location is not known, but is believed to have been released in 2015 or earlier.
Logging
The command line option
mopidy --save-debug-log
and the configurationlogging/debug_file
have been removed. To save a debug log for sharing, runmopidy -vvvv 2>&1 | tee mopidy.log
or equivalent. (Fixes: #1452, PR: #1783)Replaced the configurations
logging/console_format
andlogging/debug_format
with the single configurationlogging/format
. It defaults to the same format as the old debug format. (Fixes: #1452, PR: #1783)Added configuration
logging/verbosity
to be able to control logging verbosity from the configuration file, in addition to passing-q
or-v
on the command line. (Fixes: #1452, PR: #1783)
Core API
Removed properties, methods, and arguments that have been deprecated since 1.0, released in 2015. Everything removed already has a replacement, that should be used instead. See below for a full list of removals and replacements. (Fixes: #1083, #1461, PR: #1768, #1769)
Root object
Removed properties, use getter/setter instead:
mopidy.core.Core.uri_schemes
mopidy.core.Core.version
Library controller
Removed methods:
mopidy.core.LibraryController.find_exact()
: Usesearch()
with the keyword argumentexact=True
instead.
Removed the
uri
argument tomopidy.core.LibraryController.lookup()
. Use theuris
argument instead.Removed the support for passing the search query as keyword arguments to
mopidy.core.LibraryController.search()
. Use thequery
argument instead.mopidy.core.LibraryController.search()
now returns an empty result if there is noquery
. Previously, it returned the full music library. This is not feasible for online music services and has thus been deprecated since 1.0.
Playback controller
Removed properties, use getter/setter instead:
mopidy.core.PlaybackController.current_tl_track
mopidy.core.PlaybackController.current_track
mopidy.core.PlaybackController.state
mopidy.core.PlaybackController.time_position
Moved to the mixer controller:
mopidy.core.PlaybackController.get_mute()
: Useget_mute()
.mopidy.core.PlaybackController.get_volume()
: Useget_volume()
.mopidy.core.PlaybackController.set_mute()
: Useset_mute()
.mopidy.core.PlaybackController.set_volume()
: Useset_volume()
.mopidy.core.PlaybackController.mute
: Useget_mute()
andset_mute()
.mopidy.core.PlaybackController.volume
: Useget_volume()
andset_volume()
.
Deprecated the
tl_track
argument tomopidy.core.PlaybackController.play()
, with the goal of removing it in the next major release. Use thetlid
argument instead. (Fixes: #1773, PR: #1786, #1854)
Playlist controller
Removed properties, use getter/setter instead:
mopidy.core.PlaylistController.playlists
Removed methods:
mopidy.core.PlaylistsController.filter()
: Useas_list()
and filter yourself.mopidy.core.PlaylistsController.get_playlists()
: Useas_list()
andget_items()
.
Tracklist controller
Removed properties, use getter/setter instead:
mopidy.core.TracklistController.tl_tracks
mopidy.core.TracklistController.tracks
mopidy.core.TracklistController.length
mopidy.core.TracklistController.version
mopidy.core.TracklistController.consume
mopidy.core.TracklistController.random
mopidy.core.TracklistController.repeat
mopidy.core.TracklistController.single
Removed the
uri
argument tomopidy.core.TracklistController.add()
. Use theuris
argument instead.Removed the support for passing filter criteria as keyword arguments to
mopidy.core.TracklistController.filter()
. Use thecriteria
argument instead.Removed the support for passing filter criteria as keyword arguments to
mopidy.core.TracklistController.remove()
. Use thecriteria
argument instead.Deprecated methods, with the goal of removing them in the next major release: (Fixes: #1773, PR: #1786, #1854)
mopidy.core.TracklistController.eot_track()
. Useget_eot_tlid()
instead.mopidy.core.TracklistController.next_track()
. Useget_next_tlid()
instead.mopidy.core.TracklistController.previous_track()
. Useget_previous_tlid()
instead.
The
tracks
argument tomopidy.core.TracklistController.add()
has been deprecated since Mopidy 1.0. It is still deprecated, with the goal of removing it in the next major release. Use theuris
argument instead.
Backend API
Add
mopidy.backend.PlaybackProvider.is_live()
which can be implemented by playback providers that want to mark their URIs as live streams that should not be buffered. (PR: #1845)
Models
Remove
.copy()
method on all model classes. Use the.replace()
method instead. (Fixes: #1464, PR: #1774)Remove
mopidy.models.Album.images
. Clients should usemopidy.core.LibraryController.get_images()
instead. Backends should implementmopidy.backend.LibraryProvider.get_images()
. (Fixes: #1464, PR: #1774)
Extension support
The following methods now return
pathlib.Path
objects instead of strings:This makes it easier to support arbitrary encoding in file names.
The command mopidy deps no longer repeats the dependencies of Mopidy itself for every installed extension. This reduces the length of the command’s output drastically. (PR: #1846)
HTTP frontend
Stop bundling Mopidy.js and serving it at
/mopidy/mopidy.js
and/mopidy/mopidy.min.js
. All Mopidy web clients must use Mopidy.js from npm or vendor their own copy of the library. (Fixes: #1083, #1460, PR: #1708)Remove support for serving arbitrary files over HTTP through the use of
http/static_dir
, which has been deprecated since 1.0. (Fixes: #1463, PR: #1706)Add option
http/default_app
to redirect from web server root to a specific app instead of Mopidy’s web app list. (PR: #1791)Add cookie secret to Tornado web server, allowing Tornado request handlers to call
get_secure_cookie()
, in an implementation ofget_current_user()
. (PR: #1801)
MPD frontend
The Mopidy-MPD frontend is no longer bundled with Mopidy, and has been moved to its own Git repo and PyPI project.
Local backend
The Mopidy-Local backend is no longer bundled with Mopidy, and has been moved to its own Git repo and PyPI project. (Fixes: #1003)
Removed
mopidy.exceptions.FindError
, as it was only used by Mopidy-Local. (PR: #1857)
Audio
Remove the method
mopidy.audio.Audio.emit_end_of_stream()
, which has been deprecated since 1.0. (Fixes: #1465, PR: #1705)Add
live_stream
option tomopidy.audio.Audio.set_uri()
that disables buffering, which reduces latency before playback starts, and discards data when paused. (PR: #1845)
Internals
Format code with Black. (PR: #1834)
Port test assertions from
unittest
methods to pytestassert
statements. (PR: #1838)Switch all internal path handling to use
pathlib
. (Fixes: #1744, PR: #1814)Remove
mopidy.compat
and all Python 2/3 compatibility code. (PR: #1833, #1835)Replace
requirements.txt
andsetup.py
with declarative config insetup.cfg
. (PR: #1839)Refreshed and updated all of our end user-oriented documentation.