*******
Changes
*******

This change log is used to track all major changes to Mopidy.


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.backends.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 :option:`-q`/:option:`--quiet` and
  :option:`-v`/:option:`--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-frontend` 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 ``--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 :option:`--list-deps` option to the ``mopidy`` command 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://www.mpris.org/>`_ over D-Bus. In
  practice, this makes it possible to control Mopidy through the `Ubuntu Sound
  Menu <https://wiki.ubuntu.com/SoundMenu>`_.

**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 :option:`--help-gst` for a list
    of available options. (Fixes: :issue:`95`)

  - Improve :option:`--list-settings` output. (Fixes: :issue:`91`)

  - Added :option:`--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 ``--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-tag-cache`
    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` and
    :ref:`use-mpd-on-a-network` 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 crate 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 :option:`--dump` command line option to
    :option:`--save-debug-log`.
  - Rename setting :attr:`mopidy.settings.DUMP_LOG_FORMAT` to
    :attr:`mopidy.settings.DEBUG_LOG_FORMAT` and use it for :option:`--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 :option:`--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 :doc:`release roadmap <development>` 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 :option:`--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.
