Changelog 1.x series
This is the changelog of Mopidy v1.0.0 through v1.1.2.
For the latest releases, see Changelog.
v1.1.2 (2016-01-18)
Bug fix release.
Main: Catch errors when loading the
logging/config_file
file. (Fixes: #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: #1352, PR: #1356)
Core: Skips over unplayable tracks if the user attempts to change tracks while paused, like we already did if in playing state. (Fixes #1378, PR: #1379)
Core: Make
lookup()
ignore tracks with empty URIs. (Partly fixes: #1340, PR: #1381)Core: Fix crash if backends emits events with wrong names or arguments. (Fixes: #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: #1299)Local: If the scan or clear commands are used on a library that does not exist, exit with an error. (Fixes: #1298)
MPD: Notify idling clients when a seek is performed. (Fixes: #1331)
MPD: Don’t return tracks with empty URIs. (Partly fixes: #1340, PR: #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: #1393, PR: #1397)Proxy: Handle case where
proxy/port
is either missing from config or set to an empty string. (PR: #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
mopidy.core.LibraryController.refresh()
work for all backends with a library provider. Previously, it wrongly worked for all backends with a playlists provider. (Fixes: #1257)Core: Respect
core/cache_dir
andcore/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/var/lib/mopidy/.local
and/var/lib/mopidy/.cache
. (Fixes: #1259, PR: #1266)Core: Fix error in
get_eot_tlid()
docstring. (Fixes: #1269)Audio: Add
timeout
parameter toscan()
. (Part of: #1250, PR: #1281)Extension support: Make
get_cache_dir()
,get_config_dir()
, andget_data_dir()
class methods, so they can be used without creating an instance of theExtension
class. (Fixes: #1275)Local: Deprecate
local/data_dir
and respectcore/data_dir
instead. This does not change the defaults for desktop users, only system services installed from packages that properly setcore/data_dir
, like the Debian and Arch packages. (Fixes: #1259, PR: #1266)Local: Change default value of
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
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 setcore/data_dir
, like the Debian and Arch pakages. (Fixes: #1259, PR: #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: #1250, PR: #1281)
Stream: If “file” is present in the
stream/protocols
config value and the Mopidy-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 thestream/protocols
config, and then proceed startup. (Fixes: #1248, PR: #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: #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: #1249, PR: #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: #1260, PR: #1261)
File: Allow looking up metadata about any
file://
URI, just like we did in Mopidy 1.0.x, where Mopidy-Stream handledfile://
URIs. In Mopidy 1.1.0, Mopidy-File did not allow one to lookup files outside the directories listed infile/media_dir
. This broke Mopidy-Local-SQLite when thelocal/media_dir
directory was not within one of thefile/media_dirs
directories. For browsing of files, we still limit access to files inside thefile/media_dir
directories. For lookup, you can now read metadata for any file you know the path of. (Fixes: #1268, PR: #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 everyone who has contributed, 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: #1090)mopidy.core.PlaylistsController.filter()
Updated core controllers to handle backend exceptions in all calls that rely on multiple backends. (Issue: #667)
Update core methods to do strict input checking. (Fixes: #700)
Add
tlid
alternatives to methods that taketl_track
and also addget_{eot,next,previous}_tlid
methods as light weight alternatives to thetl_track
versions of the calls. (Fixes: #1131, PR: #1136, #1140)Add
mopidy.core.PlaybackController.get_current_tlid()
. (Part of: #1137)Update core to handle backend crashes and bad data. (Fixes: #1161)
Add
core/max_tracklist_length
config and limitation. (Fixes: #997 PR: #1225)Added
playlist_deleted
event. (Fixes: #996)
Models
Added type checks and other sanity checks to model construction and serialization. (Fixes: #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: #348)
Added
mopidy.models.Artist.sortname
field that is mapped tomusicbrainz-sortname
tag. (Fixes: #940)
Configuration
Add new configurations to set base directories to be used by Mopidy and Mopidy extensions:
core/cache_dir
,core/config_dir
, andcore/data_dir
. (Fixes: #843, PR: #1232)
Extension support
Add new methods to
Extension
class for getting cache, config and data directories specific to your extension: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: #843, PR: #1232)
Add
mopidy.httpclient.format_proxy()
andmopidy.httpclient.format_user_agent()
. (Part of: #1156)It is now possible to import
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: #1068, PR: #1115)
Local backend
Filter out
None
fromget_distinct()
results. All returned results should be strings. (Fixes: #1202)
Stream backend
Move stream playlist parsing from GStreamer to the stream backend. (Fixes: #671)
File backend
The Mopidy-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: #1004, PR: #1207)
M3U backend
Support loading UTF-8 encoded M3U files with the
.m3u8
file extension. (PR: #1193)
MPD frontend
The MPD command
count
now ignores tracks with no length, which would previously cause aTypeError
. (PR: #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: #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: #1218, PR: #1219)Implement
tagtypes
MPD command. (PR: #1235)Exclude empty tags fields from metadata output. (Fixes: #1045, PR: #1235)
Implement protocol extensions to output Album URIs and Album Images when outputting track data to clients. (PR: #1230)
The MPD commands
lsinfo
andlistplaylists
are now implemented using theas_list()
method, which retrieves a lot less data and is thus much faster than the deprecatedget_playlists()
. The drawback is that theLast-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
v1.0.8 (2015-07-22)
Bug fix release.
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
inmopidy.core.LibraryController.get_distinct()
. (Fixes: #1181, PR: #1183)Core: Make sure track changes make it to audio while paused. (Fixes: #1177, PR: #1185)
v1.0.5 (2015-05-19)
Bug fix release.
v1.0.4 (2015-04-30)
Bug fix release.
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: #1153, PR: #1154)
Audio: Follow-up fix for #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: #1147, PR: #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 #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: #1147, PR: #1152)
Audio: Make sure mute events get emitted by software mixer. (Fixes: #1146, PR: #1152)
v1.0.1 (2015-04-23)
Bug fix release.
Core: Make the new history controller available for use. (Fixes: mopidy.js#6)
Audio: Software volume control has been reworked to greatly reduce the delay between changing the volume and the change taking effect. (Fixes: #1097, PR: #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: #726, PR: issue:1124)
HTTP: Fix threading bug that would cause duplicate delivery of WS messages. (PR: #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 #1120, PR: #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 everyone who has contributed!
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:
Semantic 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: #952)
Add
mopidy.core.HistoryController
which keeps track of what tracks have been played. (Fixes: #423, #1056, PR: #803, #1063)Add
mopidy.core.MixerController
which keeps track of volume and mute. (Fixes: #962)
Core library controller
Deprecated:
mopidy.core.LibraryController.find_exact()
. Usemopidy.core.LibraryController.search()
with theexact
keyword argument set toTrue
.Deprecated: The
uri
argument tomopidy.core.LibraryController.lookup()
. Use newuris
keyword argument instead.Add
exact
keyword argument tomopidy.core.LibraryController.search()
.Add
uris
keyword argument tomopidy.core.LibraryController.lookup()
which allows for simpler lookup of multiple URIs. (Fixes: #1008, PR: #1047)Updated
mopidy.core.LibraryController.search()
andmopidy.core.LibraryController.find_exact()
to normalize and warn about malformed queries from clients. (Fixes: #1067, PR: #1073)Add
mopidy.core.LibraryController.get_distinct()
for getting unique values for a given field. (Fixes: #913, PR: #1022)Add
mopidy.core.LibraryController.get_images()
for looking up images for any URI that is known to the backends. (Fixes #973, PR: #981, #992 and #1013)
Core playlist controller
Deprecated:
mopidy.core.PlaylistsController.get_playlists()
. Useas_list()
andget_items()
instead. (Fixes: #1057, PR: #1075)Deprecated:
mopidy.core.PlaylistsController.filter()
. Useas_list()
and filter yourself.Add
mopidy.core.PlaylistsController.as_list()
. (Fixes: #1057, PR: #1075)Add
mopidy.core.PlaylistsController.get_items()
. (Fixes: #1057, PR: #1075)
Core tracklist controller
Removed: The following methods were documented as internal. They are now fully private and unavailable outside the core actor. (Fixes: #1058, PR: #1062)
mopidy.core.TracklistController.mark_played()
mopidy.core.TracklistController.mark_playing()
mopidy.core.TracklistController.mark_unplayable()
Add
uris
argument tomopidy.core.TracklistController.add()
which allows for simpler addition of multiple URIs to the tracklist. (Fixes: #1060, PR: #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: #1070, PR: #1076)
mopidy.core.PlaybackController.change_track()
is now internal.Removed
on_error_step
keyword argument frommopidy.core.PlaybackController.play()
Removed
clear_current_track
keyword argument tomopidy.core.PlaybackController.stop()
.Made the following event triggers internal:
mopidy.core.PlaybackController.on_end_of_track()
mopidy.core.PlaybackController.on_stream_changed()
mopidy.core.PlaybackController.on_tracklist_changed()
mopidy.core.PlaybackController.set_current_tl_track()
is now internal.
Deprecated: The old methods on
mopidy.core.PlaybackController
for volume and mute management have been deprecated. Usemopidy.core.MixerController
instead. (Fixes: #962)When seeking while paused, we no longer change to playing. (Fixes: #939, PR: #1018)
Changed
mopidy.core.PlaybackController.play()
to take the return value frommopidy.backend.PlaybackProvider.change_track()
into account when determining the success of theplay()
call. (PR: #1071)Add
mopidy.core.Listener.stream_title_changed()
andmopidy.core.PlaybackController.get_stream_title()
for letting clients know about the current title in streams. (PR: #938, #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
mopidy.backend.LibraryProvider.find_exact()
.Add an
exact
keyword argument tomopidy.backend.LibraryProvider.search()
to replace the oldfind_exact()
method.
Backend playlist providers
Removed: Remove default implementation of
mopidy.backend.PlaylistsProvider.playlists
. This is potentially backwards incompatible. (PR: #1046)Changed the API for
mopidy.backend.PlaylistsProvider
. Note that this change is not backwards compatible. These changes are important to reduce the Mopidy startup time. (Fixes: #1057, PR: #1075)Remove
mopidy.backend.PlaylistsProvider.playlists
property.
Backend playback providers
Changed the API for
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: #1052, PR: #1064)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
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
mopidy.backend.PlaybackProvider.translate_uri()
ormopidy.backend.PlaybackProvider.change_track()
to continue working.mopidy.backend.PlaybackProvider.prepare_change()
has been added.
Models
Add
mopidy.models.Image
model to be returned bymopidy.core.LibraryController.get_images()
. (Part of #973)Change the semantics of
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 ofmopidy.models.Playlist.last_modified
. (Fixes: #678, PR: #1036)
Commands
Make the
mopidy
command print a friendly error message if thegobject
Python module cannot be imported. (Fixes: #836)Add support for repeating the
-v
argument four times to set the log level for all loggers to the lowest possible value, including log records at levels lower thanDEBUG
too.Add path to the current
mopidy
executable to the output ofmopidy deps
. This make it easier to see that a user is using pip-installed Mopidy instead of APT-installed Mopidy without asking forwhich mopidy
output.
Configuration
Logging
Local backend
Add symlink support with loop protection to file finder. (Fixes: #858, PR: #874)
Add
--force
option formopidy local scan
for forcing a full rescan of the library. (Fixes: #910, PR: #1010)Stop ignoring
offset
andlimit
in searches when using the default JSON backed local library. (Fixes: #917, PR: #949)Removed double triggering of
playlists_loaded
event. (Fixes: #998, PR: #999)Cleanup and refactoring of local playlist code. Preserves playlist names better and fixes bug in deletion of playlists. (Fixes: #937, PR: #995 and rebased into #1000)
Moved playlist support out to a new extension, Mopidy-M3U.
Deprecated: The config value
local/playlists_dir
is no longer in use and can be removed from your config.
Local library API
Implementors of
mopidy.local.Library.lookup()
should now return a list ofTrack
instead of a single track, just like the otherlookup()
methods in Mopidy. For now, returning a single track will continue to work. (PR: #840)Add support for giving local libraries direct access to tags and duration. (Fixes: #967)
Add
mopidy.local.Library.get_images()
for looking up images for local URIs. (Fixes: #1031, PR: #1032 and #1037)
Stream backend
M3U backend
MPD frontend
Add support for blacklisting MPD commands. This is used to prevent clients from using
listall
andlistallinfo
which recursively lookup the entire “database”. If you insist on using a client that needs these commands changempd/command_blacklist
.Start setting the
Name
field with the stream title when listening to radio streams. (Fixes: #944, PR: #1030)Enable browsing of artist references, in addition to albums and playlists. (PR: #884)
Switch the
list
command over to using the new methodmopidy.core.LibraryController.get_distinct()
for increased performance. (Fixes: #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: #934, PR: #968)
Add support for
toggleoutput
command. (PR: #1015)The
mixrampdb
andmixrampdelay
commands are now known to Mopidy, but are not implemented. (PR: #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: #1044)
HTTP frontend
Deprecated: Deprecated the
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: #1020)
Mixers
Add support for disabling volume control in Mopidy entirely by setting the configuration
audio/mixer
tonone
. (Fixes: #936, PR: #1015, #1035)
Audio
Removed: Support for visualizers and the
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
mopidy.audio.Audio.emit_end_of_stream()
. Pass aNone
buffer tomopidy.audio.Audio.emit_data()
to end the stream. This should only affect Mopidy-Spotify.Add
mopidy.audio.AudioListener.tags_changed()
. Notifies core when new tags are found.Add
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: #853)
Add workaround for volume not persisting across tracks on OS X. (Issue: #886, PR: #958)
Improved missing plugin error reporting in scanner. (PR: #1033)
Introduced a new return type for the scanner, a named tuple with
uri
,tags
,duration
,seekable
andmime
. (PR: #1033)Added support for checking if the media is seekable, and getting the initial MIME type guess. (PR: #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: mopidy.js#1)Default to
wss://
as the WebSocket protocol if the page is hosted onhttps://
. This has no effect if thewebSocketUrl
setting is specified. (Pull request: mopidy.js#2)Upgrade dependencies.
Development
Add new contribution guidelines.
Add new development guide.
Speed up event emitting.
Changed test runner from nose to py.test. (PR: #1024)