mopidy/docs/changelog.rst
2018-04-06 22:11:47 +02:00

3992 lines
153 KiB
ReStructuredText

*********
Changelog
*********
This changelog is used to track all major changes to Mopidy.
v2.2.0 (UNRELEASED)
===================
Feature release.
- Dependencies: Drop support for Tornado < 4.4. Though strictly a breaking
change, this shouldn't affect any supported systems as even Debian stable
includes Tornado >= 4.4.
- Core: Remove upper limit of 10000 tracks in tracklist. 10000 tracks is still
the default limit as some MPD clients crash if the tracklist is longer, but
it is now possible to set the :confval:`core/max_tracklist_length` config
value as high as you want to. (Fixes: :issue:`1600`, PR: :issue:`1666`)
- Core: Fix crash on `library.lookup(uris=[])`. (Fixes: :issue:`1619`, PR:
:issue:`1620`)
- File: Change default ordering to show directories first, then files. (PR:
:issue:`1595`)
- File: Fix extraneous encoding of path. (PR: :issue:`1611`)
- MPD: Added ``idle`` to the list of available commands.
(Fixes: :issue:`1593`, PR: :issue:`1597`)
- MPD: Added Unix domain sockets for binding MPD to.
(Fixes: :issue:`1531`, PR: :issue:`1629`)
- Ensure that decoding of OS errors with unknown encoding never crashes, but
instead replaces unknown bytes with a replacement marker. (Fixes:
:issue:`1599`)
- Set GLib program and application name, so that we show up as "Mopidy" in
PulseAudio instead of "python ...". (PR: :issue:`1626`)
v2.1.0 (2017-01-02)
===================
Mopidy 2.1.0, a feature release, is finally out!
Since the release of 2.0.0, it has been quiet times in Mopidy circles. This is
mainly caused by core developers moving from the enterprise to startups or into
positions with more responsibility, and getting more kids. Of course, this has
greatly decreased the amount of spare time available for open source work. But
fear not, Mopidy is not dead. We've returned from year long periods with close
to no activity before, and will hopefully do so again.
Despite all, we've closed or merged approximately 18 issues and pull requests
through about 170 commits since the release of v2.0.1 back in August.
The major new feature in Mopidy 2.1 is support for restoring playback state and
the current playlist after a restart. This feature was contributed by `Jens
Lütjen <https://github.com/dublok>`_.
- Dependencies: Drop support for Tornado < 3.2. Though strictly a breaking
change, this shouldn't have any effect on what systems we support, as Tornado
3.2 or newer is available from the distros that include GStreamer >= 1.2.3,
which we already require.
- Core: Mopidy restores its last state when started. Can be enabled by setting
the config value :confval:`core/restore_state` to ``true``.
- Audio: Update scanner to handle sources such as RTSP. (Fixes: :issue:`1479`)
- Audio: The scanner set the date to :attr:`mopidy.models.Track.date` and
:attr:`mopidy.models.Album.date`
(Fixes: :issue:`1741`)
- File: Add new config value :confval:`file/excluded_file_extensions`.
- Local: Skip hidden directories directly in ``media_dir``.
(Fixes: :issue:`1559`, PR: :issue:`1555`)
- MPD: Fix MPD protocol for ``replay_gain_status`` command. The actual command
remains unimplemented. (PR: :issue:`1520`)
- MPD: Add ``nextsong`` and ``nextsongid`` to the response of MPD ``status``
command. (Fixes: :issue:`1133`, :issue:`1516`, PR: :issue:`1523`)
- MPD: Fix inconsistent playlist state after playlist is emptied with repeat
and consume mode turned on. (Fixes: :issue:`1512`, PR: :issue:`1549`)
- Audio: Improve handling of duration in scanning. VBR tracks should fail less
frequently and MMS works again. (Fixes: :issue:`1553`, PR :issue:`1575`,
:issue:`1576`, :issue:`1577`)
v2.0.1 (2016-08-16)
===================
Bug fix release.
- Audio: Set ``soft-volume`` flag on GStreamer's playbin element. This is the
playbin's default, but we managed to override it when configuring the playbin
to only process audio. This should fix the "Volume/mute is not available"
warning.
- Audio: Fix buffer conversion. This fixes image extraction.
(Fixes: :issue:`1469`, PR: :issue:`1472`)
- Audio: Update scan logic to workaround GStreamer issue where tags and
duration might only be available after we start playing.
(Fixes: :issue:`935`, :issue:`1453`, :issue:`1474`, :issue:`1480`, PR:
:issue:`1487`)
- Audio: Better handling of seek when position does not match the expected
pending position. (Fixes: :issue:`1462`, :issue:`1505`, PR: :issue:`1496`)
- Audio: Handle bad date tags from audio, thanks to Mario Lang and Tom Parker
who fixed this in parallel. (Fixes: :issue:`1506`, PR: :issue:`1525`,
:issue:`1517`)
- Audio: Make sure scanner handles streams without a duration.
(Fixes: :issue:`1526`)
- Audio: Ensure audio tags are never ``None``. (Fixes: :issue:`1449`)
- Audio: Update :meth:`mopidy.audio.Audio.set_metadata` to postpone sending
tags if there is a pending track change. (Fixes: :issue:`1357`, PR:
:issue:`1538`)
- Core: Avoid endless loop if all tracks in the tracklist are unplayable and
consume mode is off. (Fixes: :issue:`1221`, :issue:`1454`, PR: :issue:`1455`)
- Core: Correctly record the last position of a track when switching to another
one. Particularly relevant for Mopidy-Scrobbler users, as before it was
essentially unusable. (Fixes: :issue:`1456`, PR: :issue:`1534`)
- Models: Fix encoding error if :class:`~mopidy.models.fields.Identifier`
fields, like the ``musicbrainz_id`` model fields, contained non-ASCII Unicode
data. (Fixes: :issue:`1508`, PR: :issue:`1546`)
- File: Ensure path comparison is done between bytestrings only. Fixes crash
where a :confval:`file/media_dirs` path contained non-ASCII characters.
(Fixes: :issue:`1345`, PR: :issue:`1493`)
- Stream: Fix milliseconds vs seconds mistake in timeout handling.
(Fixes: :issue:`1521`, PR: :issue:`1522`)
- Docs: Fix the rendering of :class:`mopidy.core.Core` and
:class:`mopidy.audio.Audio` docs. This should also contribute towards making
the Mopidy Debian package build bit-by-bit reproducible. (Fixes:
:issue:`1500`)
v2.0.0 (2016-02-15)
===================
Mopidy 2.0 is here!
Since the release of 1.1, we've closed or merged approximately 80 issues and
pull requests through about 350 commits by 14 extraordinary people, including
10 newcomers. That's about the same amount of issues and commits as between 1.0
and 1.1. The number of contributors is a bit lower but we didn't have a real
life sprint during this development cycle. Thanks to :ref:`everyone <authors>`
who has :ref:`contributed <contributing>`!
With the release of Mopidy 1.0 we promised that any extension working with
Mopidy 1.0 should continue working with all Mopidy 1.x releases. Mopidy 2.0 is
quite a friendly major release and will only break a single extension that we
know of: Mopidy-Spotify. To ensure that everything continues working, please
upgrade to Mopidy 2.0 and Mopidy-Spotify 3.0 at the same time.
No deprecated functionality has been removed in Mopidy 2.0.
The major features of Mopidy 2.0 are:
- Gapless playback has been mostly implemented. It works as long as you don't
change tracks in the middle of a track or use previous and next. In a future
release, previous and next will also become gapless. It is now quite easy to
have Mopidy streaming audio over the network using Icecast. See the updated
:ref:`streaming` docs for details of how to set it up and workarounds for the
remaining issues.
- Mopidy has upgraded from GStreamer 0.10 to 1.x. This has been in our backlog
for more than three years. With this upgrade we're ridding ourselves of
years of GStreamer bugs that have been fixed in newer releases, we can get
into Debian testing again, and we've removed the last major roadblock for
running Mopidy on Python 3.
Dependencies
------------
- Mopidy now requires GStreamer >= 1.2.3, as we've finally ported from
GStreamer 0.10. Since we're requiring a new major version of our major
dependency, we're upping the major version of Mopidy too. (Fixes:
:issue:`225`)
Core API
--------
- Start ``tlid`` counting at 1 instead of 0 to keep in sync with MPD's
``songid``.
- :meth:`~mopidy.core.PlaybackController.get_time_position` now returns the
seek target while a seek is in progress. This gives better results than just
failing the position query. (Fixes: :issue:`312` PR: :issue:`1346`)
- Add :meth:`mopidy.core.PlaylistsController.get_uri_schemes`. (PR:
:issue:`1362`)
- The ``track_playback_ended`` event now includes the correct ``tl_track``
reference when changing to the next track in consume mode. (Fixes:
:issue:`1402` PR: :issue:`1403` PR: :issue:`1406`)
Models
------
- **Deprecated:** :attr:`mopidy.models.Album.images` is deprecated. Use
:meth:`mopidy.core.LibraryController.get_images` instead. (Fixes:
:issue:`1325`)
Extension support
-----------------
- Log exception and continue if an extension crashes during setup. Previously,
we let Mopidy crash if an extension's setup crashed. (PR: :issue:`1337`)
Local backend
-------------
- Made :confval:`local/data_dir` really deprecated. This change breaks older
versions of Mopidy-Local-SQLite and Mopidy-Local-Images.
M3U backend
-----------
- Add :confval:`m3u/base_dir` for resolving relative paths in M3U
files. (Fixes: :issue:`1428`, PR: :issue:`1442`)
- Derive track name from file name for non-extended M3U
playlists. (Fixes: :issue:`1364`, PR: :issue:`1369`)
- Major refactoring of the M3U playlist extension. (Fixes:
:issue:`1370` PR: :issue:`1386`)
- Add :confval:`m3u/default_encoding` and :confval:`m3u/default_extension`
config values for improved text encoding support.
- No longer scan playlist directory and parse playlists at startup or refresh.
Similarly to the file extension, this now happens on request.
- Use :class:`mopidy.models.Ref` instances when reading and writing
playlists. Therefore, ``Track.length`` is no longer stored in
extended M3U playlists and ``#EXTINF`` runtime is always set to
-1.
- Improve reliability of playlist updates using the core playlist API by
applying the write-replace pattern for file updates.
Stream backend
--------------
- Make sure both lookup and playback correctly handle playlists and our
blacklist support. (Fixes: :issue:`1445`, PR: :issue:`1447`)
MPD frontend
------------
- Implemented commands for modifying stored playlists:
- ``playlistadd``
- ``playlistclear``
- ``playlistdelete``
- ``playlistmove``
- ``rename``
- ``rm``
- ``save``
(Fixes: :issue:`1014`, PR: :issue:`1187`, :issue:`1308`, :issue:`1322`)
- Start ``songid`` counting at 1 instead of 0 to match the original MPD server.
- Idle events are now emitted on ``seeked`` events. This fix means that
clients relying on ``idle`` events now get notified about seeks.
(Fixes: :issue:`1331`, PR: :issue:`1347`)
- Idle events are now emitted on ``playlists_loaded`` events. This fix means
that clients relying on ``idle`` events now get notified about playlist loads.
(Fixes: :issue:`1331`, PR: :issue:`1347`)
- Event handler for ``playlist_deleted`` has been unbroken. This unreported bug
would cause the MPD frontend to crash preventing any further communication
via the MPD protocol. (PR: :issue:`1347`)
Zeroconf
--------
- Require ``stype`` argument to :class:`mopidy.zeroconf.Zeroconf`.
- Use Avahi's interface selection by default. (Fixes: :issue:`1283`)
- Use Avahi server's hostname instead of ``socket.getfqdn()`` in service
display name.
Cleanups
--------
- Removed warning if :file:`~/.mopidy` exists. We stopped using this location
in 0.6, released in October 2011.
- Removed warning if :file:`~/.config/mopidy/settings.py` exists. We stopped
using this settings file in 0.14, released in April 2013.
- The ``on_event`` handler in our listener helper now catches exceptions. This
means that any errors in event handling won't crash the actor in question.
- Catch errors when loading :confval:`logging/config_file`.
(Fixes: :issue:`1320`)
- **Breaking:** Removed unused internal
:class:`mopidy.internal.process.BaseThread`. This breaks Mopidy-Spotify
1.4.0. Versions < 1.4.0 was already broken by Mopidy 1.1, while versions >=
2.0 doesn't use this class.
Audio
-----
- **Breaking:** The audio scanner now returns ISO-8601 formatted strings
instead of :class:`~datetime.datetime` objects for dates found in tags.
Because of this change, we can now return years without months or days, which
matches the semantics of the date fields in our data models.
- **Breaking:** :meth:`mopidy.audio.Audio.set_appsrc`'s ``caps`` argument has
changed format due to the upgrade from GStreamer 0.10 to GStreamer 1. As
far as we know, this is only used by Mopidy-Spotify. As an example, with
GStreamer 0.10 the Mopidy-Spotify caps was::
audio/x-raw-int, endianness=(int)1234, channels=(int)2, width=(int)16,
depth=(int)16, signed=(boolean)true, rate=(int)44100
With GStreamer 1 this changes to::
audio/x-raw,format=S16LE,rate=44100,channels=2,layout=interleaved
If your Mopidy backend uses ``set_appsrc()``, please refer to GStreamer
documentation for details on the new caps string format.
- **Breaking:** :func:`mopidy.audio.utils.create_buffer`'s ``capabilities``
argument is no longer in use and has been removed. As far as we know, this
was only used by Mopidy-Spotify.
- Duplicate seek events getting to ``appsrc`` based backends is now fixed. This
should prevent seeking in Mopidy-Spotify from glitching. (Fixes:
:issue:`1404`)
- Workaround crash caused by a race that does not seem to affect functionality.
This should be fixed properly together with :issue:`1222`. (Fixes:
:issue:`1430`, PR: :issue:`1438`)
- Add a new config option, :confval:`audio/buffer_time`, for setting the buffer
time of the GStreamer queue. If you experience buffering before track
changes, it may help to increase this. (Workaround for :issue:`1409`)
- ``tags_changed`` events are only emitted for fields that have changed.
Previous behavior was to emit this for all fields received from GStreamer.
(PR: :issue:`1439`)
Gapless
-------
- Add partial support for gapless playback. Gapless now works as long as you
don't change tracks or use next/previous. (PR: :issue:`1288`)
The :ref:`streaming` docs has been updated with the workarounds still needed
to properly stream Mopidy audio through Icecast.
- Core playback has been refactored to better handle gapless, and async state
changes.
- Tests have been updated to always use a core actor so async state changes
don't trip us up.
- Seek events are now triggered when the seek completes. Previously the event
was emitted when the seek was requested, not when it completed. Further
changes have been made to make seek work correctly for gapless related corner
cases. (Fixes: :issue:`1305` PR: :issue:`1346`)
v1.1.2 (2016-01-18)
===================
Bug fix release.
- Main: Catch errors when loading the :confval:`logging/config_file` file.
(Fixes: :issue:`1320`)
- Core: If changing to another track while the player is paused, the new track
would not be added to the history or marked as currently playing. (Fixes:
:issue:`1352`, PR: :issue:`1356`)
- Core: Skips over unplayable tracks if the user attempts to change tracks
while paused, like we already did if in playing state. (Fixes :issue:`1378`,
PR: :issue:`1379`)
- Core: Make :meth:`~mopidy.core.LibraryController.lookup` ignore tracks with
empty URIs. (Partly fixes: :issue:`1340`, PR: :issue:`1381`)
- Core: Fix crash if backends emits events with wrong names or arguments.
(Fixes: :issue:`1383`)
- Stream: If an URI is considered playable, don't consider it as a candidate
for playlist parsing. Just looking at MIME type prefixes isn't enough, as for
example Ogg Vorbis has the MIME type ``application/ogg``. (Fixes:
:issue:`1299`)
- Local: If the scan or clear commands are used on a library that does not
exist, exit with an error. (Fixes: :issue:`1298`)
- MPD: Notify idling clients when a seek is performed. (Fixes: :issue:`1331`)
- MPD: Don't return tracks with empty URIs. (Partly fixes: :issue:`1340`, PR:
:issue:`1343`)
- MPD: Add ``volume`` command that was reintroduced, though still as a
deprecated command, in MPD 0.18 and is in use by some clients like mpc.
(Fixes: :issue:`1393`, PR: :issue:`1397`)
- Proxy: Handle case where :confval:`proxy/port` is either missing from config
or set to an empty string. (PR: :issue:`1371`)
v1.1.1 (2015-09-14)
===================
Bug fix release.
- Dependencies: Specify that we need Requests >= 2.0, not just any version.
This ensures that we fail earlier if Mopidy is used with a too old Requests.
- Core: Make :meth:`mopidy.core.LibraryController.refresh` work for all
backends with a library provider. Previously, it wrongly worked for all
backends with a playlists provider. (Fixes: :issue:`1257`)
- Core: Respect :confval:`core/cache_dir` and :confval:`core/data_dir` config
values added in 1.1.0 when creating the dirs Mopidy need to store data. This
should not change the behavior for desktop users running Mopidy. When running
Mopidy as a system service installed from a package which sets the core dir
configs properly (e.g. Debian and Arch packages), this fix avoids the
creation of a couple of directories that should not be used, typically
:file:`/var/lib/mopidy/.local` and :file:`/var/lib/mopidy/.cache`. (Fixes:
:issue:`1259`, PR: :issue:`1266`)
- Core: Fix error in :meth:`~mopidy.core.TracklistController.get_eot_tlid`
docstring. (Fixes: :issue:`1269`)
- Audio: Add ``timeout`` parameter to :meth:`~mopidy.audio.scan.Scanner.scan`.
(Part of: :issue:`1250`, PR: :issue:`1281`)
- Extension support: Make :meth:`~mopidy.ext.Extension.get_cache_dir`,
:meth:`~mopidy.ext.Extension.get_config_dir`, and
:meth:`~mopidy.ext.Extension.get_data_dir` class methods, so they can be used
without creating an instance of the :class:`~mopidy.ext.Extension` class.
(Fixes: :issue:`1275`)
- Local: Deprecate :confval:`local/data_dir` and respect
:confval:`core/data_dir` instead. This does not change the defaults for
desktop users, only system services installed from packages that properly set
:confval:`core/data_dir`, like the Debian and Arch packages. (Fixes:
:issue:`1259`, PR: :issue:`1266`)
- Local: Change default value of :confval:`local/scan_flush_threshold` from
1000 to 100 to shorten the time Mopidy-Local-SQLite blocks incoming requests
while scanning the local library.
- M3U: Changed default for the :confval:`m3u/playlists_dir` from
``$XDG_DATA_DIR/mopidy/m3u`` to unset, which now means the extension's data
dir. This does not change the defaults for desktop users, only system
services installed from packages that properly set :confval:`core/data_dir`,
like the Debian and Arch pakages. (Fixes: :issue:`1259`, PR: :issue:`1266`)
- Stream: Expand nested playlists to find the stream URI. This used to work,
but regressed in 1.1.0 with the extraction of stream playlist parsing from
GStreamer to being handled by the Mopidy-Stream backend. (Fixes:
:issue:`1250`, PR: :issue:`1281`)
- Stream: If "file" is present in the :confval:`stream/protocols` config value
and the :ref:`ext-file` extension is enabled, we exited with an error because
two extensions claimed the same URI scheme. We now log a warning recommending
to remove "file" from the :confval:`stream/protocols` config, and then
proceed startup. (Fixes: :issue:`1248`, PR: :issue:`1254`)
- Stream: Fix bug in new playlist parser. A non-ASCII char in an urilist
comment would cause a crash while parsing due to comparison of a non-ASCII
bytestring with a Unicode string. (Fixes: :issue:`1265`)
- File: Adjust log levels when failing to expand ``$XDG_MUSIC_DIR`` into a real
path. This usually happens when running Mopidy as a system service, and thus
with a limited set of environment variables. (Fixes: :issue:`1249`, PR:
:issue:`1255`)
- File: When browsing files, we no longer scan the files to check if they're
playable. This makes browsing of the file hierarchy instant for HTTP clients,
which do no scanning of the files' metadata, and a bit faster for MPD
clients, which no longer scan the files twice. (Fixes: :issue:`1260`, PR:
:issue:`1261`)
- File: Allow looking up metadata about any ``file://`` URI, just like we did
in Mopidy 1.0.x, where Mopidy-Stream handled ``file://`` URIs. In Mopidy
1.1.0, Mopidy-File did not allow one to lookup files outside the directories
listed in :confval:`file/media_dir`. This broke Mopidy-Local-SQLite when the
:confval:`local/media_dir` directory was not within one of the
:confval:`file/media_dirs` directories. For browsing of files, we still limit
access to files inside the :confval:`file/media_dir` directories. For lookup,
you can now read metadata for any file you know the path of. (Fixes:
:issue:`1268`, PR: :issue:`1273`)
- Audio: Fix timeout handling in scanner. This regression caused timeouts to
expire before it should, causing scans to fail.
- Audio: Update scanner to emit MIME type instead of an error when missing a
plugin.
v1.1.0 (2015-08-09)
===================
Mopidy 1.1 is here!
Since the release of 1.0, we've closed or merged approximately 65 issues and
pull requests through about 400 commits by a record high 20 extraordinary
people, including 14 newcomers. That's less issues and commits than in the 1.0
release, but even more contributors, and a doubling of the number of newcomers.
Thanks to :ref:`everyone <authors>` who has :ref:`contributed <contributing>`,
especially those that joined the sprint at EuroPython 2015 in Bilbao, Spain a
couple of weeks ago!
As we promised with the release of Mopidy 1.0, any extension working with
Mopidy 1.0 should continue working with all Mopidy 1.x releases. However, this
release brings a lot stronger enforcement of our documented APIs. If an
extension doesn't use the APIs properly, it may no longer work. The advantage
of this change is that Mopidy is now more robust against errors in extensions,
and also provides vastly better error messages when extensions misbehave. This
should make it easier to create quality extensions.
The major features of Mopidy 1.1 are:
- Validation of the arguments to all core API methods, as well as all responses
from backends and all data model attributes.
- New bundled backend, Mopidy-File. It is similar to Mopidy-Local, but allows
you to browse and play music from local disk without running a scan to index
the music first. The drawback is that it doesn't support searching.
- The Mopidy-MPD server should now be up to date with the 0.19 version of the
MPD protocol.
Dependencies
------------
- Mopidy now requires Requests.
- Heads up: Porting from GStreamer 0.10 to 1.x and support for running Mopidy
with Python 3.4+ is not far off on our roadmap.
Core API
--------
- **Deprecated:** Calling the following methods with ``kwargs`` is being
deprecated. (PR: :issue:`1090`)
- :meth:`mopidy.core.LibraryController.search`
- :meth:`mopidy.core.PlaylistsController.filter`
- :meth:`mopidy.core.TracklistController.filter`
- :meth:`mopidy.core.TracklistController.remove`
- Updated core controllers to handle backend exceptions in all calls that rely
on multiple backends. (Issue: :issue:`667`)
- Update core methods to do strict input checking. (Fixes: :issue:`700`)
- Add ``tlid`` alternatives to methods that take ``tl_track`` and also add
``get_{eot,next,previous}_tlid`` methods as light weight alternatives to the
``tl_track`` versions of the calls. (Fixes: :issue:`1131`, PR: :issue:`1136`,
:issue:`1140`)
- Add :meth:`mopidy.core.PlaybackController.get_current_tlid`.
(Part of: :issue:`1137`)
- Update core to handle backend crashes and bad data. (Fixes: :issue:`1161`)
- Add :confval:`core/max_tracklist_length` config and limitation. (Fixes:
:issue:`997` PR: :issue:`1225`)
- Added ``playlist_deleted`` event. (Fixes: :issue:`996`)
Models
------
- Added type checks and other sanity checks to model construction and
serialization. (Fixes: :issue:`865`)
- Memory usage for models has been greatly improved. We now have a lower
overhead per instance by using slots, interned identifiers and automatically
reuse instances. For the test data set this was developed against, a library
of ~14.000 tracks, went from needing ~75MB to ~17MB. (Fixes: :issue:`348`)
- Added :attr:`mopidy.models.Artist.sortname` field that is mapped to
``musicbrainz-sortname`` tag. (Fixes: :issue:`940`)
Configuration
-------------
- Add new configurations to set base directories to be used by Mopidy and
Mopidy extensions: :confval:`core/cache_dir`, :confval:`core/config_dir`, and
:confval:`core/data_dir`. (Fixes: :issue:`843`, PR: :issue:`1232`)
Extension support
-----------------
- Add new methods to :class:`~mopidy.ext.Extension` class for getting cache,
config and data directories specific to your extension:
- :meth:`mopidy.ext.Extension.get_cache_dir`
- :meth:`mopidy.ext.Extension.get_config_dir`
- :meth:`mopidy.ext.Extension.get_data_dir`
Extensions should use these methods so that the correct directories are used
both when Mopidy is run by a regular user and when run as a system service.
(Fixes: :issue:`843`, PR: :issue:`1232`)
- Add :func:`mopidy.httpclient.format_proxy` and
:func:`mopidy.httpclient.format_user_agent`. (Part of: :issue:`1156`)
- It is now possible to import :mod:`mopidy.backends` without having GObject or
GStreamer installed. In other words, a lot of backend extensions should now
be able to run tests in a virtualenv with global site-packages disabled. This
removes a lot of potential error sources. (Fixes: :issue:`1068`, PR:
:issue:`1115`)
Local backend
-------------
- Filter out :class:`None` from
:meth:`~mopidy.backend.LibraryProvider.get_distinct` results. All returned
results should be strings. (Fixes: :issue:`1202`)
Stream backend
--------------
- Move stream playlist parsing from GStreamer to the stream backend. (Fixes:
:issue:`671`)
File backend
------------
The :ref:`Mopidy-File <ext-file>` backend is a new bundled backend. It is
similar to Mopidy-Local since it works with local files, but it differs in a
few key ways:
- Mopidy-File lets you browse your media files by their file hierarchy.
- It supports multiple media directories, all exposed under the "Files"
directory when you browse your library with e.g. an MPD client.
- There is no index of the media files, like the JSON or SQLite files used by
Mopidy-Local. Thus no need to scan the music collection before starting
Mopidy. Everything is read from the file system when needed and changes to
the file system is thus immediately visible in Mopidy clients.
- Because there is no index, there is no support for search.
Our long term plan is to keep this very simple file backend in Mopidy, as it
has a well defined and limited scope, while splitting the more feature rich
Mopidy-Local extension out to an independent project. (Fixes: :issue:`1004`,
PR: :issue:`1207`)
M3U backend
-----------
- Support loading UTF-8 encoded M3U files with the ``.m3u8`` file extension.
(PR: :issue:`1193`)
MPD frontend
------------
- The MPD command ``count`` now ignores tracks with no length, which would
previously cause a :exc:`TypeError`. (PR: :issue:`1192`)
- Concatenate multiple artists, composers and performers using the "A;B" format
instead of "A, B". This is a part of updating our protocol implementation to
match MPD 0.19. (PR: :issue:`1213`)
- Add "not implemented" skeletons of new commands in the MPD protocol version
0.19:
- Current playlist:
- ``rangeid``
- ``addtagid``
- ``cleartagid``
- Mounts and neighbors:
- ``mount``
- ``unmount``
- ``listmounts``
- ``listneighbors``
- Music DB:
- ``listfiles``
- Track data now include the ``Last-Modified`` field if set on the track model.
(Fixes: :issue:`1218`, PR: :issue:`1219`)
- Implement ``tagtypes`` MPD command. (PR: :issue:`1235`)
- Exclude empty tags fields from metadata output. (Fixes: :issue:`1045`, PR:
:issue:`1235`)
- Implement protocol extensions to output Album URIs and Album Images when
outputting track data to clients. (PR: :issue:`1230`)
- The MPD commands ``lsinfo`` and ``listplaylists`` are now implemented using
the :meth:`~mopidy.core.PlaylistsController.as_list` method, which retrieves
a lot less data and is thus much faster than the deprecated
:meth:`~mopidy.core.PlaylistsController.get_playlists`. The drawback is that
the ``Last-Modified`` timestamp is not available through this method, and the
timestamps in the MPD command responses are now always set to the current
time.
Internal changes
----------------
- Tests have been cleaned up to stop using deprecated APIs where feasible.
(Partial fix: :issue:`1083`, PR: :issue:`1090`)
v1.0.8 (2015-07-22)
===================
Bug fix release.
- Fix reversal of ``Title`` and ``Name`` in MPD protocol (Fixes: :issue:`1212`
PR: :issue:`1214`)
- Fix crash if an M3U file in the :confval:`m3u/playlist_dir` directory has a
file name not decodable with the current file system encoding. (Fixes:
:issue:`1209`)
v1.0.7 (2015-06-26)
===================
Bug fix release.
- Fix error in the MPD command ``list title ...``. The error was introduced in
v1.0.6.
v1.0.6 (2015-06-25)
===================
Bug fix release.
- Core/MPD/Local: Add support for ``title`` in
:meth:`mopidy.core.LibraryController.get_distinct`. (Fixes: :issue:`1181`,
PR: :issue:`1183`)
- Core: Make sure track changes make it to audio while paused.
(Fixes: :issue:`1177`, PR: :issue:`1185`)
v1.0.5 (2015-05-19)
===================
Bug fix release.
- Core: Add workaround for playlist providers that do not support
creating playlists. (Fixes: :issue:`1162`, PR :issue:`1165`)
- M3U: Fix encoding error when saving playlists with non-ASCII track
titles. (Fixes: :issue:`1175`, PR :issue:`1176`)
v1.0.4 (2015-04-30)
===================
Bug fix release.
- Audio: Since all previous attempts at tweaking the queuing for :issue:`1097`
seems to break things in subtle ways for different users. We are giving up
on tweaking the defaults and just going to live with a bit more lag on
software volume changes. (Fixes: :issue:`1147`)
v1.0.3 (2015-04-28)
===================
Bug fix release.
- HTTP: Another follow-up to the Tornado <3.0 fixing. Since the tests aren't
run for Tornado 2.3 we didn't catch that our previous fix wasn't sufficient.
(Fixes: :issue:`1153`, PR: :issue:`1154`)
- Audio: Follow-up fix for :issue:`1097` still exhibits issues for certain
setups. We are giving this get an other go by setting the buffer size to
maximum 100ms instead of a fixed number of buffers. (Addresses: :issue:`1147`,
PR: :issue:`1154`)
v1.0.2 (2015-04-27)
===================
Bug fix release.
- HTTP: Make event broadcasts work with Tornado 2.3 again. The threading fix
in v1.0.1 broke this.
- Audio: Fix for :issue:`1097` tuned down the buffer size in the queue. Turns
out this can cause distortions in certain cases. Give this an other go with
a more generous buffer size. (Addresses: :issue:`1147`, PR: :issue:`1152`)
- Audio: Make sure mute events get emitted by software mixer.
(Fixes: :issue:`1146`, PR: :issue:`1152`)
v1.0.1 (2015-04-23)
===================
Bug fix release.
- Core: Make the new history controller available for use. (Fixes: :js:`6`)
- Audio: Software volume control has been reworked to greatly reduce the delay
between changing the volume and the change taking effect. (Fixes:
:issue:`1097`, PR: :issue:`1101`)
- Audio: As a side effect of the previous bug fix, software volume is no longer
tied to the PulseAudio application volume when using ``pulsesink``. This
behavior was confusing for many users and doesn't work well with the plans
for multiple outputs.
- Audio: Update scanner to decode all media it finds. This should fix cases
where the scanner hangs on non-audio files like video. The scanner will now
also let us know if we found any decodeable audio. (Fixes: :issue:`726`, PR:
issue:`1124`)
- HTTP: Fix threading bug that would cause duplicate delivery of WS messages.
(PR: :issue:`1127`)
- MPD: Fix case where a playlist that is present in both browse and as a listed
playlist breaks the MPD frontend protocol output. (Fixes :issue:`1120`, PR:
:issue:`1142`)
v1.0.0 (2015-03-25)
===================
Three months after our fifth anniversary, Mopidy 1.0 is finally here!
Since the release of 0.19, we've closed or merged approximately 140 issues and
pull requests through more than 600 commits by a record high 19 extraordinary
people, including seven newcomers. Thanks to :ref:`everyone <authors>` who has
:ref:`contributed <contributing>`!
For the longest time, the focus of Mopidy 1.0 was to be another incremental
improvement, to be numbered 0.20. The result is still very much an incremental
improvement, with lots of small and larger improvements across Mopidy's
functionality.
The major features of Mopidy 1.0 are:
- :ref:`Semantic Versioning <versioning>`. We promise to not break APIs before
Mopidy 2.0. A Mopidy extension working with Mopidy 1.0 should continue to
work with all Mopidy 1.x releases.
- Preparation work to ease migration to a cleaned up and leaner core API in
Mopidy 2.0, and to give us some of the benefits of the cleaned up core API
right away.
- Preparation work to enable gapless playback in an upcoming 1.x release.
Dependencies
------------
Since the previous release there are no changes to Mopidy's dependencies.
However, porting from GStreamer 0.10 to 1.x and support for running Mopidy with
Python 3.4+ is not far off on our roadmap.
Core API
--------
In the API used by all frontends and web extensions there is lots of methods
and arguments that are now deprecated in preparation for the next major
release. With the exception of some internals that leaked out in the playback
controller, no core APIs have been removed in this release. In other words,
most clients should continue to work unchanged when upgrading to Mopidy 1.0.
Though, it is strongly encouraged to review any use of the deprecated parts of
the API as those parts will be removed in Mopidy 2.0.
- **Deprecated:** Deprecate all Python properties in the core API. The
previously undocumented getter and setter methods are now the official API.
This aligns the Python API with the WebSocket/JavaScript API. Python
frontends needs to be updated. WebSocket/JavaScript API users are not
affected. (Fixes: :issue:`952`)
- Add :class:`mopidy.core.HistoryController` which keeps track of what tracks
have been played. (Fixes: :issue:`423`, :issue:`1056`, PR: :issue:`803`,
:issue:`1063`)
- Add :class:`mopidy.core.MixerController` which keeps track of volume and
mute. (Fixes: :issue:`962`)
Core library controller
~~~~~~~~~~~~~~~~~~~~~~~
- **Deprecated:** :meth:`mopidy.core.LibraryController.find_exact`. Use
:meth:`mopidy.core.LibraryController.search` with the ``exact`` keyword
argument set to :class:`True`.
- **Deprecated:** The ``uri`` argument to
:meth:`mopidy.core.LibraryController.lookup`. Use new ``uris`` keyword
argument instead.
- Add ``exact`` keyword argument to
:meth:`mopidy.core.LibraryController.search`.
- Add ``uris`` keyword argument to :meth:`mopidy.core.LibraryController.lookup`
which allows for simpler lookup of multiple URIs. (Fixes: :issue:`1008`, PR:
:issue:`1047`)
- Updated :meth:`mopidy.core.LibraryController.search` and
:meth:`mopidy.core.LibraryController.find_exact` to normalize and warn about
malformed queries from clients. (Fixes: :issue:`1067`, PR: :issue:`1073`)
- Add :meth:`mopidy.core.LibraryController.get_distinct` for getting unique
values for a given field. (Fixes: :issue:`913`, PR: :issue:`1022`)
- Add :meth:`mopidy.core.LibraryController.get_images` for looking up images
for any URI that is known to the backends. (Fixes :issue:`973`, PR:
:issue:`981`, :issue:`992` and :issue:`1013`)
Core playlist controller
~~~~~~~~~~~~~~~~~~~~~~~~
- **Deprecated:** :meth:`mopidy.core.PlaylistsController.get_playlists`. Use
:meth:`~mopidy.core.PlaylistsController.as_list` and
:meth:`~mopidy.core.PlaylistsController.get_items` instead. (Fixes:
:issue:`1057`, PR: :issue:`1075`)
- **Deprecated:** :meth:`mopidy.core.PlaylistsController.filter`. Use
:meth:`~mopidy.core.PlaylistsController.as_list` and filter yourself.
- Add :meth:`mopidy.core.PlaylistsController.as_list`. (Fixes: :issue:`1057`,
PR: :issue:`1075`)
- Add :meth:`mopidy.core.PlaylistsController.get_items`. (Fixes: :issue:`1057`,
PR: :issue:`1075`)
Core tracklist controller
~~~~~~~~~~~~~~~~~~~~~~~~~
- **Removed:** The following methods were documented as internal. They are now
fully private and unavailable outside the core actor. (Fixes: :issue:`1058`,
PR: :issue:`1062`)
- :meth:`mopidy.core.TracklistController.mark_played`
- :meth:`mopidy.core.TracklistController.mark_playing`
- :meth:`mopidy.core.TracklistController.mark_unplayable`
- Add ``uris`` argument to :meth:`mopidy.core.TracklistController.add` which
allows for simpler addition of multiple URIs to the tracklist. (Fixes:
:issue:`1060`, PR: :issue:`1065`)
Core playback controller
~~~~~~~~~~~~~~~~~~~~~~~~
- **Removed:** Remove several internal parts that were leaking into the public
API and was never intended to be used externally. (Fixes: :issue:`1070`, PR:
:issue:`1076`)
- :meth:`mopidy.core.PlaybackController.change_track` is now internal.
- Removed ``on_error_step`` keyword argument from
:meth:`mopidy.core.PlaybackController.play`
- Removed ``clear_current_track`` keyword argument to
:meth:`mopidy.core.PlaybackController.stop`.
- Made the following event triggers internal:
- :meth:`mopidy.core.PlaybackController.on_end_of_track`
- :meth:`mopidy.core.PlaybackController.on_stream_changed`
- :meth:`mopidy.core.PlaybackController.on_tracklist_changed`
- :meth:`mopidy.core.PlaybackController.set_current_tl_track` is now
internal.
- **Deprecated:** The old methods on :class:`mopidy.core.PlaybackController`
for volume and mute management have been deprecated. Use
:class:`mopidy.core.MixerController` instead. (Fixes: :issue:`962`)
- When seeking while paused, we no longer change to playing. (Fixes:
:issue:`939`, PR: :issue:`1018`)
- Changed :meth:`mopidy.core.PlaybackController.play` to take the return value
from :meth:`mopidy.backend.PlaybackProvider.change_track` into account when
determining the success of the :meth:`~mopidy.core.PlaybackController.play`
call. (PR: :issue:`1071`)
- Add :meth:`mopidy.core.Listener.stream_title_changed` and
:meth:`mopidy.core.PlaybackController.get_stream_title` for letting clients
know about the current title in streams. (PR: :issue:`938`, :issue:`1030`)
Backend API
-----------
In the API implemented by all backends there have been way fewer but somewhat
more drastic changes with some methods removed and new ones being required for
certain functionality to continue working. Most backends were already updated to
be compatible with Mopidy 1.0 before the release. New versions of the backends
will be released shortly after Mopidy itself.
Backend library providers
~~~~~~~~~~~~~~~~~~~~~~~~~
- **Removed:** Remove :meth:`mopidy.backend.LibraryProvider.find_exact`.
- Add an ``exact`` keyword argument to
:meth:`mopidy.backend.LibraryProvider.search` to replace the old
:meth:`~mopidy.backend.LibraryProvider.find_exact` method.
Backend playlist providers
~~~~~~~~~~~~~~~~~~~~~~~~~~
- **Removed:** Remove default implementation of
:attr:`mopidy.backend.PlaylistsProvider.playlists`. This is potentially
backwards incompatible. (PR: :issue:`1046`)
- Changed the API for :class:`mopidy.backend.PlaylistsProvider`. Note that this
change is **not** backwards compatible. These changes are important to reduce
the Mopidy startup time. (Fixes: :issue:`1057`, PR: :issue:`1075`)
- Add :meth:`mopidy.backend.PlaylistsProvider.as_list`.
- Add :meth:`mopidy.backend.PlaylistsProvider.get_items`.
- Remove :attr:`mopidy.backend.PlaylistsProvider.playlists` property.
Backend playback providers
~~~~~~~~~~~~~~~~~~~~~~~~~~
- Changed the API for :class:`mopidy.backend.PlaybackProvider`. Note that this
change is **not** backwards compatible for certain backends. These changes
are crucial to adding gapless in one of the upcoming releases.
(Fixes: :issue:`1052`, PR: :issue:`1064`)
- :meth:`mopidy.backend.PlaybackProvider.translate_uri` has been added. It is
strongly recommended that all backends migrate to using this API for
translating "Mopidy URIs" to real ones for playback.
- The semantics and signature of :meth:`mopidy.backend.PlaybackProvider.play`
has changed. The method is now only used to set the playback state to
playing, and no longer takes a track.
Backends must migrate to
:meth:`mopidy.backend.PlaybackProvider.translate_uri` or
:meth:`mopidy.backend.PlaybackProvider.change_track` to continue working.
- :meth:`mopidy.backend.PlaybackProvider.prepare_change` has been added.
Models
------
- Add :class:`mopidy.models.Image` model to be returned by
:meth:`mopidy.core.LibraryController.get_images`. (Part of :issue:`973`)
- Change the semantics of :attr:`mopidy.models.Track.last_modified` to be
milliseconds instead of seconds since Unix epoch, or a simple counter,
depending on the source of the track. This makes it match the semantics of
:attr:`mopidy.models.Playlist.last_modified`. (Fixes: :issue:`678`, PR:
:issue:`1036`)
Commands
--------
- Make the ``mopidy`` command print a friendly error message if the
:mod:`gobject` Python module cannot be imported. (Fixes: :issue:`836`)
- Add support for repeating the :option:`-v <mopidy -v>` argument four times
to set the log level for all loggers to the lowest possible value, including
log records at levels lower than ``DEBUG`` too.
- Add path to the current ``mopidy`` executable to the output of ``mopidy
deps``. This make it easier to see that a user is using pip-installed Mopidy
instead of APT-installed Mopidy without asking for ``which mopidy`` output.
Configuration
-------------
- Add support for the log level value ``all`` to the loglevels configurations.
This can be used to show absolutely all log records, including those at
custom levels below ``DEBUG``.
- Add debug logging of unknown sections. (Fixes: :issue:`694`, PR: :issue:`1002`)
Logging
-------
- Add custom log level ``TRACE`` (numerical level 5), which can be used by
Mopidy and extensions to log at an even more detailed level than ``DEBUG``.
- Add support for per logger color overrides. (Fixes: :issue:`808`, PR:
:issue:`1005`)
Local backend
-------------
- Improve error logging for scanner. (Fixes: :issue:`856`, PR: :issue:`874`)
- Add symlink support with loop protection to file finder. (Fixes:
:issue:`858`, PR: :issue:`874`)
- Add ``--force`` option for ``mopidy local scan`` for forcing a full rescan of
the library. (Fixes: :issue:`910`, PR: :issue:`1010`)
- Stop ignoring ``offset`` and ``limit`` in searches when using the default
JSON backed local library. (Fixes: :issue:`917`, PR: :issue:`949`)
- Removed double triggering of ``playlists_loaded`` event.
(Fixes: :issue:`998`, PR: :issue:`999`)
- Cleanup and refactoring of local playlist code. Preserves playlist names
better and fixes bug in deletion of playlists. (Fixes: :issue:`937`,
PR: :issue:`995` and rebased into :issue:`1000`)
- Sort local playlists by name. (Fixes: :issue:`1026`, PR: :issue:`1028`)
- Moved playlist support out to a new extension, :ref:`ext-m3u`.
- *Deprecated:* The config value :confval:`local/playlists_dir` is no longer in
use and can be removed from your config.
Local library API
~~~~~~~~~~~~~~~~~
- Implementors of :meth:`mopidy.local.Library.lookup` should now return a list
of :class:`~mopidy.models.Track` instead of a single track, just like the
other ``lookup()`` methods in Mopidy. For now, returning a single track will
continue to work. (PR: :issue:`840`)
- Add support for giving local libraries direct access to tags and duration.
(Fixes: :issue:`967`)
- Add :meth:`mopidy.local.Library.get_images` for looking up images
for local URIs. (Fixes: :issue:`1031`, PR: :issue:`1032` and :issue:`1037`)
Stream backend
--------------
- Add support for HTTP proxies when doing initial metadata lookup for a stream.
(Fixes :issue:`390`, PR: :issue:`982`)
- Add basic tests for the stream library provider.
M3U backend
-----------
- Mopidy-M3U is a new bundled backend. It provides the same M3U support as was
previously part of the local backend. See :ref:`m3u-migration` for how to
migrate your local playlists to work with the M3U backend. (Fixes:
:issue:`1054`, PR: :issue:`1066`)
- In playlist names, replace "/", which are illegal in M3U file names,
with "|". (PR: :issue:`1084`)
MPD frontend
------------
- Add support for blacklisting MPD commands. This is used to prevent clients
from using ``listall`` and ``listallinfo`` which recursively lookup the entire
"database". If you insist on using a client that needs these commands change
:confval:`mpd/command_blacklist`.
- Start setting the ``Name`` field with the stream title when listening to
radio streams. (Fixes: :issue:`944`, PR: :issue:`1030`)
- Enable browsing of artist references, in addition to albums and playlists.
(PR: :issue:`884`)
- Switch the ``list`` command over to using the new method
:meth:`mopidy.core.LibraryController.get_distinct` for increased performance.
(Fixes: :issue:`913`)
- In stored playlist names, replace "/", which are illegal, with "|" instead of
a whitespace. Pipes are more similar to forward slash.
- Share a single mapping between names and URIs across all MPD sessions. (Fixes:
:issue:`934`, PR: :issue:`968`)
- Add support for ``toggleoutput`` command. (PR: :issue:`1015`)
- The ``mixrampdb`` and ``mixrampdelay`` commands are now known to Mopidy, but
are not implemented. (PR: :issue:`1015`)
- Fix crash on socket error when using a locale causing the exception's error
message to contain characters not in ASCII. (Fixes: issue:`971`, PR:
:issue:`1044`)
HTTP frontend
-------------
- **Deprecated:** Deprecated the :confval:`http/static_dir` config. Please make
your web clients pip-installable Mopidy extensions to make it easier to
install for end users.
- Prevent a race condition in WebSocket event broadcasting from crashing the
web server. (PR: :issue:`1020`)
Mixers
------
- Add support for disabling volume control in Mopidy entirely by setting the
configuration :confval:`audio/mixer` to ``none``. (Fixes: :issue:`936`, PR:
:issue:`1015`, :issue:`1035`)
Audio
-----
- **Removed:** Support for visualizers and the :confval:`audio/visualizer`
config value. The feature was originally added as a workaround for all the
people asking for ncmpcpp visualizer support, and since we could get it
almost for free thanks to GStreamer. But, this feature did never make sense
for a server such as Mopidy.
- **Deprecated:** Deprecated :meth:`mopidy.audio.Audio.emit_end_of_stream`.
Pass a :class:`None` buffer to :meth:`mopidy.audio.Audio.emit_data` to end
the stream. This should only affect Mopidy-Spotify.
- Add :meth:`mopidy.audio.AudioListener.tags_changed`. Notifies core when new
tags are found.
- Add :meth:`mopidy.audio.Audio.get_current_tags` for looking up the current
tags of the playing media.
- Internal code cleanup within audio subsystem:
- Started splitting audio code into smaller better defined pieces.
- Improved GStreamer related debug logging.
- Provide better error messages for missing plugins.
- Add foundation for trying to re-add multiple output support.
- Add internal helper for converting GStreamer data types to Python.
- Reduce scope of audio scanner to just find tags and duration. Modification
time, URI and minimum length handling are now outside of this class.
- Update scanner to operate with milliseconds for duration.
- Update scanner to use a custom source, typefind and decodebin. This allows
us to detect playlists before we try to decode them.
- Refactored scanner to create a new pipeline per track, this is needed as
reseting decodebin is much slower than tearing it down and making a fresh
one.
- Move and rename helper for converting tags to tracks.
- Ignore albums without a name when converting tags to tracks.
- Support UTF-8 in M3U playlists. (Fixes: :issue:`853`)
- Add workaround for volume not persisting across tracks on OS X.
(Issue: :issue:`886`, PR: :issue:`958`)
- Improved missing plugin error reporting in scanner. (PR: :issue:`1033`)
- Introduced a new return type for the scanner, a named tuple with ``uri``,
``tags``, ``duration``, ``seekable`` and ``mime``. (PR: :issue:`1033`)
- Added support for checking if the media is seekable, and getting the initial
MIME type guess. (PR: :issue:`1033`)
Mopidy.js client library
------------------------
This version has been released to npm as Mopidy.js v0.5.0.
- Reexport When.js library as ``Mopidy.when``, to make it easily available to
users of Mopidy.js. (Fixes: :js:`1`)
- Default to ``wss://`` as the WebSocket protocol if the page is hosted on
``https://``. This has no effect if the ``webSocketUrl`` setting is
specified. (Pull request: :js:`2`)
- Upgrade dependencies.
Development
-----------
- Add new :ref:`contribution guidelines <contributing>`.
- Add new :ref:`development guide <devenv>`.
- Speed up event emitting.
- Changed test runner from nose to py.test. (PR: :issue:`1024`)
v0.19.5 (2014-12-23)
====================
Today is Mopidy's five year anniversary. We're celebrating with a bugfix
release and are looking forward to the next five years!
- Config: Support UTF-8 in extension's default config. If an extension with
non-ASCII characters in its default config was installed, and Mopidy didn't
already have a config file, Mopidy would crashed when trying to create the
initial config file based on the default config of all available extensions.
(Fixes: :discuss:`428`)
- Extensions: Fix crash when unpacking data from
:exc:`pkg_resources.VersionConflict` created with a single argument. (Fixes:
:issue:`911`)
- Models: Hide empty collections from :func:`repr()` representations.
- Models: Field values are no longer stored on the model instance when the
value matches the default value for the field. This makes two models equal
when they have a field which in one case is implicitly set to the default
value and in the other case explicitly set to the default value, but with
otherwise equal fields. (Fixes: :issue:`837`)
- Models: Changed the default value of :attr:`mopidy.models.Album.num_tracks`,
:attr:`mopidy.models.Track.track_no`, and
:attr:`mopidy.models.Track.last_modified` from ``0`` to :class:`None`.
- Core: When skipping to the next track in consume mode, remove the skipped
track from the tracklist. This is consistent with the original MPD server's
behavior. (Fixes: :issue:`902`)
- Local: Fix scanning of modified files. (PR: :issue:`904`)
- MPD: Re-enable browsing of empty directories. (PR: :issue:`906`)
- MPD: Remove track comments from responses. They are not included by the
original MPD server, and this works around :issue:`881`. (PR: :issue:`882`)
- HTTP: Errors while starting HTTP apps are logged instead of crashing the HTTP
server. (Fixes: :issue:`875`)
v0.19.4 (2014-09-01)
====================
Bug fix release.
- Configuration: :option:`mopidy --config` now supports directories.
- Logging: Fix that some loggers would be disabled if
:confval:`logging/config_file` was set. (Fixes: :issue:`740`)
- Quit process with exit code 1 when stopping because of a backend, frontend,
or mixer initialization error.
- Backend API: Update :meth:`mopidy.backend.LibraryProvider.browse` signature
and docs to match how the core use the backend's browse method. (Fixes:
:issue:`833`)
- Local library API: Add :attr:`mopidy.local.Library.ROOT_DIRECTORY_URI`
constant for use by implementors of :meth:`mopidy.local.Library.browse`.
(Related to: :issue:`833`)
- HTTP frontend: Guard against double close of WebSocket, which causes an
:exc:`AttributeError` on Tornado < 3.2.
- MPD frontend: Make the ``list`` command return albums when sending 3
arguments. This was incorrectly returning artists after the MPD command
changes in 0.19.0. (Fixes: :issue:`817`)
- MPD frontend: Fix a race condition where two threads could try to free the
same data simultaneously. (Fixes: :issue:`781`)
v0.19.3 (2014-08-03)
====================
Bug fix release.
- Audio: Fix negative track length for radio streams. (Fixes: :issue:`662`,
PR: :issue:`796`)
- Audio: Tell GStreamer to not pick Jack sink. (Fixes: :issue:`604`)
- Zeroconf: Fix discovery by adding ``.local`` to the announced hostname. (PR:
:issue:`795`)
- Zeroconf: Fix intermittent DBus/Avahi exception.
- Extensions: Fail early if trying to setup an extension which doesn't
implement the :meth:`mopidy.ext.Extension.setup` method. (Fixes:
:issue:`813`)
v0.19.2 (2014-07-26)
====================
Bug fix release, directly from the Mopidy development sprint at EuroPython 2014
in Berlin.
- Audio: Make :confval:`audio/mixer_volume` work on the software mixer again. This
was broken with the mixer changes in 0.19.0. (Fixes: :issue:`791`)
- HTTP frontend: When using Tornado 4.0, allow WebSocket requests from other
hosts. (Fixes: :issue:`788`)
- MPD frontend: Fix crash when MPD commands are called with the wrong number of
arguments. This was broken with the MPD command changes in 0.19.0. (Fixes:
:issue:`789`)
v0.19.1 (2014-07-23)
====================
Bug fix release.
- Dependencies: Mopidy now requires Tornado >= 2.3, instead of >= 3.1. This
should make Mopidy continue to work on Debian/Raspbian stable, where Tornado
2.3 is the newest version available.
- HTTP frontend: Add missing string interpolation placeholder.
- Development: ``mopidy --version`` and :meth:`mopidy.core.Core.get_version`
now returns the correct version when Mopidy is run from a Git repo other than
Mopidy's own. (Related to :issue:`706`)
v0.19.0 (2014-07-21)
====================
The focus of 0.19 have been on improving the MPD implementation, replacing
GStreamer mixers with our own mixer API, and on making web clients installable
with ``pip``, like any other Mopidy extension.
Since the release of 0.18, we've closed or merged 53 issues and pull requests
through about 445 commits by :ref:`12 people <authors>`, including five new
guys. Thanks to everyone that has contributed!
**Dependencies**
- Mopidy now requires Tornado >= 3.1.
- Mopidy no longer requires CherryPy or ws4py. Previously, these were optional
dependencies required for the HTTP frontend to work.
**Backend API**
- *Breaking change:* Imports of the backend API from
:mod:`mopidy.backends` no longer works. The new API introuced in v0.18 is now
required. Most extensions already use the new API location.
**Commands**
- The ``mopidy-convert-config`` tool for migrating the ``setings.py``
configuration file used by Mopidy up until 0.14 to the new config file format
has been removed after over a year of trusty service. If you still need to
convert your old ``settings.py`` configuration file, do so using and older
release, like Mopidy 0.18, or migrate the configuration to the new format by
hand.
**Configuration**
- Add ``optional=True`` support to :class:`mopidy.config.Boolean`.
**Logging**
- Fix proper decoding of exception messages that depends on the user's locale.
- Colorize logs depending on log level. This can be turned off with the new
:confval:`logging/color` configuration. (Fixes: :issue:`772`)
**Extension support**
- *Breaking change:* Removed the :class:`~mopidy.ext.Extension` methods that
were deprecated in 0.18: :meth:`~mopidy.ext.Extension.get_backend_classes`,
:meth:`~mopidy.ext.Extension.get_frontend_classes`, and
:meth:`~mopidy.ext.Extension.register_gstreamer_elements`. Use
:meth:`mopidy.ext.Extension.setup` instead, as most extensions already do.
**Audio**
- *Breaking change:* Removed support for GStreamer mixers. GStreamer 1.x does
not support volume control, so we changed to use software mixing by default
in v0.17.0. Now, we're removing support for all other GStreamer mixers and
are reintroducing mixers as something extensions can provide independently of
GStreamer. (Fixes: :issue:`665`, PR: :issue:`760`)
- *Breaking change:* Changed the :confval:`audio/mixer` config value to refer
to Mopidy mixer extensions instead of GStreamer mixers. The default value,
``software``, still has the same behavior. All other values will either no
longer work or will at the very least require you to install an additional
extension.
- Changed the :confval:`audio/mixer_volume` config value behavior from
affecting GStreamer mixers to affecting Mopidy mixer extensions instead. The
end result should be the same without any changes to this config value.
- Deprecated the :confval:`audio/mixer_track` config value. This config value
is no longer in use. Mixer extensions that need additional configuration
handle this themselves.
- Use :ref:`proxy-config` when streaming media from the Internet. (Partly
fixing :issue:`390`)
- Fix proper decoding of exception messages that depends on the user's locale.
- Fix recognition of ASX and XSPF playlists with tags in all caps or with
carriage return line endings. (Fixes: :issue:`687`)
- Support simpler ASX playlist variant with ``<ENTRY>`` elements without
children.
- Added ``target_state`` attribute to the audio layer's
:meth:`~mopidy.audio.AudioListener.state_changed` event. Currently, it is
:class:`None` except when we're paused because of buffering. Then the new
field exposes our target state after buffering has completed.
**Mixers**
- Added new :class:`mopidy.mixer.Mixer` API which can be implemented by
extensions.
- Created a bundled extension, :ref:`ext-softwaremixer`, for controlling volume
in software in GStreamer's pipeline. This is Mopidy's default mixer. To use
this mixer, set the :confval:`audio/mixer` config value to ``software``.
- Created an external extension, `Mopidy-ALSAMixer
<https://github.com/mopidy/mopidy-alsamixer/>`_, for controlling volume with
hardware through ALSA. To use this mixer, install the extension, and set the
:confval:`audio/mixer` config value to ``alsamixer``.
**HTTP frontend**
- CherryPy and ws4py have been replaced with Tornado. This will hopefully
reduce CPU usage on OS X (:issue:`445`) and improve error handling in corner
cases, like when returning from suspend (:issue:`718`).
- Added support for packaging web clients as Mopidy extensions and installing
them using pip. See the :ref:`http-server-api` for details. (Fixes:
:issue:`440`)
- Added web page at ``/mopidy/`` which lists all web clients installed as
Mopidy extensions. (Fixes: :issue:`440`)
- Added support for extending the HTTP frontend with additional server side
functionality. See :ref:`http-server-api` for details.
- Exposed the core API using HTTP POST requests with JSON-RPC payloads at
``/mopidy/rpc``. This is the same JSON-RPC interface as is exposed over the
WebSocket at ``/mopidy/ws``, so you can run any core API command.
The HTTP POST interfaces does not give you access to events from Mopidy, like
the WebSocket does. The WebSocket interface is still recommended for web
clients. The HTTP POST interface may be easier to use for simpler programs,
that just needs to query the currently playing track or similar. See
:ref:`http-post-api` for details.
- If Zeroconf is enabled, we now announce the ``_mopidy-http._tcp`` service in
addition to ``_http._tcp``. This is to make it easier to automatically find
Mopidy's HTTP server among other Zeroconf-published HTTP servers on the
local network.
**Mopidy.js client library**
This version has been released to npm as Mopidy.js v0.4.0.
- Update Mopidy.js to use when.js 3. If you maintain a Mopidy client, you
should review the `differences between when.js 2 and 3
<https://github.com/cujojs/when/blob/master/docs/api.md#upgrading-to-30-from-2x>`_
and the `when.js debugging guide
<https://github.com/cujojs/when/blob/master/docs/api.md#debugging-promises>`_.
- All of Mopidy.js' promise rejection values are now of the Error type. This
ensures that all JavaScript VMs will show a useful stack trace if a rejected
promise's value is used to throw an exception. To allow catch clauses to
handle different errors differently, server side errors are of the type
``Mopidy.ServerError``, and connection related errors are of the type
``Mopidy.ConnectionError``.
- Add support for method calls with by-name arguments. The old calling
convention, ``by-position-only``, is still the default, but this will
change in the future. A warning is logged to the console if you don't
explicitly select a calling convention. See the :ref:`mopidy-js` docs for
details.
**MPD frontend**
- Proper command tokenization for MPD requests. This replaces the old regex
based system with an MPD protocol specific tokenizer responsible for breaking
requests into pieces before the handlers have at them.
(Fixes: :issue:`591` and :issue:`592`)
- Updated command handler system. As part of the tokenizer cleanup we've
updated how commands are registered and making it simpler to create new
handlers.
- Simplified a bunch of handlers. All the "browse" type commands now use a
common browse helper under the hood for less repetition. Likewise the query
handling of "search" commands has been somewhat simplified.
- Adds placeholders for missing MPD commands, preparing the way for bumping the
protocol version once they have been added.
- Respond to all pending requests before closing connection. (PR: :issue:`722`)
- Stop incorrectly catching `LookupError` in command handling.
(Fixes: :issue:`741`)
- Browse support for playlists and albums has been added. (PR: :issue:`749`,
:issue:`754`)
- The ``lsinfo`` command now returns browse results before local playlists.
This is helpful as not all clients sort the returned items. (PR:
:issue:`755`)
- Browse now supports different entries with identical names. (PR:
:issue:`762`)
- Search terms that are empty or consists of only whitespace are no longer
included in the search query sent to backends. (PR: :issue:`758`)
**Local backend**
- The JSON local library backend now logs a friendly message telling you about
``mopidy local scan`` if you don't have a local library cache. (Fixes:
:issue:`711`)
- The ``local scan`` command now use multiple threads to walk the file system
and check files' modification time. This speeds up scanning, escpecially
when scanning remote file systems over e.g. NFS.
- the ``local scan`` command now creates necessary folders if they don't
already exist. Previously, this was only done by the Mopidy server, so doing
a ``local scan`` before running the server the first time resulted in a
crash. (Fixes: :issue:`703`)
- Fix proper decoding of exception messages that depends on the user's locale.
**Stream backend**
- Add config value :confval:`stream/metadata_blacklist` to blacklist certain
URIs we should not open to read metadata from before they are opened for
playback. This is typically needed for services that invalidate URIs after a
single use. (Fixes: :issue:`660`)
v0.18.3 (2014-02-16)
====================
Bug fix release.
- Fix documentation build.
v0.18.2 (2014-02-16)
====================
Bug fix release.
- We now log warnings for wrongly configured extensions, and clearly label them
in ``mopidy config``, but does no longer stop Mopidy from starting because of
misconfigured extensions. (Fixes: :issue:`682`)
- Fix a crash in the server side WebSocket handler caused by connection
problems with clients. (Fixes: :issue:`428`, :issue:`571`)
- Fix the ``time_position`` field of the ``track_playback_ended`` event, which
has been always 0 since v0.18.0. This made scrobbles by Mopidy-Scrobbler not
be persisted by Last.fm, because Mopidy reported that you listened to 0
seconds of each track. (Fixes: :issue:`674`)
- Fix the log setup so that it is possible to increase the amount of logging
from a specific logger using the ``loglevels`` config section. (Fixes:
:issue:`684`)
- Serialization of :class:`~mopidy.models.Playlist` models with the
``last_modified`` field set to a :class:`datetime.datetime` instance did not
work. The type of :attr:`mopidy.models.Playlist.last_modified` has been
redefined from a :class:`datetime.datetime` instance to the number of
milliseconds since Unix epoch as an integer. This makes serialization of the
time stamp simpler.
- Minor refactor of the MPD server context so that Mopidy's MPD protocol
implementation can easier be reused. (Fixes: :issue:`646`)
- Network and signal handling has been updated to play nice on Windows systems.
v0.18.1 (2014-01-23)
====================
Bug fix release.
- Disable extension instead of crashing if a dependency has the wrong
version. (Fixes: :issue:`657`)
- Make logging work to both console, debug log file, and any custom logging
setup from :confval:`logging/config_file` at the same time. (Fixes:
:issue:`661`)
v0.18.0 (2014-01-19)
====================
The focus of 0.18 have been on two fronts: the local library and browsing.
First, the local library's old tag cache file used for storing the track
metadata scanned from your music collection has been replaced with a far
simpler implementation using JSON as the storage format. At the same time, the
local library have been made replaceable by extensions, so you can now create
extensions that use your favorite database to store the metadata.
Second, we've finally implemented the long awaited "file system" browsing
feature that you know from MPD. It is supported by both the MPD frontend and
the local and Spotify backends. It is also used by the new Mopidy-Dirble
extension to provide you with a directory of Internet radio stations from all
over the world.
Since the release of 0.17, we've closed or merged 49 issues and pull requests
through about 285 commits by :ref:`11 people <authors>`, including six new
guys. Thanks to everyone that has contributed!
**Core API**
- Add :meth:`mopidy.core.Core.version` for HTTP clients to manage compatibility
between API versions. (Fixes: :issue:`597`)
- Add :class:`mopidy.models.Ref` class for use as a lightweight reference to
other model types, containing just an URI, a name, and an object type. It is
barely used for now, but its use will be extended over time.
- Add :meth:`mopidy.core.LibraryController.browse` method for browsing a
virtual file system of tracks. Backends can implement support for this by
implementing :meth:`mopidy.backend.LibraryProvider.browse`.
- Events emitted on play/stop, pause/resume, next/previous and on end of track
has been cleaned up to work consistently. See the message of
:commit:`1d108752f6` for the full details. (Fixes: :issue:`629`)
**Backend API**
- Move the backend API classes from :mod:`mopidy.backends.base` to
:mod:`mopidy.backend` and remove the ``Base`` prefix from the class names:
- From :class:`mopidy.backends.base.Backend`
to :class:`mopidy.backend.Backend`
- From :class:`mopidy.backends.base.BaseLibraryProvider`
to :class:`mopidy.backend.LibraryProvider`
- From :class:`mopidy.backends.base.BasePlaybackProvider`
to :class:`mopidy.backend.PlaybackProvider`
- From :class:`mopidy.backends.base.BasePlaylistsProvider`
to :class:`mopidy.backend.PlaylistsProvider`
- From :class:`mopidy.backends.listener.BackendListener`
to :class:`mopidy.backend.BackendListener`
Imports from the old locations still works, but are deprecated.
- Add :meth:`mopidy.backend.LibraryProvider.browse`, which can be implemented
by backends that wants to expose directories of tracks in Mopidy's virtual
file system.
**Frontend API**
- The dummy backend used for testing many frontends have moved from
:mod:`mopidy.backends.dummy` to :mod:`mopidy.backend.dummy`.
(PR: :issue:`984`)
**Commands**
- Reduce amount of logging from dependencies when using :option:`mopidy -v`.
(Fixes: :issue:`593`)
- Add support for additional logging verbosity levels with ``mopidy -vv`` and
``mopidy -vvv`` which increases the amount of logging from dependencies.
(Fixes: :issue:`593`)
**Configuration**
- The default for the :option:`mopidy --config` option has been updated to
include ``$XDG_CONFIG_DIRS`` in addition to ``$XDG_CONFIG_DIR``. (Fixes
:issue:`431`)
- Added support for deprecating config values in order to allow for graceful
removal of the no longer used config value :confval:`local/tag_cache_file`.
**Extension support**
- Switched to using a registry model for classes provided by extension. This
allows extensions to be extended by other extensions, as needed by for
example pluggable libraries for the local backend. See
:class:`mopidy.ext.Registry` for details. (Fixes :issue:`601`)
- Added the new method :meth:`mopidy.ext.Extension.setup`. This method
replaces the now deprecated
:meth:`~mopidy.ext.Extension.get_backend_classes`,
:meth:`~mopidy.ext.Extension.get_frontend_classes`, and
:meth:`~mopidy.ext.Extension.register_gstreamer_elements`.
**Audio**
- Added :confval:`audio/mixer_volume` to set the initial volume of mixers.
This is especially useful for setting the software mixer volume to something
else than the default 100%. (Fixes: :issue:`633`)
**Local backend**
.. note::
After upgrading to Mopidy 0.18 you must run ``mopidy local scan`` to
reindex your local music collection. This is due to the change of storage
format.
- Added support for browsing local directories in Mopidy's virtual file system.
- Finished the work on creating pluggable libraries. Users can now
reconfigure Mopidy to use alternate library providers of their choosing for
local files. (Fixes issue :issue:`44`, partially resolves :issue:`397`, and
causes a temporary regression of :issue:`527`.)
- Switched default local library provider from a "tag cache" file that closely
resembled the one used by the original MPD server to a compressed JSON file.
This greatly simplifies our library code and reuses our existing model
serialization code, as used by the HTTP API and web clients.
- Removed our outdated and bug-ridden "tag cache" local library implementation.
- Added the config value :confval:`local/library` to select which library to
use. It defaults to ``json``, which is the only local library bundled with
Mopidy.
- Added the config value :confval:`local/data_dir` to have a common config for
where to store local library data. This is intended to avoid every single
local library provider having to have it's own config value for this.
- Added the config value :confval:`local/scan_flush_threshold` to control how
often to tell local libraries to store changes when scanning local music.
**Streaming backend**
- Add live lookup of URI metadata. (Fixes :issue:`540`)
- Add support for extended M3U playlist, meaning that basic track metadata
stored in playlists will be used by Mopidy.
**HTTP frontend**
- Upgrade Mopidy.js dependencies and add support for using Mopidy.js with
Browserify. This version has been released to npm as Mopidy.js v0.2.0.
(Fixes: :issue:`609`)
**MPD frontend**
- Make the ``lsinfo``, ``listall``, and ``listallinfo`` commands support
browsing of Mopidy's virtual file system. (Fixes: :issue:`145`)
- Empty commands now return a ``ACK [5@0] {} No command given`` error instead
of ``OK``. This is consistent with the original MPD server implementation.
**Internal changes**
- Events from the audio actor, backends, and core actor are now emitted
asyncronously through the GObject event loop. This should resolve the issue
that has blocked the merge of the EOT-vs-EOS fix for a long time.
v0.17.0 (2013-11-23)
====================
The focus of 0.17 has been on introducing subcommands to the ``mopidy``
command, making it possible for extensions to add subcommands of their own, and
to improve the default config file when starting Mopidy the first time. In
addition, we've grown support for Zeroconf publishing of the MPD and HTTP
servers, and gotten a much faster scanner. The scanner now also scans some
additional tags like composers and performers.
Since the release of 0.16, we've closed or merged 22 issues and pull requests
through about 200 commits by :ref:`five people <authors>`, including one new
contributor.
**Commands**
- Switched to subcommands for the ``mopidy`` command , this implies the
following changes: (Fixes: :issue:`437`)
===================== =================
Old command New command
===================== =================
mopidy --show-deps mopidy deps
mopidy --show-config mopidy config
mopidy-scan mopidy local scan
===================== =================
- Added hooks for extensions to create their own custom subcommands and
converted ``mopidy-scan`` as a first user of the new API. (Fixes:
:issue:`436`)
**Configuration**
- When ``mopidy`` is started for the first time we create an empty
:file:`{$XDG_CONFIG_DIR}/mopidy/mopidy.conf` file. We now populate this file
with the default config for all installed extensions so it'll be easier to
set up Mopidy without looking through all the documentation for relevant
config values. (Fixes: :issue:`467`)
**Core API**
- The :class:`~mopidy.models.Track` model has grown fields for ``composers``,
``performers``, ``genre``, and ``comment``.
- The search field ``track`` has been renamed to ``track_name`` to avoid
confusion with ``track_no``. (Fixes: :issue:`535`)
- The signature of the tracklist's
:meth:`~mopidy.core.TracklistController.filter` and
:meth:`~mopidy.core.TracklistController.remove` methods have changed.
Previously, they expected e.g. ``tracklist.filter(tlid=17)``. Now, the value
must always be a list, e.g. ``tracklist.filter(tlid=[17])``. This change
allows you to get or remove multiple tracks with a single call, e.g.
``tracklist.remove(tlid=[1, 2, 7])``. This is especially useful for web
clients, as requests can be batched. This also brings the interface closer to
the library's :meth:`~mopidy.core.LibraryController.find_exact` and
:meth:`~mopidy.core.LibraryController.search` methods.
**Audio**
- Change default volume mixer from ``autoaudiomixer`` to ``software``.
GStreamer 1.x does not support volume control, so we're changing to use
software mixing by default, as that may be the only thing we'll support in
the future when we upgrade to GStreamer 1.x.
**Local backend**
- Library scanning has been switched back from GStreamer's discoverer to our
custom implementation due to various issues with GStreamer 0.10's built in
scanner. This also fixes the scanner slowdown. (Fixes: :issue:`565`)
- When scanning, we no longer default the album artist to be the same as the
track artist. Album artist is now only populated if the scanned file got an
explicit album artist set.
- The scanner will now extract multiple artists from files with multiple artist
tags.
- The scanner will now extract composers and performers, as well as genre,
bitrate, and comments. (Fixes: :issue:`577`)
- Fix scanner so that time of last modification is respected when deciding
which files can be skipped when scanning the music collection for changes.
- The scanner now ignores the capitalization of file extensions in
:confval:`local/excluded_file_extensions`, so you no longer need to list both
``.jpg`` and ``.JPG`` to ignore JPEG files when scanning. (Fixes:
:issue:`525`)
- The scanner now by default ignores ``*.nfo`` and ``*.html`` files too.
**MPD frontend**
- The MPD service is now published as a Zeroconf service if avahi-daemon is
running on the system. Some MPD clients will use this to present Mopidy as an
available server on the local network without needing any configuration. See
the :confval:`mpd/zeroconf` config value to change the service name or
disable the service. (Fixes: :issue:`39`)
- Add support for ``composer``, ``performer``, ``comment``, ``genre``, and
``performer``. These tags can be used with ``list ...``, ``search ...``, and
``find ...`` and their variants, and are supported in the ``any`` tag also
- The ``bitrate`` field in the ``status`` response is now always an integer.
This follows the behavior of the original MPD server. (Fixes: :issue:`577`)
**HTTP frontend**
- The HTTP service is now published as a Zeroconf service if avahi-daemon is
running on the system. Some browsers will present HTTP Zeroconf services on
the local network as "local sites" bookmarks. See the
:confval:`http/zeroconf` config value to change the service name or disable
the service. (Fixes: :issue:`39`)
**DBUS/MPRIS**
- The ``mopidy`` process now registers it's GObject event loop as the default
eventloop for dbus-python. (Fixes: :mpris:`2`)
v0.16.1 (2013-11-02)
====================
This is very small release to get Mopidy's Debian package ready for inclusion
in Debian.
**Commands**
- Fix removal of last dir level in paths to dependencies in
``mopidy --show-deps`` output.
- Add manpages for all commands.
**Local backend**
- Fix search filtering by track number that was added in 0.16.0.
**MPD frontend**
- Add support for ``list "albumartist" ...`` which was missed when ``find`` and
``search`` learned to handle ``albumartist`` in 0.16.0. (Fixes: :issue:`553`)
v0.16.0 (2013-10-27)
====================
The goals for 0.16 were to add support for queuing playlists of e.g. radio
streams directly to Mopidy, without manually extracting the stream URLs from
the playlist first, and to move the Spotify, Last.fm, and MPRIS support out to
independent Mopidy extensions, living outside the main Mopidy repo. In
addition, we've seen some cleanup to the playback vs tracklist part of the core
API, which will require some changes for users of the HTTP/JavaScript APIs, as
well as the addition of audio muting to the core API. To speed up the
:ref:`development of new extensions <extensiondev>`, we've added a cookiecutter
project to get the skeleton of a Mopidy extension up and running in a matter of
minutes. Read below for all the details and for links to issues with even more
details.
Since the release of 0.15, we've closed or merged 31 issues and pull requests
through about 200 commits by :ref:`five people <authors>`, including three new
contributors.
**Dependencies**
Parts of Mopidy have been moved to their own external extensions. If you want
Mopidy to continue to work like it used to, you may have to install one or more
of the following extensions as well:
- The Spotify backend has been moved to
`Mopidy-Spotify <https://github.com/mopidy/mopidy-spotify>`_.
- The Last.fm scrobbler has been moved to
`Mopidy-Scrobbler <https://github.com/mopidy/mopidy-scrobbler>`_.
- The MPRIS frontend has been moved to
`Mopidy-MPRIS <https://github.com/mopidy/mopidy-mpris>`_.
**Core**
- Parts of the functionality in :class:`mopidy.core.PlaybackController` have
been moved to :class:`mopidy.core.TracklistController`:
=================================== ==================================
Old location New location
=================================== ==================================
playback.get_consume() tracklist.get_consume()
playback.set_consume(v) tracklist.set_consume(v)
playback.consume tracklist.consume
playback.get_random() tracklist.get_random()
playback.set_random(v) tracklist.set_random(v)
playback.random tracklist.random
playback.get_repeat() tracklist.get_repeat()
playback.set_repeat(v) tracklist.set_repeat(v)
playback.repeat tracklist.repeat
playback.get_single() tracklist.get_single()
playback.set_single(v) tracklist.set_single(v)
playback.single tracklist.single
playback.get_tracklist_position() tracklist.index(tl_track)
playback.tracklist_position tracklist.index(tl_track)
playback.get_tl_track_at_eot() tracklist.eot_track(tl_track)
playback.tl_track_at_eot tracklist.eot_track(tl_track)
playback.get_tl_track_at_next() tracklist.next_track(tl_track)
playback.tl_track_at_next tracklist.next_track(tl_track)
playback.get_tl_track_at_previous() tracklist.previous_track(tl_track)
playback.tl_track_at_previous tracklist.previous_track(tl_track)
=================================== ==================================
The ``tl_track`` argument to the last four new functions are used as the
reference ``tl_track`` in the tracklist to find e.g. the next track. Usually,
this will be :attr:`~mopidy.core.PlaybackController.current_tl_track`.
- Added :attr:`mopidy.core.PlaybackController.mute` for muting and unmuting
audio. (Fixes: :issue:`186`)
- Added :meth:`mopidy.core.CoreListener.mute_changed` event that is triggered
when the mute state changes.
- In "random" mode, after a full playthrough of the tracklist, playback
continued from the last track played to the end of the playlist in non-random
order. It now stops when all tracks have been played once, unless "repeat"
mode is enabled. (Fixes: :issue:`453`)
- In "single" mode, after a track ended, playback continued with the next track
in the tracklist. It now stops after playing a single track, unless "repeat"
mode is enabled. (Fixes: :issue:`496`)
**Audio**
- Added support for parsing and playback of playlists in GStreamer. For end
users this basically means that you can now add a radio playlist to Mopidy
and we will automatically download it and play the stream inside it.
Currently we support M3U, PLS, XSPF and ASX files. Also note that we can
currently only play the first stream in the playlist.
- We now handle the rare case where an audio track has max volume equal to min.
This was causing divide by zero errors when scaling volumes to a zero to
hundred scale. (Fixes: :issue:`525`)
- Added support for muting audio without setting the volume to 0. This works
both for the software and hardware mixers. (Fixes: :issue:`186`)
**Local backend**
- Replaced our custom media library scanner with GStreamer's builtin scanner.
This should make scanning less error prone and faster as timeouts should be
infrequent. (Fixes: :issue:`198`)
- Media files with less than 100ms duration are now excluded from the library.
- Media files with the file extensions ``.jpeg``, ``.jpg``, ``.png``, ``.txt``,
and ``.log`` are now skipped by the media library scanner. You can change the
list of excluded file extensions by setting the
:confval:`local/excluded_file_extensions` config value. (Fixes: :issue:`516`)
- Unknown URIs found in playlists are now made into track objects with the URI
set instead of being ignored. This makes it possible to have playlists with
e.g. HTTP radio streams and not just ``local:track:...`` URIs. This used to
work, but was broken in Mopidy 0.15.0. (Fixes: :issue:`527`)
- Fixed crash when playing ``local:track:...`` URIs which contained non-ASCII
chars after uridecode.
- Removed media files are now also removed from the in-memory media library
when the media library is reloaded from disk. (Fixes: :issue:`500`)
**MPD frontend**
- Made the formerly unused commands ``outputs``, ``enableoutput``, and
``disableoutput`` mute/unmute audio. (Related to: :issue:`186`)
- The MPD command ``list`` now works with ``"albumartist"`` as its second
argument, e.g. ``list "album" "albumartist" "anartist"``. (Fixes:
:issue:`468`)
- The MPD commands ``find`` and ``search`` now accepts ``albumartist`` and
``track`` (this is the track number, not the track name) as field types to
limit the search result with.
- The MPD command ``count`` is now implemented. It accepts the same type of
arguments as ``find`` and ``search``, but returns the number of tracks and
their total playtime instead.
**Extension support**
- A cookiecutter project for quickly creating new Mopidy extensions have been
created. You can find it at `cookiecutter-mopidy-ext
<https://github.com/mopidy/cookiecutter-mopidy-ext>`_. (Fixes: :issue:`522`)
v0.15.0 (2013-09-19)
====================
A release with a number of small and medium fixes, with no specific focus.
**Dependencies**
- Mopidy no longer supports Python 2.6. Currently, the only Python version
supported by Mopidy is Python 2.7. We're continuously working towards running
Mopidy on Python 3. (Fixes: :issue:`344`)
**Command line options**
- Converted from the optparse to the argparse library for handling command line
options.
- ``mopidy --show-config`` will now take into consideration any
:option:`mopidy --option` arguments appearing later on the command line. This
helps you see the effective configuration for runs with the same
``mopidy --options`` arguments.
**Audio**
- Added support for audio visualization. :confval:`audio/visualizer` can now be
set to GStreamer visualizers.
- Properly encode localized mixer names before logging.
**Local backend**
- An album's number of discs and a track's disc number are now extracted when
scanning your music collection.
- The scanner now gives up scanning a file after a second, and continues with
the next file. This fixes some hangs on non-media files, like logs. (Fixes:
:issue:`476`, :issue:`483`)
- Added support for pluggable library updaters. This allows extension writers
to start providing their own custom libraries instead of being stuck with
just our tag cache as the only option.
- Converted local backend to use new ``local:playlist:path`` and
``local:track:path`` URI scheme. Also moves support of ``file://`` to
streaming backend.
**Spotify backend**
- Prepend playlist folder names to the playlist name, so that the playlist
hierarchy from your Spotify account is available in Mopidy. (Fixes:
:issue:`62`)
- Fix proxy config values that was broken with the config system change in
0.14. (Fixes: :issue:`472`)
**MPD frontend**
- Replace newline, carriage return and forward slash in playlist names. (Fixes:
:issue:`474`, :issue:`480`)
- Accept ``listall`` and ``listallinfo`` commands without the URI parameter.
The methods are still not implemented, but now the commands are accepted as
valid.
**HTTP frontend**
- Fix too broad truth test that caused :class:`mopidy.models.TlTrack`
objects with ``tlid`` set to ``0`` to be sent to the HTTP client without the
``tlid`` field. (Fixes: :issue:`501`)
- Upgrade Mopidy.js dependencies. This version has been released to npm as
Mopidy.js v0.1.1.
**Extension support**
- :class:`mopidy.config.Secret` is now deserialized to unicode instead of
bytes. This may require modifications to extensions.
v0.14.2 (2013-07-01)
====================
This is a maintenance release to make Mopidy 0.14 work with pyspotify 1.11.
**Dependencies**
- pyspotify >= 1.9, < 2 is now required for Spotify support. In other words,
you're free to upgrade to pyspotify 1.11, but it isn't a requirement.
v0.14.1 (2013-04-28)
====================
This release addresses an issue in v0.14.0 where the new
``mopidy-convert-config`` tool and the new :option:`mopidy --option`
command line option was broken because some string operations inadvertently
converted some byte strings to unicode.
v0.14.0 (2013-04-28)
====================
The 0.14 release has a clear focus on two things: the new configuration system
and extension support. Mopidy's documentation has also been greatly extended
and improved.
Since the last release a month ago, we've closed or merged 53 issues and pull
requests. A total of seven :ref:`authors <authors>` have contributed, including
one new.
**Dependencies**
- setuptools or distribute is now required. We've introduced this dependency to
use setuptools' entry points functionality to find installed Mopidy
extensions.
**New configuration system**
- Mopidy has a new configuration system based on ini-style files instead of a
Python file. This makes configuration easier for users, and also makes it
possible for Mopidy extensions to have their own config sections.
As part of this change we have cleaned up the naming of our config values.
To ease migration we've made a tool named ``mopidy-convert-config`` for
automatically converting the old ``settings.py`` to a new ``mopidy.conf``
file. This tool takes care of all the renamed config values as well. See
``mopidy-convert-config`` for details on how to use it.
- A long wanted feature: You can now enable or disable specific frontends or
backends without having to redefine :attr:`~mopidy.settings.FRONTENDS` or
:attr:`~mopidy.settings.BACKENDS` in your config. Those config values are
gone completely.
**Extension support**
- Mopidy now supports extensions. This means that any developer now easily can
create a Mopidy extension to add new control interfaces or music backends.
This helps spread the maintenance burden across more developers, and also
makes it possible to extend Mopidy with new backends the core developers are
unable to create and/or maintain because of geo restrictions, etc. If you're
interested in creating an extension for Mopidy, read up on
:ref:`extensiondev`.
- All of Mopidy's existing frontends and backends are now plugged into Mopidy
as extensions, but they are still distributed together with Mopidy and are
enabled by default.
- The NAD mixer have been moved out of Mopidy core to its own project,
Mopidy-NAD. See :ref:`ext` for more information.
- Janez Troha has made the first two external extensions for Mopidy: a backend
for playing music from Soundcloud, and a backend for playing music from a
Beets music library. See :ref:`ext` for more information.
**Command line options**
- The command option ``mopidy --list-settings`` is now named
``mopidy --show-config``.
- The command option ``mopidy --list-deps`` is now named
``mopidy --show-deps``.
- What configuration files to use can now be specified through the command
option :option:`mopidy --config`, multiple files can be specified using colon
as a separator.
- Configuration values can now be overridden through the command option
:option:`mopidy --option`. For example: ``mopidy --option
spotify/enabled=false``.
- The GStreamer command line options, ``mopidy --gst-*`` and
``mopidy --help-gst`` are no longer supported. To set GStreamer debug
flags, you can use environment variables such as :envvar:`GST_DEBUG`. Refer
to GStreamer's documentation for details.
**Spotify backend**
- Add support for starred playlists, both your own and those owned by other
users. (Fixes: :issue:`326`)
- Fix crash when a new playlist is added by another Spotify client. (Fixes:
:issue:`387`, :issue:`425`)
**MPD frontend**
- Playlists with identical names are now handled properly by the MPD frontend
by suffixing the duplicate names with e.g. ``[2]``. This is needed because
MPD identify playlists by name only, while Mopidy and Spotify supports
multiple playlists with the same name, and identify them using an URI.
(Fixes: :issue:`114`)
**MPRIS frontend**
- The frontend is now disabled if the :envvar:`DISPLAY` environment variable is
unset. This avoids some harmless error messages, that have been known to
confuse new users debugging other problems.
**Development**
- Developers running Mopidy from a Git clone now need to run ``python setup.py
develop`` to register the bundled extensions. If you don't do this, Mopidy
will not find any frontends or backends. Note that we highly recomend you do
this in a virtualenv, not system wide. As a bonus, the command also gives
you a ``mopidy`` executable in your search path.
v0.13.0 (2013-03-31)
====================
The 0.13 release brings small improvements and bugfixes throughout Mopidy.
There are no major new features, just incremental improvement of what we
already have.
**Dependencies**
- Pykka >= 1.1 is now required.
**Core**
- Removed the :attr:`mopidy.settings.DEBUG_THREAD` setting and the
``mopidy --debug-thread`` command line option. Sending SIGUSR1 to
the Mopidy process will now always make it log tracebacks for all alive
threads.
- Log a warning if a track isn't playable to make it more obvious that backend
X needs backend Y to be present for playback to work.
- :meth:`mopidy.core.TracklistController.add` now accepts an ``uri`` which it
will lookup in the library and then add to the tracklist. This is helpful
for e.g. web clients that doesn't want to transfer all track meta data back
to the server just to add it to the tracklist when the server already got all
the needed information easily available. (Fixes: :issue:`325`)
- Change the following methods to accept an ``uris`` keyword argument:
- :meth:`mopidy.core.LibraryController.find_exact`
- :meth:`mopidy.core.LibraryController.search`
Search queries will only be forwarded to backends handling the given URI
roots, and the backends may use the URI roots to further limit what results
are returned. For example, a search with ``uris=['file:']`` will only be
processed by the local backend. A search with
``uris=['file:///media/music']`` will only be processed by the local backend,
and, if such filtering is supported by the backend, will only return results
with URIs within the given URI root.
**Audio sub-system**
- Make audio error logging handle log messages with non-ASCII chars. (Fixes:
:issue:`347`)
**Local backend**
- Make ``mopidy-scan`` work with Ogg Vorbis files. (Fixes: :issue:`275`)
- Fix playback of files with non-ASCII chars in their file path. (Fixes:
:issue:`353`)
**Spotify backend**
- Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`)
- For all playlists owned by other Spotify users, we now append the owner's
username to the playlist name. (Partly fixes: :issue:`114`)
**HTTP frontend**
- Mopidy.js now works both from browsers and from Node.js environments. This
means that you now can make Mopidy clients in Node.js. Mopidy.js has been
published to the `npm registry <https://www.npmjs.com/package/mopidy>`_ for easy
installation in Node.js projects.
- Upgrade Mopidy.js' build system Grunt from 0.3 to 0.4.
- Upgrade Mopidy.js' dependencies when.js from 1.6.1 to 2.0.0.
- Expose :meth:`mopidy.core.Core.get_uri_schemes` to HTTP clients. It is
available through Mopidy.js as ``mopidy.getUriSchemes()``.
**MPRIS frontend**
- Publish album art URIs if available.
- Publish disc number of track if available.
v0.12.0 (2013-03-12)
====================
The 0.12 release has been delayed for a while because of some issues related
some ongoing GStreamer cleanup we didn't invest enough time to finish. Finally,
we've come to our senses and have now cherry-picked the good parts to bring you
a new release, while postponing the GStreamer changes to 0.13. The release adds
a new backend for playing audio streams, as well as various minor improvements
throughout Mopidy.
- Make Mopidy work on early Python 2.6 versions. (Fixes: :issue:`302`)
- ``optparse`` fails if the first argument to ``add_option`` is a unicode
string on Python < 2.6.2rc1.
- ``foo(**data)`` fails if the keys in ``data`` is unicode strings on Python
< 2.6.5rc1.
**Audio sub-system**
- Improve selection of mixer tracks for volume control. (Fixes: :issue:`307`)
**Local backend**
- Make ``mopidy-scan`` support symlinks.
**Stream backend**
We've added a new backend for playing audio streams, the :mod:`stream backend
<mopidy.stream>`. It is activated by default. The stream backend supports the
intersection of what your GStreamer installation supports and what protocols
are included in the :attr:`mopidy.settings.STREAM_PROTOCOLS` setting.
Current limitations:
- No metadata about the current track in the stream is available.
- Playlists are not parsed, so you can't play e.g. a M3U or PLS file which
contains stream URIs. You need to extract the stream URL from the playlist
yourself. See :issue:`303` for progress on this.
**Core API**
- :meth:`mopidy.core.PlaylistsController.get_playlists` now accepts an argument
``include_tracks``. This defaults to :class:`True`, which has the same old
behavior. If set to :class:`False`, the tracks are stripped from the
playlists before they are returned. This can be used to limit the amount of
data returned if the response is to be passed out of the application, e.g. to
a web client. (Fixes: :issue:`297`)
**Models**
- Add :attr:`mopidy.models.Album.images` field for including album art URIs.
(Partly fixes :issue:`263`)
- Add :attr:`mopidy.models.Track.disc_no` field. (Partly fixes: :issue:`286`)
- Add :attr:`mopidy.models.Album.num_discs` field. (Partly fixes: :issue:`286`)
v0.11.1 (2012-12-24)
====================
Spotify search was broken in 0.11.0 for users of Python 2.6. This release fixes
it. If you're using Python 2.7, v0.11.0 and v0.11.1 should be equivalent.
v0.11.0 (2012-12-24)
====================
In celebration of Mopidy's three year anniversary December 23, we're releasing
Mopidy 0.11. This release brings several improvements, most notably better
search which now includes matching artists and albums from Spotify in the
search results.
**Settings**
- The settings validator now complains if a setting which expects a tuple of
values (e.g. :attr:`mopidy.settings.BACKENDS`,
:attr:`mopidy.settings.FRONTENDS`) has a non-iterable value. This typically
happens because the setting value contains a single value and one has
forgotten to add a comma after the string, making the value a tuple. (Fixes:
:issue:`278`)
**Spotify backend**
- Add :attr:`mopidy.settings.SPOTIFY_TIMEOUT` setting which allows you to
control how long we should wait before giving up on Spotify searches, etc.
- Add support for looking up albums, artists, and playlists by URI in addition
to tracks. (Fixes: :issue:`67`)
As an example of how this can be used, you can try the the following MPD
commands which now all adds one or more tracks to your tracklist::
add "spotify:track:1mwt9hzaH7idmC5UCoOUkz"
add "spotify:album:3gpHG5MGwnipnap32lFYvI"
add "spotify:artist:5TgQ66WuWkoQ2xYxaSTnVP"
add "spotify:user:p3.no:playlist:0XX6tamRiqEgh3t6FPFEkw"
- Increase max number of tracks returned by searches from 100 to 200, which
seems to be Spotify's current max limit.
**Local backend**
- Load track dates from tag cache.
- Add support for searching by track date.
**MPD frontend**
- Add :attr:`mopidy.settings.MPD_SERVER_CONNECTION_TIMEOUT` setting which
controls how long an MPD client can stay inactive before the connection is
closed by the server.
- Add support for the ``findadd`` command.
- Updated to match the MPD 0.17 protocol (Fixes: :issue:`228`):
- Add support for ``seekcur`` command.
- Add support for ``config`` command.
- Add support for loading a range of tracks from a playlist to the ``load``
command.
- Add support for ``searchadd`` command.
- Add support for ``searchaddpl`` command.
- Add empty stubs for channel commands for client to client communication.
- Add support for search by date.
- Make ``seek`` and ``seekid`` not restart the current track before seeking in
it.
- Include fake tracks representing albums and artists in the search results.
When these are added to the tracklist, they expand to either all tracks in
the album or all tracks by the artist. This makes it easy to play full albums
in proper order, which is a feature that have been frequently requested.
(Fixes: :issue:`67`, :issue:`148`)
**Internal changes**
*Models:*
- Specified that :attr:`mopidy.models.Playlist.last_modified` should be in UTC.
- Added :class:`mopidy.models.SearchResult` model to encapsulate search results
consisting of more than just tracks.
*Core API:*
- Change the following methods to return :class:`mopidy.models.SearchResult`
objects which can include both track results and other results:
- :meth:`mopidy.core.LibraryController.find_exact`
- :meth:`mopidy.core.LibraryController.search`
- Change the following methods to accept either a dict with filters or kwargs.
Previously they only accepted kwargs, which made them impossible to use from
the Mopidy.js through JSON-RPC, which doesn't support kwargs.
- :meth:`mopidy.core.LibraryController.find_exact`
- :meth:`mopidy.core.LibraryController.search`
- :meth:`mopidy.core.PlaylistsController.filter`
- :meth:`mopidy.core.TracklistController.filter`
- :meth:`mopidy.core.TracklistController.remove`
- Actually trigger the :meth:`mopidy.core.CoreListener.volume_changed` event.
- Include the new volume level in the
:meth:`mopidy.core.CoreListener.volume_changed` event.
- The ``track_playback_{paused,resumed,started,ended}`` events now include a
:class:`mopidy.models.TlTrack` instead of a :class:`mopidy.models.Track`.
*Audio:*
- Mixers with fewer than 100 volume levels could report another volume level
than what you just set due to the conversion between Mopidy's 0-100 range and
the mixer's range. Now Mopidy returns the recently set volume if the mixer
reports a volume level that matches the recently set volume, otherwise the
mixer's volume level is rescaled to the 1-100 range and returned.
v0.10.0 (2012-12-12)
====================
We've added an HTTP frontend for those wanting to build web clients for Mopidy!
**Dependencies**
- pyspotify >= 1.9, < 1.11 is now required for Spotify support. In other words,
you're free to upgrade to pyspotify 1.10, but it isn't a requirement.
**Documentation**
- Added installation instructions for Fedora.
**Spotify backend**
- Save a lot of memory by reusing artist, album, and track models.
- Make sure the playlist loading hack only runs once.
**Local backend**
- Change log level from error to warning on messages emitted when the tag cache
isn't found and a couple of similar cases.
- Make ``mopidy-scan`` ignore invalid dates, e.g. dates in years outside the
range 1-9999.
- Make ``mopidy-scan`` accept ``-q``/``--quiet`` and ``-v``/``--verbose``
options to control the amount of logging output when scanning.
- The scanner can now handle files with other encodings than UTF-8. Rebuild
your tag cache with ``mopidy-scan`` to include tracks that may have been
ignored previously.
**HTTP frontend**
- Added new optional HTTP frontend which exposes Mopidy's core API through
JSON-RPC 2.0 messages over a WebSocket. See :ref:`http-api` for further
details.
- Added a JavaScript library, Mopidy.js, to make it easier to develop web based
Mopidy clients using the new HTTP frontend.
**Bug fixes**
- :issue:`256`: Fix crash caused by non-ASCII characters in paths returned from
``glib``. The bug can be worked around by overriding the settings that
includes offending ``$XDG_`` variables.
v0.9.0 (2012-11-21)
===================
Support for using the local and Spotify backends simultaneously have for a very
long time been our most requested feature. Finally, it's here!
**Dependencies**
- pyspotify >= 1.9, < 1.10 is now required for Spotify support.
**Documentation**
- New :ref:`installation` guides, organized by OS and distribution so that you
can follow one concise list of instructions instead of jumping around the
docs to look for instructions for each dependency.
- Moved :ref:`raspberrypi-installation` howto from the wiki to the docs.
- Updated :ref:`mpd-clients` overview.
- Added :ref:`mpris-clients` and :ref:`upnp-clients` overview.
**Multiple backends support**
- Both the local backend and the Spotify backend are now turned on by default.
The local backend is listed first in the :attr:`mopidy.settings.BACKENDS`
setting, and are thus given the highest priority in e.g. search results,
meaning that we're listing search hits from the local backend first. If you
want to prioritize the backends in another way, simply set ``BACKENDS`` in
your own settings file and reorder the backends.
There are no other setting changes related to the local and Spotify backends.
As always, see :mod:`mopidy.settings` for the full list of available
settings.
**Spotify backend**
- The Spotify backend now includes release year and artist on albums.
- :issue:`233`: The Spotify backend now returns the track if you search for the
Spotify track URI.
- Added support for connecting to the Spotify service through an HTTP or SOCKS
proxy, which is supported by pyspotify >= 1.9.
- Subscriptions to other Spotify user's "starred" playlists are ignored, as
they currently isn't fully supported by pyspotify.
**Local backend**
- :issue:`236`: The ``mopidy-scan`` command failed to include tags from ALAC
files (Apple lossless) because it didn't support multiple tag messages from
GStreamer per track it scanned.
- Added support for search by filename to local backend.
**MPD frontend**
- :issue:`218`: The MPD commands ``listplaylist`` and ``listplaylistinfo`` now
accepts unquoted playlist names if they don't contain spaces.
- :issue:`246`: The MPD command ``list album artist ""`` and similar
``search``, ``find``, and ``list`` commands with empty filter values caused a
:exc:`LookupError`, but should have been ignored by the MPD server.
- The MPD frontend no longer lowercases search queries. This broke e.g. search
by URI, where casing may be essential.
- The MPD command ``plchanges`` always returned the entire playlist. It now
returns an empty response when the client has seen the latest version.
- The MPD commands ``search`` and ``find`` now allows the key ``file``, which
is used by ncmpcpp instead of ``filename``.
- The MPD commands ``search`` and ``find`` now allow search query values to be
empty strings.
- The MPD command ``listplaylists`` will no longer return playlists without a
name. This could crash ncmpcpp.
- The MPD command ``list`` will no longer return artist names, album names, or
dates that are blank.
- The MPD command ``decoders`` will now return an empty response instead of a
"not implemented" error to make the ncmpcpp browse view work the first time
it is opened.
**MPRIS frontend**
- The MPRIS playlists interface is now supported by our MPRIS frontend. This
means that you now can select playlists to queue and play from the Ubuntu
Sound Menu.
**Audio mixers**
- Made the :mod:`NAD mixer <mopidy.audio.mixers.nad>` responsive to interrupts
during amplifier calibration. It will now quit immediately, while previously
it completed the calibration first, and then quit, which could take more than
15 seconds.
**Developer support**
- Added optional background thread for debugging deadlocks. When the feature is
enabled via the ``mopidy --debug-thread`` option or
:attr:`mopidy.settings.DEBUG_THREAD` setting a ``SIGUSR1`` signal will dump
the traceback for all running threads.
- The settings validator will now allow any setting prefixed with ``CUSTOM_``
to exist in the settings file.
**Internal changes**
Internally, Mopidy have seen a lot of changes to pave the way for multiple
backends and the future HTTP frontend.
- A new layer and actor, "core", has been added to our stack, inbetween the
frontends and the backends. The responsibility of the core layer and actor is
to take requests from the frontends, pass them on to one or more backends,
and combining the response from the backends into a single response to the
requesting frontend.
Frontends no longer know anything about the backends. They just use the
:ref:`core-api`.
- The dependency graph between the core controllers and the backend providers
have been straightened out, so that we don't have any circular dependencies.
The frontend, core, backend, and audio layers are now strictly separate. The
frontend layer calls on the core layer, and the core layer calls on the
backend layer. Both the core layer and the backends are allowed to call on
the audio layer. Any data flow in the opposite direction is done by
broadcasting of events to listeners, through e.g.
:class:`mopidy.core.CoreListener` and :class:`mopidy.audio.AudioListener`.
See :ref:`concepts` for more details and illustrations of all the relations.
- All dependencies are now explicitly passed to the constructors of the
frontends, core, and the backends. This makes testing each layer with
dummy/mocked lower layers easier than with the old variant, where
dependencies where looked up in Pykka's actor registry.
- All properties in the core API now got getters, and setters if setting them
is allowed. They are not explictly listed in the docs as they have the same
behavior as the documented properties, but they are available and may be
used. This is useful for the future HTTP frontend.
*Models:*
- Added :attr:`mopidy.models.Album.date` attribute. It has the same format as
the existing :attr:`mopidy.models.Track.date`.
- Added :class:`mopidy.models.ModelJSONEncoder` and
:func:`mopidy.models.model_json_decoder` for automatic JSON serialization and
deserialization of data structures which contains Mopidy models. This is
useful for the future HTTP frontend.
*Library:*
- :meth:`mopidy.core.LibraryController.find_exact` and
:meth:`mopidy.core.LibraryController.search` now returns plain lists of
tracks instead of playlist objects.
- :meth:`mopidy.core.LibraryController.lookup` now returns a list of tracks
instead of a single track. This makes it possible to support lookup of
artist or album URIs which then can expand to a list of tracks.
*Playback:*
- The base playback provider has been updated with sane default behavior
instead of empty functions. By default, the playback provider now lets
GStreamer keep track of the current track's time position. The local backend
simply uses the base playback provider without any changes. Any future
backend that just feeds URIs to GStreamer to play can also use the base
playback provider without any changes.
- Removed :attr:`mopidy.core.PlaybackController.track_at_previous`. Use
:attr:`mopidy.core.PlaybackController.tl_track_at_previous` instead.
- Removed :attr:`mopidy.core.PlaybackController.track_at_next`. Use
:attr:`mopidy.core.PlaybackController.tl_track_at_next` instead.
- Removed :attr:`mopidy.core.PlaybackController.track_at_eot`. Use
:attr:`mopidy.core.PlaybackController.tl_track_at_eot` instead.
- Removed :attr:`mopidy.core.PlaybackController.current_tlid`. Use
:attr:`mopidy.core.PlaybackController.current_tl_track` instead.
*Playlists:*
The playlists part of the core API has been revised to be more focused around
the playlist URI, and some redundant functionality has been removed:
- Renamed "stored playlists" to "playlists" everywhere, including the core API
used by frontends.
- :attr:`mopidy.core.PlaylistsController.playlists` no longer supports
assignment to it. The `playlists` property on the backend layer still does,
and all functionality is maintained by assigning to the playlists collections
at the backend level.
- :meth:`mopidy.core.PlaylistsController.delete` now accepts an URI, and not a
playlist object.
- :meth:`mopidy.core.PlaylistsController.save` now returns the saved playlist.
The returned playlist may differ from the saved playlist, and should thus be
used instead of the playlist passed to
:meth:`mopidy.core.PlaylistsController.save`.
- :meth:`mopidy.core.PlaylistsController.rename` has been removed, since
renaming can be done with :meth:`mopidy.core.PlaylistsController.save`.
- :meth:`mopidy.core.PlaylistsController.get` has been replaced by
:meth:`mopidy.core.PlaylistsController.filter`.
- The event :meth:`mopidy.core.CoreListener.playlist_changed` has been changed
to include the playlist that was changed.
*Tracklist:*
- Renamed "current playlist" to "tracklist" everywhere, including the core API
used by frontends.
- Removed :meth:`mopidy.core.TracklistController.append`. Use
:meth:`mopidy.core.TracklistController.add` instead, which is now capable of
adding multiple tracks.
- :meth:`mopidy.core.TracklistController.get` has been replaced by
:meth:`mopidy.core.TracklistController.filter`.
- :meth:`mopidy.core.TracklistController.remove` can now remove multiple
tracks, and returns the tracks it removed.
- When the tracklist is changed, we now trigger the new
:meth:`mopidy.core.CoreListener.tracklist_changed` event. Previously we
triggered :meth:`mopidy.core.CoreListener.playlist_changed`, which is
intended for stored playlists, not the tracklist.
*Towards Python 3 support:*
- Make the entire code base use unicode strings by default, and only fall back
to bytestrings where it is required. Another step closer to Python 3.
v0.8.1 (2012-10-30)
===================
A small maintenance release to fix a bug introduced in 0.8.0 and update Mopidy
to work with Pykka 1.0.
**Dependencies**
- Pykka >= 1.0 is now required.
**Bug fixes**
- :issue:`213`: Fix "streaming task paused, reason not-negotiated" errors
observed by some users on some Spotify tracks due to a change introduced in
0.8.0. See the issue for a patch that applies to 0.8.0.
- :issue:`216`: Volume returned by the MPD command `status` contained a
floating point ``.0`` suffix. This bug was introduced with the large audio
output and mixer changes in v0.8.0 and broke the MPDroid Android client. It
now returns an integer again.
v0.8.0 (2012-09-20)
===================
This release does not include any major new features. We've done a major
cleanup of how audio outputs and audio mixers work, and on the way we've
resolved a bunch of related issues.
**Audio output and mixer changes**
- Removed multiple outputs support. Having this feature currently seems to be
more trouble than what it is worth. The :attr:`mopidy.settings.OUTPUTS`
setting is no longer supported, and has been replaced with
:attr:`mopidy.settings.OUTPUT` which is a GStreamer bin description string in
the same format as ``gst-launch`` expects. Default value is
``autoaudiosink``. (Fixes: :issue:`81`, :issue:`115`, :issue:`121`,
:issue:`159`)
- Switch to pure GStreamer based mixing. This implies that users setup a
GStreamer bin with a mixer in it in :attr:`mopidy.settings.MIXER`. The
default value is ``autoaudiomixer``, a custom mixer that attempts to find a
mixer that will work on your system. If this picks the wrong mixer you can of
course override it. Setting the mixer to :class:`None` is also supported. MPD
protocol support for volume has also been updated to return -1 when we have
no mixer set. ``software`` can be used to force software mixing.
- Removed the Denon hardware mixer, as it is not maintained.
- Updated the NAD hardware mixer to work in the new GStreamer based mixing
regime. Settings are now passed as GStreamer element properties. In practice
that means that the following old-style config::
MIXER = u'mopidy.mixers.nad.NadMixer'
MIXER_EXT_PORT = u'/dev/ttyUSB0'
MIXER_EXT_SOURCE = u'Aux'
MIXER_EXT_SPEAKERS_A = u'On'
MIXER_EXT_SPEAKERS_B = u'Off'
Now is reduced to simply::
MIXER = u'nadmixer port=/dev/ttyUSB0 source=aux speakers-a=on speakers-b=off'
The ``port`` property defaults to ``/dev/ttyUSB0``, and the rest of the
properties may be left out if you don't want the mixer to adjust the settings
on your NAD amplifier when Mopidy is started.
**Changes**
- When unknown settings are encountered, we now check if it's similar to a
known setting, and suggests to the user what we think the setting should have
been.
- Added ``mopidy --list-deps`` option that lists required and optional
dependencies, their current versions, and some other information useful for
debugging. (Fixes: :issue:`74`)
- Added ``tools/debug-proxy.py`` to tee client requests to two backends and
diff responses. Intended as a developer tool for checking for MPD protocol
changes and various client support. Requires gevent, which currently is not a
dependency of Mopidy.
- Support tracks with only release year, and not a full release date, like e.g.
Spotify tracks.
- Default value of ``LOCAL_MUSIC_PATH`` has been updated to be
``$XDG_MUSIC_DIR``, which on most systems this is set to ``$HOME``. Users of
local backend that relied on the old default ``~/music`` need to update their
settings. Note that the code responsible for finding this music now also
ignores UNIX hidden files and folders.
- File and path settings now support ``$XDG_CACHE_DIR``, ``$XDG_DATA_DIR`` and
``$XDG_MUSIC_DIR`` substitution. Defaults for such settings have been updated
to use this instead of hidden away defaults.
- Playback is now done using ``playbin2`` from GStreamer instead of rolling our
own. This is the first step towards resolving :issue:`171`.
**Bug fixes**
- :issue:`72`: Created a Spotify track proxy that will switch to using loaded
data as soon as it becomes available.
- :issue:`150`: Fix bug which caused some clients to block Mopidy completely.
The bug was caused by some clients sending ``close`` and then shutting down
the connection right away. This trigged a situation in which the connection
cleanup code would wait for an response that would never come inside the
event loop, blocking everything else.
- :issue:`162`: Fixed bug when the MPD command ``playlistinfo`` is used with a
track position. Track position and CPID was intermixed, so it would cause a
crash if a CPID matching the track position didn't exist.
- Fixed crash on lookup of unknown path when using local backend.
- :issue:`189`: ``LOCAL_MUSIC_PATH`` and path handling in rest of settings has
been updated so all of the code now uses the correct value.
- Fixed incorrect track URIs generated by M3U playlist parsing code. Generated
tracks are now relative to ``LOCAL_MUSIC_PATH``.
- :issue:`203`: Re-add support for software mixing.
v0.7.3 (2012-08-11)
===================
A small maintenance release to fix a crash affecting a few users, and a couple
of small adjustments to the Spotify backend.
**Changes**
- Fixed crash when logging :exc:`IOError` exceptions on systems using languages
with non-ASCII characters, like French.
- Move the default location of the Spotify cache from `~/.cache/mopidy` to
`~/.cache/mopidy/spotify`. You can change this by setting
:attr:`mopidy.settings.SPOTIFY_CACHE_PATH`.
- Reduce time required to update the Spotify cache on startup. One one
system/Spotify account, the time from clean cache to ready for use was
reduced from 35s to 12s.
v0.7.2 (2012-05-07)
===================
This is a maintenance release to make Mopidy 0.7 build on systems without all
of Mopidy's runtime dependencies, like Launchpad PPAs.
**Changes**
- Change from version tuple at :attr:`mopidy.VERSION` to :pep:`386` compliant
version string at :attr:`mopidy.__version__` to conform to :pep:`396`.
v0.7.1 (2012-04-22)
===================
This is a maintenance release to make Mopidy 0.7 work with pyspotify >= 1.7.
**Changes**
- Don't override pyspotify's ``notify_main_thread`` callback. The default
implementation is sensible, while our override did nothing.
v0.7.0 (2012-02-25)
===================
Not a big release with regard to features, but this release got some
performance improvements over v0.6, especially for slower Atom systems. It also
fixes a couple of other bugs, including one which made Mopidy crash when using
GStreamer from the prereleases of Ubuntu 12.04.
**Changes**
- The MPD command ``playlistinfo`` is now faster, thanks to John Bäckstrand.
- Added the method
:meth:`mopidy.backends.base.CurrentPlaylistController.length()`,
:meth:`mopidy.backends.base.CurrentPlaylistController.index()`, and
:meth:`mopidy.backends.base.CurrentPlaylistController.slice()` to reduce the
need for copying the entire current playlist from one thread to another.
Thanks to John Bäckstrand for pinpointing the issue.
- Fix crash on creation of config and cache directories if intermediate
directories does not exist. This was especially the case on OS X, where
``~/.config`` doesn't exist for most users.
- Fix ``gst.LinkError`` which appeared when using newer versions of GStreamer,
e.g. on Ubuntu 12.04 Alpha. (Fixes: :issue:`144`)
- Fix crash on mismatching quotation in ``list`` MPD queries. (Fixes:
:issue:`137`)
- Volume is now reported to be the same as the volume was set to, also when
internal rounding have been done due to
:attr:`mopidy.settings.MIXER_MAX_VOLUME` has been set to cap the volume. This
should make it possible to manage capped volume from clients that only
increase volume with one step at a time, like ncmpcpp does.
v0.6.1 (2011-12-28)
===================
This is a maintenance release to make Mopidy 0.6 work with pyspotify >= 1.5,
which Mopidy's develop branch have supported for a long time. This should also
make the Debian packages work out of the box again.
**Important changes**
- pyspotify 1.5 or greater is required.
**Changes**
- Spotify playlist folder boundaries are now properly detected. In other words,
if you use playlist folders, you will no longer get lots of log messages
about bad playlists.
v0.6.0 (2011-10-09)
===================
The development of Mopidy have been quite slow for the last couple of months,
but we do have some goodies to release which have been idling in the
develop branch since the warmer days of the summer. This release brings support
for the MPD ``idle`` command, which makes it possible for a client wait for
updates from the server instead of polling every second. Also, we've added
support for the MPRIS standard, so that Mopidy can be controlled over D-Bus
from e.g. the Ubuntu Sound Menu.
Please note that 0.6.0 requires some updated dependencies, as listed under
*Important changes* below.
**Important changes**
- Pykka 0.12.3 or greater is required.
- pyspotify 1.4 or greater is required.
- All config, data, and cache locations are now based on the XDG spec.
- This means that your settings file will need to be moved from
``~/.mopidy/settings.py`` to ``~/.config/mopidy/settings.py``.
- Your Spotify cache will now be stored in ``~/.cache/mopidy`` instead of
``~/.mopidy/spotify_cache``.
- The local backend's ``tag_cache`` should now be in
``~/.local/share/mopidy/tag_cache``, likewise your playlists will be in
``~/.local/share/mopidy/playlists``.
- The local client now tries to lookup where your music is via XDG, it will
fall-back to ``~/music`` or use whatever setting you set manually.
- The MPD command ``idle`` is now supported by Mopidy for the following
subsystems: player, playlist, options, and mixer. (Fixes: :issue:`32`)
- A new frontend :mod:`mopidy.frontends.mpris` have been added. It exposes
Mopidy through the `MPRIS interface <http://specifications.freedesktop.org/mpris-spec/latest/>`_ over D-Bus. In
practice, this makes it possible to control Mopidy through the `Ubuntu Sound
Menu <https://wiki.ubuntu.com/Sound#menu>`_.
**Changes**
- Replace :attr:`mopidy.backends.base.Backend.uri_handlers` with
:attr:`mopidy.backends.base.Backend.uri_schemes`, which just takes the part
up to the colon of an URI, and not any prefix.
- Add Listener API, :mod:`mopidy.listeners`, to be implemented by actors
wanting to receive events from the backend. This is a formalization of the
ad hoc events the Last.fm scrobbler has already been using for some time.
- Replaced all of the MPD network code that was provided by asyncore with
custom stack. This change was made to facilitate support for the ``idle``
command, and to reduce the number of event loops being used.
- Fix metadata update in Shoutcast streaming. (Fixes: :issue:`122`)
- Unescape all incoming MPD requests. (Fixes: :issue:`113`)
- Increase the maximum number of results returned by Spotify searches from 32
to 100.
- Send Spotify search queries to pyspotify as unicode objects, as required by
pyspotify 1.4. (Fixes: :issue:`129`)
- Add setting :attr:`mopidy.settings.MPD_SERVER_MAX_CONNECTIONS`. (Fixes:
:issue:`134`)
- Remove `destroy()` methods from backend controller and provider APIs, as it
was not in use and actually not called by any code. Will reintroduce when
needed.
v0.5.0 (2011-06-15)
===================
Since last time we've added support for audio streaming to SHOUTcast servers
and fixed the longstanding playlist loading issue in the Spotify backend. As
always the release has a bunch of bug fixes and minor improvements.
Please note that 0.5.0 requires some updated dependencies, as listed under
*Important changes* below.
**Important changes**
- If you use the Spotify backend, you *must* upgrade to libspotify 0.0.8 and
pyspotify 1.3. If you install from APT, libspotify and pyspotify will
automatically be upgraded. If you are not installing from APT, follow the
instructions at :ref:`installation`.
- If you have explicitly set the :attr:`mopidy.settings.SPOTIFY_HIGH_BITRATE`
setting, you must update your settings file. The new setting is named
:attr:`mopidy.settings.SPOTIFY_BITRATE` and accepts the integer values 96,
160, and 320.
- Mopidy now supports running with 1 to N outputs at the same time. This
feature was mainly added to facilitate SHOUTcast support, which Mopidy has
also gained. In its current state outputs can not be toggled during runtime.
**Changes**
- Local backend:
- Fix local backend time query errors that where coming from stopped
pipeline. (Fixes: :issue:`87`)
- Spotify backend:
- Thanks to Antoine Pierlot-Garcin's recent work on updating and improving
pyspotify, stored playlists will again load when Mopidy starts. The
workaround of searching and reconnecting to make the playlists appear are
no longer necessary. (Fixes: :issue:`59`)
- Track's that are no longer available in Spotify's archives are now
"autolinked" to corresponding tracks in other albums, just like the
official Spotify clients do. (Fixes: :issue:`34`)
- MPD frontend:
- Refactoring and cleanup. Most notably, all request handlers now get an
instance of :class:`mopidy.frontends.mpd.dispatcher.MpdContext` as the
first argument. The new class contains reference to any object in Mopidy
the MPD protocol implementation should need access to.
- Close the client connection when the command ``close`` is received.
- Do not allow access to the command ``kill``.
- ``commands`` and ``notcommands`` now have correct output if password
authentication is turned on, but the connected user has not been
authenticated yet.
- Command line usage:
- Support passing options to GStreamer. See ``mopidy --help-gst`` for a list
of available options. (Fixes: :issue:`95`)
- Improve ``mopidy --list-settings`` output. (Fixes: :issue:`91`)
- Added ``mopidy --interactive`` for reading missing local settings from
``stdin``. (Fixes: :issue:`96`)
- Improve shutdown procedure at CTRL+C. Add signal handler for ``SIGTERM``,
which initiates the same shutdown procedure as CTRL+C does.
- Tag cache generator:
- Made it possible to abort :command:`mopidy-scan` with CTRL+C.
- Fixed bug regarding handling of bad dates.
- Use :mod:`logging` instead of ``print`` statements.
- Found and worked around strange WMA metadata behaviour.
- Backend API:
- Calling on :meth:`mopidy.backends.base.playback.PlaybackController.next`
and :meth:`mopidy.backends.base.playback.PlaybackController.previous` no
longer implies that playback should be started. The playback state--whether
playing, paused or stopped--will now be kept.
- The method
:meth:`mopidy.backends.base.playback.PlaybackController.change_track`
has been added. Like ``next()``, and ``prev()``, it changes the current
track without changing the playback state.
v0.4.1 (2011-05-06)
===================
This is a bug fix release fixing audio problems on older GStreamer and some
minor bugs.
**Bug fixes**
- Fix broken audio on at least GStreamer 0.10.30, which affects Ubuntu 10.10.
The GStreamer `appsrc` bin wasn't being linked due to lack of default caps.
(Fixes: :issue:`85`)
- Fix crash in :mod:`mopidy.mixers.nad` that occures at startup when the
:mod:`io` module is available. We used an `eol` keyword argument which is
supported by :meth:`serial.FileLike.readline`, but not by
:meth:`io.RawBaseIO.readline`. When the :mod:`io` module is available, it is
used by PySerial instead of the `FileLike` implementation.
- Fix UnicodeDecodeError in MPD frontend on non-english locale. Thanks to
Antoine Pierlot-Garcin for the patch. (Fixes: :issue:`88`)
- Do not create Pykka proxies that are not going to be used in
:mod:`mopidy.core`. The underlying actor may already intentionally be dead,
and thus the program may crash on creating a proxy it doesn't need. Combined
with the Pykka 0.12.2 release this fixes a crash in the Last.fm frontend
which may occur when all dependencies are installed, but the frontend isn't
configured. (Fixes: :issue:`84`)
v0.4.0 (2011-04-27)
===================
Mopidy 0.4.0 is another release without major feature additions. In 0.4.0 we've
fixed a bunch of issues and bugs, with the help of several new contributors
who are credited in the changelog below. The major change of 0.4.0 is an
internal refactoring which clears way for future features, and which also make
Mopidy work on Python 2.7. In other words, Mopidy 0.4.0 works on Ubuntu 11.04
and Arch Linux.
Please note that 0.4.0 requires some updated dependencies, as listed under
*Important changes* below. Also, the known bug in the Spotify playlist
loading from Mopidy 0.3.0 is still present.
.. warning:: Known bug in Spotify playlist loading
There is a known bug in the loading of Spotify playlists. To avoid the bug,
follow the simple workaround described at :issue:`59`.
**Important changes**
- Mopidy now depends on `Pykka <http://pykka.readthedocs.org/>`_ >=0.12. If you
install from APT, Pykka will automatically be installed. If you are not
installing from APT, you may install Pykka from PyPI::
sudo pip install -U Pykka
- If you use the Spotify backend, you *should* upgrade to libspotify 0.0.7 and
the latest pyspotify from the Mopidy developers. If you install from APT,
libspotify and pyspotify will automatically be upgraded. If you are not
installing from APT, follow the instructions at :ref:`installation`.
**Changes**
- Mopidy now use Pykka actors for thread management and inter-thread
communication. The immediate advantage of this is that Mopidy now works on
Python 2.7, which is the default on e.g. Ubuntu 11.04. (Fixes: :issue:`66`)
- Spotify backend:
- Fixed multiple segmentation faults due to bugs in Pyspotify. Thanks to
Antoine Pierlot-Garcin and Jamie Kirkpatrick for patches to Pyspotify.
- Better error messages on wrong login or network problems. Thanks to Antoine
Pierlot-Garcin for patches to Mopidy and Pyspotify. (Fixes: :issue:`77`)
- Reduce log level for trivial log messages from warning to info. (Fixes:
:issue:`71`)
- Pause playback on network connection errors. (Fixes: :issue:`65`)
- Local backend:
- Fix crash in :command:`mopidy-scan` if a track has no artist name. Thanks
to Martins Grunskis for test and patch and "octe" for patch.
- Fix crash in `tag_cache` parsing if a track has no total number of tracks
in the album. Thanks to Martins Grunskis for the patch.
- MPD frontend:
- Add support for "date" queries to both the ``find`` and ``search``
commands. This makes media library browsing in ncmpcpp work, though very
slow due to all the meta data requests to Spotify.
- Add support for ``play "-1"`` when in playing or paused state, which fixes
resume and addition of tracks to the current playlist while playing for the
MPoD client.
- Fix bug where ``status`` returned ``song: None``, which caused MPDroid to
crash. (Fixes: :issue:`69`)
- Gracefully fallback to IPv4 sockets on systems that supports IPv6, but has
turned it off. (Fixes: :issue:`75`)
- GStreamer output:
- Use ``uridecodebin`` for playing audio from both Spotify and the local
backend. This contributes to support for multiple backends simultaneously.
- Settings:
- Fix crash on ``mopidy --list-settings`` on clean installation. Thanks to
Martins Grunskis for the bug report and patch. (Fixes: :issue:`63`)
- Packaging:
- Replace test data symlinks with real files to avoid symlink issues when
installing with pip. (Fixes: :issue:`68`)
- Debugging:
- Include platform, architecture, Linux distribution, and Python version in
the debug log, to ease debugging of issues with attached debug logs.
v0.3.1 (2011-01-22)
===================
A couple of fixes to the 0.3.0 release is needed to get a smooth installation.
**Bug fixes**
- The Spotify application key was missing from the Python package.
- Installation of the Python package as a normal user failed because it did not
have permissions to install ``mopidy.desktop``. The file is now only
installed if the installation is executed as the root user.
v0.3.0 (2011-01-22)
===================
Mopidy 0.3.0 brings a bunch of small changes all over the place, but no large
changes. The main features are support for high bitrate audio from Spotify, and
MPD password authentication.
Regarding the docs, we've improved the :ref:`installation instructions
<installation>` and done a bit of testing of the available :ref:`Android
<android_mpd_clients>` and :ref:`iOS clients <ios_mpd_clients>` for MPD.
Please note that 0.3.0 requires some updated dependencies, as listed under
*Important changes* below. Also, there is a known bug in the Spotify playlist
loading, as described below. As the bug will take some time to fix and has a
known workaround, we did not want to delay the release while waiting for a fix
to this problem.
.. warning:: Known bug in Spotify playlist loading
There is a known bug in the loading of Spotify playlists. This bug affects
both Mopidy 0.2.1 and 0.3.0, given that you use libspotify 0.0.6. To avoid
the bug, either use Mopidy 0.2.1 with libspotify 0.0.4, or use either
Mopidy version with libspotify 0.0.6 and follow the simple workaround
described at :issue:`59`.
**Important changes**
- If you use the Spotify backend, you need to upgrade to libspotify 0.0.6 and
the latest pyspotify from the Mopidy developers. Follow the instructions at
:ref:`installation`.
- If you use the Last.fm frontend, you need to upgrade to pylast 0.5.7. Run
``sudo pip install --upgrade pylast`` or install Mopidy from APT.
**Changes**
- Spotify backend:
- Support high bitrate (320k) audio. Set the new setting
:attr:`mopidy.settings.SPOTIFY_HIGH_BITRATE` to :class:`True` to switch to
high bitrate audio.
- Rename :mod:`mopidy.backends.libspotify` to :mod:`mopidy.backends.spotify`.
If you have set :attr:`mopidy.settings.BACKENDS` explicitly, you may need
to update the setting's value.
- Catch and log error caused by playlist folder boundaries being threated as
normal playlists. More permanent fix requires support for checking playlist
types in pyspotify (see :issue:`62`).
- Fix crash on failed lookup of track by URI. (Fixes: :issue:`60`)
- Local backend:
- Add :command:`mopidy-scan` command to generate ``tag_cache`` files without
any help from the original MPD server. See
:ref:`generating-a-local-library` for instructions on how to use it.
- Fix support for UTF-8 encoding in tag caches.
- MPD frontend:
- Add support for password authentication. See
:attr:`mopidy.settings.MPD_SERVER_PASSWORD` for details on how to use it.
(Fixes: :issue:`41`)
- Support ``setvol 50`` without quotes around the argument. Fixes volume
control in Droid MPD.
- Support ``seek 1 120`` without quotes around the arguments. Fixes seek in
Droid MPD.
- Last.fm frontend:
- Update to use Last.fm's new Scrobbling 2.0 API, as the old Submissions
Protocol 1.2.1 is deprecated. (Fixes: :issue:`33`)
- Fix crash when track object does not contain all the expected meta data.
- Fix crash when response from Last.fm cannot be decoded as UTF-8. (Fixes:
:issue:`37`)
- Fix crash when response from Last.fm contains invalid XML.
- Fix crash when response from Last.fm has an invalid HTTP status line.
- Mixers:
- Support use of unicode strings for settings specific to
:mod:`mopidy.mixers.nad`.
- Settings:
- Automatically expand the "~" characted to the user's home directory and
make the path absolute for settings with names ending in ``_PATH`` or
``_FILE``.
- Rename the following settings. The settings validator will warn you if you
need to change your local settings.
- ``LOCAL_MUSIC_FOLDER`` to :attr:`mopidy.settings.LOCAL_MUSIC_PATH`
- ``LOCAL_PLAYLIST_FOLDER`` to
:attr:`mopidy.settings.LOCAL_PLAYLIST_PATH`
- ``LOCAL_TAG_CACHE`` to :attr:`mopidy.settings.LOCAL_TAG_CACHE_FILE`
- ``SPOTIFY_LIB_CACHE`` to :attr:`mopidy.settings.SPOTIFY_CACHE_PATH`
- Fix bug which made settings set to :class:`None` or 0 cause a
:exc:`mopidy.SettingsError` to be raised.
- Packaging and distribution:
- Setup APT repository and create Debian packages of Mopidy. See
:ref:`installation` for instructions for how to install Mopidy, including
all dependencies, from APT.
- Install ``mopidy.desktop`` file that makes Mopidy available from e.g. Gnome
application menus.
- API:
- Rename and generalize ``Playlist._with(**kwargs)`` to
:meth:`mopidy.models.ImmutableObject.copy`.
- Add ``musicbrainz_id`` field to :class:`mopidy.models.Artist`,
:class:`mopidy.models.Album`, and :class:`mopidy.models.Track`.
- Prepare for multi-backend support (see :issue:`40`) by introducing the
:ref:`provider concept <concepts>`. Split the backend API into a
:ref:`backend controller API <core-api>` (for frontend use)
and a :ref:`backend provider API <backend-api>` (for backend
implementation use), which includes the following changes:
- Rename ``BaseBackend`` to :class:`mopidy.backends.base.Backend`.
- Rename ``BaseCurrentPlaylistController`` to
:class:`mopidy.backends.base.CurrentPlaylistController`.
- Split ``BaseLibraryController`` to
:class:`mopidy.backends.base.LibraryController` and
:class:`mopidy.backends.base.BaseLibraryProvider`.
- Split ``BasePlaybackController`` to
:class:`mopidy.backends.base.PlaybackController` and
:class:`mopidy.backends.base.BasePlaybackProvider`.
- Split ``BaseStoredPlaylistsController`` to
:class:`mopidy.backends.base.StoredPlaylistsController` and
:class:`mopidy.backends.base.BaseStoredPlaylistsProvider`.
- Move ``BaseMixer`` to :class:`mopidy.mixers.base.BaseMixer`.
- Add docs for the current non-stable output API,
:class:`mopidy.outputs.base.BaseOutput`.
v0.2.1 (2011-01-07)
===================
This is a maintenance release without any new features.
**Bug fixes**
- Fix crash in :mod:`mopidy.frontends.lastfm` which occurred at playback if
either :mod:`pylast` was not installed or the Last.fm scrobbling was not
correctly configured. The scrobbling thread now shuts properly down at
failure.
v0.2.0 (2010-10-24)
===================
In Mopidy 0.2.0 we've added a `Last.fm <http://www.last.fm/>`_ scrobbling
support, which means that Mopidy now can submit meta data about the tracks you
play to your Last.fm profile. See :mod:`mopidy.frontends.lastfm` for
details on new dependencies and settings. If you use Mopidy's Last.fm support,
please join the `Mopidy group at Last.fm <http://www.last.fm/group/Mopidy>`_.
With the exception of the work on the Last.fm scrobbler, there has been a
couple of quiet months in the Mopidy camp. About the only thing going on, has
been stabilization work and bug fixing. All bugs reported on GitHub, plus some,
have been fixed in 0.2.0. Thus, we hope this will be a great release!
We've worked a bit on OS X support, but not all issues are completely solved
yet. :issue:`25` is the one that is currently blocking OS X support. Any help
solving it will be greatly appreciated!
Finally, please :ref:`update your pyspotify installation <installation>` when
upgrading to Mopidy 0.2.0. The latest pyspotify got a fix for the segmentation
fault that occurred when playing music and searching at the same time, thanks
to Valentin David.
**Important changes**
- Added a Last.fm scrobbler. See :mod:`mopidy.frontends.lastfm` for details.
**Changes**
- Logging and command line options:
- Simplify the default log format,
:attr:`mopidy.settings.CONSOLE_LOG_FORMAT`. From a user's point of view:
Less noise, more information.
- Rename the ``mopidy --dump`` command line option to
:option:`mopidy --save-debug-log`.
- Rename setting :attr:`mopidy.settings.DUMP_LOG_FORMAT` to
:attr:`mopidy.settings.DEBUG_LOG_FORMAT` and use it for
:option:`mopidy --verbose` too.
- Rename setting :attr:`mopidy.settings.DUMP_LOG_FILENAME` to
:attr:`mopidy.settings.DEBUG_LOG_FILENAME`.
- MPD frontend:
- MPD command ``list`` now supports queries by artist, album name, and date,
as used by e.g. the Ario client. (Fixes: :issue:`20`)
- MPD command ``add ""`` and ``addid ""`` now behaves as expected. (Fixes
:issue:`16`)
- MPD command ``playid "-1"`` now correctly resumes playback if paused.
- Random mode:
- Fix wrong behavior on end of track and next after random mode has been
used. (Fixes: :issue:`18`)
- Fix infinite recursion loop crash on playback of non-playable tracks when
in random mode. (Fixes :issue:`17`)
- Fix assertion error that happened if one removed tracks from the current
playlist, while in random mode. (Fixes :issue:`22`)
- Switched from using subprocesses to threads. (Fixes: :issue:`14`)
- :mod:`mopidy.outputs.gstreamer`: Set ``caps`` on the ``appsrc`` bin before
use. This makes sound output work with GStreamer >= 0.10.29, which includes
the versions used in Ubuntu 10.10 and on OS X if using Homebrew. (Fixes:
:issue:`21`, :issue:`24`, contributes to :issue:`14`)
- Improved handling of uncaught exceptions in threads. The entire process
should now exit immediately.
v0.1.0 (2010-08-23)
===================
After three weeks of long nights and sprints we're finally pleased enough with
the state of Mopidy to remove the alpha label, and do a regular release.
Mopidy 0.1.0 got important improvements in search functionality, working track
position seeking, no known stability issues, and greatly improved MPD client
support. There are lots of changes since 0.1.0a3, and we urge you to at least
read the *important changes* below.
This release does not support OS X. We're sorry about that, and are working on
fixing the OS X issues for a future release. You can track the progress at
:issue:`14`.
**Important changes**
- License changed from GPLv2 to Apache License, version 2.0.
- GStreamer is now a required dependency. See our :ref:`GStreamer installation
docs <installation>`.
- :mod:`mopidy.backends.libspotify` is now the default backend.
:mod:`mopidy.backends.despotify` is no longer available. This means that you
need to install the :ref:`dependencies for libspotify <installation>`.
- If you used :mod:`mopidy.backends.libspotify` previously, pyspotify must be
updated when updating to this release, to get working seek functionality.
- :attr:`mopidy.settings.SERVER_HOSTNAME` and
:attr:`mopidy.settings.SERVER_PORT` has been renamed to
:attr:`mopidy.settings.MPD_SERVER_HOSTNAME` and
:attr:`mopidy.settings.MPD_SERVER_PORT` to allow for multiple frontends in
the future.
**Changes**
- Exit early if not Python >= 2.6, < 3.
- Validate settings at startup and print useful error messages if the settings
has not been updated or anything is misspelled.
- Add command line option ``mopidy --list-settings`` to print the currently
active settings.
- Include Sphinx scripts for building docs, pylintrc, tests and test data in
the packages created by ``setup.py`` for i.e. PyPI.
- MPD frontend:
- Search improvements, including support for multi-word search.
- Fixed ``play "-1"`` and ``playid "-1"`` behaviour when playlist is empty
or when a current track is set.
- Support ``plchanges "-1"`` to work better with MPDroid.
- Support ``pause`` without arguments to work better with MPDroid.
- Support ``plchanges``, ``play``, ``consume``, ``random``, ``repeat``, and
``single`` without quotes to work better with BitMPC.
- Fixed deletion of the currently playing track from the current playlist,
which crashed several clients.
- Implement ``seek`` and ``seekid``.
- Fix ``playlistfind`` output so the correct song is played when playing
songs directly from search results in GMPC.
- Fix ``load`` so that one can append a playlist to the current playlist, and
make it return the correct error message if the playlist is not found.
- Support for single track repeat added. (Fixes: :issue:`4`)
- Relocate from :mod:`mopidy.mpd` to :mod:`mopidy.frontends.mpd`.
- Split gigantic protocol implementation into eleven modules.
- Rename ``mopidy.frontends.mpd.{serializer => translator}`` to match naming
in backends.
- Remove setting :attr:`mopidy.settings.SERVER` and
:attr:`mopidy.settings.FRONTEND` in favour of the new
:attr:`mopidy.settings.FRONTENDS`.
- Run MPD server in its own process.
- Backends:
- Rename :mod:`mopidy.backends.gstreamer` to :mod:`mopidy.backends.local`.
- Remove :mod:`mopidy.backends.despotify`, as Despotify is little maintained
and the Libspotify backend is working much better. (Fixes: :issue:`9`,
:issue:`10`, :issue:`13`)
- A Spotify application key is now bundled with the source.
:attr:`mopidy.settings.SPOTIFY_LIB_APPKEY` is thus removed.
- If failing to play a track, playback will skip to the next track.
- Both :mod:`mopidy.backends.libspotify` and :mod:`mopidy.backends.local`
have been rewritten to use the new common GStreamer audio output module,
:mod:`mopidy.outputs.gstreamer`.
- Mixers:
- Added new :mod:`mopidy.mixers.gstreamer_software.GStreamerSoftwareMixer`
which now is the default mixer on all platforms.
- New setting :attr:`mopidy.settings.MIXER_MAX_VOLUME` for capping the
maximum output volume.
- Backend API:
- Relocate from :mod:`mopidy.backends` to :mod:`mopidy.backends.base`.
- The ``id`` field of :class:`mopidy.models.Track` has been removed, as it is
no longer needed after the CPID refactoring.
- :meth:`mopidy.backends.base.BaseBackend()` now accepts an
``output_queue`` which it can use to send messages (i.e. audio data)
to the output process.
- :meth:`mopidy.backends.base.BaseLibraryController.find_exact()` now accepts
keyword arguments of the form ``find_exact(artist=['foo'],
album=['bar'])``.
- :meth:`mopidy.backends.base.BaseLibraryController.search()` now accepts
keyword arguments of the form ``search(artist=['foo', 'fighters'],
album=['bar', 'grooves'])``.
- :meth:`mopidy.backends.base.BaseCurrentPlaylistController.append()`
replaces
:meth:`mopidy.backends.base.BaseCurrentPlaylistController.load()`. Use
:meth:`mopidy.backends.base.BaseCurrentPlaylistController.clear()` if you
want to clear the current playlist.
- The following fields in
:class:`mopidy.backends.base.BasePlaybackController` has been renamed to
reflect their relation to methods called on the controller:
- ``next_track`` to ``track_at_next``
- ``next_cp_track`` to ``cp_track_at_next``
- ``previous_track`` to ``track_at_previous``
- ``previous_cp_track`` to ``cp_track_at_previous``
- :attr:`mopidy.backends.base.BasePlaybackController.track_at_eot` and
:attr:`mopidy.backends.base.BasePlaybackController.cp_track_at_eot` has
been added to better handle the difference between the user pressing next
and the current track ending.
- Rename
:meth:`mopidy.backends.base.BasePlaybackController.new_playlist_loaded_callback()`
to
:meth:`mopidy.backends.base.BasePlaybackController.on_current_playlist_change()`.
- Rename
:meth:`mopidy.backends.base.BasePlaybackController.end_of_track_callback()`
to :meth:`mopidy.backends.base.BasePlaybackController.on_end_of_track()`.
- Remove :meth:`mopidy.backends.base.BaseStoredPlaylistsController.search()`
since it was barely used, untested, and we got no use case for non-exact
search in stored playlists yet. Use
:meth:`mopidy.backends.base.BaseStoredPlaylistsController.get()` instead.
v0.1.0a3 (2010-08-03)
=====================
In the last two months, Mopidy's MPD frontend has gotten lots of stability
fixes and error handling improvements, proper support for having the same track
multiple times in a playlist, and support for IPv6. We have also fixed the
choppy playback on the libspotify backend. For the road ahead of us, we got an
updated release roadmap with our goals for the 0.1 to 0.3 releases.
Enjoy the best alpha relase of Mopidy ever :-)
**Changes**
- MPD frontend:
- Support IPv6.
- ``addid`` responds properly on errors instead of crashing.
- ``commands`` support, which makes RelaXXPlayer work with Mopidy. (Fixes:
:issue:`6`)
- Does no longer crash on invalid data, i.e. non-UTF-8 data.
- ``ACK`` error messages are now MPD-compliant, which should make clients
handle errors from Mopidy better.
- Requests to existing commands with wrong arguments are no longer reported
as unknown commands.
- ``command_list_end`` before ``command_list_start`` now returns unknown
command error instead of crashing.
- ``list`` accepts field argument without quotes and capitalized, to work
with GMPC and ncmpc.
- ``noidle`` command now returns ``OK`` instead of an error. Should make some
clients work a bit better.
- Having multiple identical tracks in a playlist is now working properly.
(CPID refactoring)
- Despotify backend:
- Catch and log :exc:`spytify.SpytifyError`. (Fixes: :issue:`11`)
- Libspotify backend:
- Fix choppy playback using the Libspotify backend by using blocking ALSA
mode. (Fixes: :issue:`7`)
- Backend API:
- A new data structure called ``cp_track`` is now used in the current
playlist controller and the playback controller. A ``cp_track`` is a
two-tuple of (CPID integer, :class:`mopidy.models.Track`), identifying an
instance of a track uniquely within the current playlist.
- :meth:`mopidy.backends.BaseCurrentPlaylistController.load()` now accepts
lists of :class:`mopidy.models.Track` instead of
:class:`mopidy.models.Playlist`, as none of the other fields on the
``Playlist`` model was in use.
- :meth:`mopidy.backends.BaseCurrentPlaylistController.add()` now returns the
``cp_track`` added to the current playlist.
- :meth:`mopidy.backends.BaseCurrentPlaylistController.remove()` now takes
criterias, just like
:meth:`mopidy.backends.BaseCurrentPlaylistController.get()`.
- :meth:`mopidy.backends.BaseCurrentPlaylistController.get()` now returns a
``cp_track``.
- :attr:`mopidy.backends.BaseCurrentPlaylistController.tracks` is now
read-only. Use the methods to change its contents.
- :attr:`mopidy.backends.BaseCurrentPlaylistController.cp_tracks` is a
read-only list of ``cp_track``. Use the methods to change its contents.
- :attr:`mopidy.backends.BasePlaybackController.current_track` is now
just for convenience and read-only. To set the current track, assign a
``cp_track`` to
:attr:`mopidy.backends.BasePlaybackController.current_cp_track`.
- :attr:`mopidy.backends.BasePlaybackController.current_cpid` is the
read-only CPID of the current track.
- :attr:`mopidy.backends.BasePlaybackController.next_cp_track` is the
next ``cp_track`` in the playlist.
- :attr:`mopidy.backends.BasePlaybackController.previous_cp_track` is
the previous ``cp_track`` in the playlist.
- :meth:`mopidy.backends.BasePlaybackController.play()` now takes a
``cp_track``.
v0.1.0a2 (2010-06-02)
=====================
It has been a rather slow month for Mopidy, but we would like to keep up with
the established pace of at least a release per month.
**Changes**
- Improvements to MPD protocol handling, making Mopidy work much better with a
group of clients, including ncmpc, MPoD, and Theremin.
- New command line flag ``mopidy --dump`` for dumping debug log to ``dump.log``
in the current directory.
- New setting :attr:`mopidy.settings.MIXER_ALSA_CONTROL` for forcing what ALSA
control :class:`mopidy.mixers.alsa.AlsaMixer` should use.
v0.1.0a1 (2010-05-04)
=====================
Since the previous release Mopidy has seen about 300 commits, more than 200 new
tests, a libspotify release, and major feature additions to Spotify. The new
releases from Spotify have lead to updates to our dependencies, and also to new
bugs in Mopidy. Thus, this is primarily a bugfix release, even though the not
yet finished work on a GStreamer backend have been merged.
All users are recommended to upgrade to 0.1.0a1, and should at the same time
ensure that they have the latest versions of our dependencies: Despotify r508
if you are using DespotifyBackend, and pyspotify 1.1 with libspotify 0.0.4 if
you are using LibspotifyBackend.
As always, report problems at our IRC channel or our issue tracker. Thanks!
**Changes**
- Backend API changes:
- Removed ``backend.playback.volume`` wrapper. Use ``backend.mixer.volume``
directly.
- Renamed ``backend.playback.playlist_position`` to
``current_playlist_position`` to match naming of ``current_track``.
- Replaced ``get_by_id()`` with a more flexible ``get(**criteria)``.
- Merged the ``gstreamer`` branch from Thomas Adamcik:
- More than 200 new tests, and thus several bug fixes to existing code.
- Several new generic features, like shuffle, consume, and playlist repeat.
(Fixes: :issue:`3`)
- **[Work in Progress]** A new backend for playing music from a local music
archive using the GStreamer library.
- Made :class:`mopidy.mixers.alsa.AlsaMixer` work on machines without a mixer
named "Master".
- Make :class:`mopidy.backends.DespotifyBackend` ignore local files in
playlists (feature added in Spotify 0.4.3). Reported by Richard Haugen Olsen.
- And much more.
v0.1.0a0 (2010-03-27)
=====================
"*Release early. Release often. Listen to your customers.*" wrote Eric S.
Raymond in *The Cathedral and the Bazaar*.
Three months of development should be more than enough. We have more to do, but
Mopidy is working and usable. 0.1.0a0 is an alpha release, which basicly means
we will still change APIs, add features, etc. before the final 0.1.0 release.
But the software is usable as is, so we release it. Please give it a try and
give us feedback, either at our IRC channel or through the `issue tracker
<https://github.com/mopidy/mopidy/issues>`_. Thanks!
**Changes**
- Initial version. No changelog available.