Release v2.2.3
1
.gitignore
vendored
@ -6,6 +6,7 @@
|
||||
.cache/
|
||||
.coverage
|
||||
.idea
|
||||
.mypy_cache/
|
||||
.noseids
|
||||
.pytest_cache/
|
||||
.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>
|
||||
Jarryd Tilbrook <jrad.tilbrook@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>
|
||||
- Damien Cassou <damien@cassou.me>
|
||||
- Leonid Bogdanov <leonid_bogdanov@mail.ru>
|
||||
- Geoffroy Youri Berret <kaliko@azylum.org>
|
||||
- Dan Stowell <danstowell@users.sourceforge.net>
|
||||
- Gildas Le Nadan <gildas@endemic-systems.com>
|
||||
- Zvonimir Fras <zvonimir@zvonimirfras.com>
|
||||
|
||||
@ -10,7 +10,7 @@ The following requirements applies to any frontend implementation:
|
||||
opening TCP ports and exposing Mopidy for a group of clients.
|
||||
|
||||
- A frontend MUST implement at least one `Pykka
|
||||
<http://pykka.readthedocs.org/>`_ actor, called the "main actor" from here
|
||||
<https://www.pykka.org/>`_ actor, called the "main actor" from here
|
||||
on.
|
||||
|
||||
- The main actor MUST accept two constructor arguments:
|
||||
|
||||
@ -61,7 +61,7 @@ JSON-RPC 2.0 messages
|
||||
JSON-RPC 2.0 messages can be recognized by checking for the key named
|
||||
``jsonrpc`` with the string value ``2.0``. For details on the messaging format,
|
||||
please refer to the `JSON-RPC 2.0 spec
|
||||
<http://www.jsonrpc.org/specification>`_.
|
||||
<https://www.jsonrpc.org/specification>`_.
|
||||
|
||||
All methods in the :ref:`core-api` is made available through JSON-RPC calls
|
||||
over the WebSocket. For example, :meth:`mopidy.core.PlaybackController.play` is
|
||||
|
||||
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
|
||||
know won't work well. For a more exhaustive list of MPD clients, see
|
||||
http://mpd.wikia.com/wiki/Clients.
|
||||
https://mpd.fandom.com/wiki/Clients.
|
||||
|
||||
.. contents:: Contents
|
||||
:local:
|
||||
@ -65,19 +65,19 @@ Cantata
|
||||
`Cantata <https://github.com/CDrummond/cantata>`_ is a graphical MPD client
|
||||
with support for Linux, mac OS, and Windows.
|
||||
|
||||
.. image:: mpd-client-cantata.png
|
||||
:width: 1232
|
||||
:height: 710
|
||||
.. image:: mpd-client-cantata.jpg
|
||||
:width: 696
|
||||
:height: 401
|
||||
|
||||
GMPC
|
||||
----
|
||||
|
||||
`GMPC <http://gmpc.wikia.com/wiki/Gnome_Music_Player_Client>`_ is a graphical MPD client (GTK+) which works
|
||||
`GMPC <https://gmpc.fandom.com/wiki/Gnome_Music_Player_Client>`_ is a graphical MPD client (GTK+) which works
|
||||
well with Mopidy.
|
||||
|
||||
.. image:: mpd-client-gmpc.png
|
||||
:width: 1000
|
||||
:height: 565
|
||||
.. image:: mpd-client-gmpc.jpg
|
||||
:width: 696
|
||||
:height: 393
|
||||
|
||||
GMPC may sometimes requests a lot of meta data of related albums, artists, etc.
|
||||
This takes more time with Mopidy, which needs to query Spotify for the data,
|
||||
@ -100,7 +100,7 @@ Sonata
|
||||
`Sonata <https://github.com/multani/sonata>`_ is a graphical MPD client (GTK+).
|
||||
It generally works well with Mopidy, except for search.
|
||||
|
||||
.. image:: mpd-client-sonata.png
|
||||
.. image:: mpd-client-sonata.jpg
|
||||
:width: 475
|
||||
:height: 424
|
||||
|
||||
@ -176,9 +176,9 @@ other web clients, see :ref:`http-clients`.
|
||||
Rompr
|
||||
-----
|
||||
|
||||
.. image:: rompr.png
|
||||
:width: 557
|
||||
:height: 600
|
||||
.. image:: rompr.jpg
|
||||
:width: 696
|
||||
:height: 545
|
||||
|
||||
`Rompr <https://fatg3erman.github.io/RompR/>`_ is a web based MPD client.
|
||||
`mrvanes <https://github.com/mrvanes>`_, a Mopidy and Rompr user, said: "These
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
MPRIS clients
|
||||
*************
|
||||
|
||||
`MPRIS <http://specifications.freedesktop.org/mpris-spec/latest/>`_ is short
|
||||
`MPRIS <https://specifications.freedesktop.org/mpris-spec/latest/>`_ is short
|
||||
for Media Player Remote Interfacing Specification. It is a spec that describes
|
||||
a standard D-Bus interface for making media players available to other
|
||||
applications on the same system.
|
||||
|
||||
BIN
docs/clients/rompr.jpg
Normal file
|
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
|
||||
-----------------------
|
||||
|
||||
`upmpdcli <http://www.lesbonscomptes.com/upmpdcli/>`_ is recommended, since it
|
||||
is easier to setup, and offers `OpenHome
|
||||
<http://www.openhome.org/wiki/OhMedia>`_ compatibility. upmpdcli exposes a UPnP
|
||||
`upmpdcli <https://www.lesbonscomptes.com/upmpdcli/>`_ is recommended, since it
|
||||
is easier to setup, and offers `OpenHome
|
||||
<http://wiki.openhome.org/wiki/OhMedia>`_ compatibility. upmpdcli exposes a UPnP
|
||||
MediaRenderer to the network, while using the MPD protocol to control Mopidy.
|
||||
|
||||
1. Install upmpdcli. On Debian/Ubuntu::
|
||||
|
||||
@ -21,7 +21,7 @@ Code style
|
||||
bar = 'I am a bytestring, but was it intentional?'
|
||||
|
||||
- Follow :pep:`8` unless otherwise noted. `flake8
|
||||
<https://pypi.python.org/pypi/flake8>`_ should be used to check your code
|
||||
<https://pypi.org/project/flake8>`_ should be used to check your code
|
||||
against the guidelines.
|
||||
|
||||
- Use four spaces for indentation, *never* tabs.
|
||||
|
||||
@ -19,9 +19,8 @@ Mopidy and its extensions:
|
||||
Just sign in and fire away.
|
||||
|
||||
- Our IRC channel: `#mopidy <https://webchat.freenode.net/?channels=#mopidy>`_
|
||||
on `irc.freenode.net <http://freenode.net>`_,
|
||||
with public `searchable logs <https://botbot.me/freenode/mopidy/>`_. Be
|
||||
prepared to hang around for a while, as we're not always around to answer
|
||||
on `irc.freenode.net <http://freenode.net>`_.
|
||||
Be prepared to hang around for a while, as we're not always around to answer
|
||||
straight away.
|
||||
|
||||
Before asking for help, it might be worth your time to read the
|
||||
@ -119,13 +118,13 @@ Pull request guidelines
|
||||
<http://365git.tumblr.com/post/3308646748/writing-git-commit-messages>`_
|
||||
|
||||
- `A Note About Git Commit Messages
|
||||
<http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html>`_
|
||||
<https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html>`_
|
||||
|
||||
- `On commit messages
|
||||
<http://who-t.blogspot.ch/2009/12/on-commit-messages.html>`_
|
||||
|
||||
#. Send a pull request to the ``develop`` branch. See the `GitHub pull request
|
||||
docs <https://help.github.com/articles/using-pull-requests>`_ for help.
|
||||
docs <https://help.github.com/en/articles/about-pull-requests>`_ for help.
|
||||
|
||||
.. note::
|
||||
|
||||
|
||||
@ -54,7 +54,7 @@ your regular Mopidy install, which you set up in the first step, is unaffected
|
||||
by your hacking and will always be working.
|
||||
|
||||
Most of us use the `virtualenvwrapper
|
||||
<https://virtualenvwrapper.readthedocs.org/>`_ to ease working with
|
||||
<https://virtualenvwrapper.readthedocs.io/>`_ to ease working with
|
||||
virtualenvs, so that's what we'll be using for the examples here. First,
|
||||
install and setup virtualenvwrapper as described in their docs.
|
||||
|
||||
@ -262,14 +262,14 @@ environments using the ``-e`` option, e.g. to run just unit tests::
|
||||
|
||||
tox -e py27
|
||||
|
||||
To learn more, see the `tox documentation <http://tox.readthedocs.org/>`_ .
|
||||
To learn more, see the `tox documentation <https://tox.readthedocs.io/>`_ .
|
||||
|
||||
|
||||
Running unit tests
|
||||
------------------
|
||||
|
||||
Under the hood, ``tox -e py27`` will use `pytest <http://pytest.org/>`_ as the
|
||||
test runner. We can also use it directly to run all tests::
|
||||
Under the hood, ``tox -e py27`` will use `pytest <https://docs.pytest.org/>`_
|
||||
as the test runner. We can also use it directly to run all tests::
|
||||
|
||||
pytest
|
||||
|
||||
@ -335,7 +335,7 @@ We're quite pedantic about :ref:`codestyle` and try hard to keep the Mopidy
|
||||
code base a very clean and nice place to work in.
|
||||
|
||||
Luckily, you can get very far by using the `flake8
|
||||
<http://flake8.readthedocs.org/>`_ linter to check your code for issues before
|
||||
<http://flake8.readthedocs.io/>`_ linter to check your code for issues before
|
||||
submitting a pull request. Mopidy passes all of flake8's checks, with only a
|
||||
very few exceptions configured in :file:`setup.cfg`. You can either run the
|
||||
``flake8`` tox environment, like Travis CI will do on your pull request::
|
||||
@ -362,8 +362,8 @@ If successful, the command will not print anything at all.
|
||||
Writing documentation
|
||||
=====================
|
||||
|
||||
To write documentation, we use `Sphinx <http://sphinx-doc.org/>`_. See their
|
||||
site for lots of documentation on how to use Sphinx.
|
||||
To write documentation, we use `Sphinx <http://www.sphinx-doc.org/>`_. See
|
||||
their site for lots of documentation on how to use Sphinx.
|
||||
|
||||
.. note::
|
||||
|
||||
@ -509,7 +509,7 @@ For clarity, we can rename the ``origin`` remote to ``upstream``::
|
||||
upstream https://github.com/mopidy/mopidy.git (push)
|
||||
|
||||
If you haven't already, `fork the repository
|
||||
<https://help.github.com/articles/fork-a-repo/>`_ to your own GitHub account.
|
||||
<https://help.github.com/en/articles/fork-a-repo>`_ to your own GitHub account.
|
||||
|
||||
Then, add the new fork as a remote to your local clone::
|
||||
|
||||
@ -553,7 +553,7 @@ When everything is done and committed, push the branch to your fork on GitHub::
|
||||
|
||||
Go to the repository on GitHub where you want the change merged, in this case
|
||||
https://github.com/mopidy/mopidy, and `create a pull request
|
||||
<https://help.github.com/articles/creating-a-pull-request/>`_.
|
||||
<https://help.github.com/en/articles/creating-a-pull-request>`_.
|
||||
|
||||
|
||||
Updating a pull request
|
||||
|
||||
BIN
docs/ext/api_explorer.jpg
Normal file
|
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
|
||||
|
||||
Provides a backend for playing music from your `Beets
|
||||
<http://beets.radbox.org/>`_ music library through Beets' web extension.
|
||||
<https://beets.io/>`_ music library through Beets' web extension.
|
||||
|
||||
|
||||
Mopidy-Dirble
|
||||
@ -151,7 +151,7 @@ Mopidy-Podcast-gpodder
|
||||
https://github.com/tkem/mopidy-podcast-gpodder
|
||||
|
||||
Extension for Mopidy-Podcast that lets you search and browse podcasts from the
|
||||
`gpodder <http://gpodder.org/>`_ web site.
|
||||
`gpodder <https://gpodder.github.io/>`_ web site.
|
||||
|
||||
|
||||
Mopidy-Podcast-iTunes
|
||||
@ -169,8 +169,8 @@ Mopidy-radio-de
|
||||
https://github.com/hechtus/mopidy-radio-de
|
||||
|
||||
Extension for listening to Internet radio stations and podcasts listed at
|
||||
`radio.de <http://www.radio.de/>`_, `radio.net <http://www.radio.net/>`_,
|
||||
`radio.fr <http://www.radio.fr/>`_, and `radio.at <http://www.radio.at/>`_.
|
||||
`radio.de <https://www.radio.de/>`_, `radio.net <https://www.radio.net/>`_,
|
||||
`radio.fr <https://www.radio.fr/>`_, and `radio.at <https://www.radio.at/>`_.
|
||||
|
||||
|
||||
Mopidy-RNZ
|
||||
@ -178,7 +178,7 @@ Mopidy-RNZ
|
||||
|
||||
https://github.com/danbrough/mopidy-rnz
|
||||
|
||||
Extension for playing `Radio New Zealands <http://www.radionz.co.nz>`_
|
||||
Extension for playing `Radio New Zealands <https://www.rnz.co.nz>`_
|
||||
podcasts,live streams and latest news bulletin.
|
||||
|
||||
|
||||
@ -240,7 +240,7 @@ Mopidy-TuneIn
|
||||
https://github.com/kingosticks/mopidy-tunein
|
||||
|
||||
Provides a backend for playing music from the `TuneIn
|
||||
<http://tunein.com/>`_ online radio service.
|
||||
<https://tunein.com/>`_ online radio service.
|
||||
|
||||
|
||||
Mopidy-VKontakte
|
||||
|
||||
@ -55,7 +55,7 @@ Mopidy-Touchscreen
|
||||
https://github.com/9and3r/mopidy-touchscreen
|
||||
|
||||
Extension for displaying track info and controlling Mopidy from a touch screen
|
||||
using `PyGame <http://www.pygame.org/>`_/SDL.
|
||||
using `PyGame <https://www.pygame.org/>`_/SDL.
|
||||
|
||||
|
||||
Mopidy-TtsGpio
|
||||
|
||||
@ -111,8 +111,8 @@ See :ref:`config` for general help on configuring Mopidy.
|
||||
allowed and so you don't need an entry for those. However, if your requests
|
||||
originate from a different web server, you will need to add an entry for
|
||||
that server in this list. For example, to allow requests from a web server
|
||||
at 'http://www.my.web-client.com' you would specify the entry
|
||||
'www.my.web-client.com'.
|
||||
at 'http://my-web-client.example.com' you would specify the entry
|
||||
'my-web-client.example.com'.
|
||||
|
||||
.. confval:: http/csrf_protection
|
||||
|
||||
|
||||
BIN
docs/ext/iris.jpg
Executable file → Normal file
|
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.
|
||||
|
||||
.. image:: /ext/api_explorer.png
|
||||
:width: 1176
|
||||
:height: 713
|
||||
.. image:: /ext/api_explorer.jpg
|
||||
:width: 696
|
||||
:height: 422
|
||||
|
||||
To install, run::
|
||||
|
||||
@ -43,7 +43,7 @@ Mopidy extension to automate music playback based on time of day.
|
||||
goals. Other web extensions will not work as expected when this extension
|
||||
is installed.
|
||||
|
||||
.. image:: /ext/auto.png
|
||||
.. image:: /ext/auto.jpg
|
||||
:width: 533
|
||||
:height: 370
|
||||
|
||||
@ -62,8 +62,8 @@ extensions in a user-friendly and intuitive interface. Built using React and
|
||||
Redux. Made by James Barnsley.
|
||||
|
||||
.. image:: /ext/iris.jpg
|
||||
:width: 888
|
||||
:height: 646
|
||||
:width: 696
|
||||
:height: 506
|
||||
|
||||
To install, run::
|
||||
|
||||
@ -95,9 +95,9 @@ https://github.com/matgallacher/mopidy-material-webclient
|
||||
|
||||
A Mopidy web client with an Android Material design feel.
|
||||
|
||||
.. image:: /ext/material_webclient.png
|
||||
:width: 960
|
||||
:height: 520
|
||||
.. image:: /ext/material_webclient.jpg
|
||||
:width: 696
|
||||
:height: 377
|
||||
|
||||
To install, run::
|
||||
|
||||
@ -112,9 +112,9 @@ https://github.com/tkem/mopidy-mobile
|
||||
A Mopidy web client extension and hybrid mobile app, made with Ionic,
|
||||
AngularJS and Apache Cordova by Thomas Kemmer.
|
||||
|
||||
.. image:: /ext/mobile.png
|
||||
:width: 1024
|
||||
:height: 606
|
||||
.. image:: /ext/mobile.jpg
|
||||
:width: 696
|
||||
:height: 412
|
||||
|
||||
To install, run::
|
||||
|
||||
@ -128,9 +128,9 @@ https://github.com/martijnboland/moped
|
||||
|
||||
A Mopidy web client made with AngularJS by Martijn Boland.
|
||||
|
||||
.. image:: /ext/moped.png
|
||||
:width: 720
|
||||
:height: 450
|
||||
.. image:: /ext/moped.jpg
|
||||
:width: 696
|
||||
:height: 435
|
||||
|
||||
To install, run::
|
||||
|
||||
@ -147,8 +147,8 @@ a more "complete" Spotify music experience. It's currently targeted at people
|
||||
using Spotify through Mopidy. Made by Dirk Groenen.
|
||||
|
||||
.. image:: /ext/mopify.jpg
|
||||
:width: 800
|
||||
:height: 416
|
||||
:width: 696
|
||||
:height: 362
|
||||
|
||||
To install, run::
|
||||
|
||||
@ -162,11 +162,11 @@ https://github.com/pimusicbox/mopidy-musicbox-webclient
|
||||
|
||||
The first web client for Mopidy, made with jQuery Mobile by Wouter van Wijk.
|
||||
Also the web client used for Wouter's popular `Pi Musicbox
|
||||
<http://www.pimusicbox.com/>`_ image for Raspberry Pi.
|
||||
<https://www.pimusicbox.com/>`_ image for Raspberry Pi.
|
||||
|
||||
.. image:: /ext/musicbox_webclient.png
|
||||
:width: 1312
|
||||
:height: 723
|
||||
.. image:: /ext/musicbox_webclient.jpg
|
||||
:width: 696
|
||||
:height: 384
|
||||
|
||||
To install, run::
|
||||
|
||||
@ -180,7 +180,7 @@ https://github.com/Lesterpig/mopidy-party
|
||||
|
||||
Minimal web client designed for collaborative music management during parties.
|
||||
|
||||
.. image:: /ext/mopidy_party.png
|
||||
.. image:: /ext/mopidy_party.jpg
|
||||
|
||||
To install, run::
|
||||
|
||||
@ -195,7 +195,7 @@ https://github.com/xolox/mopidy-simple-webclient
|
||||
A minimalistic web client targeted for mobile devices. Made with jQuery and
|
||||
Bootstrap by Peter Odding.
|
||||
|
||||
.. image:: /ext/simple_webclient.png
|
||||
.. image:: /ext/simple_webclient.jpg
|
||||
:width: 473
|
||||
:height: 373
|
||||
|
||||
@ -221,11 +221,11 @@ https://github.com/cowbell/mopster
|
||||
Simple web client hosted online written in Ember.js and styled using basic
|
||||
Bootstrap by Wojciech Wnętrzak.
|
||||
|
||||
.. image:: /ext/mopster.png
|
||||
:width: 1275
|
||||
:height: 628
|
||||
.. image:: /ext/mopster.jpg
|
||||
:width: 696
|
||||
:height: 343
|
||||
|
||||
To use, just visit http://mopster.cowbell-labs.com/.
|
||||
To use, just visit http://mopster.urizen.pl/.
|
||||
|
||||
|
||||
Mopidy-Jukepi
|
||||
@ -235,9 +235,9 @@ https://github.com/meantimeit/jukepi
|
||||
|
||||
A Mopidy web client built with Backbone by connrs.
|
||||
|
||||
.. image:: /ext/mopidy_jukepi.png
|
||||
:width: 1260
|
||||
:height: 961
|
||||
.. image:: /ext/mopidy_jukepi.jpg
|
||||
:width: 696
|
||||
:height: 531
|
||||
|
||||
To install, run::
|
||||
|
||||
|
||||
@ -32,7 +32,7 @@ named Soundspot to Mopidy, you would name your extension's Python package
|
||||
``mopidy_soundspot``.
|
||||
|
||||
The extension must be shipped with a ``setup.py`` file and be registered on
|
||||
`PyPI <https://pypi.python.org/>`_. The name of the distribution on PyPI would
|
||||
`PyPI <https://pypi.org/>`_. The name of the distribution on PyPI would
|
||||
be something like "Mopidy-Soundspot". Make sure to include the name "Mopidy"
|
||||
somewhere in that name and that you check the capitalization. This is the name
|
||||
users will use when they install your extension from PyPI.
|
||||
@ -61,7 +61,7 @@ Example content for the most important files follows below.
|
||||
cookiecutter project template
|
||||
=============================
|
||||
|
||||
We've also made a `cookiecutter <http://cookiecutter.readthedocs.org/>`_
|
||||
We've also made a `cookiecutter <https://cookiecutter.readthedocs.io/>`_
|
||||
project template for `creating new Mopidy extensions
|
||||
<https://github.com/mopidy/cookiecutter-mopidy-ext>`_. If you install
|
||||
cookiecutter and run a single command, you're asked a few questions about the
|
||||
@ -215,7 +215,7 @@ file::
|
||||
|
||||
For details on the ``MANIFEST.in`` file format, check out the `distutils docs
|
||||
<https://docs.python.org/2/distutils/sourcedist.html#manifest-template>`_.
|
||||
`check-manifest <https://pypi.python.org/pypi/check-manifest>`_ is a very
|
||||
`check-manifest <https://pypi.org/project/check-manifest>`_ is a very
|
||||
useful tool to check your ``MANIFEST.in`` file for completeness.
|
||||
|
||||
|
||||
@ -485,7 +485,7 @@ If you make HTTP requests please make sure to respect the :ref:`proxy configs
|
||||
configured by the Mopidy user. To make this easier for extension developers,
|
||||
the helper function :func:`mopidy.httpclient.format_proxy` was added in Mopidy
|
||||
1.1. This function returns the proxy settings `formatted the way Requests
|
||||
expects <http://www.python-requests.org/en/latest/user/advanced/#proxies>`__.
|
||||
expects <https://2.python-requests.org/en/master/user/advanced/#proxies>`__.
|
||||
|
||||
User-Agent strings
|
||||
------------------
|
||||
@ -505,7 +505,7 @@ Example using Requests sessions
|
||||
-------------------------------
|
||||
|
||||
Most Mopidy extensions that make HTTP requests use the `Requests
|
||||
<http://www.python-requests.org/>`_ library to do so. When using Requests, the
|
||||
<https://2.python-requests.org/>`_ library to do so. When using Requests, the
|
||||
most convenient way to make sure the proxy and User-Agent header is set
|
||||
properly is to create a Requests session object and use that object to make all
|
||||
your HTTP requests::
|
||||
@ -541,7 +541,7 @@ your HTTP requests::
|
||||
# ``session`` object.
|
||||
|
||||
For further details, see Requests' docs on `session objects
|
||||
<http://www.python-requests.org/en/latest/user/advanced/#session-objects>`__.
|
||||
<https://2.python-requests.org/en/master/user/advanced/#session-objects>`__.
|
||||
|
||||
Testing extensions
|
||||
==================
|
||||
@ -554,8 +554,8 @@ extension in some unanticipated way.
|
||||
Before getting started, it is important to familiarize yourself with the
|
||||
Python `mock library <https://docs.python.org/dev/library/unittest.mock.html>`_.
|
||||
When it comes to running tests, Mopidy typically makes use of testing tools
|
||||
like `tox <https://tox.readthedocs.org/en/latest/>`_ and
|
||||
`pytest <http://pytest.org/latest/>`_.
|
||||
like `tox <https://tox.readthedocs.io/>`_ and
|
||||
`pytest <https://docs.pytest.org/>`_.
|
||||
|
||||
Testing approach
|
||||
----------------
|
||||
@ -646,9 +646,9 @@ file, and mocking the audio actor::
|
||||
The following libraries might be useful for mocking any HTTP requests that
|
||||
your extension makes:
|
||||
|
||||
- `responses <https://pypi.python.org/pypi/responses>`_ - A utility library for
|
||||
- `responses <https://pypi.org/project/responses>`_ - A utility library for
|
||||
mocking out the requests Python library.
|
||||
- `vcrpy <https://pypi.python.org/pypi/vcrpy>`_ - Automatically mock your HTTP
|
||||
- `vcrpy <https://pypi.org/project/vcrpy>`_ - Automatically mock your HTTP
|
||||
interactions to simplify and speed up testing.
|
||||
|
||||
At the very least, you'll probably want to patch ``requests`` or any other web
|
||||
|
||||
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
|
||||
<https://discourse.mopidy.com/>`_. We also hang around at IRC on the
|
||||
``#mopidy`` channel at `irc.freenode.net <http://freenode.net/>`_. The IRC
|
||||
channel has `public searchable logs <https://botbot.me/freenode/mopidy/>`_.
|
||||
``#mopidy`` channel at `irc.freenode.net <http://freenode.net/>`_.
|
||||
|
||||
If you stumble into a bug or have a feature request, please create an issue in
|
||||
the `issue tracker <https://github.com/mopidy/mopidy/issues>`_. If you're
|
||||
@ -121,8 +120,9 @@ announcements related to Mopidy and Mopidy extensions.
|
||||
|
||||
authors
|
||||
sponsors
|
||||
changelog
|
||||
versioning
|
||||
changelog
|
||||
history/index
|
||||
|
||||
|
||||
.. toctree::
|
||||
|
||||
@ -9,7 +9,7 @@ If you are running OS X, you can install everything needed with Homebrew.
|
||||
|
||||
xcode-select --install
|
||||
|
||||
#. Install `Homebrew <https://github.com/Homebrew/homebrew>`_.
|
||||
#. Install `Homebrew <https://brew.sh/>`_.
|
||||
|
||||
#. If you are already using Homebrew, make sure your installation is up to
|
||||
date before you continue::
|
||||
|
||||
@ -18,7 +18,7 @@ How to for Raspbian
|
||||
===================
|
||||
|
||||
#. Download the latest Raspbian Desktop or Lite disk image from
|
||||
http://www.raspberrypi.org/downloads/raspbian/.
|
||||
https://www.raspberrypi.org/downloads/raspbian/.
|
||||
|
||||
Unless you need a full graphical desktop the Lite image is preferable since
|
||||
it's much smaller.
|
||||
@ -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 want to change your audio output setting, simply rerun ``sudo
|
||||
If you want to change your audio output setting, simply rerun ``sudo
|
||||
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
|
||||
|
||||
This will use ``pip`` to install the latest release of `Mopidy from PyPI
|
||||
<https://pypi.python.org/pypi/Mopidy>`_. To upgrade Mopidy to future
|
||||
<https://pypi.org/project/Mopidy>`_. To upgrade Mopidy to future
|
||||
releases, just rerun this command.
|
||||
|
||||
#. Finally, you need to set a couple of :doc:`config values </config>`, and
|
||||
|
||||
@ -101,7 +101,7 @@ When using PulseAudio, you will typically have a PulseAudio server run by your
|
||||
main user. Since Mopidy is running as its own user, it can't access this server
|
||||
directly. Running PulseAudio as a system-wide daemon is discouraged by upstream
|
||||
(see `here
|
||||
<http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/WhatIsWrongWithSystemWide/>`_
|
||||
<https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/WhatIsWrongWithSystemWide/>`_
|
||||
for details). Rather you can configure PulseAudio and Mopidy so Mopidy sends
|
||||
the sound to the PulseAudio server already running as your main user.
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@ Sharing config and log output
|
||||
=============================
|
||||
|
||||
If you're getting help at IRC, we recommend that you use a pastebin, like
|
||||
`pastebin.com <http://pastebin.com/>`_ or `GitHub Gist
|
||||
`pastebin.com <https://pastebin.com/>`_ or `GitHub Gist
|
||||
<https://gist.github.com/>`_, to share your configuration and log output.
|
||||
Pasting more than a couple of lines on IRC is generally frowned upon. On the
|
||||
mailing list or when reporting an issue, somewhat longer text dumps are
|
||||
@ -79,7 +79,7 @@ Debugging GStreamer
|
||||
|
||||
If you really want to dig in and debug GStreamer behaviour, then check out the
|
||||
`Debugging section
|
||||
<http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-checklist-debug.html>`_
|
||||
<https://gstreamer.freedesktop.org/documentation/application-development/appendix/checklist-element.html?gi-language=python>`_
|
||||
of GStreamer's documentation for your options. Note that Mopidy does not
|
||||
support the GStreamer command line options, like ``--gst-debug-level=3``, but
|
||||
setting GStreamer environment variables, like :envvar:`GST_DEBUG`, works with
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
Versioning
|
||||
**********
|
||||
|
||||
Mopidy follows `Semantic Versioning <http://semver.org/>`_. In summary this
|
||||
Mopidy follows `Semantic Versioning <https://semver.org/>`_. In summary this
|
||||
means that our version numbers have three parts, MAJOR.MINOR.PATCH, which
|
||||
change according to the following rules:
|
||||
|
||||
|
||||
@ -14,4 +14,4 @@ if not (2, 7) <= sys.version_info < (3,):
|
||||
warnings.filterwarnings('ignore', 'could not open display')
|
||||
|
||||
|
||||
__version__ = '2.2.2'
|
||||
__version__ = '2.2.3'
|
||||
|
||||
@ -114,12 +114,6 @@ class _Outputs(Gst.Bin):
|
||||
ghost_pad = Gst.GhostPad.new('sink', self._tee.get_static_pad('sink'))
|
||||
self.add_pad(ghost_pad)
|
||||
|
||||
# Add an always connected fakesink which respects the clock so the tee
|
||||
# doesn't fail even if we don't have any outputs.
|
||||
fakesink = Gst.ElementFactory.make('fakesink')
|
||||
fakesink.set_property('sync', True)
|
||||
self._add(fakesink)
|
||||
|
||||
def add_output(self, description):
|
||||
# XXX This only works for pipelines not in use until #790 gets done.
|
||||
try:
|
||||
@ -262,7 +256,7 @@ class _Handler(object):
|
||||
target_state = _GST_STATE_MAPPING.get(self._audio._target_state)
|
||||
if target_state is None:
|
||||
# XXX: Workaround for #1430, to be fixed properly by #1222.
|
||||
logger.debug('Race condition happened. See #1222 and #1430.')
|
||||
logger.warn('Race condition happened. See #1222 and #1430.')
|
||||
return
|
||||
if target_state == new_state:
|
||||
target_state = None
|
||||
@ -280,6 +274,10 @@ class _Handler(object):
|
||||
self._audio._playbin, Gst.DebugGraphDetails.ALL, 'mopidy')
|
||||
|
||||
def on_buffering(self, percent, structure=None):
|
||||
if self._audio._target_state < Gst.State.PAUSED:
|
||||
gst_logger.debug('Skip buffering during track change.')
|
||||
return
|
||||
|
||||
if structure is not None and structure.has_field('buffering-mode'):
|
||||
buffering_mode = structure.get_enum(
|
||||
'buffering-mode', Gst.BufferingMode)
|
||||
@ -398,7 +396,7 @@ class _Handler(object):
|
||||
class Audio(pykka.ThreadingActor):
|
||||
|
||||
"""
|
||||
Audio output through `GStreamer <http://gstreamer.freedesktop.org/>`_.
|
||||
Audio output through `GStreamer <https://gstreamer.freedesktop.org/>`_.
|
||||
"""
|
||||
|
||||
#: The GStreamer state mapped to :class:`mopidy.audio.PlaybackState`
|
||||
@ -711,7 +709,6 @@ class Audio(pykka.ThreadingActor):
|
||||
|
||||
:rtype: :class:`True` if successfull, else :class:`False`
|
||||
"""
|
||||
self._buffering = False
|
||||
return self._set_state(Gst.State.NULL)
|
||||
|
||||
def wait_for_state_change(self):
|
||||
@ -754,6 +751,9 @@ class Audio(pykka.ThreadingActor):
|
||||
:type state: :class:`Gst.State`
|
||||
:rtype: :class:`True` if successfull, else :class:`False`
|
||||
"""
|
||||
if state < Gst.State.PAUSED:
|
||||
self._buffering = False
|
||||
|
||||
self._target_state = state
|
||||
result = self._playbin.set_state(state)
|
||||
gst_logger.debug(
|
||||
|
||||
@ -5,7 +5,15 @@ media_dirs =
|
||||
~/|Home
|
||||
show_dotfiles = false
|
||||
excluded_file_extensions =
|
||||
.jpg
|
||||
.directory
|
||||
.html
|
||||
.jpeg
|
||||
.jpg
|
||||
.log
|
||||
.nfo
|
||||
.pdf
|
||||
.png
|
||||
.txt
|
||||
.zip
|
||||
follow_symlinks = false
|
||||
metadata_timeout = 1000
|
||||
|
||||
@ -84,7 +84,7 @@ def parse_pls(data):
|
||||
if section.lower() != 'playlist':
|
||||
continue
|
||||
for i in range(cp.getint(section, 'numberofentries')):
|
||||
yield cp.get(section, 'file%d' % (i + 1))
|
||||
yield cp.get(section, 'file%d' % (i + 1)).strip('\"\'')
|
||||
|
||||
|
||||
def parse_xspf(data):
|
||||
|
||||
@ -12,5 +12,7 @@ excluded_file_extensions =
|
||||
.jpg
|
||||
.log
|
||||
.nfo
|
||||
.pdf
|
||||
.png
|
||||
.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
|
||||
rather incomplete with regards to data formats, both for requests and
|
||||
responses. Thus, we have had to talk a great deal with the the original `MPD
|
||||
server <http://mpd.wikia.com/>`_ using telnet to get the details we need to
|
||||
server <https://mpd.fandom.com/>`_ using telnet to get the details we need to
|
||||
implement our own MPD server which is compatible with the numerous existing
|
||||
`MPD clients <http://mpd.wikia.com/wiki/Clients>`_.
|
||||
`MPD clients <https://mpd.fandom.com/wiki/Clients>`_.
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
@ -42,7 +42,8 @@ def mixrampdb(context, decibels):
|
||||
doesn't fade the track volume, just overlaps. The songs need to have
|
||||
MixRamp tags added by an external tool. 0dB is the normalized maximum
|
||||
volume so use negative values, I prefer -17dB. In the absence of mixramp
|
||||
tags crossfading will be used. See http://sourceforge.net/projects/mixramp
|
||||
tags crossfading will be used. See
|
||||
https://sourceforge.net/projects/mixramp/
|
||||
"""
|
||||
raise exceptions.MpdNotImplemented # TODO
|
||||
|
||||
|
||||
@ -31,11 +31,11 @@ file:///tmp/baz
|
||||
|
||||
PLS = b"""[Playlist]
|
||||
NumberOfEntries=3
|
||||
File1=file:///tmp/foo
|
||||
File1="file:///tmp/foo"
|
||||
Title1=Sample Title
|
||||
Length1=123
|
||||
|
||||
File2=file:///tmp/bar
|
||||
File2='file:///tmp/bar'
|
||||
Title2=Example \xc5\xa7\xc5\x95
|
||||
Length2=321
|
||||
File3=file:///tmp/baz
|
||||
|
||||