Release v2.2.3

This commit is contained in:
Stein Magnus Jodal 2019-06-20 01:50:33 +02:00
commit bc3efdbfc1
72 changed files with 3800 additions and 3721 deletions

1
.gitignore vendored
View File

@ -6,6 +6,7 @@
.cache/
.coverage
.idea
.mypy_cache/
.noseids
.pytest_cache/
.tox

View File

@ -41,3 +41,4 @@ Caysho <caysho@internode.on.net> <mopidy-dev@mopidy-dev.mopidy-dev>
Nick Aquina <nickaquina@gmail.com> <fantostisch@users.noreply.github.com>
Jarryd Tilbrook <jrad.tilbrook@gmail.com>
Matthieu Melquiond <matt.llvw@gmail.com>
Geoffroy Youri Berret <kaliko@azylum.org>

View File

@ -111,3 +111,7 @@
- Matthieu Melquiond <matt.llvw@gmail.com>
- Damien Cassou <damien@cassou.me>
- Leonid Bogdanov <leonid_bogdanov@mail.ru>
- Geoffroy Youri Berret <kaliko@azylum.org>
- Dan Stowell <danstowell@users.sourceforge.net>
- Gildas Le Nadan <gildas@endemic-systems.com>
- Zvonimir Fras <zvonimir@zvonimirfras.com>

View File

@ -10,7 +10,7 @@ The following requirements applies to any frontend implementation:
opening TCP ports and exposing Mopidy for a group of clients.
- A frontend MUST implement at least one `Pykka
<http://pykka.readthedocs.org/>`_ actor, called the "main actor" from here
<https://www.pykka.org/>`_ actor, called the "main actor" from here
on.
- The main actor MUST accept two constructor arguments:

View File

@ -61,7 +61,7 @@ JSON-RPC 2.0 messages
JSON-RPC 2.0 messages can be recognized by checking for the key named
``jsonrpc`` with the string value ``2.0``. For details on the messaging format,
please refer to the `JSON-RPC 2.0 spec
<http://www.jsonrpc.org/specification>`_.
<https://www.jsonrpc.org/specification>`_.
All methods in the :ref:`core-api` is made available through JSON-RPC calls
over the WebSocket. For example, :meth:`mopidy.core.PlaybackController.play` is

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 751 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

View File

@ -6,7 +6,7 @@ MPD clients
This is a list of MPD clients we either know works well with Mopidy, or that we
know won't work well. For a more exhaustive list of MPD clients, see
http://mpd.wikia.com/wiki/Clients.
https://mpd.fandom.com/wiki/Clients.
.. contents:: Contents
:local:
@ -65,19 +65,19 @@ Cantata
`Cantata <https://github.com/CDrummond/cantata>`_ is a graphical MPD client
with support for Linux, mac OS, and Windows.
.. image:: mpd-client-cantata.png
:width: 1232
:height: 710
.. image:: mpd-client-cantata.jpg
:width: 696
:height: 401
GMPC
----
`GMPC <http://gmpc.wikia.com/wiki/Gnome_Music_Player_Client>`_ is a graphical MPD client (GTK+) which works
`GMPC <https://gmpc.fandom.com/wiki/Gnome_Music_Player_Client>`_ is a graphical MPD client (GTK+) which works
well with Mopidy.
.. image:: mpd-client-gmpc.png
:width: 1000
:height: 565
.. image:: mpd-client-gmpc.jpg
:width: 696
:height: 393
GMPC may sometimes requests a lot of meta data of related albums, artists, etc.
This takes more time with Mopidy, which needs to query Spotify for the data,
@ -100,7 +100,7 @@ Sonata
`Sonata <https://github.com/multani/sonata>`_ is a graphical MPD client (GTK+).
It generally works well with Mopidy, except for search.
.. image:: mpd-client-sonata.png
.. image:: mpd-client-sonata.jpg
:width: 475
:height: 424
@ -176,9 +176,9 @@ other web clients, see :ref:`http-clients`.
Rompr
-----
.. image:: rompr.png
:width: 557
:height: 600
.. image:: rompr.jpg
:width: 696
:height: 545
`Rompr <https://fatg3erman.github.io/RompR/>`_ is a web based MPD client.
`mrvanes <https://github.com/mrvanes>`_, a Mopidy and Rompr user, said: "These

View File

@ -4,7 +4,7 @@
MPRIS clients
*************
`MPRIS <http://specifications.freedesktop.org/mpris-spec/latest/>`_ is short
`MPRIS <https://specifications.freedesktop.org/mpris-spec/latest/>`_ is short
for Media Player Remote Interfacing Specification. It is a spec that describes
a standard D-Bus interface for making media players available to other
applications on the same system.

BIN
docs/clients/rompr.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 370 KiB

View File

@ -40,9 +40,9 @@ Using Mopidy-MPRIS and Rygel, or using Mopidy-MPD and upmpdcli.
Mopidy-MPD and upmpdcli
-----------------------
`upmpdcli <http://www.lesbonscomptes.com/upmpdcli/>`_ is recommended, since it
`upmpdcli <https://www.lesbonscomptes.com/upmpdcli/>`_ is recommended, since it
is easier to setup, and offers `OpenHome
<http://www.openhome.org/wiki/OhMedia>`_ compatibility. upmpdcli exposes a UPnP
<http://wiki.openhome.org/wiki/OhMedia>`_ compatibility. upmpdcli exposes a UPnP
MediaRenderer to the network, while using the MPD protocol to control Mopidy.
1. Install upmpdcli. On Debian/Ubuntu::

View File

@ -21,7 +21,7 @@ Code style
bar = 'I am a bytestring, but was it intentional?'
- Follow :pep:`8` unless otherwise noted. `flake8
<https://pypi.python.org/pypi/flake8>`_ should be used to check your code
<https://pypi.org/project/flake8>`_ should be used to check your code
against the guidelines.
- Use four spaces for indentation, *never* tabs.

View File

@ -19,9 +19,8 @@ Mopidy and its extensions:
Just sign in and fire away.
- Our IRC channel: `#mopidy <https://webchat.freenode.net/?channels=#mopidy>`_
on `irc.freenode.net <http://freenode.net>`_,
with public `searchable logs <https://botbot.me/freenode/mopidy/>`_. Be
prepared to hang around for a while, as we're not always around to answer
on `irc.freenode.net <http://freenode.net>`_.
Be prepared to hang around for a while, as we're not always around to answer
straight away.
Before asking for help, it might be worth your time to read the
@ -119,13 +118,13 @@ Pull request guidelines
<http://365git.tumblr.com/post/3308646748/writing-git-commit-messages>`_
- `A Note About Git Commit Messages
<http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html>`_
<https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html>`_
- `On commit messages
<http://who-t.blogspot.ch/2009/12/on-commit-messages.html>`_
#. Send a pull request to the ``develop`` branch. See the `GitHub pull request
docs <https://help.github.com/articles/using-pull-requests>`_ for help.
docs <https://help.github.com/en/articles/about-pull-requests>`_ for help.
.. note::

View File

@ -54,7 +54,7 @@ your regular Mopidy install, which you set up in the first step, is unaffected
by your hacking and will always be working.
Most of us use the `virtualenvwrapper
<https://virtualenvwrapper.readthedocs.org/>`_ to ease working with
<https://virtualenvwrapper.readthedocs.io/>`_ to ease working with
virtualenvs, so that's what we'll be using for the examples here. First,
install and setup virtualenvwrapper as described in their docs.
@ -262,14 +262,14 @@ environments using the ``-e`` option, e.g. to run just unit tests::
tox -e py27
To learn more, see the `tox documentation <http://tox.readthedocs.org/>`_ .
To learn more, see the `tox documentation <https://tox.readthedocs.io/>`_ .
Running unit tests
------------------
Under the hood, ``tox -e py27`` will use `pytest <http://pytest.org/>`_ as the
test runner. We can also use it directly to run all tests::
Under the hood, ``tox -e py27`` will use `pytest <https://docs.pytest.org/>`_
as the test runner. We can also use it directly to run all tests::
pytest
@ -335,7 +335,7 @@ We're quite pedantic about :ref:`codestyle` and try hard to keep the Mopidy
code base a very clean and nice place to work in.
Luckily, you can get very far by using the `flake8
<http://flake8.readthedocs.org/>`_ linter to check your code for issues before
<http://flake8.readthedocs.io/>`_ linter to check your code for issues before
submitting a pull request. Mopidy passes all of flake8's checks, with only a
very few exceptions configured in :file:`setup.cfg`. You can either run the
``flake8`` tox environment, like Travis CI will do on your pull request::
@ -362,8 +362,8 @@ If successful, the command will not print anything at all.
Writing documentation
=====================
To write documentation, we use `Sphinx <http://sphinx-doc.org/>`_. See their
site for lots of documentation on how to use Sphinx.
To write documentation, we use `Sphinx <http://www.sphinx-doc.org/>`_. See
their site for lots of documentation on how to use Sphinx.
.. note::
@ -509,7 +509,7 @@ For clarity, we can rename the ``origin`` remote to ``upstream``::
upstream https://github.com/mopidy/mopidy.git (push)
If you haven't already, `fork the repository
<https://help.github.com/articles/fork-a-repo/>`_ to your own GitHub account.
<https://help.github.com/en/articles/fork-a-repo>`_ to your own GitHub account.
Then, add the new fork as a remote to your local clone::
@ -553,7 +553,7 @@ When everything is done and committed, push the branch to your fork on GitHub::
Go to the repository on GitHub where you want the change merged, in this case
https://github.com/mopidy/mopidy, and `create a pull request
<https://help.github.com/articles/creating-a-pull-request/>`_.
<https://help.github.com/en/articles/creating-a-pull-request>`_.
Updating a pull request

BIN
docs/ext/api_explorer.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

BIN
docs/ext/auto.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

View File

@ -45,7 +45,7 @@ Mopidy-Beets
https://github.com/mopidy/mopidy-beets
Provides a backend for playing music from your `Beets
<http://beets.radbox.org/>`_ music library through Beets' web extension.
<https://beets.io/>`_ music library through Beets' web extension.
Mopidy-Dirble
@ -151,7 +151,7 @@ Mopidy-Podcast-gpodder
https://github.com/tkem/mopidy-podcast-gpodder
Extension for Mopidy-Podcast that lets you search and browse podcasts from the
`gpodder <http://gpodder.org/>`_ web site.
`gpodder <https://gpodder.github.io/>`_ web site.
Mopidy-Podcast-iTunes
@ -169,8 +169,8 @@ Mopidy-radio-de
https://github.com/hechtus/mopidy-radio-de
Extension for listening to Internet radio stations and podcasts listed at
`radio.de <http://www.radio.de/>`_, `radio.net <http://www.radio.net/>`_,
`radio.fr <http://www.radio.fr/>`_, and `radio.at <http://www.radio.at/>`_.
`radio.de <https://www.radio.de/>`_, `radio.net <https://www.radio.net/>`_,
`radio.fr <https://www.radio.fr/>`_, and `radio.at <https://www.radio.at/>`_.
Mopidy-RNZ
@ -178,7 +178,7 @@ Mopidy-RNZ
https://github.com/danbrough/mopidy-rnz
Extension for playing `Radio New Zealands <http://www.radionz.co.nz>`_
Extension for playing `Radio New Zealands <https://www.rnz.co.nz>`_
podcasts,live streams and latest news bulletin.
@ -240,7 +240,7 @@ Mopidy-TuneIn
https://github.com/kingosticks/mopidy-tunein
Provides a backend for playing music from the `TuneIn
<http://tunein.com/>`_ online radio service.
<https://tunein.com/>`_ online radio service.
Mopidy-VKontakte

View File

@ -55,7 +55,7 @@ Mopidy-Touchscreen
https://github.com/9and3r/mopidy-touchscreen
Extension for displaying track info and controlling Mopidy from a touch screen
using `PyGame <http://www.pygame.org/>`_/SDL.
using `PyGame <https://www.pygame.org/>`_/SDL.
Mopidy-TtsGpio

View File

@ -111,8 +111,8 @@ See :ref:`config` for general help on configuring Mopidy.
allowed and so you don't need an entry for those. However, if your requests
originate from a different web server, you will need to add an entry for
that server in this list. For example, to allow requests from a web server
at 'http://www.my.web-client.com' you would specify the entry
'www.my.web-client.com'.
at 'http://my-web-client.example.com' you would specify the entry
'my-web-client.example.com'.
.. confval:: http/csrf_protection

BIN
docs/ext/iris.jpg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

BIN
docs/ext/mobile.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

BIN
docs/ext/moped.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

BIN
docs/ext/mopidy_jukepi.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 KiB

BIN
docs/ext/mopidy_party.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 39 KiB

BIN
docs/ext/mopster.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

View File

@ -21,9 +21,9 @@ https://github.com/dz0ny/mopidy-api-explorer
Web extension for browsing the Mopidy HTTP API.
.. image:: /ext/api_explorer.png
:width: 1176
:height: 713
.. image:: /ext/api_explorer.jpg
:width: 696
:height: 422
To install, run::
@ -43,7 +43,7 @@ Mopidy extension to automate music playback based on time of day.
goals. Other web extensions will not work as expected when this extension
is installed.
.. image:: /ext/auto.png
.. image:: /ext/auto.jpg
:width: 533
:height: 370
@ -62,8 +62,8 @@ extensions in a user-friendly and intuitive interface. Built using React and
Redux. Made by James Barnsley.
.. image:: /ext/iris.jpg
:width: 888
:height: 646
:width: 696
:height: 506
To install, run::
@ -95,9 +95,9 @@ https://github.com/matgallacher/mopidy-material-webclient
A Mopidy web client with an Android Material design feel.
.. image:: /ext/material_webclient.png
:width: 960
:height: 520
.. image:: /ext/material_webclient.jpg
:width: 696
:height: 377
To install, run::
@ -112,9 +112,9 @@ https://github.com/tkem/mopidy-mobile
A Mopidy web client extension and hybrid mobile app, made with Ionic,
AngularJS and Apache Cordova by Thomas Kemmer.
.. image:: /ext/mobile.png
:width: 1024
:height: 606
.. image:: /ext/mobile.jpg
:width: 696
:height: 412
To install, run::
@ -128,9 +128,9 @@ https://github.com/martijnboland/moped
A Mopidy web client made with AngularJS by Martijn Boland.
.. image:: /ext/moped.png
:width: 720
:height: 450
.. image:: /ext/moped.jpg
:width: 696
:height: 435
To install, run::
@ -147,8 +147,8 @@ a more "complete" Spotify music experience. It's currently targeted at people
using Spotify through Mopidy. Made by Dirk Groenen.
.. image:: /ext/mopify.jpg
:width: 800
:height: 416
:width: 696
:height: 362
To install, run::
@ -162,11 +162,11 @@ https://github.com/pimusicbox/mopidy-musicbox-webclient
The first web client for Mopidy, made with jQuery Mobile by Wouter van Wijk.
Also the web client used for Wouter's popular `Pi Musicbox
<http://www.pimusicbox.com/>`_ image for Raspberry Pi.
<https://www.pimusicbox.com/>`_ image for Raspberry Pi.
.. image:: /ext/musicbox_webclient.png
:width: 1312
:height: 723
.. image:: /ext/musicbox_webclient.jpg
:width: 696
:height: 384
To install, run::
@ -180,7 +180,7 @@ https://github.com/Lesterpig/mopidy-party
Minimal web client designed for collaborative music management during parties.
.. image:: /ext/mopidy_party.png
.. image:: /ext/mopidy_party.jpg
To install, run::
@ -195,7 +195,7 @@ https://github.com/xolox/mopidy-simple-webclient
A minimalistic web client targeted for mobile devices. Made with jQuery and
Bootstrap by Peter Odding.
.. image:: /ext/simple_webclient.png
.. image:: /ext/simple_webclient.jpg
:width: 473
:height: 373
@ -221,11 +221,11 @@ https://github.com/cowbell/mopster
Simple web client hosted online written in Ember.js and styled using basic
Bootstrap by Wojciech Wnętrzak.
.. image:: /ext/mopster.png
:width: 1275
:height: 628
.. image:: /ext/mopster.jpg
:width: 696
:height: 343
To use, just visit http://mopster.cowbell-labs.com/.
To use, just visit http://mopster.urizen.pl/.
Mopidy-Jukepi
@ -235,9 +235,9 @@ https://github.com/meantimeit/jukepi
A Mopidy web client built with Backbone by connrs.
.. image:: /ext/mopidy_jukepi.png
:width: 1260
:height: 961
.. image:: /ext/mopidy_jukepi.jpg
:width: 696
:height: 531
To install, run::

View File

@ -32,7 +32,7 @@ named Soundspot to Mopidy, you would name your extension's Python package
``mopidy_soundspot``.
The extension must be shipped with a ``setup.py`` file and be registered on
`PyPI <https://pypi.python.org/>`_. The name of the distribution on PyPI would
`PyPI <https://pypi.org/>`_. The name of the distribution on PyPI would
be something like "Mopidy-Soundspot". Make sure to include the name "Mopidy"
somewhere in that name and that you check the capitalization. This is the name
users will use when they install your extension from PyPI.
@ -61,7 +61,7 @@ Example content for the most important files follows below.
cookiecutter project template
=============================
We've also made a `cookiecutter <http://cookiecutter.readthedocs.org/>`_
We've also made a `cookiecutter <https://cookiecutter.readthedocs.io/>`_
project template for `creating new Mopidy extensions
<https://github.com/mopidy/cookiecutter-mopidy-ext>`_. If you install
cookiecutter and run a single command, you're asked a few questions about the
@ -215,7 +215,7 @@ file::
For details on the ``MANIFEST.in`` file format, check out the `distutils docs
<https://docs.python.org/2/distutils/sourcedist.html#manifest-template>`_.
`check-manifest <https://pypi.python.org/pypi/check-manifest>`_ is a very
`check-manifest <https://pypi.org/project/check-manifest>`_ is a very
useful tool to check your ``MANIFEST.in`` file for completeness.
@ -485,7 +485,7 @@ If you make HTTP requests please make sure to respect the :ref:`proxy configs
configured by the Mopidy user. To make this easier for extension developers,
the helper function :func:`mopidy.httpclient.format_proxy` was added in Mopidy
1.1. This function returns the proxy settings `formatted the way Requests
expects <http://www.python-requests.org/en/latest/user/advanced/#proxies>`__.
expects <https://2.python-requests.org/en/master/user/advanced/#proxies>`__.
User-Agent strings
------------------
@ -505,7 +505,7 @@ Example using Requests sessions
-------------------------------
Most Mopidy extensions that make HTTP requests use the `Requests
<http://www.python-requests.org/>`_ library to do so. When using Requests, the
<https://2.python-requests.org/>`_ library to do so. When using Requests, the
most convenient way to make sure the proxy and User-Agent header is set
properly is to create a Requests session object and use that object to make all
your HTTP requests::
@ -541,7 +541,7 @@ your HTTP requests::
# ``session`` object.
For further details, see Requests' docs on `session objects
<http://www.python-requests.org/en/latest/user/advanced/#session-objects>`__.
<https://2.python-requests.org/en/master/user/advanced/#session-objects>`__.
Testing extensions
==================
@ -554,8 +554,8 @@ extension in some unanticipated way.
Before getting started, it is important to familiarize yourself with the
Python `mock library <https://docs.python.org/dev/library/unittest.mock.html>`_.
When it comes to running tests, Mopidy typically makes use of testing tools
like `tox <https://tox.readthedocs.org/en/latest/>`_ and
`pytest <http://pytest.org/latest/>`_.
like `tox <https://tox.readthedocs.io/>`_ and
`pytest <https://docs.pytest.org/>`_.
Testing approach
----------------
@ -646,9 +646,9 @@ file, and mocking the audio actor::
The following libraries might be useful for mocking any HTTP requests that
your extension makes:
- `responses <https://pypi.python.org/pypi/responses>`_ - A utility library for
- `responses <https://pypi.org/project/responses>`_ - A utility library for
mocking out the requests Python library.
- `vcrpy <https://pypi.python.org/pypi/vcrpy>`_ - Automatically mock your HTTP
- `vcrpy <https://pypi.org/project/vcrpy>`_ - Automatically mock your HTTP
interactions to simplify and speed up testing.
At the very least, you'll probably want to patch ``requests`` or any other web

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,933 @@
********************
Changelog 1.x series
********************
This is the changelog of Mopidy v1.0.0 through v1.1.2.
For the latest releases, see :ref:`changelog`.
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`)

15
docs/history/index.rst Normal file
View File

@ -0,0 +1,15 @@
.. _history:
*******
History
*******
These are the changelogs for historical releases of Mopidy.
For the latest releases, see :ref:`changelog`.
.. toctree::
:maxdepth: 1
changelog-1.x
changelog-0.x

View File

@ -60,8 +60,7 @@ To get started with Mopidy, start by reading :ref:`installation`.
If you get stuck, you can get help at the `Mopidy discussion forum
<https://discourse.mopidy.com/>`_. We also hang around at IRC on the
``#mopidy`` channel at `irc.freenode.net <http://freenode.net/>`_. The IRC
channel has `public searchable logs <https://botbot.me/freenode/mopidy/>`_.
``#mopidy`` channel at `irc.freenode.net <http://freenode.net/>`_.
If you stumble into a bug or have a feature request, please create an issue in
the `issue tracker <https://github.com/mopidy/mopidy/issues>`_. If you're
@ -121,8 +120,9 @@ announcements related to Mopidy and Mopidy extensions.
authors
sponsors
changelog
versioning
changelog
history/index
.. toctree::

View File

@ -9,7 +9,7 @@ If you are running OS X, you can install everything needed with Homebrew.
xcode-select --install
#. Install `Homebrew <https://github.com/Homebrew/homebrew>`_.
#. Install `Homebrew <https://brew.sh/>`_.
#. If you are already using Homebrew, make sure your installation is up to
date before you continue::

View File

@ -18,7 +18,7 @@ How to for Raspbian
===================
#. Download the latest Raspbian Desktop or Lite disk image from
http://www.raspberrypi.org/downloads/raspbian/.
https://www.raspberrypi.org/downloads/raspbian/.
Unless you need a full graphical desktop the Lite image is preferable since
it's much smaller.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -71,7 +71,7 @@ please follow the directions :ref:`here <contributing>`.
sudo pip install -U mopidy
This will use ``pip`` to install the latest release of `Mopidy from PyPI
<https://pypi.python.org/pypi/Mopidy>`_. To upgrade Mopidy to future
<https://pypi.org/project/Mopidy>`_. To upgrade Mopidy to future
releases, just rerun this command.
#. Finally, you need to set a couple of :doc:`config values </config>`, and

View File

@ -101,7 +101,7 @@ When using PulseAudio, you will typically have a PulseAudio server run by your
main user. Since Mopidy is running as its own user, it can't access this server
directly. Running PulseAudio as a system-wide daemon is discouraged by upstream
(see `here
<http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/WhatIsWrongWithSystemWide/>`_
<https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/WhatIsWrongWithSystemWide/>`_
for details). Rather you can configure PulseAudio and Mopidy so Mopidy sends
the sound to the PulseAudio server already running as your main user.

View File

@ -18,7 +18,7 @@ Sharing config and log output
=============================
If you're getting help at IRC, we recommend that you use a pastebin, like
`pastebin.com <http://pastebin.com/>`_ or `GitHub Gist
`pastebin.com <https://pastebin.com/>`_ or `GitHub Gist
<https://gist.github.com/>`_, to share your configuration and log output.
Pasting more than a couple of lines on IRC is generally frowned upon. On the
mailing list or when reporting an issue, somewhat longer text dumps are
@ -79,7 +79,7 @@ Debugging GStreamer
If you really want to dig in and debug GStreamer behaviour, then check out the
`Debugging section
<http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-checklist-debug.html>`_
<https://gstreamer.freedesktop.org/documentation/application-development/appendix/checklist-element.html?gi-language=python>`_
of GStreamer's documentation for your options. Note that Mopidy does not
support the GStreamer command line options, like ``--gst-debug-level=3``, but
setting GStreamer environment variables, like :envvar:`GST_DEBUG`, works with

View File

@ -4,7 +4,7 @@
Versioning
**********
Mopidy follows `Semantic Versioning <http://semver.org/>`_. In summary this
Mopidy follows `Semantic Versioning <https://semver.org/>`_. In summary this
means that our version numbers have three parts, MAJOR.MINOR.PATCH, which
change according to the following rules:

View File

@ -14,4 +14,4 @@ if not (2, 7) <= sys.version_info < (3,):
warnings.filterwarnings('ignore', 'could not open display')
__version__ = '2.2.2'
__version__ = '2.2.3'

View File

@ -114,12 +114,6 @@ class _Outputs(Gst.Bin):
ghost_pad = Gst.GhostPad.new('sink', self._tee.get_static_pad('sink'))
self.add_pad(ghost_pad)
# Add an always connected fakesink which respects the clock so the tee
# doesn't fail even if we don't have any outputs.
fakesink = Gst.ElementFactory.make('fakesink')
fakesink.set_property('sync', True)
self._add(fakesink)
def add_output(self, description):
# XXX This only works for pipelines not in use until #790 gets done.
try:
@ -262,7 +256,7 @@ class _Handler(object):
target_state = _GST_STATE_MAPPING.get(self._audio._target_state)
if target_state is None:
# XXX: Workaround for #1430, to be fixed properly by #1222.
logger.debug('Race condition happened. See #1222 and #1430.')
logger.warn('Race condition happened. See #1222 and #1430.')
return
if target_state == new_state:
target_state = None
@ -280,6 +274,10 @@ class _Handler(object):
self._audio._playbin, Gst.DebugGraphDetails.ALL, 'mopidy')
def on_buffering(self, percent, structure=None):
if self._audio._target_state < Gst.State.PAUSED:
gst_logger.debug('Skip buffering during track change.')
return
if structure is not None and structure.has_field('buffering-mode'):
buffering_mode = structure.get_enum(
'buffering-mode', Gst.BufferingMode)
@ -398,7 +396,7 @@ class _Handler(object):
class Audio(pykka.ThreadingActor):
"""
Audio output through `GStreamer <http://gstreamer.freedesktop.org/>`_.
Audio output through `GStreamer <https://gstreamer.freedesktop.org/>`_.
"""
#: The GStreamer state mapped to :class:`mopidy.audio.PlaybackState`
@ -711,7 +709,6 @@ class Audio(pykka.ThreadingActor):
:rtype: :class:`True` if successfull, else :class:`False`
"""
self._buffering = False
return self._set_state(Gst.State.NULL)
def wait_for_state_change(self):
@ -754,6 +751,9 @@ class Audio(pykka.ThreadingActor):
:type state: :class:`Gst.State`
:rtype: :class:`True` if successfull, else :class:`False`
"""
if state < Gst.State.PAUSED:
self._buffering = False
self._target_state = state
result = self._playbin.set_state(state)
gst_logger.debug(

View File

@ -5,7 +5,15 @@ media_dirs =
~/|Home
show_dotfiles = false
excluded_file_extensions =
.jpg
.directory
.html
.jpeg
.jpg
.log
.nfo
.pdf
.png
.txt
.zip
follow_symlinks = false
metadata_timeout = 1000

View File

@ -84,7 +84,7 @@ def parse_pls(data):
if section.lower() != 'playlist':
continue
for i in range(cp.getint(section, 'numberofentries')):
yield cp.get(section, 'file%d' % (i + 1))
yield cp.get(section, 'file%d' % (i + 1)).strip('\"\'')
def parse_xspf(data):

View File

@ -12,5 +12,7 @@ excluded_file_extensions =
.jpg
.log
.nfo
.pdf
.png
.txt
.zip

View File

@ -5,9 +5,9 @@ This is partly based upon the `MPD protocol documentation
<http://www.musicpd.org/doc/protocol/>`_, which is a useful resource, but it is
rather incomplete with regards to data formats, both for requests and
responses. Thus, we have had to talk a great deal with the the original `MPD
server <http://mpd.wikia.com/>`_ using telnet to get the details we need to
server <https://mpd.fandom.com/>`_ using telnet to get the details we need to
implement our own MPD server which is compatible with the numerous existing
`MPD clients <http://mpd.wikia.com/wiki/Clients>`_.
`MPD clients <https://mpd.fandom.com/wiki/Clients>`_.
"""
from __future__ import absolute_import, unicode_literals

View File

@ -42,7 +42,8 @@ def mixrampdb(context, decibels):
doesn't fade the track volume, just overlaps. The songs need to have
MixRamp tags added by an external tool. 0dB is the normalized maximum
volume so use negative values, I prefer -17dB. In the absence of mixramp
tags crossfading will be used. See http://sourceforge.net/projects/mixramp
tags crossfading will be used. See
https://sourceforge.net/projects/mixramp/
"""
raise exceptions.MpdNotImplemented # TODO

View File

@ -31,11 +31,11 @@ file:///tmp/baz
PLS = b"""[Playlist]
NumberOfEntries=3
File1=file:///tmp/foo
File1="file:///tmp/foo"
Title1=Sample Title
Length1=123
File2=file:///tmp/bar
File2='file:///tmp/bar'
Title2=Example \xc5\xa7\xc5\x95
Length2=321
File3=file:///tmp/baz