Release v2.2.3
1
.gitignore
vendored
@ -6,6 +6,7 @@
|
|||||||
.cache/
|
.cache/
|
||||||
.coverage
|
.coverage
|
||||||
.idea
|
.idea
|
||||||
|
.mypy_cache/
|
||||||
.noseids
|
.noseids
|
||||||
.pytest_cache/
|
.pytest_cache/
|
||||||
.tox
|
.tox
|
||||||
|
|||||||
1
.mailmap
@ -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>
|
Nick Aquina <nickaquina@gmail.com> <fantostisch@users.noreply.github.com>
|
||||||
Jarryd Tilbrook <jrad.tilbrook@gmail.com>
|
Jarryd Tilbrook <jrad.tilbrook@gmail.com>
|
||||||
Matthieu Melquiond <matt.llvw@gmail.com>
|
Matthieu Melquiond <matt.llvw@gmail.com>
|
||||||
|
Geoffroy Youri Berret <kaliko@azylum.org>
|
||||||
|
|||||||
4
AUTHORS
@ -111,3 +111,7 @@
|
|||||||
- Matthieu Melquiond <matt.llvw@gmail.com>
|
- Matthieu Melquiond <matt.llvw@gmail.com>
|
||||||
- Damien Cassou <damien@cassou.me>
|
- Damien Cassou <damien@cassou.me>
|
||||||
- Leonid Bogdanov <leonid_bogdanov@mail.ru>
|
- 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>
|
||||||
|
|||||||
@ -10,7 +10,7 @@ The following requirements applies to any frontend implementation:
|
|||||||
opening TCP ports and exposing Mopidy for a group of clients.
|
opening TCP ports and exposing Mopidy for a group of clients.
|
||||||
|
|
||||||
- A frontend MUST implement at least one `Pykka
|
- 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.
|
on.
|
||||||
|
|
||||||
- The main actor MUST accept two constructor arguments:
|
- The main actor MUST accept two constructor arguments:
|
||||||
|
|||||||
@ -61,7 +61,7 @@ JSON-RPC 2.0 messages
|
|||||||
JSON-RPC 2.0 messages can be recognized by checking for the key named
|
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,
|
``jsonrpc`` with the string value ``2.0``. For details on the messaging format,
|
||||||
please refer to the `JSON-RPC 2.0 spec
|
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
|
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
|
over the WebSocket. For example, :meth:`mopidy.core.PlaybackController.play` is
|
||||||
|
|||||||
3648
docs/changelog.rst
BIN
docs/clients/mpd-client-cantata.jpg
Normal file
|
After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 751 KiB |
BIN
docs/clients/mpd-client-gmpc.jpg
Normal file
|
After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 175 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 12 KiB |
BIN
docs/clients/mpd-client-sonata.jpg
Normal file
|
After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 47 KiB |
@ -6,7 +6,7 @@ MPD clients
|
|||||||
|
|
||||||
This is a list of MPD clients we either know works well with Mopidy, or that we
|
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
|
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
|
.. contents:: Contents
|
||||||
:local:
|
:local:
|
||||||
@ -65,19 +65,19 @@ Cantata
|
|||||||
`Cantata <https://github.com/CDrummond/cantata>`_ is a graphical MPD client
|
`Cantata <https://github.com/CDrummond/cantata>`_ is a graphical MPD client
|
||||||
with support for Linux, mac OS, and Windows.
|
with support for Linux, mac OS, and Windows.
|
||||||
|
|
||||||
.. image:: mpd-client-cantata.png
|
.. image:: mpd-client-cantata.jpg
|
||||||
:width: 1232
|
:width: 696
|
||||||
:height: 710
|
:height: 401
|
||||||
|
|
||||||
GMPC
|
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.
|
well with Mopidy.
|
||||||
|
|
||||||
.. image:: mpd-client-gmpc.png
|
.. image:: mpd-client-gmpc.jpg
|
||||||
:width: 1000
|
:width: 696
|
||||||
:height: 565
|
:height: 393
|
||||||
|
|
||||||
GMPC may sometimes requests a lot of meta data of related albums, artists, etc.
|
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,
|
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+).
|
`Sonata <https://github.com/multani/sonata>`_ is a graphical MPD client (GTK+).
|
||||||
It generally works well with Mopidy, except for search.
|
It generally works well with Mopidy, except for search.
|
||||||
|
|
||||||
.. image:: mpd-client-sonata.png
|
.. image:: mpd-client-sonata.jpg
|
||||||
:width: 475
|
:width: 475
|
||||||
:height: 424
|
:height: 424
|
||||||
|
|
||||||
@ -176,9 +176,9 @@ other web clients, see :ref:`http-clients`.
|
|||||||
Rompr
|
Rompr
|
||||||
-----
|
-----
|
||||||
|
|
||||||
.. image:: rompr.png
|
.. image:: rompr.jpg
|
||||||
:width: 557
|
:width: 696
|
||||||
:height: 600
|
:height: 545
|
||||||
|
|
||||||
`Rompr <https://fatg3erman.github.io/RompR/>`_ is a web based MPD client.
|
`Rompr <https://fatg3erman.github.io/RompR/>`_ is a web based MPD client.
|
||||||
`mrvanes <https://github.com/mrvanes>`_, a Mopidy and Rompr user, said: "These
|
`mrvanes <https://github.com/mrvanes>`_, a Mopidy and Rompr user, said: "These
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
MPRIS clients
|
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
|
for Media Player Remote Interfacing Specification. It is a spec that describes
|
||||||
a standard D-Bus interface for making media players available to other
|
a standard D-Bus interface for making media players available to other
|
||||||
applications on the same system.
|
applications on the same system.
|
||||||
|
|||||||
BIN
docs/clients/rompr.jpg
Normal file
|
After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 370 KiB |
@ -40,9 +40,9 @@ Using Mopidy-MPRIS and Rygel, or using Mopidy-MPD and upmpdcli.
|
|||||||
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
|
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.
|
MediaRenderer to the network, while using the MPD protocol to control Mopidy.
|
||||||
|
|
||||||
1. Install upmpdcli. On Debian/Ubuntu::
|
1. Install upmpdcli. On Debian/Ubuntu::
|
||||||
|
|||||||
@ -21,7 +21,7 @@ Code style
|
|||||||
bar = 'I am a bytestring, but was it intentional?'
|
bar = 'I am a bytestring, but was it intentional?'
|
||||||
|
|
||||||
- Follow :pep:`8` unless otherwise noted. `flake8
|
- 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.
|
against the guidelines.
|
||||||
|
|
||||||
- Use four spaces for indentation, *never* tabs.
|
- Use four spaces for indentation, *never* tabs.
|
||||||
|
|||||||
@ -19,9 +19,8 @@ Mopidy and its extensions:
|
|||||||
Just sign in and fire away.
|
Just sign in and fire away.
|
||||||
|
|
||||||
- Our IRC channel: `#mopidy <https://webchat.freenode.net/?channels=#mopidy>`_
|
- Our IRC channel: `#mopidy <https://webchat.freenode.net/?channels=#mopidy>`_
|
||||||
on `irc.freenode.net <http://freenode.net>`_,
|
on `irc.freenode.net <http://freenode.net>`_.
|
||||||
with public `searchable logs <https://botbot.me/freenode/mopidy/>`_. Be
|
Be prepared to hang around for a while, as we're not always around to answer
|
||||||
prepared to hang around for a while, as we're not always around to answer
|
|
||||||
straight away.
|
straight away.
|
||||||
|
|
||||||
Before asking for help, it might be worth your time to read the
|
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>`_
|
<http://365git.tumblr.com/post/3308646748/writing-git-commit-messages>`_
|
||||||
|
|
||||||
- `A Note About 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
|
- `On commit messages
|
||||||
<http://who-t.blogspot.ch/2009/12/on-commit-messages.html>`_
|
<http://who-t.blogspot.ch/2009/12/on-commit-messages.html>`_
|
||||||
|
|
||||||
#. Send a pull request to the ``develop`` branch. See the `GitHub pull request
|
#. 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::
|
.. note::
|
||||||
|
|
||||||
|
|||||||
@ -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.
|
by your hacking and will always be working.
|
||||||
|
|
||||||
Most of us use the `virtualenvwrapper
|
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,
|
virtualenvs, so that's what we'll be using for the examples here. First,
|
||||||
install and setup virtualenvwrapper as described in their docs.
|
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
|
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
|
Running unit tests
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
Under the hood, ``tox -e py27`` will use `pytest <http://pytest.org/>`_ as the
|
Under the hood, ``tox -e py27`` will use `pytest <https://docs.pytest.org/>`_
|
||||||
test runner. We can also use it directly to run all tests::
|
as the test runner. We can also use it directly to run all tests::
|
||||||
|
|
||||||
pytest
|
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.
|
code base a very clean and nice place to work in.
|
||||||
|
|
||||||
Luckily, you can get very far by using the `flake8
|
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
|
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
|
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::
|
``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
|
Writing documentation
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
To write documentation, we use `Sphinx <http://sphinx-doc.org/>`_. See their
|
To write documentation, we use `Sphinx <http://www.sphinx-doc.org/>`_. See
|
||||||
site for lots of documentation on how to use Sphinx.
|
their site for lots of documentation on how to use Sphinx.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
@ -509,7 +509,7 @@ For clarity, we can rename the ``origin`` remote to ``upstream``::
|
|||||||
upstream https://github.com/mopidy/mopidy.git (push)
|
upstream https://github.com/mopidy/mopidy.git (push)
|
||||||
|
|
||||||
If you haven't already, `fork the repository
|
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::
|
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
|
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://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
|
Updating a pull request
|
||||||
|
|||||||
BIN
docs/ext/api_explorer.jpg
Normal file
|
After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 70 KiB |
BIN
docs/ext/auto.jpg
Normal file
|
After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 32 KiB |
@ -45,7 +45,7 @@ Mopidy-Beets
|
|||||||
https://github.com/mopidy/mopidy-beets
|
https://github.com/mopidy/mopidy-beets
|
||||||
|
|
||||||
Provides a backend for playing music from your `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
|
Mopidy-Dirble
|
||||||
@ -151,7 +151,7 @@ Mopidy-Podcast-gpodder
|
|||||||
https://github.com/tkem/mopidy-podcast-gpodder
|
https://github.com/tkem/mopidy-podcast-gpodder
|
||||||
|
|
||||||
Extension for Mopidy-Podcast that lets you search and browse podcasts from the
|
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
|
Mopidy-Podcast-iTunes
|
||||||
@ -169,8 +169,8 @@ Mopidy-radio-de
|
|||||||
https://github.com/hechtus/mopidy-radio-de
|
https://github.com/hechtus/mopidy-radio-de
|
||||||
|
|
||||||
Extension for listening to Internet radio stations and podcasts listed at
|
Extension for listening to Internet radio stations and podcasts listed at
|
||||||
`radio.de <http://www.radio.de/>`_, `radio.net <http://www.radio.net/>`_,
|
`radio.de <https://www.radio.de/>`_, `radio.net <https://www.radio.net/>`_,
|
||||||
`radio.fr <http://www.radio.fr/>`_, and `radio.at <http://www.radio.at/>`_.
|
`radio.fr <https://www.radio.fr/>`_, and `radio.at <https://www.radio.at/>`_.
|
||||||
|
|
||||||
|
|
||||||
Mopidy-RNZ
|
Mopidy-RNZ
|
||||||
@ -178,7 +178,7 @@ Mopidy-RNZ
|
|||||||
|
|
||||||
https://github.com/danbrough/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.
|
podcasts,live streams and latest news bulletin.
|
||||||
|
|
||||||
|
|
||||||
@ -240,7 +240,7 @@ Mopidy-TuneIn
|
|||||||
https://github.com/kingosticks/mopidy-tunein
|
https://github.com/kingosticks/mopidy-tunein
|
||||||
|
|
||||||
Provides a backend for playing music from the `TuneIn
|
Provides a backend for playing music from the `TuneIn
|
||||||
<http://tunein.com/>`_ online radio service.
|
<https://tunein.com/>`_ online radio service.
|
||||||
|
|
||||||
|
|
||||||
Mopidy-VKontakte
|
Mopidy-VKontakte
|
||||||
|
|||||||
@ -55,7 +55,7 @@ Mopidy-Touchscreen
|
|||||||
https://github.com/9and3r/mopidy-touchscreen
|
https://github.com/9and3r/mopidy-touchscreen
|
||||||
|
|
||||||
Extension for displaying track info and controlling Mopidy from a touch screen
|
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
|
Mopidy-TtsGpio
|
||||||
|
|||||||
@ -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
|
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
|
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
|
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
|
at 'http://my-web-client.example.com' you would specify the entry
|
||||||
'www.my.web-client.com'.
|
'my-web-client.example.com'.
|
||||||
|
|
||||||
.. confval:: http/csrf_protection
|
.. confval:: http/csrf_protection
|
||||||
|
|
||||||
|
|||||||
BIN
docs/ext/iris.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 55 KiB |
BIN
docs/ext/material_webclient.jpg
Normal file
|
After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 42 KiB |
BIN
docs/ext/mobile.jpg
Normal file
|
After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 86 KiB |
BIN
docs/ext/moped.jpg
Normal file
|
After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 180 KiB |
BIN
docs/ext/mopidy_jukepi.jpg
Normal file
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 191 KiB |
BIN
docs/ext/mopidy_party.jpg
Normal file
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 39 KiB |
BIN
docs/ext/mopster.jpg
Normal file
|
After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 80 KiB |
BIN
docs/ext/musicbox_webclient.jpg
Normal file
|
After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 205 KiB |
BIN
docs/ext/simple_webclient.jpg
Normal file
|
After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 49 KiB |
@ -21,9 +21,9 @@ https://github.com/dz0ny/mopidy-api-explorer
|
|||||||
|
|
||||||
Web extension for browsing the Mopidy HTTP API.
|
Web extension for browsing the Mopidy HTTP API.
|
||||||
|
|
||||||
.. image:: /ext/api_explorer.png
|
.. image:: /ext/api_explorer.jpg
|
||||||
:width: 1176
|
:width: 696
|
||||||
:height: 713
|
:height: 422
|
||||||
|
|
||||||
To install, run::
|
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
|
goals. Other web extensions will not work as expected when this extension
|
||||||
is installed.
|
is installed.
|
||||||
|
|
||||||
.. image:: /ext/auto.png
|
.. image:: /ext/auto.jpg
|
||||||
:width: 533
|
:width: 533
|
||||||
:height: 370
|
:height: 370
|
||||||
|
|
||||||
@ -62,8 +62,8 @@ extensions in a user-friendly and intuitive interface. Built using React and
|
|||||||
Redux. Made by James Barnsley.
|
Redux. Made by James Barnsley.
|
||||||
|
|
||||||
.. image:: /ext/iris.jpg
|
.. image:: /ext/iris.jpg
|
||||||
:width: 888
|
:width: 696
|
||||||
:height: 646
|
:height: 506
|
||||||
|
|
||||||
To install, run::
|
To install, run::
|
||||||
|
|
||||||
@ -95,9 +95,9 @@ https://github.com/matgallacher/mopidy-material-webclient
|
|||||||
|
|
||||||
A Mopidy web client with an Android Material design feel.
|
A Mopidy web client with an Android Material design feel.
|
||||||
|
|
||||||
.. image:: /ext/material_webclient.png
|
.. image:: /ext/material_webclient.jpg
|
||||||
:width: 960
|
:width: 696
|
||||||
:height: 520
|
:height: 377
|
||||||
|
|
||||||
To install, run::
|
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,
|
A Mopidy web client extension and hybrid mobile app, made with Ionic,
|
||||||
AngularJS and Apache Cordova by Thomas Kemmer.
|
AngularJS and Apache Cordova by Thomas Kemmer.
|
||||||
|
|
||||||
.. image:: /ext/mobile.png
|
.. image:: /ext/mobile.jpg
|
||||||
:width: 1024
|
:width: 696
|
||||||
:height: 606
|
:height: 412
|
||||||
|
|
||||||
To install, run::
|
To install, run::
|
||||||
|
|
||||||
@ -128,9 +128,9 @@ https://github.com/martijnboland/moped
|
|||||||
|
|
||||||
A Mopidy web client made with AngularJS by Martijn Boland.
|
A Mopidy web client made with AngularJS by Martijn Boland.
|
||||||
|
|
||||||
.. image:: /ext/moped.png
|
.. image:: /ext/moped.jpg
|
||||||
:width: 720
|
:width: 696
|
||||||
:height: 450
|
:height: 435
|
||||||
|
|
||||||
To install, run::
|
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.
|
using Spotify through Mopidy. Made by Dirk Groenen.
|
||||||
|
|
||||||
.. image:: /ext/mopify.jpg
|
.. image:: /ext/mopify.jpg
|
||||||
:width: 800
|
:width: 696
|
||||||
:height: 416
|
:height: 362
|
||||||
|
|
||||||
To install, run::
|
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.
|
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
|
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
|
.. image:: /ext/musicbox_webclient.jpg
|
||||||
:width: 1312
|
:width: 696
|
||||||
:height: 723
|
:height: 384
|
||||||
|
|
||||||
To install, run::
|
To install, run::
|
||||||
|
|
||||||
@ -180,7 +180,7 @@ https://github.com/Lesterpig/mopidy-party
|
|||||||
|
|
||||||
Minimal web client designed for collaborative music management during parties.
|
Minimal web client designed for collaborative music management during parties.
|
||||||
|
|
||||||
.. image:: /ext/mopidy_party.png
|
.. image:: /ext/mopidy_party.jpg
|
||||||
|
|
||||||
To install, run::
|
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
|
A minimalistic web client targeted for mobile devices. Made with jQuery and
|
||||||
Bootstrap by Peter Odding.
|
Bootstrap by Peter Odding.
|
||||||
|
|
||||||
.. image:: /ext/simple_webclient.png
|
.. image:: /ext/simple_webclient.jpg
|
||||||
:width: 473
|
:width: 473
|
||||||
:height: 373
|
:height: 373
|
||||||
|
|
||||||
@ -221,11 +221,11 @@ https://github.com/cowbell/mopster
|
|||||||
Simple web client hosted online written in Ember.js and styled using basic
|
Simple web client hosted online written in Ember.js and styled using basic
|
||||||
Bootstrap by Wojciech Wnętrzak.
|
Bootstrap by Wojciech Wnętrzak.
|
||||||
|
|
||||||
.. image:: /ext/mopster.png
|
.. image:: /ext/mopster.jpg
|
||||||
:width: 1275
|
:width: 696
|
||||||
:height: 628
|
:height: 343
|
||||||
|
|
||||||
To use, just visit http://mopster.cowbell-labs.com/.
|
To use, just visit http://mopster.urizen.pl/.
|
||||||
|
|
||||||
|
|
||||||
Mopidy-Jukepi
|
Mopidy-Jukepi
|
||||||
@ -235,9 +235,9 @@ https://github.com/meantimeit/jukepi
|
|||||||
|
|
||||||
A Mopidy web client built with Backbone by connrs.
|
A Mopidy web client built with Backbone by connrs.
|
||||||
|
|
||||||
.. image:: /ext/mopidy_jukepi.png
|
.. image:: /ext/mopidy_jukepi.jpg
|
||||||
:width: 1260
|
:width: 696
|
||||||
:height: 961
|
:height: 531
|
||||||
|
|
||||||
To install, run::
|
To install, run::
|
||||||
|
|
||||||
|
|||||||
@ -32,7 +32,7 @@ named Soundspot to Mopidy, you would name your extension's Python package
|
|||||||
``mopidy_soundspot``.
|
``mopidy_soundspot``.
|
||||||
|
|
||||||
The extension must be shipped with a ``setup.py`` file and be registered on
|
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"
|
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
|
somewhere in that name and that you check the capitalization. This is the name
|
||||||
users will use when they install your extension from PyPI.
|
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
|
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
|
project template for `creating new Mopidy extensions
|
||||||
<https://github.com/mopidy/cookiecutter-mopidy-ext>`_. If you install
|
<https://github.com/mopidy/cookiecutter-mopidy-ext>`_. If you install
|
||||||
cookiecutter and run a single command, you're asked a few questions about the
|
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
|
For details on the ``MANIFEST.in`` file format, check out the `distutils docs
|
||||||
<https://docs.python.org/2/distutils/sourcedist.html#manifest-template>`_.
|
<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.
|
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,
|
configured by the Mopidy user. To make this easier for extension developers,
|
||||||
the helper function :func:`mopidy.httpclient.format_proxy` was added in Mopidy
|
the helper function :func:`mopidy.httpclient.format_proxy` was added in Mopidy
|
||||||
1.1. This function returns the proxy settings `formatted the way Requests
|
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
|
User-Agent strings
|
||||||
------------------
|
------------------
|
||||||
@ -505,7 +505,7 @@ Example using Requests sessions
|
|||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
Most Mopidy extensions that make HTTP requests use the `Requests
|
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
|
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
|
properly is to create a Requests session object and use that object to make all
|
||||||
your HTTP requests::
|
your HTTP requests::
|
||||||
@ -541,7 +541,7 @@ your HTTP requests::
|
|||||||
# ``session`` object.
|
# ``session`` object.
|
||||||
|
|
||||||
For further details, see Requests' docs on `session objects
|
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
|
Testing extensions
|
||||||
==================
|
==================
|
||||||
@ -554,8 +554,8 @@ extension in some unanticipated way.
|
|||||||
Before getting started, it is important to familiarize yourself with the
|
Before getting started, it is important to familiarize yourself with the
|
||||||
Python `mock library <https://docs.python.org/dev/library/unittest.mock.html>`_.
|
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
|
When it comes to running tests, Mopidy typically makes use of testing tools
|
||||||
like `tox <https://tox.readthedocs.org/en/latest/>`_ and
|
like `tox <https://tox.readthedocs.io/>`_ and
|
||||||
`pytest <http://pytest.org/latest/>`_.
|
`pytest <https://docs.pytest.org/>`_.
|
||||||
|
|
||||||
Testing approach
|
Testing approach
|
||||||
----------------
|
----------------
|
||||||
@ -646,9 +646,9 @@ file, and mocking the audio actor::
|
|||||||
The following libraries might be useful for mocking any HTTP requests that
|
The following libraries might be useful for mocking any HTTP requests that
|
||||||
your extension makes:
|
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.
|
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.
|
interactions to simplify and speed up testing.
|
||||||
|
|
||||||
At the very least, you'll probably want to patch ``requests`` or any other web
|
At the very least, you'll probably want to patch ``requests`` or any other web
|
||||||
|
|||||||
2689
docs/history/changelog-0.x.rst
Normal file
933
docs/history/changelog-1.x.rst
Normal 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
@ -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
|
||||||
@ -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
|
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
|
<https://discourse.mopidy.com/>`_. We also hang around at IRC on the
|
||||||
``#mopidy`` channel at `irc.freenode.net <http://freenode.net/>`_. The IRC
|
``#mopidy`` channel at `irc.freenode.net <http://freenode.net/>`_.
|
||||||
channel has `public searchable logs <https://botbot.me/freenode/mopidy/>`_.
|
|
||||||
|
|
||||||
If you stumble into a bug or have a feature request, please create an issue in
|
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
|
the `issue tracker <https://github.com/mopidy/mopidy/issues>`_. If you're
|
||||||
@ -121,8 +120,9 @@ announcements related to Mopidy and Mopidy extensions.
|
|||||||
|
|
||||||
authors
|
authors
|
||||||
sponsors
|
sponsors
|
||||||
changelog
|
|
||||||
versioning
|
versioning
|
||||||
|
changelog
|
||||||
|
history/index
|
||||||
|
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
|
|||||||
@ -9,7 +9,7 @@ If you are running OS X, you can install everything needed with Homebrew.
|
|||||||
|
|
||||||
xcode-select --install
|
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
|
#. If you are already using Homebrew, make sure your installation is up to
|
||||||
date before you continue::
|
date before you continue::
|
||||||
|
|||||||
@ -18,7 +18,7 @@ How to for Raspbian
|
|||||||
===================
|
===================
|
||||||
|
|
||||||
#. Download the latest Raspbian Desktop or Lite disk image from
|
#. 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
|
Unless you need a full graphical desktop the Lite image is preferable since
|
||||||
it's much smaller.
|
it's much smaller.
|
||||||
@ -88,5 +88,5 @@ You can test sound output independent of Mopidy by running::
|
|||||||
|
|
||||||
If you hear a voice saying "Front Center", then your sound is working.
|
If you hear a voice saying "Front Center", then your sound is working.
|
||||||
|
|
||||||
If you want to change your audio output setting, simply rerun ``sudo
|
If you want to change your audio output setting, simply rerun ``sudo
|
||||||
raspi-config``.
|
raspi-config``.
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 30 KiB |
@ -71,7 +71,7 @@ please follow the directions :ref:`here <contributing>`.
|
|||||||
sudo pip install -U mopidy
|
sudo pip install -U mopidy
|
||||||
|
|
||||||
This will use ``pip`` to install the latest release of `Mopidy from PyPI
|
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.
|
releases, just rerun this command.
|
||||||
|
|
||||||
#. Finally, you need to set a couple of :doc:`config values </config>`, and
|
#. Finally, you need to set a couple of :doc:`config values </config>`, and
|
||||||
|
|||||||
@ -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
|
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
|
directly. Running PulseAudio as a system-wide daemon is discouraged by upstream
|
||||||
(see `here
|
(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
|
for details). Rather you can configure PulseAudio and Mopidy so Mopidy sends
|
||||||
the sound to the PulseAudio server already running as your main user.
|
the sound to the PulseAudio server already running as your main user.
|
||||||
|
|
||||||
|
|||||||
@ -18,7 +18,7 @@ Sharing config and log output
|
|||||||
=============================
|
=============================
|
||||||
|
|
||||||
If you're getting help at IRC, we recommend that you use a pastebin, like
|
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.
|
<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
|
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
|
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
|
If you really want to dig in and debug GStreamer behaviour, then check out the
|
||||||
`Debugging section
|
`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
|
of GStreamer's documentation for your options. Note that Mopidy does not
|
||||||
support the GStreamer command line options, like ``--gst-debug-level=3``, but
|
support the GStreamer command line options, like ``--gst-debug-level=3``, but
|
||||||
setting GStreamer environment variables, like :envvar:`GST_DEBUG`, works with
|
setting GStreamer environment variables, like :envvar:`GST_DEBUG`, works with
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
Versioning
|
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
|
means that our version numbers have three parts, MAJOR.MINOR.PATCH, which
|
||||||
change according to the following rules:
|
change according to the following rules:
|
||||||
|
|
||||||
|
|||||||
@ -14,4 +14,4 @@ if not (2, 7) <= sys.version_info < (3,):
|
|||||||
warnings.filterwarnings('ignore', 'could not open display')
|
warnings.filterwarnings('ignore', 'could not open display')
|
||||||
|
|
||||||
|
|
||||||
__version__ = '2.2.2'
|
__version__ = '2.2.3'
|
||||||
|
|||||||
@ -114,12 +114,6 @@ class _Outputs(Gst.Bin):
|
|||||||
ghost_pad = Gst.GhostPad.new('sink', self._tee.get_static_pad('sink'))
|
ghost_pad = Gst.GhostPad.new('sink', self._tee.get_static_pad('sink'))
|
||||||
self.add_pad(ghost_pad)
|
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):
|
def add_output(self, description):
|
||||||
# XXX This only works for pipelines not in use until #790 gets done.
|
# XXX This only works for pipelines not in use until #790 gets done.
|
||||||
try:
|
try:
|
||||||
@ -262,7 +256,7 @@ class _Handler(object):
|
|||||||
target_state = _GST_STATE_MAPPING.get(self._audio._target_state)
|
target_state = _GST_STATE_MAPPING.get(self._audio._target_state)
|
||||||
if target_state is None:
|
if target_state is None:
|
||||||
# XXX: Workaround for #1430, to be fixed properly by #1222.
|
# 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
|
return
|
||||||
if target_state == new_state:
|
if target_state == new_state:
|
||||||
target_state = None
|
target_state = None
|
||||||
@ -280,6 +274,10 @@ class _Handler(object):
|
|||||||
self._audio._playbin, Gst.DebugGraphDetails.ALL, 'mopidy')
|
self._audio._playbin, Gst.DebugGraphDetails.ALL, 'mopidy')
|
||||||
|
|
||||||
def on_buffering(self, percent, structure=None):
|
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'):
|
if structure is not None and structure.has_field('buffering-mode'):
|
||||||
buffering_mode = structure.get_enum(
|
buffering_mode = structure.get_enum(
|
||||||
'buffering-mode', Gst.BufferingMode)
|
'buffering-mode', Gst.BufferingMode)
|
||||||
@ -398,7 +396,7 @@ class _Handler(object):
|
|||||||
class Audio(pykka.ThreadingActor):
|
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`
|
#: 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`
|
:rtype: :class:`True` if successfull, else :class:`False`
|
||||||
"""
|
"""
|
||||||
self._buffering = False
|
|
||||||
return self._set_state(Gst.State.NULL)
|
return self._set_state(Gst.State.NULL)
|
||||||
|
|
||||||
def wait_for_state_change(self):
|
def wait_for_state_change(self):
|
||||||
@ -754,6 +751,9 @@ class Audio(pykka.ThreadingActor):
|
|||||||
:type state: :class:`Gst.State`
|
:type state: :class:`Gst.State`
|
||||||
:rtype: :class:`True` if successfull, else :class:`False`
|
:rtype: :class:`True` if successfull, else :class:`False`
|
||||||
"""
|
"""
|
||||||
|
if state < Gst.State.PAUSED:
|
||||||
|
self._buffering = False
|
||||||
|
|
||||||
self._target_state = state
|
self._target_state = state
|
||||||
result = self._playbin.set_state(state)
|
result = self._playbin.set_state(state)
|
||||||
gst_logger.debug(
|
gst_logger.debug(
|
||||||
|
|||||||
@ -5,7 +5,15 @@ media_dirs =
|
|||||||
~/|Home
|
~/|Home
|
||||||
show_dotfiles = false
|
show_dotfiles = false
|
||||||
excluded_file_extensions =
|
excluded_file_extensions =
|
||||||
.jpg
|
.directory
|
||||||
|
.html
|
||||||
.jpeg
|
.jpeg
|
||||||
|
.jpg
|
||||||
|
.log
|
||||||
|
.nfo
|
||||||
|
.pdf
|
||||||
|
.png
|
||||||
|
.txt
|
||||||
|
.zip
|
||||||
follow_symlinks = false
|
follow_symlinks = false
|
||||||
metadata_timeout = 1000
|
metadata_timeout = 1000
|
||||||
|
|||||||
@ -84,7 +84,7 @@ def parse_pls(data):
|
|||||||
if section.lower() != 'playlist':
|
if section.lower() != 'playlist':
|
||||||
continue
|
continue
|
||||||
for i in range(cp.getint(section, 'numberofentries')):
|
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):
|
def parse_xspf(data):
|
||||||
|
|||||||
@ -12,5 +12,7 @@ excluded_file_extensions =
|
|||||||
.jpg
|
.jpg
|
||||||
.log
|
.log
|
||||||
.nfo
|
.nfo
|
||||||
|
.pdf
|
||||||
.png
|
.png
|
||||||
.txt
|
.txt
|
||||||
|
.zip
|
||||||
|
|||||||
@ -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
|
<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
|
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
|
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
|
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
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|||||||
@ -42,7 +42,8 @@ def mixrampdb(context, decibels):
|
|||||||
doesn't fade the track volume, just overlaps. The songs need to have
|
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
|
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
|
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
|
raise exceptions.MpdNotImplemented # TODO
|
||||||
|
|
||||||
|
|||||||
@ -31,11 +31,11 @@ file:///tmp/baz
|
|||||||
|
|
||||||
PLS = b"""[Playlist]
|
PLS = b"""[Playlist]
|
||||||
NumberOfEntries=3
|
NumberOfEntries=3
|
||||||
File1=file:///tmp/foo
|
File1="file:///tmp/foo"
|
||||||
Title1=Sample Title
|
Title1=Sample Title
|
||||||
Length1=123
|
Length1=123
|
||||||
|
|
||||||
File2=file:///tmp/bar
|
File2='file:///tmp/bar'
|
||||||
Title2=Example \xc5\xa7\xc5\x95
|
Title2=Example \xc5\xa7\xc5\x95
|
||||||
Length2=321
|
Length2=321
|
||||||
File3=file:///tmp/baz
|
File3=file:///tmp/baz
|
||||||
|
|||||||