Skip to main content

MopidyAPI

MopidyAPI is a Python (3.6+) library for interacting with Mopidy via its JSON RPC API.

MopidyAPI uses HTTP to call RPC methods, and websockets to listen for events.

It is compatible with all functions present in Mopidy 3.0.1.

Installation

pip install mopidyapi

Usage

MopidyAPI contains functions mapping to each of the Mopidy v3.0.1 core API functions.

For example mopidy.core.PlaybackController.pause() in the documentation maps to MopidyAPI.playback.pause() here.

Quick example

>>> from mopidyapi import MopidyAPI
>>> m = MopidyAPI()
>>> tracks = m.tracklist.get_tracks()
>>> tracks[0].name

	'I've Seen Footage'

>>> tracks[0].artists

	[Artist(name='Death Grips', uri='spotify:artist:5RADpgYLOuS2ZxDq7ggYYH')]

>>> tracks[0]._fields

	('album',
	 'name',
	 'disc_no',
	 'uri',
	 'length',
	 'track_no',
	 'artists',
	 'date',
	 'bitrate')

Connecting to Mopidy

To connect to Mopidy, you need to instantiate a MopidyAPI object. By default, it will connect to Mopidy at localhost:6680, so you might not need to give the constructor any arguments.

from mopidyapi import MopidyAPI
m = MopidyAPI(host='my.mopidy.host.com', port=6680)

You can also pass use_websockets=False, to prevent starting the websocket listener, which runs in a separate thread. However, event listening (described below) won't work with this set.

Calling Mopidy functions

All of the functions described in the Mopidy 3.0.1 core API documentation are available in MopidyAPI.

Functions named in the Mopidy docs as core.<ControllerName>Controller.<functionname>(), will be under the name MopidyAPI.<controllername>.<functionname>()

For example, you can pause the music by calling m.playback.pause(), or you could search for a song by calling e.g. m.library.search(artist='Rick Astley'), where m = MopidyAPI().

Functions will return Python native namedtuple representations of the returned data.

Event listening

You can use function decorators to mark specific functions to be called when an event arrives. See example below.

The events used are described in Mopidy's core events documentation.

from mopidyapi import MopidyAPI
m = MopidyAPI()

@m.on_event('volume_changed')
def print_volume(event):
    print(f"Volume changed to: {event.volume}")

@m.on_event('track_playback_started')
def print_newtracks(event):
    print(f"Started playing track: {event.track.name}")

Like with function calls, the events passed are namedtuples.

If you need to add and remove callbacks more dynamically, you can use the add_callback and del_callback functions.

del_callback accepts two keyword arguments:

  • event: an event name string to remove all callbacks for
  • f: a callback function to remove

You can use one or both. Here's an example of passing a function to del_callback:

from mopidyapi import MopidyAPI
m = MopidyAPI()

def print_volume(event):
    """ Print volume only once. Delete callback after first call """
    print(f"Volume changed to: {event.volume}")
    m.del_callback(f=print_volume)

m.add_callback('volume_changed', print_volume)

An important caveat with both the event listener decorators and add methods, is that it will not warn you in any way, if you use an invalid event name (e.g. you misspell the event name).

Note on the choice of namedtuples

Why namedtuples?

The choice of namedtuples might seem unusual (or even inconvenient), but they have a number of advantages over dictionaries for this application:

1. Less verbose than dicts.

event.tl_track.track.album.name

is shorter and easier on the eyes than

event['tl_track']['track']['album']['name']

2. They print much more neatly.

Artist(name='Death Grips', uri='spotify:artist:5RADpgYLOuS2ZxDq7ggYYH')

is much better than

{'name': 'Death Grips', 'uri': 'spotify:artist:5RADpgYLOuS2ZxDq7ggYYH'}.

3. namedtuples accurately represent the immutable nature of the data.

Being allowed to mutate the data coming from Mopidy might give one the idea that this would change the data inside Mopidy, which is obviously not the case.

...but, I know dicts!

Okay, so if you need .keys(), you can use ._fields() instead, and if you absolutely need a dict, you can use ._asdict(), which will return an actual dict.

Contributing

Please do tell me about bugs via the github issue tracker.

Also feel free to write, if you're just in the mood to help me improve this project. I don't bite :)

License

This project is licensed under the GPLv3. See the LICENSE file for details.

Metadata

Release files for raveberry-mopidyapi 1.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for raveberry-mopidyapi 1.0.2
File Size Uploaded Provenance Actions
raveberry-mopidyapi-1.0.2.tar.gz 35.7 kB Without provenance Details for raveberry-mopidyapi-1.0.2.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for raveberry-mopidyapi 1.0.2
File Interpreter ABI Platform Actions
raveberry_mopidyapi-1.0.2-py3-none-any.whl Python 3 none any Details for raveberry_mopidyapi-1.0.2-py3-none-any.whl

Total release size: 63.2 kB

Release files / raveberry-mopidyapi-1.0.2.tar.gz

Download URL raveberry-mopidyapi-1.0.2.tar.gz
Size 35.7 kB
Tags Source
SHA-256 checksum
How to use checksums
9505565f60135a0b0230c27ad9432d0f7b77704a67ef864ff2dbdf62bad0812b
BLAKE2b-256 checksum
How to use checksums
81c43c8a71c1c45ceb77909ff6fc84ef7d0ffad38f695052afb049c9cd41501f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/3.7.3 pkginfo/1.7.0 requests/2.25.0 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.8.10

Release files / raveberry_mopidyapi-1.0.2-py3-none-any.whl

Download URL raveberry_mopidyapi-1.0.2-py3-none-any.whl
Size 27.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
74015d7e4e5b04eb59beea9bca74164623d0be191c92e2843b049f228c6d5c6c
BLAKE2b-256 checksum
How to use checksums
487efd435d9a1b54408f095d89142e15e665bf379ca725730bba36d15ec0d020
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/3.7.3 pkginfo/1.7.0 requests/2.25.0 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.8.10

Security for raveberry-mopidyapi 1.0.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.0.2 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page