Changelog¶
This changelog is used to track all major changes to Mopidy.
For older releases, see History.
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
GLibinstead 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-logand the configurationlogging/debug_filehave been removed. To save a debug log for sharing, runmopidy -vvvv 2>&1 | tee mopidy.logor equivalent. (Fixes: #1452, PR: #1783)Replaced the configurations
logging/console_formatandlogging/debug_formatwith the single configurationlogging/format. It defaults to the same format as the old debug format. (Fixes: #1452, PR: #1783)Added configuration
logging/verbosityto be able to control logging verbosity from the configuration file, in addition to passing-qor-von 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_schemesmopidy.core.Core.version
Library controller¶
Removed methods:
mopidy.core.LibraryController.find_exact(): Usesearch()with the keyword argumentexact=Trueinstead.
Removed the
uriargument tomopidy.core.LibraryController.lookup(). Use theurisargument instead.Removed the support for passing the search query as keyword arguments to
mopidy.core.LibraryController.search(). Use thequeryargument instead.mopidy.core.LibraryController.search()now returns an empty result if there is noquery. Previously, it returned the full music library. This does not work with online music services, and have thus been deprecated since 1.0.
Playback controller¶
Removed properties, use getter/setter instead:
mopidy.core.PlaybackController.current_tl_trackmopidy.core.PlaybackController.current_trackmopidy.core.PlaybackController.statemopidy.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_trackargument tomopidy.core.PlaybackController.play(), with the goal of removing it in the next major release. Use thetlidargument 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_tracksmopidy.core.TracklistController.tracksmopidy.core.TracklistController.lengthmopidy.core.TracklistController.versionmopidy.core.TracklistController.consumemopidy.core.TracklistController.randommopidy.core.TracklistController.repeatmopidy.core.TracklistController.single
Removed the
uriargument tomopidy.core.TracklistController.add(). Use theurisargument instead.Removed the support for passing filter criteria as keyword arguments to
mopidy.core.TracklistController.filter(). Use thecriteriaargument instead.Removed the support for passing filter criteria as keyword arguments to
mopidy.core.TracklistController.remove(). Use thecriteriaargument 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
tracksargument 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 theurisargument instead.
Backend API¶
Add
mopidy.backend.PlaybackProvider.is_live()which can be implemented by playback providers that wants 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.Pathobjects 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.jsand/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_appto 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)
The
mopidy.exceptions.FindErrorhas been removed, 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_streamoption 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
unittestmethods to pytestassertstatements. (PR: #1838)Switch all internal path handling to use
pathlib. (Fixes: #1744, PR: #1814)Remove
mopidy.compatand all Python 2/3 compatibility code. (PR: #1833, #1835)Replace
requirements.txtandsetup.pywith declarative config insetup.cfg. (PR: #1839)Refreshed and updated all of our end user-oriented documentation.