From e00b590ae9757edbb565a8e788a54defd76a6bed Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Tue, 30 Oct 2012 22:30:13 +0100 Subject: [PATCH 001/151] Detangle EOT and EOS. This commit tries to detangle EOS from EOT which we have incorrectly intermingled. EOS events should only be happening at the end of the playlist when we are about to stop. EOT handling has been removed / broken in this change, and will need to be re-added with proper tests. --- mopidy/core/actor.py | 2 +- mopidy/core/playback.py | 7 +++++-- tests/backends/base/playback.py | 6 ++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/mopidy/core/actor.py b/mopidy/core/actor.py index cd4ba180..072a989b 100644 --- a/mopidy/core/actor.py +++ b/mopidy/core/actor.py @@ -56,7 +56,7 @@ class Core(pykka.ThreadingActor, AudioListener, BackendListener): """List of URI schemes we can handle""" def reached_end_of_stream(self): - self.playback.on_end_of_track() + self.playback.on_end_of_stream() def state_changed(self, old_state, new_state): # XXX: This is a temporary fix for issue #232 while we wait for a more diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index 4941ef0f..73227f68 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -312,6 +312,11 @@ class PlaybackController(object): elif old_state == PlaybackState.PAUSED: self.pause() + def on_end_of_stream(self): + self._trigger_track_playback_ended() + self.state = PlaybackState.STOPPED + self.current_cp_track = None + def on_end_of_track(self): """ Tell the playback controller that end of track is reached. @@ -326,8 +331,6 @@ class PlaybackController(object): if self.tl_track_at_eot: self._trigger_track_playback_ended() self.play(self.tl_track_at_eot) - else: - self.stop(clear_current_track=True) if self.consume: self.core.tracklist.remove(tlid=original_tl_track.tlid) diff --git a/tests/backends/base/playback.py b/tests/backends/base/playback.py index 09dffbab..ea6cbbf4 100644 --- a/tests/backends/base/playback.py +++ b/tests/backends/base/playback.py @@ -110,6 +110,7 @@ class PlaybackControllerTest(object): def test_current_track_after_completed_playlist(self): self.playback.play(self.tracklist.tl_tracks[-1]) self.playback.on_end_of_track() + self.playback.on_end_of_stream() self.assertEqual(self.playback.state, PlaybackState.STOPPED) self.assertEqual(self.playback.current_track, None) @@ -338,6 +339,8 @@ class PlaybackControllerTest(object): self.playback.on_end_of_track() + self.playback.on_end_of_stream() + self.assertEqual(self.playback.state, PlaybackState.STOPPED) @populate_tracklist @@ -346,6 +349,7 @@ class PlaybackControllerTest(object): for _ in self.tracks: self.playback.on_end_of_track() + self.playback.on_end_of_stream() self.assertEqual(self.playback.current_track, None) self.assertEqual(self.playback.state, PlaybackState.STOPPED) @@ -510,6 +514,7 @@ class PlaybackControllerTest(object): def test_tracklist_position_at_end_of_playlist(self): self.playback.play(self.tracklist.tl_tracks[-1]) self.playback.on_end_of_track() + self.playback.on_end_of_stream() self.assertEqual(self.playback.tracklist_position, None) def test_on_tracklist_change_gets_called(self): @@ -815,6 +820,7 @@ class PlaybackControllerTest(object): def test_end_of_playlist_stops(self): self.playback.play(self.tracklist.tl_tracks[-1]) self.playback.on_end_of_track() + self.playback.on_end_of_stream() self.assertEqual(self.playback.state, PlaybackState.STOPPED) def test_repeat_off_by_default(self): From 3a9ce05b7c8bed3e77255033b17c391de06bd8be Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 1 Nov 2012 22:28:57 +0100 Subject: [PATCH 002/151] Add change track to playback providers. This method is intended to make implementing EOT handling much more streamlined by adding a way to easily just change the URI and any other state without messing with gstreamer pipe states Naming of this is a bit unfortunate as it is not the same as the core.playback's concept of change_track. At least not yet --- mopidy/backends/base.py | 21 ++++++++++++++++++--- mopidy/backends/spotify/playback.py | 18 +++++------------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/mopidy/backends/base.py b/mopidy/backends/base.py index 8250a24c..ebef096f 100644 --- a/mopidy/backends/base.py +++ b/mopidy/backends/base.py @@ -88,8 +88,8 @@ class BaseLibraryProvider(object): class BasePlaybackProvider(object): """ - :param audio: the audio actor - :type audio: actor proxy to an instance of :class:`mopidy.audio.Audio` + :param audio: audio sub-system + :type audio: actor proxy to a :class:`mopidy.audio.Audio` actor. :param backend: the backend :type backend: :class:`mopidy.backends.base.Backend` """ @@ -121,9 +121,24 @@ class BasePlaybackProvider(object): :rtype: :class:`True` if successful, else :class:`False` """ self.audio.prepare_change() - self.audio.set_uri(track.uri).get() + self.change_track(track) return self.audio.start_playback().get() + def change_track(self, track): + """ + Swith to provided track. + + Used for handling of EOT and and in :meth:`play`. + + *MAY be reimplemented by subclass.* + + :param track: the track to play + :type track: :class:`mopidy.models.Track` + :rtype: :class:`True` if successful, else :class:`False` + """ + self.audio.set_uri(track.uri).get() + return True + def resume(self): """ Resume playback at the same time position playback was paused. diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index e4534172..2e41f072 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -23,26 +23,18 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): return super(SpotifyPlaybackProvider, self).pause() - def play(self, track): - if track.uri is None: - return False - + def change_track(self, track): + self.audio.set_uri('appsrc://').get() + self.audio.set_metadata(track).get() try: self.backend.spotify.session.load( Link.from_string(track.uri).as_track()) self.backend.spotify.session.play(1) - - self.audio.prepare_change() - self.audio.set_uri('appsrc://') - self.audio.start_playback() - self.audio.set_metadata(track) - - self._timer.play() - - return True except SpotifyError as e: logger.info('Playback of %s failed: %s', track.uri, e) return False + self._timer.play() + return True def resume(self): time_position = self.get_time_position() From 2a391f23e1a11b84de0a2bb665989e49b9a7129a Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 8 Nov 2012 23:17:48 +0100 Subject: [PATCH 003/151] Use source's factory name to determine type. Checking the URI inside the new-source handler turned out to tickle some issue that gave us deadlocks. Getting the source and checking which factory created it is much safer. --- mopidy/audio/actor.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 7de98075..1f482301 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -78,8 +78,9 @@ class Audio(pykka.ThreadingActor): self._appsrc = None def _on_new_source(self, element, pad): - uri = element.get_property('uri') - if not uri or not uri.startswith('appsrc://'): + source = element.get_property('source') + + if source.get_factory().get_name() != 'appsrc': return # These caps matches the audio data provided by libspotify @@ -87,7 +88,6 @@ class Audio(pykka.ThreadingActor): b'audio/x-raw-int, endianness=(int)1234, channels=(int)2, ' b'width=(int)16, depth=(int)16, signed=(boolean)true, ' b'rate=(int)44100') - source = element.get_property('source') source.set_property('caps', default_caps) # GStreamer does not like unicode source.set_property('format', b'time') From 1f544038b046df8bc4652b6547b136acb33077af Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 8 Nov 2012 23:41:39 +0100 Subject: [PATCH 004/151] Setup about to finish handling for proper EOT support. With this change we ask the core.playback system to set the next tracks uri and otherwise update state as needed. With this change we should be able to support streaming oggs and gapless playback to mention a few of items this fixes. On the down side, this change breaks test_end_of_track_skips_to_next_track_on_failure as there is no clean way to handle this with the async nature of this EOT handling. --- mopidy/audio/actor.py | 7 +++++++ mopidy/core/playback.py | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 1f482301..0a0cb0be 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -77,6 +77,13 @@ class Audio(pykka.ThreadingActor): def _on_about_to_finish(self, element): self._appsrc = None + # TODO: this is just a horrible hack to get us started. the + # comunication is correct, but this way of hooking it up is not. + from mopidy.core import Core + logger.debug(u'Triggering reached end of track event') + core = pykka.ActorRegistry.get_by_class(Core)[0].proxy() + core.playback.on_end_of_track().get() + def _on_new_source(self, element, pad): source = element.get_property('source') diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index 73227f68..3ca2631f 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -315,7 +315,7 @@ class PlaybackController(object): def on_end_of_stream(self): self._trigger_track_playback_ended() self.state = PlaybackState.STOPPED - self.current_cp_track = None + self.current_tl_track = None def on_end_of_track(self): """ @@ -329,8 +329,10 @@ class PlaybackController(object): original_tl_track = self.current_tl_track if self.tl_track_at_eot: + self.current_tl_track = self.tl_track_at_eot self._trigger_track_playback_ended() - self.play(self.tl_track_at_eot) + self._get_backend().playback.change_track(self.current_track) + self._trigger_track_playback_started() if self.consume: self.core.tracklist.remove(tlid=original_tl_track.tlid) From 167932278b3751d2bc138953bf6fb2a364dda0c8 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 22 Dec 2012 18:57:36 +0100 Subject: [PATCH 005/151] audio: Remove blocking get_state() calls in get_position() and seek() --- mopidy/audio/actor.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 1b6c79b3..714ab0a6 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -274,13 +274,11 @@ class Audio(pykka.ThreadingActor): :rtype: int """ - if self._playbin.get_state()[1] == gst.STATE_NULL: - return 0 try: position = self._playbin.query_position(gst.FORMAT_TIME)[0] return position // gst.MSECOND - except gst.QueryError, e: - logger.error('time_position failed: %s', e) + except gst.QueryError: + logger.debug('Position query failed') return 0 def set_position(self, position): @@ -291,12 +289,9 @@ class Audio(pykka.ThreadingActor): :type position: int :rtype: :class:`True` if successful, else :class:`False` """ - self._playbin.get_state() # block until state changes are done - handeled = self._playbin.seek_simple( + return self._playbin.seek_simple( gst.Format(gst.FORMAT_TIME), gst.SEEK_FLAG_FLUSH, position * gst.MSECOND) - self._playbin.get_state() # block until seek is done - return handeled def start_playback(self): """ From 9fa0f5213ee59e62d889d67ea439993cad70edc1 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 22 Dec 2012 18:57:03 +0100 Subject: [PATCH 006/151] audio: Setup appsrc with seek-data callback --- mopidy/audio/actor.py | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 714ab0a6..bd974bed 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -39,13 +39,17 @@ class Audio(pykka.ThreadingActor): super(Audio, self).__init__() self._playbin = None + self._mixer = None self._mixer_track = None self._mixer_scale = None self._software_mixing = False - self._appsrc = None self._volume_set = None + self._appsrc = None + self._appsrc_seek_data_callback = None + self._appsrc_seek_data_id = None + self._notify_source_signal_id = None self._about_to_finish_id = None self._message_signal_id = None @@ -77,7 +81,12 @@ class Audio(pykka.ThreadingActor): 'notify::source', self._on_new_source) def _on_about_to_finish(self, element): - self._appsrc = None + source, self._appsrc = self._appsrc, None + if source is None: + return + if self._appsrc_seek_data_id is not None: + source.disconnect(self._appsrc_seek_data_id) + self._appsrc_seek_data_id = None def _on_new_source(self, element, pad): uri = element.get_property('uri') @@ -93,9 +102,19 @@ class Audio(pykka.ThreadingActor): source.set_property('caps', default_caps) # GStreamer does not like unicode source.set_property('format', b'time') + source.set_property('stream-type', b'seekable') + + self._appsrc_seek_data_id = source.connect( + 'seek-data', self._appsrc_on_seek_data) self._appsrc = source + def _appsrc_on_seek_data(self, appsrc, time_in_ns): + time_in_ms = time_in_ns // gst.MSECOND + if self._appsrc_seek_data_callback is not None: + self._appsrc_seek_data_callback(time_in_ms) + return True + def _teardown_playbin(self): if self._about_to_finish_id: self._playbin.disconnect(self._about_to_finish_id) @@ -242,6 +261,19 @@ class Audio(pykka.ThreadingActor): """ self._playbin.set_property('uri', uri) + def set_appsrc(self, seek_data=None): + """ + Switch to using appsrc for getting audio to be played. + + You *MUST* call :meth:`prepare_change` before calling this method. + + :param seek_data: callback for when data from a new position is needed + to continue playback + :type seek_data: callable which takes time position in ms + """ + self._appsrc_seek_data_callback = seek_data + self._playbin.set_property('uri', 'appsrc://') + def emit_data(self, buffer_): """ Call this to deliver raw audio data to be played. From c7656cdc15e71320fb910c6eaf2ffb4a340b9de2 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 22 Dec 2012 20:24:58 +0100 Subject: [PATCH 007/151] spotify: Replace wall clock timer with GStreamer timer --- mopidy/backends/spotify/playback.py | 93 ++++------------------ mopidy/backends/spotify/session_manager.py | 4 + 2 files changed, 19 insertions(+), 78 deletions(-) diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index e4534172..d80ef543 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -1,113 +1,50 @@ from __future__ import unicode_literals import logging -import time +import functools from spotify import Link, SpotifyError from mopidy.backends import base -from mopidy.core import PlaybackState logger = logging.getLogger('mopidy.backends.spotify') +def seek_data_callback(spotify_backend, time_position): + logger.debug('seek_data_callback(%d) called', time_position) + spotify_backend.playback.on_seek_data(time_position) + + class SpotifyPlaybackProvider(base.BasePlaybackProvider): - def __init__(self, *args, **kwargs): - super(SpotifyPlaybackProvider, self).__init__(*args, **kwargs) - - self._timer = TrackPositionTimer() - - def pause(self): - self._timer.pause() - - return super(SpotifyPlaybackProvider, self).pause() - def play(self, track): if track.uri is None: return False + spotify_backend = self.backend.actor_ref.proxy() + seek_data_callback_bound = functools.partial( + seek_data_callback, spotify_backend) + try: self.backend.spotify.session.load( Link.from_string(track.uri).as_track()) self.backend.spotify.session.play(1) self.audio.prepare_change() - self.audio.set_uri('appsrc://') + self.audio.set_appsrc(seek_data=seek_data_callback_bound) self.audio.start_playback() self.audio.set_metadata(track) - self._timer.play() - return True except SpotifyError as e: logger.info('Playback of %s failed: %s', track.uri, e) return False - def resume(self): - time_position = self.get_time_position() - self._timer.resume() - self.audio.prepare_change() - result = self.seek(time_position) - self.audio.start_playback() - return result - - def seek(self, time_position): - self.backend.spotify.session.seek(time_position) - self._timer.seek(time_position) - return True - def stop(self): self.backend.spotify.session.play(0) - return super(SpotifyPlaybackProvider, self).stop() - def get_time_position(self): - # XXX: The default implementation of get_time_position hangs/times out - # when used with the Spotify backend and GStreamer appsrc. If this can - # be resolved, we no longer need to use a wall clock based time - # position for Spotify playback. - return self._timer.get_time_position() - - -class TrackPositionTimer(object): - """ - Keeps track of time position in a track using the wall clock and playback - events. - - To not introduce a reverse dependency on the playback controller, this - class keeps track of playback state itself. - """ - - def __init__(self): - self._state = PlaybackState.STOPPED - self._accumulated = 0 - self._started = 0 - - def play(self): - self._state = PlaybackState.PLAYING - self._accumulated = 0 - self._started = self._wall_time() - - def pause(self): - self._state = PlaybackState.PAUSED - self._accumulated += self._wall_time() - self._started - - def resume(self): - self._state = PlaybackState.PLAYING - - def seek(self, time_position): - self._started = self._wall_time() - self._accumulated = time_position - - def get_time_position(self): - if self._state == PlaybackState.PLAYING: - time_since_started = self._wall_time() - self._started - return self._accumulated + time_since_started - elif self._state == PlaybackState.PAUSED: - return self._accumulated - elif self._state == PlaybackState.STOPPED: - return 0 - - def _wall_time(self): - return int(time.time() * 1000) + def on_seek_data(self, time_position): + logger.debug('playback.on_seek_data(%d) called', time_position) + self.backend.spotify.next_buffer_timestamp = time_position + self.backend.spotify.session.seek(time_position) diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index f2631406..0eed9939 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -46,6 +46,7 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): self.backend_ref = backend_ref self.connected = threading.Event() + self.next_buffer_timestamp = None self.container_manager = None self.playlist_manager = None @@ -121,6 +122,9 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): } buffer_ = gst.Buffer(bytes(frames)) buffer_.set_caps(gst.caps_from_string(capabilites)) + if self.next_buffer_timestamp is not None: + buffer_.timestamp = self.next_buffer_timestamp * gst.MSECOND + self.next_buffer_timestamp = None if self.audio.emit_data(buffer_).get(): return num_frames From b3e92ff5731e4070b2a78712f76bfdd8268d8e14 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 23 Dec 2012 12:35:52 +0100 Subject: [PATCH 008/151] audio: Log buffering messages --- mopidy/audio/actor.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index bd974bed..c524bae1 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -207,6 +207,9 @@ class Audio(pykka.ThreadingActor): and message.src == self._playbin): old_state, new_state, pending_state = message.parse_state_changed() self._on_playbin_state_changed(old_state, new_state, pending_state) + elif message.type == gst.MESSAGE_BUFFERING: + percent = message.parse_buffering() + logger.debug('Buffer %d%% full', percent) elif message.type == gst.MESSAGE_EOS: self._on_end_of_stream() elif message.type == gst.MESSAGE_ERROR: From a555e84225b4411a5acebac38124562f1bb19a43 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 23 Dec 2012 12:36:37 +0100 Subject: [PATCH 009/151] audio: Add appsrc need-data and enough-data callbacks --- mopidy/audio/actor.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index c524bae1..9f96c161 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -47,6 +47,10 @@ class Audio(pykka.ThreadingActor): self._volume_set = None self._appsrc = None + self._appsrc_need_data_callback = None + self._appsrc_need_data_id = None + self._appsrc_enough_data_callback = None + self._appsrc_enough_data_id = None self._appsrc_seek_data_callback = None self._appsrc_seek_data_id = None @@ -84,6 +88,12 @@ class Audio(pykka.ThreadingActor): source, self._appsrc = self._appsrc, None if source is None: return + if self._appsrc_need_data_id is not None: + source.disconnect(self._appsrc_need_data_id) + self._appsrc_need_data_id = None + if self._appsrc_enough_data_id is not None: + source.disconnect(self._appsrc_enough_data_id) + self._appsrc_enough_data_id = None if self._appsrc_seek_data_id is not None: source.disconnect(self._appsrc_seek_data_id) self._appsrc_seek_data_id = None @@ -104,11 +114,26 @@ class Audio(pykka.ThreadingActor): source.set_property('format', b'time') source.set_property('stream-type', b'seekable') + self._appsrc_need_data_id = source.connect( + 'need-data', self._appsrc_on_need_data) + self._appsrc_enough_data_id = source.connect( + 'enough-data', self._appsrc_on_enough_data) self._appsrc_seek_data_id = source.connect( 'seek-data', self._appsrc_on_seek_data) self._appsrc = source + def _appsrc_on_need_data(self, appsrc, length_hint_in_ns): + length_hint_in_ms = length_hint_in_ns // gst.MSECOND + if self._appsrc_need_data_callback is not None: + self._appsrc_need_data_callback(length_hint_in_ms) + return True + + def _appsrc_on_enough_data(self, appsrc): + if self._appsrc_enough_data_callback is not None: + self._appsrc_enough_data_callback() + return True + def _appsrc_on_seek_data(self, appsrc, time_in_ns): time_in_ms = time_in_ns // gst.MSECOND if self._appsrc_seek_data_callback is not None: @@ -264,16 +289,22 @@ class Audio(pykka.ThreadingActor): """ self._playbin.set_property('uri', uri) - def set_appsrc(self, seek_data=None): + def set_appsrc(self, need_data=None, enough_data=None, seek_data=None): """ Switch to using appsrc for getting audio to be played. You *MUST* call :meth:`prepare_change` before calling this method. + :param need_data: callback for when appsrc needs data + :type need_data: callable which takes data length hint in ms + :param enough_data: callback for when appsrc has enough data + :type enough_data: callable :param seek_data: callback for when data from a new position is needed to continue playback :type seek_data: callable which takes time position in ms """ + self._appsrc_need_data_callback = need_data + self._appsrc_enough_data_callback = enough_data self._appsrc_seek_data_callback = seek_data self._playbin.set_property('uri', 'appsrc://') From a02f2a96020bc4ad0f7ef2cd6c597c325c879435 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 23 Dec 2012 12:37:12 +0100 Subject: [PATCH 010/151] audio: Make appsrc buffer between 0.5 and 1 MB of data --- mopidy/audio/actor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 9f96c161..c3d11d98 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -110,9 +110,10 @@ class Audio(pykka.ThreadingActor): b'rate=(int)44100') source = element.get_property('source') source.set_property('caps', default_caps) - # GStreamer does not like unicode source.set_property('format', b'time') source.set_property('stream-type', b'seekable') + source.set_property('max-bytes', 1024 * 1024) # 1 MB + source.set_property('min-percent', 50) self._appsrc_need_data_id = source.connect( 'need-data', self._appsrc_on_need_data) From 50e8ff04b3fe6718e394567dd785fba58ec20768 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 23 Dec 2012 12:38:37 +0100 Subject: [PATCH 011/151] spotify: Only push audio data when GStreamer wants more --- mopidy/backends/spotify/playback.py | 23 +++++++++++++++++++++- mopidy/backends/spotify/session_manager.py | 5 +++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index d80ef543..9855e124 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -11,6 +11,16 @@ from mopidy.backends import base logger = logging.getLogger('mopidy.backends.spotify') +def need_data_callback(spotify_backend, length_hint): + logger.debug('need_data_callback(%d) called', length_hint) + spotify_backend.playback.on_need_data(length_hint) + + +def enough_data_callback(spotify_backend): + logger.debug('enough_data_callback() called') + spotify_backend.playback.on_enough_data() + + def seek_data_callback(spotify_backend, time_position): logger.debug('seek_data_callback(%d) called', time_position) spotify_backend.playback.on_seek_data(time_position) @@ -31,7 +41,10 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): self.backend.spotify.session.play(1) self.audio.prepare_change() - self.audio.set_appsrc(seek_data=seek_data_callback_bound) + self.audio.set_appsrc( + need_data=None, + enough_data=None, + seek_data=seek_data_callback_bound) self.audio.start_playback() self.audio.set_metadata(track) @@ -44,6 +57,14 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): self.backend.spotify.session.play(0) return super(SpotifyPlaybackProvider, self).stop() + def on_need_data(self, length_hint): + logger.debug('playback.on_need_data(%d) called', length_hint) + self.backend.spotify.push_audio_data = True + + def on_enough_data(self): + logger.debug('playback.on_enough_data() called') + self.backend.spotify.push_audio_data = False + def on_seek_data(self, time_position): logger.debug('playback.on_seek_data(%d) called', time_position) self.backend.spotify.next_buffer_timestamp = time_position diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index 0eed9939..a9c0884e 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -46,6 +46,7 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): self.backend_ref = backend_ref self.connected = threading.Event() + self.push_audio_data = True self.next_buffer_timestamp = None self.container_manager = None @@ -107,6 +108,10 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): """Callback used by pyspotify""" # pylint: disable = R0913 # Too many arguments (8/5) + + if not self.push_audio_data: + return 0 + assert sample_type == 0, 'Expects 16-bit signed integer samples' capabilites = """ audio/x-raw-int, From c218375100f8fbe7c7d08e4e59453c3a6597c871 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 24 Dec 2012 01:40:35 +0100 Subject: [PATCH 012/151] audio: Move Spotify appsrc caps out of audio --- mopidy/audio/actor.py | 18 ++++++++++-------- mopidy/backends/spotify/playback.py | 10 +++++++++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index bd974bed..65edd037 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -47,6 +47,7 @@ class Audio(pykka.ThreadingActor): self._volume_set = None self._appsrc = None + self._appsrc_caps = None self._appsrc_seek_data_callback = None self._appsrc_seek_data_id = None @@ -84,6 +85,7 @@ class Audio(pykka.ThreadingActor): source, self._appsrc = self._appsrc, None if source is None: return + self._appsrc_caps = None if self._appsrc_seek_data_id is not None: source.disconnect(self._appsrc_seek_data_id) self._appsrc_seek_data_id = None @@ -93,14 +95,8 @@ class Audio(pykka.ThreadingActor): if not uri or not uri.startswith('appsrc://'): return - # These caps matches the audio data provided by libspotify - default_caps = gst.Caps( - b'audio/x-raw-int, endianness=(int)1234, channels=(int)2, ' - b'width=(int)16, depth=(int)16, signed=(boolean)true, ' - b'rate=(int)44100') source = element.get_property('source') - source.set_property('caps', default_caps) - # GStreamer does not like unicode + source.set_property('caps', self._appsrc_caps) source.set_property('format', b'time') source.set_property('stream-type', b'seekable') @@ -261,16 +257,22 @@ class Audio(pykka.ThreadingActor): """ self._playbin.set_property('uri', uri) - def set_appsrc(self, seek_data=None): + def set_appsrc(self, caps, seek_data=None): """ Switch to using appsrc for getting audio to be played. You *MUST* call :meth:`prepare_change` before calling this method. + :param caps: GStreamer caps string describing the audio format to + expect + :type caps: string :param seek_data: callback for when data from a new position is needed to continue playback :type seek_data: callable which takes time position in ms """ + if isinstance(caps, unicode): + caps = caps.encode('utf-8') + self._appsrc_caps = gst.Caps(caps) self._appsrc_seek_data_callback = seek_data self._playbin.set_property('uri', 'appsrc://') diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index d80ef543..9069ce7e 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -17,6 +17,12 @@ def seek_data_callback(spotify_backend, time_position): class SpotifyPlaybackProvider(base.BasePlaybackProvider): + # These GStreamer caps matches the audio data provided by libspotify + _caps = ( + 'audio/x-raw-int, endianness=(int)1234, channels=(int)2, ' + 'width=(int)16, depth=(int)16, signed=(boolean)true, ' + 'rate=(int)44100') + def play(self, track): if track.uri is None: return False @@ -31,7 +37,9 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): self.backend.spotify.session.play(1) self.audio.prepare_change() - self.audio.set_appsrc(seek_data=seek_data_callback_bound) + self.audio.set_appsrc( + self._caps, + seek_data=seek_data_callback_bound) self.audio.start_playback() self.audio.set_metadata(track) From 01bb71107465849f1a64371cf2a46992d491b5c6 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 24 Dec 2012 11:11:39 +0100 Subject: [PATCH 013/151] docs: Add v0.12 section to changelog --- docs/changes.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/changes.rst b/docs/changes.rst index e705444b..23e53be0 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -5,6 +5,12 @@ Changes This change log is used to track all major changes to Mopidy. +v0.12.0 (in development) +======================== + +(in development) + + v0.11.0 (2012-12-24) ==================== From 81b9d1116dd4096077b5cb48abded1e2fe2208ad Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 24 Dec 2012 12:13:00 +0100 Subject: [PATCH 014/151] docs: Update changelog --- docs/changes.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/changes.rst b/docs/changes.rst index 23e53be0..89707b6a 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -10,6 +10,10 @@ v0.12.0 (in development) (in development) +**Spotify** + +- Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`) + v0.11.0 (2012-12-24) ==================== From aa0c6f6dc02a9ccf114bd95499256d9a973b7573 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 24 Dec 2012 12:18:48 +0100 Subject: [PATCH 015/151] audio: Add MB constant to make code more readable --- mopidy/audio/actor.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 6aecbe8a..672aa540 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -21,6 +21,9 @@ logger = logging.getLogger('mopidy.audio') mixers.register_mixers() +MB = 1 << 20 + + class Audio(pykka.ThreadingActor): """ Audio output through `GStreamer `_. @@ -109,7 +112,7 @@ class Audio(pykka.ThreadingActor): source.set_property('caps', self._appsrc_caps) source.set_property('format', b'time') source.set_property('stream-type', b'seekable') - source.set_property('max-bytes', 1024 * 1024) # 1 MB + source.set_property('max-bytes', 1 * MB) source.set_property('min-percent', 50) self._appsrc_need_data_id = source.connect( From 7c790d61b2c046960a578725b546cec1555eb064 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 24 Dec 2012 12:21:05 +0100 Subject: [PATCH 016/151] spotify: Hook need-data and enough-data callbacks onto appsrc --- mopidy/backends/spotify/playback.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index 6899ee47..45850107 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -38,6 +38,10 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): return False spotify_backend = self.backend.actor_ref.proxy() + need_data_callback_bound = functools.partial( + need_data_callback, spotify_backend) + enough_data_callback_bound = functools.partial( + enough_data_callback, spotify_backend) seek_data_callback_bound = functools.partial( seek_data_callback, spotify_backend) @@ -49,8 +53,8 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): self.audio.prepare_change() self.audio.set_appsrc( self._caps, - need_data=None, - enough_data=None, + need_data=need_data_callback_bound, + enough_data=enough_data_callback_bound, seek_data=seek_data_callback_bound) self.audio.start_playback() self.audio.set_metadata(track) From 5e94aa19ec5419a30c219746acd5f265dfaaf75c Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 24 Dec 2012 12:51:13 +0100 Subject: [PATCH 017/151] spotify: Reduce callback logging --- mopidy/backends/spotify/playback.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index 45850107..c148972c 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -12,17 +12,14 @@ logger = logging.getLogger('mopidy.backends.spotify') def need_data_callback(spotify_backend, length_hint): - logger.debug('need_data_callback(%d) called', length_hint) spotify_backend.playback.on_need_data(length_hint) def enough_data_callback(spotify_backend): - logger.debug('enough_data_callback() called') spotify_backend.playback.on_enough_data() def seek_data_callback(spotify_backend, time_position): - logger.debug('seek_data_callback(%d) called', time_position) spotify_backend.playback.on_seek_data(time_position) From 3a4a9e60e00e851d460c4aeed3cbac22fe545cb9 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Mon, 24 Dec 2012 13:55:46 +0100 Subject: [PATCH 018/151] Fix use of threading.Event for Python 2.6 and clear connected state. threading.Event's wait method returns None on python pre 2.7, which means all searches would fail. This also corrects that fact that we weren't clearing the connected threading event on disconnects. I did not add any tests for this at this time as I just want to get the fix out. --- mopidy/backends/spotify/library.py | 4 +++- mopidy/backends/spotify/session_manager.py | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/mopidy/backends/spotify/library.py b/mopidy/backends/spotify/library.py index a8a9bcd6..96e5f616 100644 --- a/mopidy/backends/spotify/library.py +++ b/mopidy/backends/spotify/library.py @@ -163,7 +163,9 @@ class SpotifyLibraryProvider(base.BaseLibraryProvider): translator.to_mopidy_track(t) for t in results.tracks()]) future.set(search_result) - if not self.backend.spotify.connected.wait(settings.SPOTIFY_TIMEOUT): + # Wait always returns None on python 2.6 :/ + self.backend.spotify.connected.wait(settings.SPOTIFY_TIMEOUT) + if not self.backend.spotify.connected.is_set(): logger.debug('Not connected: Spotify search cancelled') return SearchResult(uri='spotify:search') diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index 0eed9939..ad0a806e 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -84,6 +84,7 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): def logged_out(self, session): """Callback used by pyspotify""" logger.info('Disconnected from Spotify') + self.connected.clear() def metadata_updated(self, session): """Callback used by pyspotify""" From f1aa1f9d665946b5f80085947872d211aea537d2 Mon Sep 17 00:00:00 2001 From: "Jeremy B. Merrill" Date: Mon, 24 Dec 2012 13:14:01 -0500 Subject: [PATCH 019/151] Add caveat about static in sound test file. Add a note saying that the purpose of the "aplay ... Front_Center.wav" line is merely to test whether the sound works or not, rather than to test its quality. Anecdotally, I had very static-y sound from the aplay command, which prompted me to incorrectly believe that my sound would not work with Mopidy. As it turns out, the sound works fine using Mopidy or gstreamer. This note will hopefully keep other Mopidy users from thinking their sound is broken when it is not. (I ended up installing armhf version and trying to use despotify, which didn't work, before coming back to Mopidy.) --- docs/installation/raspberrypi.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/installation/raspberrypi.rst b/docs/installation/raspberrypi.rst index fbb07364..8a4d9409 100644 --- a/docs/installation/raspberrypi.rst +++ b/docs/installation/raspberrypi.rst @@ -210,6 +210,10 @@ software packages, as Wheezy is going to be the next release of Debian. aplay /usr/share/sounds/alsa/Front_Center.wav + If you hear a voice saying "Front Center," then your sound is working. Don't + be concerned if this test sound includes static, output from Mopidy will not. + Test your sound with gstreamer to determine sound quality. + To make the change to analog output stick, you can add the ``amixer`` command to e.g. ``/etc/rc.local``, which will be executed when the system is booting. From 8a0c48e61e51ed700ec2e286bd20ad4f1551a843 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 27 Dec 2012 00:30:03 +0100 Subject: [PATCH 020/151] Add timestamp and duration to all spotify buffers. This fixes the issue where pausing playback would show the time of the last timestamped buffer instead of the current time. We also make sure to reset the time when we start a new track. This was done by overriding the play method on the session manager as it is also used for pausing, resuming and stopping. Ideally this should probably be reworked to avoid the gst import in mopidy.backends.spotify.playback, but for now this should do. --- mopidy/backends/spotify/playback.py | 7 ++++++- mopidy/backends/spotify/session_manager.py | 10 ++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index 9069ce7e..d7e622fb 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -1,5 +1,9 @@ from __future__ import unicode_literals +import pygst +pygst.require('0.10') +import gst + import logging import functools @@ -35,6 +39,7 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): self.backend.spotify.session.load( Link.from_string(track.uri).as_track()) self.backend.spotify.session.play(1) + self.backend.spotify.buffer_timestamp = 0 self.audio.prepare_change() self.audio.set_appsrc( @@ -54,5 +59,5 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): def on_seek_data(self, time_position): logger.debug('playback.on_seek_data(%d) called', time_position) - self.backend.spotify.next_buffer_timestamp = time_position + self.backend.spotify.buffer_timestamp = time_position * gst.MSECOND self.backend.spotify.session.seek(time_position) diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index ad0a806e..d372bfa4 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -46,7 +46,7 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): self.backend_ref = backend_ref self.connected = threading.Event() - self.next_buffer_timestamp = None + self.buffer_timestamp = 0 self.container_manager = None self.playlist_manager = None @@ -121,11 +121,13 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): 'sample_rate': sample_rate, 'channels': channels, } + buffer_ = gst.Buffer(bytes(frames)) buffer_.set_caps(gst.caps_from_string(capabilites)) - if self.next_buffer_timestamp is not None: - buffer_.timestamp = self.next_buffer_timestamp * gst.MSECOND - self.next_buffer_timestamp = None + buffer_.timestamp = self.buffer_timestamp + buffer_.duration = num_frames * gst.SECOND / sample_rate + + self.buffer_timestamp += buffer_.duration if self.audio.emit_data(buffer_).get(): return num_frames From ce750ddbf9ef3becefb2d613954eb422b4e3026b Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 27 Dec 2012 03:28:44 +0100 Subject: [PATCH 021/151] Fix racecondition triggered KeyError in our DebugThread. --- mopidy/utils/process.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mopidy/utils/process.py b/mopidy/utils/process.py index 5edf287e..6be8937c 100644 --- a/mopidy/utils/process.py +++ b/mopidy/utils/process.py @@ -101,7 +101,7 @@ class DebugThread(threading.Thread): stack = ''.join(traceback.format_stack(frame)) logger.debug( 'Current state of %s (%s):\n%s', - threads[ident], ident, stack) + threads.get(ident, '?'), ident, stack) del frame self.event.clear() From ab7bb2e2fa7dea4f368dc48b6d8524511dd61929 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 27 Dec 2012 20:36:25 +0100 Subject: [PATCH 022/151] Update authors list --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index d536c059..45e1a37e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -13,3 +13,4 @@ - Matt Bray - Trygve Aaberge - Wouter van Wijk +- Jeremy B. Merrill From 0459f037a4e51886ccfbbdb59e7b70cea60e5f03 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 27 Dec 2012 20:44:19 +0100 Subject: [PATCH 023/151] spotify: Remove gst import from spotify.playback module --- mopidy/backends/spotify/playback.py | 6 +----- mopidy/backends/spotify/session_manager.py | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index d7e622fb..63ee45cc 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -1,9 +1,5 @@ from __future__ import unicode_literals -import pygst -pygst.require('0.10') -import gst - import logging import functools @@ -59,5 +55,5 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): def on_seek_data(self, time_position): logger.debug('playback.on_seek_data(%d) called', time_position) - self.backend.spotify.buffer_timestamp = time_position * gst.MSECOND + self.backend.spotify.buffer_timestamp = time_position self.backend.spotify.session.seek(time_position) diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index d372bfa4..82287497 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -124,7 +124,7 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): buffer_ = gst.Buffer(bytes(frames)) buffer_.set_caps(gst.caps_from_string(capabilites)) - buffer_.timestamp = self.buffer_timestamp + buffer_.timestamp = self.buffer_timestamp * gst.MSECOND buffer_.duration = num_frames * gst.SECOND / sample_rate self.buffer_timestamp += buffer_.duration From f9c50051c2dfae3da74dc777c01dcbe365e7706f Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 27 Dec 2012 20:53:20 +0100 Subject: [PATCH 024/151] Revert "spotify: Remove gst import from spotify.playback module" This reverts commit 0459f037a4e51886ccfbbdb59e7b70cea60e5f03. --- mopidy/backends/spotify/playback.py | 6 +++++- mopidy/backends/spotify/session_manager.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index 63ee45cc..d7e622fb 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -1,5 +1,9 @@ from __future__ import unicode_literals +import pygst +pygst.require('0.10') +import gst + import logging import functools @@ -55,5 +59,5 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): def on_seek_data(self, time_position): logger.debug('playback.on_seek_data(%d) called', time_position) - self.backend.spotify.buffer_timestamp = time_position + self.backend.spotify.buffer_timestamp = time_position * gst.MSECOND self.backend.spotify.session.seek(time_position) diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index 82287497..d372bfa4 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -124,7 +124,7 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): buffer_ = gst.Buffer(bytes(frames)) buffer_.set_caps(gst.caps_from_string(capabilites)) - buffer_.timestamp = self.buffer_timestamp * gst.MSECOND + buffer_.timestamp = self.buffer_timestamp buffer_.duration = num_frames * gst.SECOND / sample_rate self.buffer_timestamp += buffer_.duration From b4028e9c577c03277cfc39b24b070fd4868a3847 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 27 Dec 2012 20:58:05 +0100 Subject: [PATCH 025/151] spotify: Remove gst import from spotify.playback module --- mopidy/backends/spotify/playback.py | 8 ++------ mopidy/backends/spotify/session_manager.py | 8 ++++---- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index d7e622fb..2937f881 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -1,9 +1,5 @@ from __future__ import unicode_literals -import pygst -pygst.require('0.10') -import gst - import logging import functools @@ -39,7 +35,7 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): self.backend.spotify.session.load( Link.from_string(track.uri).as_track()) self.backend.spotify.session.play(1) - self.backend.spotify.buffer_timestamp = 0 + self.backend.spotify.buffer_timestamp_in_ms = 0 self.audio.prepare_change() self.audio.set_appsrc( @@ -59,5 +55,5 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): def on_seek_data(self, time_position): logger.debug('playback.on_seek_data(%d) called', time_position) - self.backend.spotify.buffer_timestamp = time_position * gst.MSECOND + self.backend.spotify.buffer_timestamp_in_ms = time_position self.backend.spotify.session.seek(time_position) diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index d372bfa4..6eba6f05 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -46,7 +46,7 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): self.backend_ref = backend_ref self.connected = threading.Event() - self.buffer_timestamp = 0 + self.buffer_timestamp_in_ms = 0 self.container_manager = None self.playlist_manager = None @@ -124,10 +124,10 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): buffer_ = gst.Buffer(bytes(frames)) buffer_.set_caps(gst.caps_from_string(capabilites)) - buffer_.timestamp = self.buffer_timestamp - buffer_.duration = num_frames * gst.SECOND / sample_rate + buffer_.timestamp = self.buffer_timestamp_in_ms * gst.MSECOND + buffer_.duration = num_frames * gst.SECOND // sample_rate - self.buffer_timestamp += buffer_.duration + self.buffer_timestamp_in_ms += buffer_.duration // gst.MSECOND if self.audio.emit_data(buffer_).get(): return num_frames From ea431c2f184fa432ff03b1d77778eb3a21690df0 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 27 Dec 2012 21:00:37 +0100 Subject: [PATCH 026/151] Revert "spotify: Remove gst import from spotify.playback module" This reverts commit b4028e9c577c03277cfc39b24b070fd4868a3847. --- mopidy/backends/spotify/playback.py | 8 ++++++-- mopidy/backends/spotify/session_manager.py | 8 ++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index 2937f881..d7e622fb 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -1,5 +1,9 @@ from __future__ import unicode_literals +import pygst +pygst.require('0.10') +import gst + import logging import functools @@ -35,7 +39,7 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): self.backend.spotify.session.load( Link.from_string(track.uri).as_track()) self.backend.spotify.session.play(1) - self.backend.spotify.buffer_timestamp_in_ms = 0 + self.backend.spotify.buffer_timestamp = 0 self.audio.prepare_change() self.audio.set_appsrc( @@ -55,5 +59,5 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): def on_seek_data(self, time_position): logger.debug('playback.on_seek_data(%d) called', time_position) - self.backend.spotify.buffer_timestamp_in_ms = time_position + self.backend.spotify.buffer_timestamp = time_position * gst.MSECOND self.backend.spotify.session.seek(time_position) diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index 6eba6f05..d372bfa4 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -46,7 +46,7 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): self.backend_ref = backend_ref self.connected = threading.Event() - self.buffer_timestamp_in_ms = 0 + self.buffer_timestamp = 0 self.container_manager = None self.playlist_manager = None @@ -124,10 +124,10 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): buffer_ = gst.Buffer(bytes(frames)) buffer_.set_caps(gst.caps_from_string(capabilites)) - buffer_.timestamp = self.buffer_timestamp_in_ms * gst.MSECOND - buffer_.duration = num_frames * gst.SECOND // sample_rate + buffer_.timestamp = self.buffer_timestamp + buffer_.duration = num_frames * gst.SECOND / sample_rate - self.buffer_timestamp_in_ms += buffer_.duration // gst.MSECOND + self.buffer_timestamp += buffer_.duration if self.audio.emit_data(buffer_).get(): return num_frames From fb8e96bbf043211858bae76cbc3a7b1754854959 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 29 Dec 2012 13:23:21 +0100 Subject: [PATCH 027/151] docs: Add woutervanwijk's web client --- .../woutervanwijk-mopidy-webclient.png | Bin 0 -> 46487 bytes docs/clients/http.rst | 21 +++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 docs/_static/woutervanwijk-mopidy-webclient.png diff --git a/docs/_static/woutervanwijk-mopidy-webclient.png b/docs/_static/woutervanwijk-mopidy-webclient.png new file mode 100644 index 0000000000000000000000000000000000000000..0dd99acc9b9a52cc21dc994d12dd5b68f6615a8f GIT binary patch literal 46487 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 z

F}rfo(IQIujQ=quRfap=;+4J`s6aCsf>d_}BkyyqOkc#fd&u?lCOG$mJd7Tw;< zh(L}R&_CezckBwj)Qz_vLOf2Zz4Lbg_qBctvK&RF8E995Qdo+;;<|AXvd>+6a&R@ zDZ=y(GfC>#>xuRi>ruH~u2if$*qzNtV^;+*N;R%lvn$se;n`;Cf|}B>a!x2k^@QPi z>=l=K1a8!=UG}?6@9{XeOtZc9m?kliu2V3LYL8l5be`++^s29Xj`}iiy@22;9?=pU zc^*fwY=So#9F*afQ^Qm3FBSvn@X%|%bX~d0EONFeyMxuIH`GV{*E~eV2v+M3OAsg? zL6vk--h<6{Z!cHL(J!#br93>-B%V7nvL8UFm`qP&qSiHojh8FGu4{KSZ8UhRt;LO# z9o&)E+)3!&hn=2GeoOc9v+%X5x){1lW4c*7KnI!!6*9jn;+E<>=W)4a!OpLGFV``b z{r(EsSrqFlDrQ(3Kigg)k!E4`9S%|LTM7)1HXwmgQY6kwhncwgRUuiY*20D^X4b*n zW1*7h_K_AVlA}62EaQY1!Q|GZ>=)&+=+DQ+GyNUzSncNz%=2thvPU(#?&$xbz9z)r zkh>PXCkzDN*6Z20hPLUnuHPLK)E!*jpVy-%uzMJE8({Pjrg_)3jHYTOitpa={fIG3 zz65)}aF6$WEtb*bu$G6BpC17E8!`(poXYXrL}zx{-dr%{XdFZyhRTR@s275)XZZom zZr5)i1-22dTF}ed_!E6&C6NkSQs?4(hLbDF0VSF=ZSg|(QUxf5;Rw@~7~>}yO-@1n zuI>56xXmISEycI}KX7_TuK(by=bl-=$y$uIN5KiATTiqLj5ZUeU5ESt~M7aoD$+8B9Y9TZx!RsUvo=0$gk*j~$E)N6mE> zj~SQdH3-r8x{%Mwt~Q%pPHr5~P^a|3&ZK%{?W!$?qIKn1un%r-P$q*N<4eT0E`$f7TO+?nJKopKQBF7nZNL`qpJEaeXu zKTf^wicc{!bu;LSl!MA&tvc%L&)>QoBZ68ky$Y2wdzs)DZe4i?Omsx5$Gz)Ahe~E+ z;Jnfx(S-^u-~5M~9j$kdBlz7(3{S;$T?Z&sT=>x~8^{N{Y#sCl25TZ0a%=Gsto>w; z6WyI)1}$!ybnKF}9mdiTyv&}XsFI@%*lJ{srSqkDd?WOAOg=~PSdjih5r^PH@$3xz_a<5}cN&GFb6fIbML^f+dM zEz9i%TDOYTD%X3>J;n8>v9hFVVg!&Lk^=4kc3KSb(WPcSV9}hN=Eq*+NDgO#jDfsG z|A6K~7>x?$Q$h^>`XS^Od%Ve`ivw<9g?`*s6{FoAWwE0bH_lcyY;F%KqK_lYayHDX zZs99-d-JO&+hfdm1xpZm)oeF{<|w?Q@ssB2*NT_06UNjQd|_LrUAfjp;1xRum;J>} z2s1xQBN`b@(mX`~aHt?54hP8i5W!a2dh^hL63T1pu=8|1*I*6p@YK?(8k{O0=1~b} z!qpP4P0Q>#a#(jZM0u?1=MU&(FmDdLxtu0hElJ$T+I82sOKEUm-Ue!&o|B(G|u38Pxe7JGg}n*U`mSGo-$Th2bzqCyLX2{7GWhEm;iRnVD4e5gm#<7Y@(n0gu}p{aZK|ZN{vc zRDE;QCvSEFXtnWg^)tqDedg_AP(nQ({cB>5)J%mv%>c(V5VlXGh`po`hN^S={5k*C z{V#|2r*ejTS4o$wq{mxS%s~{)>8&{RYeE=#nMUomDXo;F>D`@siZhHGzp^Or>8KQ< z@1lr|v9*&N)QidAMqH(@U-iON;Yc`V@s84n^PtY{-T5n>^0R$uaylLj-5L)P?*Zq_?4j$=-XA6L)M+!dOT1rBKLH>v#b zimAE1BJH_i`DE$QRjn3sn^mp_6bRw|0Oa9@K0xNe=T9X~xjvLvAN#K-)OeZP^7sy}u_0*@6HoAET z8_GLjwX*U)olVQp?)AQrzBe<2zBCkm^VlqUq!e%T>0wfX2b1OVER_y!QYoogsWgdE zuhjc`V9nF%V@{$57MBZR>_LLAegQPQvd~CSf{|+6Fxi0v%wdF(T@}EmMhExa%EY`| zQSfqaFnAj65<}q^EcxAD;TsMsOZXs$_QGd#29@vE`-X$8{jHL+W-2l$Tno&$L-9qb z(gL0E%iKo}^@N-)G|9heb_?F;(umZra@tZs+4+!2!cAutlQDv_$=&EhC!El07y@?Mi!|QPXBD{|IGXa605_(7?C%C=TL8(1Ehi;9VYGDJZ~XK530wwZxit^w zn`0y%wPbR_ioI#~B%nQ+r8;}Rt`OSJiF6N7$?cTBcEqQfZ}Oa09r63nA*D7qXUL?+ zJ_FN0Vr4dMD4Oz3TCFIR{K~@X%VLQ0u@7fXik4XSAj_||wOdPRi%*Kl>HdD9p^lXL zfdrfv%I?xt3cu7{&0jATyjLx3HbuHkyw(>+vx^xpoU)tqeH%z=aO-O?FFGrpSNVY1 z%C2bQvj*!oz8^e|qt12tnz>$w8kw$EkqWHOe(3}|&ntepyX+rT63!JNyf-{JwHQ(w zHW=OU&F10S>EZhVshJyWne@CG%b~ANa(0^Q-{^1uH2Od&!|oH2M38>dA1H;`T-tD% zaQ^)M2YDWfR<&VHIlG$cUg=>&xXAJ!kV- z|4j-T((RPS+o#*LB-Kkc{M^_gh*am-<_sq7)RgE#Hd|nOog;mcsti0;@+363{KbV{ zDbOz@A2~IoOdsopKtMWX{xEFoWv1^fjoR7|?4Is=&me;sAwivq<&J1L@eEudscl7d z=D6GaAnb`Z#Ig~N$NM!w(Qs$g=}MuFytWkneakiUcnkEL6&36(krN{nw~$MP84e8@ z+G>jIa1v0~iYH~6M9{sv<;pSH-dFd!J9(V`(K$ZiUG=FkgWbwe-LXfi+52M)%U_Z} zNs2DTEzF{zaxG~*l{kqC<3T>Pz!n5?;F0X6Nn1jk}ROlD>s^Yj-u5`v>6dK_V#vf4REc#hVK9`R+G)-$m0yg;Ag{x+507EnoFa8sI|UW3BIxFD6{!fjgOI5);tskY;H zCvN_od1%80;o?0a{@~7E|66EI2;4&#?P5cQ(}ZI1Ckv$|oL_*U3%*JBI){m%#%a)s>j5KhBuAFcMZo3-wbZD_)6I)&8< zm5jFoQBrNQOV;uT-59G|zcypAl!D?JQkDn(Am`qf3M=nT{Unj8rz+|W-dsG&U~jM) z>k%l3C*z|%@J4m%Zp%!*13w#~kvB%zZHd8_?b_K2xx|i5taWA-`?}nmqh8MS-i_VX zIU$7cnmWJX4iEg@OyLJj#k1waiVqCFEf(PwMG|+Pw50|M9?GtVBN57Vt zYkOu0YSD|iY%L#0TYu5|YVnhwm2O6ac%O-G#HD|4hJo-@{-NmibDTxa?f;nkca!$g zPB|eAdja=&-S%j)-rDMICCs&Em(dQSeLI@T4h`e+dOmu~EJoMp_U-HkW`e!db)eIh z9yFMy_tjGpzcc@F8Lp<1(Mbeqg5n^J*#Etf#WegBJk+6_72!9!DBmj-CX>I{ga|zo zZVyM^h>k6Ni{K&mMN#@BYM}y7uSi2VUBhJUh*x$c{gAWESb>?|P*o_!y|b346tk@* zYm)xcu%6gQt_#r-5NX^;V1!xMAw{RG^^R={foW0+QVFZ&C6{ zZp*!~)?M(Wom{!%6et{Jb~A?9X2MRednd+ewhq=OYQYDw3^y%Y=3!++ulL$H0d`JR zE1u;(*_5E_+eLpH5OuUK(HEoaHcv5%1j5qj*J7Bq^zj+b7a#;hdw8ewz^$<^lB5)= zF|yfQrSr_wj1>g0bSR?uGVE^x#(!V^ zk7n~RSR&}&P=qSIdb)`)7xxT6$D637hbT1XO~N2 zXOI6(`nY-c2oimQjp?AH0a;$E3|ZS3q{qnH;M{Rr-OpK;4UOd1N%hE&q1?ToAh}zW zL+f7gMAF!{nl*eRD!)6w_@0UlOJfe`o*!ObU(6UiU7Va?vw*;xma8g^TGu*!?gb%C z#iRn4TZ^LN=|$e&N`J0o1s+vo9_`z%99ek}JY!j;mY|*Np-g|y)%OSd-{Vto3}t)` zaX|=f(_Wz*;&yEUCURm`{sCDj&138p`M!~!-!xH#)xV?iSR$Z07+Yx7FIw5`T7axJ ztU9u&PtYpfzs}zTn(u7aeb}MQeYM%F+=p^yz7d{eaV&@{_}ZUF=C{lQKz9rYABV#Q z!uJh2Hrk~a=%`}DKun`d8+#V#_wUIAyGU`$Z9jxl{u(u8Ydw;r@q+wb>>IVIlEhCThwTT3g2s*G1^dLA0phLsF(X1oJXu8o z+^i&Kf6m4Nua0>yd2uLpS034`*opbgUs^pu=?oMVbss<; zqvU$?gNFLQY7h#>tlViY8>!364~|gBGnF$=)hQI6x6OBXB4-dZAe*(x_9-Kr9vds^ z$wkvf!{y0W8XO$zSEq;H2#UO^gebk(ypCRjKX-bLr$zyD*z!t}j=MWq=)un=s+&V&Yxo}Ok0ZVj@`^(Ja5=J#2(%yP0_Ak7 zE)%Ul8@`s}uY&GdT*V`wjzi@e?DjX1_K6hxUhi+`MfY!>&%Ak<3OX+9`Y5_Z)W}@% zJnc_FR`#40*L+{>beb+DkG7Gf-V1G_$+SLCS9*Kx7v|O_9VsOABzCkz#dze?LqnSD z^5rA$BMj@g6>OW7*ZLF#qZZb}{K~m4H#MFLXY6aKLp1KdS2Ur9OjZl0w}!7Z#1S|p zjQ~ z`4Y~vL#Th2~c6BF)GLRZm01=_T42zcAlTh@rmkI?bH5gS^x z90fxwIRhM1%}oa+8{BRr?npArp6`(QqVy`f#>VhV95=fnPT%CSzs%7tW_V}Tuk3tr zhDuht+v|_#TVtNAfb3!&(*ga{h=}S-GThM^jI~?K$O5I0WR$<=R%JM=_UEy zw}zh)%PbS3D7=qXmcvuyhAhu!Y$b=PcCxGMO3rGX6G zNw)UmJ=19uh5p&6J0Z1NNZzgnw9zk@mhBPfzo&OfoIlqHs^7aG=C!Mpb1F*CdX1MT z=5fA|bNK(kE(nx3B$ip`^AK!r`@r8Gt*H5^NI1NR-E{C^OktzVINi50k)0ML&I5gC z)Gpg_w(I4S+|44qn5EmsW;_igi+jIQ`@29O4NF7UZ6iC7!P$$AXNkku&o`mo_wD$L zZeqqs7DMUD<7S(Zn#-W?h$l1+c=gN>CE{-J)YgHOMYMrtuFqr`C78?d_etVOKv+~RdA zkBfP{DqOGEber!aH{AVpFsroCKqk}`J*~tPF9kU6U9?^RRG^((q|-0c0&Q79S0R5- zaP7tyY)>%T`uQIzQ0|V!U>+`SHzz!op8~hGCED?qB5GFKH^ob( zMSMMacB*gP7YoOBAA7{XR@mWX7%(U(BV4L#pi#Qv?5SqLOi9)elbP^1=p(m5+(2>r zn&trNgDbsqo6#TrS+D6&B%n;a=jook8I<8Js5e_N2cU%;? z*}5+q;UbOuElY4o+7#-vmqO&$PksU?Yg6Nmk(W2Q8f~Z`oM>*7KMILiXNF?~Ext7B z%oRceZoL7}2pzAdtyJVTAqNlN@s}2HOaV4Jqex4TLoUs@5-hzyQHx_nSyE2R=r>8_ z{+MXka(1TJqh41tU2L5GU^NZINoM0LM{G$ZHhfit!EGtniNE{OutTqtwW2ZOpVKQ~ ztRx~0bv#bPOIUQhVki1Wg!h;H&=z3sJ*?d1dEWTajfbKX><>TisMKFqvm{50gfkkM za9Z}RI)%h!TFw@(%}GFm;8FHI#nT?+>a~gqXvFggE`EH?;p^jJ#A^thSX(9gKGC^r z^tB|>h!SD>!FGdxyD^i-ANZ>piiij2`{`No;WPYdVD0|6!2zUjjA9Hrs1Orz@J01g zwQL5|u~_Gm^c9$@-tj^{t(t*B7)Dm_njtwyqvo*H%p&D&g4GfcT34YK6&FCu^3PYjrQ_VTsDZGr|YCgn{SR8D0bs84QGcB%9GK0 zUMW%ehapXn)ZmaWZqo8o)EeciJs}#$tMJ7TrNy<9Xj#5=$RE{{nNx_vah`tMNb?ux zJ7gL*65HY`Kl?qO$!;g8z=M#XZ~RT(b)owu4ov)i&~GS& z>3F5_yY23LxX3TCDb<2-Y(?r7k7bX|r|~)*quVT@$D1wB%X~}7vL+r zxv`NIKW=+C>WZwc9uix^#lL%~Rul3SgOOyIS#HsB5XWzv@%p=){!;43U?!@oHC~I; zIN&lXzpM|@x0fg`2Q?FWQc-9ueiS%5DrHx04hT)dCWe%KGP0-TL2>3&q~(GiTC9E? z#k7vQAcC4ldC<7D!x8L{2f2EP3S?G=P8b~x6GR7rrdLf;2-FYCc-*YE8KL7*{Fz&; z>hcUPb`?i4(bO}A@K6etJP%=OmUTagft@|#?h?*dR)@N{>_be{_J-@Zb;qb-fh>4s zF&Oy;cSlum@zbEG)?A*6>6b&h%dNmmxa%o$$xXwHcol0)6`SR?7-x6<$EuLIExp$M z0I!$|!{vuw?$VD?y-W3A)nE-agM{tMb3ScxPg%Ln9&ikYHwPD}zuo@u*jd!c;o0Iu zDM-to$ueElflTwFh@eU#f1|cLpPjjN0eK zHHci8BgKY4b73FwrY~9h>nqBd@VAXWp4(&rdq6!qX6uo!*@dMCM!if-`t^v-Xlhx1 z%7~>8>^{70e%*?FS*&?tG8W0Tcc$y3hQ)z`KV*+`Wc6|&WgKnzB6UAK@Ml|G9jRu4 zr>ajaJOVQ$8uHw_3Gj3;D8Z`$JvCCW_I9 zW%#6w4!Rwho#CO%3qb!(XPi#6byEjvqB=WCR zC=JX`n?AVfuM$S6Gni?A2J(sNb;CIsUYCFKzCO+&!O6`SEMFAQ$;q5{2G}6l!|Jb< z@YJ0g^566hV@gVnF|Y0=H6TNq&HJuw!iLqp70=d2F&UBhXwjj6sIMa>kME^VYnHqo z`d$G3855MGoX_tm;e#=u{mWxnmNqOli_s#O^m9dA+}C_~9c1yb3Zi^C#blvT0Cw&} z48=ztLy-=>u4ZZ9Zf9K)F_aV5D@$>UY!MO95@1*%nXToJ;O5qrtUt;Z9lt zPH;?)?cY>Bo_DbygH*vkNZZ_?P5lYnFzzBWM-?K z+f!t%p4|1D9Nud7B0@e3Eh;n?mgk?6rIg5hV-a*odsyN}x{SITQ70Vo3!m3(SG-XQ z8g^oSt8)svF)zQhHBV2YRs5Z7n^{VpNYb5+dgJ4|zHV8?I?tE;*9!&af)gU3czTlm z5$^g-&2N5_TCFHVy2Hg`KabsHLV3hsw^2vm!Ew0VLvMLml;u!%H`|tau!Yz17(?0p zs+MEH-OK%*&(x#Y>6a$5FP)^rvHx73?$$_AjCu_l0u|md2PZ>?nEzI*c`89iVq~+& z#~Mz9YS+_6@<*l;scB{UYB?NPK+$pdu)TwH^giT%ESF)pf1?6!GtYuY}Nctk&g9`yF0q5nkQt?=);Pl&Q zevOqpm-FnXJrb0Ja9iA;tLfVEIGl7)I(3QwJWv4K^Qgh>nEj6za7)nZWfVviQWTmr z$Kw{`Miu1CljVSlNf={f`^94A471@wc<*Asnmw7O&0p1FUt|{b>jP`cv6E(WIsrdi zCEOl-muIMseYbABchK*Z+Ad)&h%>zVX9;l$4N1i0B^Ih$O#***)&xjfug!5I$U_b}nwglf4RUe*ihRN6Y3lN| zBQV=*(+xs8)Y<=~YD&iGlOikW3CGuj5`G7f!IP|}gV)|J3Qn{%s<<_j!yU0i*yK9w zfx?cQK2(sj;I`|4Cb412|NH7-i?Z+YvWU=464Kyu)4w|Cj4a?8E0MvWK8^d@PMJ+@%gFjgtTAT{^N>w#HT}!-=kJroSi)1ofJrWCHkBOAw zq}lj^8Np+=`@0s^{-+VUe}-(7sp zqvOmktNvV&2{-(^7Q={%MLC=4rKICL@kBH;kHISqBS@M}=Sa9ss+$8YXZWkH!}cz# z>2i=yMofpkU&YcHI7{USvem~QGsfoxU=&e8|2+P`f**u92 zO384UT>n`+N05ekcyMM=&`M_U-VV5LN=PnrfS#z{`C3=PxqLZqu@V6r7*J`sSabO~ zIJ+b;&F3@gWocg{g6JsukJ{OA~D0HIYPqwp&W`&BJL@>7B(y|yWOz_p=Vk}HzX{}zb*9ISr+b7CF za5vsp)&6TVNhHPgGFvtp*BPhmKflTM0eSBP2MXq`c;W_g0Wgn3Es_*4WQ_rgJD#sD zO^GMwD4LCP-Bki7(Hj;^Yw_qmX=q?h=~l$zXsupK}-Nvh~b0&SLOWw6gdCMR{tXx8{C;H zJ9z!|)Jt5jSxdxk8~52}^F^#i<1$y8V=JXA`ZmzM1q^Jc!e@Dekt=hlN;_@0o58cX z4m_RPEmz2A(IvP}U)FqF4b8u|v{8P&IfPjvJ8D8cJHZ$lDGCE2yDB_eZ{sz!jePgB zs#%Zu-JQ3d?$+{Y%{)t7bq>Pgz46!OFMi=6XUqh@B0g`6W82?8Yrru2Q4Q{SG#i_k zlS)k0n6u+XIsUxeQMsL`=LS{+e~srG+2L?r5BgPjyw8%;c=?);7aW#J$Z@1Lh6-iX z##PYA1DMy4UJV15w5>a*R)m^V0_)m0d5hQda^*~Cf%RRqQwEPR&GU!Mb`x9nvrc5C zD_D_m@H!ZLS-cJg9ckq>w^KV3FTJ5FoUc2-;g!xZ{q~URRK~%vP>uK;m!p`Xk!)y7 z$u`3`q7MJiIat?x8_|k9tCFV{WCx&B*sA9z>vO!h!WxCZzxrL{oK_8z$jTvnFNcT}v-O{4PV0wz? zyq3YkG@3c&o28(tNReDjZXXR4P)Yy7V&WnsY!1-U4q?GTMCDb?logGoPqI2Y1KQ3~Dh85u?4MAy?5fA>bbM4cr z+pzsbE)X@)Y%O6ou9rC636rAiqc{>c;7+Z}=GDfE|G4CW7yX*wdRw=@zC8$0l#`)- zhiDCqH;SL8xxijT_3r!-8##(_;Eiz*ux>ha5d5W!2X)K9*fvz*B~qTL>&>2RDO-F-li7am2G1g zE8HQ7sxnC+Q&8E*w`A``8uDayJKm?(p6|=<;KnG>`jEpKDHELvgi$%_uO}-ute8H1 z=h4Vz&q5k$IK4#PqCf9u_=fCdTk7~rk^R^fOdp*{nsn#mVaXmuHPIh>!hEvc)pVps z><4Cg2tN8MvqT0>@~2PdmN0DGo}7_VjCtuvFFHHLzuLsCoDItyT4r7UL!0un%lSmx zWK;4cM;j@=!0OhXUp0AGtN;XdvNajSZT7IwX{BYRsFPyKx*M8DW1@JP%dA?~-16Di zlF z8%;eapf23Wx59XJ-PxP5tRM3g2WV(T<33vnxZRdBIF2QI#)tEUcX_ei4rg84G*cDB z!lxIQZ$#g_AuIy1)zVYc>FR_Em9<0C4%;4}c`bxq)rQtJ7w*4+3rT@TDzcGCbczEv zBoSko&{X)KTv50>j}NP< zqaP86W1pYif%rY8v0@BASFj-h!onIJKR@7X025KV9*pZnb6Gt5`c<%aVW^BOn4maXu z+jHVYl{AFX3MmkLaIlpm?kce~RLPlMbb4Q&(sHx@-1mi)jl5n&HQvezf-@_2jflRz*&KRr1)mifh9) z?a*kpoTiAp1Y^z1!N8hRaru|MfOQQ|4E{n`@_lN<(q?+o_{z==E(+1Xs)?N*w9_o=3-WyqRW>?v+krz z%t!&KS(5@W*d_d;6RXln3uUW%^yX~EBxNo4i5u2iyDl=@?ByETETEoC7G&SJLJHJ# z(@6F5HG-PoW>XgmVr>SN6C$iEokVqzn_v?t@1!}oP6`%4bq;+uzBX^(&Xlz0FE7}Q zS}CJ@#$-tCx$p)~TPvAJ)bQ^Zi!-%5i(AK8h52C0tFV$5Q9%X}bU@5S(YIMFVJ9@c zuS|o@OqV1@UpLxcttSP@KAYah?O*({^ICs#erRz#L?Vsp&%QCGI}bgAJ$}UPeiGGw zOg(>|KuU@BX1Exi3bv*3`yNswVS>3R`zG-$_&4fI_Pi$GxR6!8D)T*E7E=kF} zq};3KOorfevTEae4TwPTgv3O(Bgo|(N;kq|<(xYDHRpU7JQOFFh$?-47&dL_`Q@-N z-byTbkY41Xds@UMalN_SoQZMIMY=xS!P-zZM{7W#DR&WxS?7!S zd}(n!K=(+p2X8KG*Enj-1Zs8B~WBWGo)!Icb?j8k6`9#%t(!J(bI<FSQ#=`!BEu1I~1+3s@E^ZmU=XZ}CP*6ojCD9sb%Z$P~*aYpuIW~zJ6ki{; zsn^d+)!bdM$Whj`S%SAJh%I&CbiYC$Tbo5?m%DK^AnP-u@l=wKyKsR@2YtW=YtruNQA zrFvuIp(_ZfdhJv3ak{LU?CwKI9QAFnOl}zTGZ#=`z^?tf+6fXY-N|rzRO#S!$Zp0M zHff``PM~v?4V$_AzCH#vQZ|fFeeB(~f2`nn+7ayLh6vqUF*!qRrdfNds8z0m&ATS7 z9ZsYM!sUqt>y(3Ac3{=D_1O5!dKd3c;EMztr!~|fsPOJBoz8~)TfxkB=xRqChVpbQ z<>hudY4viY@1=~Qy|YW^N&WWzvE>ULXP+HH1@b%b5dV_uHw=Cbf`pj!rXB7cX09e9 zE8FE`mJIw%g=6KQklmy1cverM1}Q6U)ht!{bq8WHELQVbwFNXcx(}E(<<*8~DH;98 zuW1h#XXdmAXX}b$H61N2%UR;4M*=2te7QaR2y^t;->{URj@|zcl=epxTmny8Z|~^g z;-77AAPCntdZ$gsMKVZLZJOXGp!Dx~E@e z0G{4-@pX=FDG7fR`EbRnLJ1`Wi}@dM1>vE<53wOHG7b#ek0H9pZ3G;2FabaTUrnv!$Tki=e!6nALl~X#tFeWYtPGjpcVz&xd5AeZ4&Onpaxv8b(nv$xJMBkapoYKZd-0 z49j?aPdDu=#<6=?uEos7fl+rPq#26pClf9BUcO7z%st+NPg^pu3&g#y&?B3;RKsM- zmQj8rp7A>RM?Udght6t#P+1%jvtl2DUYt~%As33_Pw}dDn4~Qm)?}R|E3ZwRF!fdfQster% z+>zwHV(3Ok$YyTn7v{6ubmM0~^8t=>wky_3R&LVh3nsbdS7)kGScS#Z0XxNZWs>ZI zP@5M~cgW2T{fh!yi(T)aX{tlnlDiwY&YjShQwLsOhqG_fT)~>EpPIkfi3*@}ded95 zk@6M~>onT3FNM1RVWfqfq0ifU#y<|-Z=n7y7$;Nz!b+?M@3zyR{Cq?MMb<_lZ<9u3>r< zx!zpIaU8FZ`y1Vkrcm*%(tA}0JYJk{1i$zE?k?QC&g|Vb#u+o*D*sPz%L?ycHuz%dhH?nei1Tc3J@ZRKS7zbj3cWW%R4X5yeDd(xvWC`k06HQBwaK326oU$@QOtRT{2-4u{( zzFhSnJBatd?mz)iUma&qsb>n>PwU(cjg33&6t<7BVk<%{yr|HqP41izfS*(yJKd!L z_17dUXVMRE@n3Nix_a%-w2!Y%6pz%DM3xmR*KDp7;$|Vt&ApUL&CWBQQ+-fUE6QE8 zulfA}=%RLa*oDM*4>k%uyIS>u{%z;ws6Hg?4QJAI8ZQKD&&K63<3=c;I`LQ;Gj`dw zB|n9Hbkx=5HOVL|_zX^`1MW5~+nZZX<=C?-JDq(|op^k9+sD0?qb{xMzD>=mB&U!q zs-O?1u>3IofmT?CD=yx2#PnjZEyzWZSqCobD~{4Ef=iC`AUHRYlB^+@x_5NNLq&*i zP{BRl%^PwKd;n`v@5YF08OQ39CYb(bFXwW2Iuve8UQ;e53_F!PHt;yMX5ig*He8al z?n&v8|1O`tvM=|ElOk26i3D(}ISYnvmKZCoBt3f`u7@-XKW~aD3mQdRshL1-b?oKUo7p&Xm_I`!fN z#=36U(J0LTXgH75^kS*RMHQP<_EmlPlh-#9HJ@lMoATX!;gn8%?h9q#w5r4u=H?%x zc_kA>-7EW#J;unldJ1t}G+)&sQl!-x0WKq-xXhSR#>(hDpj|gP!T5A_D=CfDq0s|t zBdL@rxQ>6Z&b8)pY9NNVanvUmUtwS^=+_!77|?e%E7udk0JsA}{Kumdw` zSse~PMfNqsd`5dX-Kaigr2W}k)Z25Y<-$zJ{i{T5dCePf$~59@IoqfGCY)C(h)sRz zyvF3gE9D_B@1km>CJ+kU8XZs^rN~d<`ka%P=k0Y4d**zkbq*P{)n1U5)Y4W!u0q!v z^P8Kg{)!R5rc4V)&1k};Z5I*0gJyXlOC%k7F^v%`o8f`hbQS*wJi&S0A?teaE z8x)C(1erjlTE+L87t@lcYJKu+|NY^8a}n~>z(y_0iB-OeZVaB^m$RiXzh)T5lT3k}PigNuD;M}S%(i(%4yJ};$n;#ucsFXpjJgiRARAMa{| z$wb5q9Hk6N4#+D0pl}RwZbHu_wA~tb7?o%#AJsc;y^Dx5MKag;>dM1@JqPOdu3^j# zcMQ2r(b9l%>amR#qY)|$p*qP6j|G_VS4)j7j@=NXCd#~Ks*+oK3q*3k-Q_BB&|l7@ zQk{-;WOq0c0uhd7Ze9U<2}OnXqwjy=V!LacUi!@XBts(2v3O`I=a%a0WGC z5jRBRJ`1AIu=EHndepb}hEP-^tN7Xt7nV7%mdA>sTD?@x!%yT#^H)83E}TdJV%B(z zFVvu2TX=i0R>D8vN5)`pnt%8Jqs*%hK+-~bn%-S&I{h3OUn14a;&wYOTIr;x3@KeU zky8RWA>PB6-)rmBX@#WVH*4z#UU9Xf5u&u(S}S5W-wa$#rxuLYhJIiiUvb4dFB6qiozYZD$kR6Ww5{B12J;bSD;Dj&;zj z-h0CsGkxD_yedkmTu9w=6yTR2I)0Oki_6S4v83;bFB^1%7EVER@wq=s4lWS?WDWq( zj9KNCEkf$mNI>0@Elw8MHVkLL*FT{9hMaHPOFy2-sgJC)**iYrJn9ZQiFetOv zVc;{^*9OWPcxl&t(_-_Y60PK0ZztwTyrtsummD95Cc^b!2N5IIVX@5q5)!}!K)cAh zYr-s)%TV`DQYe2J)mPRB~|fATep*LYaRC9PW5_)`Em9uqn}0IXn)f& zQ6PpyDs1)={*$4kpFHI`T7xk*!z-H&`X)ZHi*0&C}o{2 zHx#-g22PXDEHT<=>{(^@+Ms04t0Q(s>92uv^fg6U`3bAUsG@oK=5hAil$cnX^d9qb zGU44@n}luaB8UtaH3uP~hvkGu*K_1jr9Otg0DEgJt&sj_)RV=*S~^!w zS%$}SP9#1)?eGcjfEUkGOiFLnQOygANCrev3!&N_{79xe)rw*~31aDP$Ng~V(-xwO zQw%!gHq97aPWlP|=;6w4@>%)N6J5P5^&9=DhO?S1-?$^|gOL)op71gsb zFdhDq{$j)rhA}*}tAL8I(rrT9rQhUQoLm>|Qv38yF2anXZwsqJtH{4_`y z@RXxN4305Dv`LUPDNBLylSQ^_Uq*}j*AP2u4uR(H-)+UN&B}VgH!}d7*{mg zh2tnj1&c}wu9Jq^%DCwbMd*yq>H{xO(MMPqXD0cN$D_XT7f2{pqp-U{S6K})!~QDa zV%SaZ7l3AP_T}JTLVhRsF~k>kZZqc4vWiGxKu--THTSavxQ3gNT|`*cHG6@=g@8IK z^=z>jAsT3W)E#G;_e$!EvKeXd;1R`WbpZpGtrhO;awS&KU=A>jiYy@+j~}U-s-vEf zO5gh~exYcTSj#ZG&o^e6@38 zJK7*Y3t=1$nvumj;B&Y)n zkYHvgFwg;@Df{1TS133$Bq*?dPx<|0*8bAx2>3-9OOO{t&*@D^9l+-Qi%PnS$8|UUbI6@ z`wx!ePo_0?w)#B`ltM7G+h#FcY;`Rtz0Wju9l01MG^8v`^t45 zOLM8h@9-XLv-a3Hr)T`C07Tosr5{~TkvkMd7wE+1m)NO5hzF2~tLVtAqI0}92)fFB zet7+D3^;AdJPnYRDK&Yjhr#(R=Ku$lW@cAP6X4Bzbzai1W%g9V;ehisYN{~mxMDDW zP+mJkw_&@&vd`9}vSi3>(RtX+-4jpVf|387{8IO6su~5G7{K$GZJhNoq-Io{G->dE6^Z zvnf9raI{V>f07oKvQc#OO#>W@^)Rlu(3{Zbq1m26HG!03-?Emghk_EQ_C$gMLe6ls zWTB6EyZp#Ett>77^bk;+=aSolBh-}nehlcFN8Pyr{60>O-)$xqDa^;F0{qx3fZdee zSb5kLjd~LoM^(BH}WoT`LF4K_!u^0^as4UB&IM=jgNONTTHQ&Z@lgK3G8Y zzEDx2J<`^C!%WstWX?*!;Av6j3&@P*qDkx93O|WGY@k^}5`DpEhs8;en2u%(_NiNf zGp=3OyD>~vp!`{Qb?6dNXB(2U%m!e~Sl~lR+%On^VdZJlvA=EnR(CNc@&)42F4dny zRN6SC{zhi7Xei^l9Wa_@`td$D#D_z|S|& z0i$FBkd?1@=*RI$K66P+ri1BC%-55#0O~l5oa3S@h6|zC-IVVe)qIeq58O?K^(ixz z3O%eo-u0#$mXRD zU0|8^s>ak*lp4Ep?XGYXQ!oPI9PmFO{-U5)>1wecan7>_h3r!=!7j< zPTPg#< zYz0Plwc`a!hWrtN8F0-a4)XE-?BUg?MzrRqFKdur;LkwSV0g7&)pcN6s;ZOe^m$Q~ z84tsG8JBI#>zb`wR6%jW!FM~kbZ=*D(SbGL&TXmo4YLV=1SklJ$$}Zu^<0rN@DbWyN}F(QPBKu zYx?*WJnYN9m{{ajb)_eLOv80A$Of$IkiX|TY}DTXwFMEu|1{z3Hkd&9H=j;bk_M`91GA;VBvdKK(aqv|s$6kiRZvzK-KI z7nmV+`w5btI)2eCieSDW?NywOl+V3$uyTrYdjoP$tK6uWf1rbVi4FLS*bBYCe_e%6 z;#OH4++M+do-Q&5^p%izl7;Yq6t6V`G^3MH9Qb^zyAqps;P2~hLonWJl$%oT5EY&- z)+1nI`fktAkCYik3r)4*FqqSfO1URD)fI&NZypS!eQav>$Ybz7@wklEc7k0Kl<)6V ze!jvt`;1xZGg_RwsnLOKwn?p~Ja1a6mektk~bDvCZOJo>%=`0DsaGls9fvX{$<9y!f1^0vV&I2!IAvParM4k5u<%vRf|`N{JWptV0_t@pL^fmukH8J zM+Xf?&kK~a-k5gI5n7!s@sKIT-NdohS@OoJ`7bHHcD>llwFVTwX8!XCd^DB(c*%t= zKcl1)(Pi|&<3DAAc^w()V6SZ_5)R+@ZvqsNMY^^)pGXiODG3B2qGOTmk&K-={4ht{l^{M%@)=kD|_>YDOMy1Ao4{tkdLb{dU~I zGO#enC(5ifd5sllA4nEfVID=7P0-|lo#bkQ#Ok2kNQlecW9B_Ep%s$U*jH1xb|iv1 zqA&gJ%QQg}#e&wx{f%l{F7Ysq#N~(9Wb76ml#^&(5q{M0CSetZ!U^d$nWLa7pTA_x zY)X~y-TgZ|*TaNg$zc=>L~-s6&r~Zk!fLZc-!Bcv_qrlN+>_VgJuM+VsmagoHvB@G zbw^Md--D3V${V~zRuXJUbi3Vem9z&@sh*E6Kb-JPB&9wwIwFF;;}9S4AJObe!)1dP zD~~paT{47Ng4Ovebo-XY^WdX}m zPD~=+LhYpe!%Hc)@IWS~T9Es`p05D4F^HV3fT(+b+z!Bfqb$FVoqD>UgImDQ!K(U! z=6(Ks-EK0ljw>8kn1DSwyGoG4rpiFQ->4SmE{6AK*Hd}wTH&ed`qE4U_Y~jOP{Ib3 zdNCX$<`05)RvONo$uYcEftP_zF*4W%H`zS?7~;;ZiATto6 zjd$)XQ`cao6X#C?gMsmudy7_wj!M zb3rzkW_>f>c+nU_>r#2>!l2cuvnLKU0pOF$;u7@oWliV8?y&_P9^q%fc7i+O%+ph;;;lZr zWu6n=sU4TGSnClrQxY@R9MlBnnAj8EViWz*xJDNX5reeT)5o(*oW&|J0PwY!sJq85 z&la>*Ap@7(ecn6Ui*;6014y|7cyNiH#40oWH4Ow209-x)>`l6RHpV$Lk{<7@biKjn zJXgDiL$?xph||}TDL&lhUMK_QZkpd4QX)d>k-Sozl+O^2aD^R&Gz($~njoORQ&8_3 zC98Y)?Ya^l=f)ISZwbWr2eTmE!~&qtVE+9uF3=c!&Ix_RR7E>9PJ4+=FP zIHlW-q_sc8O`RXcW|=jhcBV<{@+#gaCyu-oO2B>M8)7Lh9JXt1+U{F)DL(6NZ1zg< zld5sQUI7KwMn!4tJe8U!bxYEb7k5tchLS5EcWwzy&oq&zvZE)C|MdOI$gAbWE-s(rT~ zY}~c9b8^InID4RJGdK$OUXe4uj=!&^)Qd-q()|s`rcRyO`fUN6vb7sN#^ldTirPp! z<~k+AL0}LB4L9ZiBb;5aZ+Jtp>~#?xXZM!SrEifmydYTFOJYm^G`F8Bp!+B^hx&XJ zaR#-EoOa|Gx0$EA=|bs|un}QF#izJ;@J-m;K$Da=Dui_V3ZxQ-;=w%z21^pJ{Gde`+xw@#i z64W^EjVSzbsqdcVM_u3cOiW4vS9-OX(Uj`8k*#)Zv!jmbAJs|j(PZJkjY3DMEMMyv z%FqD?P}wwg%$O56RPY~)hRcd7t6~e)=KAd;wd0r!im)3O=>B<*BivtAm_r1t`YJeB z8{-^f9}Ej5qU(b88*fm|vo9v%c2F61<;@;PP(EIHdIj8xxCK~GYznd5d;Gu;NyN!wc>A74N>{f9VR)0B_$?d2xdD@P74BQ3NO!3L~w)7 z<3$0yD$Z}dGeuw%%F^ChihuAZwe=3p&-$%zcDS+iJmEc_JZV$e)HAFc%ww4Z6KM*JjZDCK@fl<@~ z&haTjR3dZ^(tYfV!2Ue8zV1%{>Sv475uTXMFN&X5j@CWo-C~|ZMVObY*SG2XzxXf$ z4E2>QKOW^>`JS!V-N3nvM7`pRx`~4VSr{;^H&M-|mdGK}i=@Loi8L0uHdIPo6rYgAmmmM@m(=I;^RSu;s^a`B{y%~uNkGxf6fk&Q% zU!kd&EjBf@7bH3qnKz91QUZzc9EtL?Dg_8|iYyGeesjZ43ocxOuF&gNgj8@4V~zeW z_R`BsTeVs1t=W#vx_5u!rGB#M2PedXX#&?0%Uw!Ayv2G^>>3p7O^=v~H3ETvS37m~ zZFzW9%B+SIdFEt>89DV%eY`QbRu_@cq8#GO4TpbwlL?O+X^^^hOl~$Q78Z+BNPGr2 zl6SZGSI6wc;-Y364+Flo0tli#dy*?rb(paYN{f0#sZ!fq-;5$nqZ#I}VMD-*f-aNKeO4~JEca0#Akyj&q-Qg(XHzh}MzHA9L+MDLPnI$L8ec0fCP0vx|_ z&V!~)^(Ctv{ix<+26{)SL<04=t_VOEBTjF`B=e*7=|Zdp&oQ$n&z zLIISM``x2Ak+&`>jn6C1_0^6w8 zqTB3hme^H~Js3ytMB&0fg@ZS7&9D3GuksQNOAQ-n>FicIX!iZHv}TweuUm!Gmx_0f z;efD`PLDi_faqK*Y@umv#9IQK#P_I%hXPc=#Zrm@QK7N%b)q_63@+QT+8M5}Ha;^;ATb2Tx_75;9~im1|O>qLb>w-ckyR9N*CE1A|>xzevcq5R%Fj z(37u;(4#bW)*tdLec2xH6ulg3|IUwc*=Vyw*4cppHnhT&kjuzxL_zq5K~pbNpVwe~?zl3q zNwLE48cD2R48@T+tjR8E5W0|F|TN5>o=`SN<#TG0aX0K z-xjB&4h^|tRCJSIx$7;1uKQJB)SqC7B>Z+2>8XvOC3bE`9W~+n85sCL!5~0##!bG` zV;w`{KhKHppx(rYpyz>`_V@_TE03(ww&df5cTS&bbCe#X&B|pq?u8QiNn(>2Eon4V z0gU!bdU!yg6x(qk89z|41@ai<$ecygo zMNHtbZ9m#d(GP_+l~#F!Yb&T7poE(!N|;1JLJ7( z7aeMNpr*Tanv0d7!a(P;oh}7I%^&^EfESH_*i=^VVUSzTf*ITIUlZ`8)}pJ;V_MbN zs62x_Q4Mf3_%W#QyOMcP{u_zRcv!&SKlk1xJFP*Z6B9V9s6So1nOioh{)Bf}_^vPs zAHHhHtkql8r>UFFJ&dMq&TG0XgzZ{=Ar(CS5Gf0H6xWo#7-(ry#P%4*K4?rWZS=3l z4{w+9r+M|bSUs>^MSbz&W@Id>t!xRO`y91-)+ir8;0~)}ciavgL%7%A4sMvuJSfq> zR$IVQB{${&h5zyXlP@nzJPy2QYInC-V@ZtQU7&USov&ZneO zmLzEqpUAxk4~Iw6nPw6b<3o@JX7e0?$)S(Axv?3mIP`tscxI^dbpDL?I7HEexU#V^ zFA-0KQ*~cM8sW6XSvP)$yG}&`xve!6Uf4%j_EUF|5k$nY;c|ykApCE*eClw7^kn#D zM$KxsYFUWpsEsh2>KiA8Svq4TD^p1{NctOD`=p*|T#ja=^CV5{bxzYdErK5(_mAM; z(a=QX6@FAm`!e*hbjx*04IDGd=`scu`m!s;?#eWhML5^zv}n2OgZKl+rCr!S9Jr3| zhu(6qE3%i%A=*nbB1NwZ3CJ!nTMoREQrl*;bRNN1mfxzSgdkzJU|j@}9Qe(=XHn^B zaC_3)wzoa_hGYlqH{V(&_4(J2ja9ynQ4kr;*kKPK9qdE}x4*BZBqcZ>yv1M&fV=i& zVc}Dn@=WN5_Cb+|z*80MDQNRe+41gVW|Ym0#Fx0o>|~~Q>_v4?37hEfqJ`~1e)s_b zSd?Ju$Xo!HI!U> z!0>IgQ!`D}6FBg}vT1kMS%G5G_Rd=mHJt$^Lu34*Om8ssIpPm?TquYN)WTv4XA4Fs3z*$YJBZUC>-kZ zlFF^@^ucjn!hDcYws>qKeOFUstc{;>AMT{@V?Q=MyF1vWMwW|+orK#K%qWvf2@1T- zsv305br`PR?@kI12NnA8&f%niT>$WTt5lTBdW}uiVKZaNak2=DPrHI~Mi?=N&f`3T zD=Pku`O@$rVq#63XzKlu+pzrR1)QI!2^f`f`%Y3cZ^&-dXB!&}Qh3%Xf!9T8-#D4Y zu4M1gPwS{jl4FvH3vys>=^x{2DDM!iL*dmmId3%W0R10r=o#a2=OjyWtro_v=dQ_*>UlpNV^X1y0H-# zS&@l(z*3Lgw1zH(tFL}vvr+o~YR6)hXdC7!Ae7^%VBBs-R zrS|)|e`yyJq|ua!DZ)JF{ynqWov(;FB{LKsgdM5Y(qK7P32Sl{`V4>q*CNg@A-NX86zBvx9P zl1cJsvU~|dBf9tutCjw0x+Blx{2ljUE_-wZe7UI^Tw|spu}@62%tz=W&gBJzyq}^@ zX5+gctDvnFJpK0QzDt#CgWO$opq8D_By^Y&2E{9Wbh_btCAt3e8`GI!Ncrld)(3x4 zk4=d?C}Pc3Vv*J?Xht?ge1-=OR;NAhU9-G`l~Hd?kKmir49bpU_z0lr2TVSX{f%LKdhQ)fsS5U*&5 zy31Z{#`26k9I4xlAo;;`vT9rsH|?Q*BRX2ie0yA?S=u2pqRJ74CKBR>p4^6a$P;nB z`%Us;3gd7A&iF(wL4BW};psnwvrKQM`?(Vtn^kK}+QWg!^5jS~5|hfdaiy!a$Upl7 z5I{CFOugWWx|{0iYIqvYO1G+D^{(UUFRe6{_wfG{&2p_Z=lq+oIT&%xcF_is4 zVp?y+0>s8@(ACb7O*QoP}PGUD0*THn%YkBeiB?>i>=;Z!bw6vzwG8A<%8A`)S{i1zf+O zRE=tw9YAR`(s3Tjs@)|+#K$F3VwH`xy0qlI3_ju}X}z8%M8lZH+J*pkMEM+pRc56i zfCpuTRNUMMGIfcqtbekfbCQUt)ULF8ag4STK?IZ#$*0)wC&DXt7d;jCv~KUBIXgfC zopo9dGgdnId{A*9JiNUt5JCP#ZD6KA0`vRjgZ%&EM;0bUX7|u>?G6`YcKl63_hp;i zs=RdnZ)EaQ%k7pg$zJT|Ol!zLJ|8wRPMaIw+s^kCLp$wtBjWM$$aidfF7b^d#fF}Y5qa*C>0laft||8bg}^8_&#cZod8uB>;{qV z->RjojCgQPaxr@CAq=)pjm8qC;Jb~mdR|v_01f_4Ukhq#WAEd6K8Jsj({A&dc3+6Y zzqXsm3im@v5NApj(^4^94%4@a(?Y;L6SYhxv5u~G`i*8=h0?%>(P>=zS(QBS{z-Ic zzyxxJYlZzY4EBvA$|h2ig@}!fTJ~;ZZ=Iu)u7l1-J-gH8rrSoZ@}16k;13WXuSBw_ zYxUs%JptGRxu1R#9LJ5fbgfH4uOsTm39ZxWX@_ZPI@8+VFc6uGyO1Uv(7GwTTk4n{2?b6~ z(J4=5v=E|zk)Va4faNIF=P`?rZ~3Z#?Vmv=3{1VI-4!td-_?QbW@fvI96Da6LgpxM z2z?w&6duvyT(!j2w#|e_JQI2F5hDu0ubfI@v7tRTu!~Vml&8;JeV|J+1Zz4qnd0&L* z-u{U%catDMwt5O6BNp;W@fo(2g)&_#wT8_xK*wu-S>VOBsT_KI*8k|Y1k#l*_C1xq zkPtHv8**TRB7%pEFtxCXB8M2dNyVZ~tzZfA z5~hXrYJ(Co*$!e~>dP2XalO15wHz2CGdgKJ8TwxjbJ>;Oz2C*;2JbpS065p+^{ik{ zP6Z0Q$f!6xzTb+Q)%kAQCOBpAWJl%rCu@wD(g~O}WK5&v5;P zA5UHSM8Bl_l`WbsPRe!`6%~6_uleHX<*wb{R1CKkmSJT!$n3E5?HZ|fNz{QGGpSc) zvelxT&gSPb zyGI^7Sp?@WHNSOwx_B^=#}hM{gH>sfgFMZ~$=W0h=&BgS1k%5=tX8KBnp?1hu(2m0$^6;HXTQvh{AKzvu$QatD4ij-ECc9tI+232qa(@@RE zz#Sb~liV+{BW+Ikt7xR}{0T~MPczL%BUc1OJNnqMWASc))%2}6m zDM&_F&5>8Z*ySzYbJiE-t`3h{%XbjLarJHPI=vPX+%V`CQ$tAiCve$%`J!p{@+bdx zx(}VvsfH}fue)Z|ginMYrU%v#4B%09#||*qpeS>G7|gsV86sk33keuc9?O!9DiM1! z1OMd&j>4z5+L|)ZAN@mpY;C3eBM0VK6oXLtV=YJ8Tsa4E+uq6gAQ{ld0d&;;qtqF^ z@^Xmf2@d&0{>}LFQ3DneCYPfh*BCT-%ZAynL0XX5ICpumdPVE!id+J(g<-3@TDn4S zv0tv!v@`-mZnDNZK45Xos`=Jc(MND!;wAE%M4Mxr7%vkrjq<4Hf6UH z9wxW4{uMF)Pjhcq%zR5qHfMAsHwu_)QRB~~oG!Ls*nR@S%g-1Y zf7buD`u-N1|HU%@B^C3J1I>_WKJ_|p@AI0eafC7X0pkGgzm-ImE2P@@vqsGK=tfT_ zVU~F`SQw{_+&tmT{@eUhR8iZpYlTOwZ9Z7wkeE3+W=9stvZ^TW_neu4l;uj*T}2u& z(Ve@%P4PRyj_^1WpPp@@1TEBJrtXr$G`19^X-`pE`sEdF#6QICC1iqidg7qRhql4l z?$;l-`Y6U4A(-3_pFpM-Oyj!j+P?pd6%NM$H>b2i7Jr9zVl8!nQV`cr>sZ9`ro&T9bsfDQDRI4I*YM~_lev12RB1u#1uvjo?r6N*=&da} zr{SC7G`?kSh8RW ziHLEL)@`yUWzvIlv!5dZA9K|9n&zg9k1*BL+M=Bth?%V-yrtF+P4z3SEN$6|VRqHt z7|{Xv<#qs$Gh$tGb|5>s5AadIO$2^HMxokWZ%|^&!5FBoNa>GjjUgU#qu@1oM-|}= z5-%JYY8}#cPtA=EF|@|{A-HJp=zhHEQw0ajbpUJ`7S1kbS8`UFwFmN;H1E+zDZ0H+ zXTfA-D!=(v=K4RYF=A%od&s<<;6n&mWp;TXjA7rj&?pt;lCmK*PgHnVZP1QoUqBgZ zbl?5{qwUpj3&|go*F1sw8(kv%eX|+kFsC7L4OzxI@BGR~=}pG)A=kkB_>wyXWhTV( z+VC)`lp=GVaL@IpsoBf5%LZ;8`l211FnMTJP8#7cx!KlfWVVy=qwZy=MA8V7Sv4^m zJ`=!lv>BFtc1_&Q(>O`f+-_$7$@s2I@kcsLbLM}yMC-OfKUxjc^CCy;CF9x8j;J%1 zPs@1Wo9OO2p!Z&BjO)*$E0oZTmo%WkGgpkM;uBX7=_M;jXdm_4Y+?s%v&Z1?@G8n@jvgBR-KxwB-K9mxd(!qUZX5ts9TyrJVWR2zcL#U z9B2fv!O;Wp#zvEp=tL=s*I5o)5hfyzr3wajaxE?3CS!pqzKTggr(fq0rr z0GwZDh(vWiURgLmlC<(WyJYN#oQ0|Vx=)BZK9BdQGWq>VyDv^-C7rSv(|g^Vp2E|iS+60ql8P*}#kB9hcOeZi#fuEjD-<%DS1fUX%P zl=~HLINNE(p(@$;^xAf>xZ=x3ubIdP`0ZCz-k-^pCZ;CG^EtvC>5gWQHHJ-D$P%XI z9ZOTFf^AA;a;2d`eaG(MC8Kb?BK|$4Hmm7?KXoa~)a?7rtx^L9HN1MO`_@84jTKhD zW&y?*RIk@uWnl$7w~4pV-fon!Irf;3=gv4D4gO)pR5Z^7c2$hVQ_O{5*@?;lQR0k> zui@{H;cdzSA{wK*3R7_#>n89NK-U^DgWrlfkc3u2mO@-70=mFgalUENG(Iktt7^Ov zCU=8IFw)gPXy9cAvJ&WgmExbk*S+BXJLP-0Vby}M!H~45d1x%4gCm%!E(Eoi^vbOp z*VpV#e>OG?1Keh#)%U}bt=1VW{?JSc{pc$WD{vRR5)YBe)x5gp{_)e@4O$Swm}GC~ zE&>jxpBe`QX8^L3a}mT*-h&cZmaMThp3gnnhoaw*1z+^CR;p=6f33-=yZ&zG|G3E* za3HnSJFB9Mbj`3A?XgYbY0t_;&Pt4THyzCmO3}BarlM=KnGNu--+eTa5@?yei|TKY zcb_B;;2!eEe76m){`{z=p+#{>i+3nq3P5sl&=g}>R48s7r#1%6h6U{N_rD})tPhJT zAyG-Cwk-~?1^y8dgI$HeSMU?5HzrtjvHW|PZv2nlQyYSq7~IiQ6$vNtntH#MBlW?E zK0OTM0?Jz4wE?cFOt&Bjs-5XWed|iG&BaC7mYuke; zU&xmhD;e^l+1O?2hhGILqP#i{_oeH!(8t+se&=7Gez^r{C_w<9y@-T88roeBnA;JQ z?93`Z2ec+6794pde5+89FXX{f3mwB7%mb5ZZB|O>* z18Rg5x7rgxjd1XD0JF^bbX&0v;K0${ zyg>mc&lUxgCR1lAgU0++bVkSG@81YvyVs@vZZ{A)hgNGa_-kYRH<0i>P4}NDDl>*l z%0tr$$M(r;{&fn^(*nSoo7#vJUuZcRzUQ0Rl06Vo6!HIZf=rJ(l@gUwQd&0ZBv7Z@ zz|mj*)-!o>IjgCO5VGnP@Y2~)W^}N5p3*Bj_g~^6G}__Ul`CZObTW8|5uUhmv#rH8 zRVv)MuUVouMS-wvDkO`qJ{ds3XXC~+BnM@d6|-^LYXBQrd*B1Jaj!TXOI8p=`z#03 zd9_*g2>=Eq45W8!boN*mj)vK)!*^=2Nhegqw`V%rZE#L4>#uSupL9QiT}O=ljY<7y zmoU^~+^7+^kl-f+bC0$LxoIF|39bBMo{z996{T>g`3bYjYG`kM)XgBA*&^S2&6|Lk zZ41MsYuxG{n(Y}g&>b|Rt4i>7!c9p7|9D61ltrP?Jo@=*k?wlkX+q^@RkWn7>X8yH z59;!*LF+BLRULwY+5^ug_;_Zl2=$|I82Pq(^Ea?nsTp3E>n zah)LF)*zQu%7-+U8J10$=oipiY?Jm)Z;5qPw{{H*I9&5UCrDPALA3C>k)0JsEot-nwcq@q^`-myad2#~zb;ss1V0rJn?FD)t4GXZ(}RQ7M` z2bK@KG)Ie*2YK&rFYNQ=>oP6TY zQ3_M3wpRxArn>xF6>uR9{Fk1xym^ADbGrIEQV)6azJhO+R6kuTTKr4xPb^1GAbZI6 zX(E_H_CkpHJ!i^x!j{{xQkv_3Ui~Ib^JrUq7z@~{ylYGeD4kK3?%JAvqxuGKs^5U8 zWj4Lih+)#iqY{+@-%}{YJ(%%%kWzY_WGqTPCs}?h;qo@CMD2)Dk~=zv+ll23M`Oiy zz_Ge?E}E!9JN@VQ&`oo}b@@CZ8X^_m;Q#O5xZGVub{;f2=m#0!N(Sg^?5TKfnP(Ak9oc>_H({XR1@6t$jFtJw zGqda%wx$k$66Or)n~?KW(&W6vw*OE{9CwDSO4VqcMjydQE?VjCHG zZC6al`PrT(CY&vE0W6ZhgIvWNLC*E*uAw2tiT=(BXElcEGI= zyRuF6>v3{wi`@p$*9>Za^5F5x-?tiHLA{^@izS^?Qd5ttz8|RB@n7<4Zs3={?&^yW z5wm^WGPb5N;+xYQxwY9h4#$T&l#+?prjx#TKg=)SpcQeEUW<%;`5m{k5b%&3L3XlR zDXX)h0jj72`JY=-zik~!-pKrklDxK?k3!QQq~IGi47eehsp8Vqha(RExiT!ZSxfm0 z|9^(*#ZIR5&=>%9=mSXNHL$yY^wB3dm1PqVSNOBJp0a09r}bM#$wAk2nI8Oi(trSv z=B-C&&=+LhykGVIM9#HgHUU0QVH_p+H{6aN1+kUGb#K{^K9R5#{pL0PDT}Wl*KL@n zpmyNSk34<*Xu{nv{ma5=7SueA*0Ak0l$h$RaMP*p2j7>!DVjz(;^b3kCE>%qM(WwB z!9b66D5*y;Jscq4kZ`|c1pRw{q}%s3jj19UUBhMukHr7a zn=mZgv_RpHgSQ>7FYZI5gO#h%X)%0o4X3b%!Xs^;Rln~esW0HpEUX~2I-vV89JnEb zx8TFqkFe*mZcpl0g#OBy4`E$PH{&w;4$*e}WC95MwXAW1q%6SvMk=B@`OQ76C5tsB zfP8)~uZu)8*(tEZ!y91u}%5t;exj`Sm;lo5Cg|354m# z$nO*E?U72Tw%eb{2KpDB9)VrK#k(N~VcK4ZtwWZo4nSUR>~a(yj3Ph{8W9n;1G+>C zLteiUSxlS4ZFl4PGJTiWaF-5gr+$Z!x>ZQxk6xV9qUjC;gzCN&B*2@(;tO@A`GJ~X zuY<=#mKpamtd@-($9pk({13R30i1H57p_IW30=Wal>H}YFZe(g60)`QXk2gR@* z!#B2^2@$l_1#b}&QRV8k?T{YFRq+$TO47c=0HEsoBc;#4nTY(8sDoRCPK4zAa$L0< zwJOC&cIu3cV+y(*>s~^!%_Nk+`11Lvc!`#;-e!b;qaDs3_}Jf>3EQGEyv76{Z!`6i z5f-qYMG&j^<*`Wh-=OzD_IvsV+5VrI`G0D)=$*UDDjFa*z?SUK&)dpjtienaSXk!5 zfBaqjW2^3dG9Z>m`1F^g|4#t_pQH1CkGIPwPUV*>>;1Sk^=UBs>mOm4aQVOuEK?d| z*ZJ*8tGWFRz0-GKYs}A2NNdq(eZNez?xf^ww9-Z-35+kR;o2Cvt-1cyK=QHtZP9n0 zmCU;GAHpt(Q&B~w`G9Q@4LGK`wJ^afvk^H}q=T6}k>?!%pu!b-4Eg`DYc ze2wwV`muigaAlY2O&*d0h?>>1`RI5T=Lx$S{U}8pnuWjtE!!8j@BU77=k~9ut$UMM zEzA2vl`|;;C$zBlu!k7`vbzZF`+fQ~YxJ(`X&lN}&j|R>3Q9y)NB}~>94*P& z6(KHG5S;tP?ap_m-qI0ui!AJ~S38raDvRm&`<5)}+whS1M{&JpV(?vJ7_6Tpjx)P( z6zQy-x^6Qaz1oc{v2__xsX2QQdt&UV zjw3${fldCH_TaCu;AA&<;~-d`}uc->2kFZNO$C3YMqpmJRWH$LF&5D zdcGi{70~!6x8}SVBC;+lxf}!}JvW=P^&|^oxu`P+zP$VrrZOaN?K%rLLQTzt-w)ETj+RPK2+Cn+gOWg(uxdP=+X<@SS@ zQy209m)jT2>r8vcw*5G>!r#(G!uIiLw2c(ar%BYkHQa^=iC$TN=&x}gUHe>nr8(mI zS;OP%-&9w@BtdyfXpxuyXvP}OW#^NtsHBZ~NG7yBJj`ZL#Nng4&Av}=wEgN&Y;kza zv`h~xKFnX0O1D9#kS0wUDvHn=?$DHQtxJNd3*EK#s7g99Y!Jtxpvm`CLe`1ZMqYQ; zXpygDup}Gzm`oc6810WShkNcl`99y4rF}fh*_hVZX6 zc5YVhp;RUvQ%(+MjZ_qx&y+FCz=2LiWdKf9bW<{8q=qWY^;cvfpm9WsD3#_@t9xGn zo{EmdU8O?B8jkfOXQG@$-A}5{#rr=g%}fs(7+y)Vy=b^DG*IN!ffda=ud5R&gLK7t zcUT+XLeunf?6kd5ENlSVFtiF0_hLML|7}g73US7S!aHTJg~}WNUgTe^D+@hvSoI?= z>ToPwqir5gU999J>$TM^vnETjSV-gUty?;`4+gJ;_Mu=CQsij1W*zU#hgPu=Pxug0)@Z}#1}>X*V!W38#_mP|KS)eK`)M7-)s={KVFG{(4S zXe1d{g=e3N-JMn%Dy7CH!!DYi3=xo;a9Y+ZUp`tWKLReRF#K*F)6~Lui_pNlk}_5^ zlf_4C>{*UhX9yje$XP)1O9fO!-B}P~_Ep$@xTLJ13S|mV0SPhHHQF z4%R=bwL#yE+-CcrrC%Z#Y#cqpXPOQVJ8Dt+Qph}q_6<((sSz7zz`*C{o^11vqf04bwR<77($DpryOgAOo;d`T5h?H4N*e;R|=+EP~(87r!4&U4taE z3Zaw2#D8-N1a8A<)1#;H^NhYzV2TAFciWDvU6TkPsM3|kT=S!w>=}QaibJcfl`h!t zrRIS_oA;(a+E+CaaVc&|oEnVEMU zb9Zt%&B;(JpQG738Q}M-M<;cZSSildV&%viasKf{P>c?@#S^98xOtzNvWpm-LQ>Ud zirS6|_lrv+VhEerhcobpA)NS1us2n)i~Xx?RR=U>vyvHSMm_8(iewz!=NY89b~Nzq zWN;Cho!Vbmab9vz7q-JIbu5b%Gb3|6Jk1AbPAS<19Rr?`OtU3*qlzi`X2dod!I|R2 zZv8Ep_~|X{r^H?wFqIgoh*Ilb4+2Aw!9Mc9I2}ii80JSe*?H|XY+ty^*;zru=gkZ9O)cUg* z@s7i^=&_@Quyy#FYGXZq`MX=t_z-V&O@9ceQ)0Q^alYhQaH0jbe3X{x^~;puTTz)g~H0fx*o1b)QzNPS#`{- z0|*@Ag-ZV9-y+@(AAy^cTU$|>ZEIX37sO)j7nGv)g4gggq1dQ2wi~PvRZuBZZ#2`i zakQg@crU>V5r*47M$Zr-*Hw~hNklH3tpOCjjOV=Hx__PE?JpD;_%ZH<__}}p*kT?z z^r+}Aa4g0{N7OVe_{5|Ek>mzd;~=evd%R$|O; zS;{*j@4`@$x?onCHF4AU#T!&`O?V?vv}&xC`opI@U!}=Vzsg+U9%TjPfg(*4^~peR1^V75+0sRSG-ywc_l>!1!0|4l05HDzwenbkv@6zrl+S9aDsmN zT@gCLPXP7lyX@yy;8eI@S-?@;-?{!w;C6#(jIZ;znj~Sf`f5Ug3wzgS=arS*;3q4^ z$+}rB^Y9X*Tgyf2nqwlSEo7(I%z@}dYipK!xykcwvMBQlhGgxd9ap@kX-+C?Qf4W9 zmf!Vh+l|>yFkjj5m6mr%bAGwNhE+nmEOl)`HzR}_1c4K)m|ganWvPgdy0*5mLRIy6 zX1(#t27d^v>gZy*NwWe|GTmCa7*vZZ*otTRKyxqHyOhsTYWJ5ayhy@o+MvLF3M_<{ z(}JRsWl09XPN-V{PBI;^C$tQaxMC03&^$1*!&`t#&c%*#kbV=SH~0M-ai>J-RwtRq z9cKHmZ)AtsO8z(5auq5*#vrX#NRjh-Ks@Ja3^OTGF3@F@ZE#x~KSdz?s2BCcB`2fDgN?@cp+{nzGzU#Ll~3tXMp}?*K}t@k zakrJUz5iHQ3%hPZ;%HkY`{a^$Z#ZL;Ir_x_0KUalyJ(WsN=)3jw^_=#KbhJOdKV_j zAZsHzH&EnN?QOe5a-bs3fIl_ajXgYuX<*w|QQ;kQ&uCnSNHXGBh{YSU>LHA;dKTl_ zVhEMF-q15jWlA%e$KI0PLQ5DTa%Nv^x+E#*<)0^6Z&*zI7~DuRjqSUFc4jl^p6=FA zw)u+|t&A9;hV0wsC%{&m!|=5 z`g7@*qr4`!g!qVK)W&C-LIsG7yMd0g`93Rrss?IdMKE>XG)Rg9(ta0-)onFV;qD4} zlHZ+?I?2a;7a=p6(giUx{Cq@ttmCU7d`3L2NTAbLQ^R?RP#odMn#dBmPr-hHGNJKe zpg?goTT%Nl4vxn%-H2x(cW_TXtO_Xa{7t?nHQ) z64rIc{3j|%98eTaRX47>*aBVJnz4H0w?ZKLZ3ql%J-;a+vAMd7Et^=Kw6vJc+0S;) z65|dvmh!F!PSF*!OVKd^HwwYj|5zhYi3V|laHh1}ut!qX(NY6JLYmWU=CiGrcza7> z2CImddrX-sA15c;CJ%NiiU61q1Qk{RyW)i_<$@Brj(<;@U%=UL`%F7&4UPH_UL`Lg zb(;abHOLVU>kklBrIPZg=@p!Z5qHcz)jhFcYS=iU&(xGM)U?$VS$A6LN0}E;xx!mKx~^q%UaJ5>HRD`htfh`;rBb`=bD$>dttZq21AF* z#pYi`LLz^iaI_I3C36a!W#wf0Y`Kw%Xx?Ha;8i&7uN7IU?35)8;*jUcIU;{lIvNju zd(ChzFgL#F?7rf%@IsCp^wK)1nByi)!L?J6R!_ID;AZT}38ZoWuX(L{wg*$i42+p#9yZpXm z6Xotg>IE85?x8I~y0k0P>9_7KFpGx@Ae&nczq-E~PxAK?XE7Q+A<4E~)s9EB9Vdc$ zgb10iH@4s4OJi^zEE9vn95q>aX6f#go+}!L@^dslg)L$cet=QTz&E$240KP;CQui8 zWE|B_Jl}1iUs@E&l45t@(Q4V%xuUsO4G*+v1|_V{Q2CMJtgBuc(@@5*ozh5Sw9PR7 zbxqP;nAOY*86!_tyJ=lf0ttbH4r39?tTHI8b^-|z>bd-o)%cK|7!=ium<*Y!tFt0J zEQ&{|p{%&EKb~fRLZ-E89(Zn($?`Wp_f88xQzu)(qhC_ig?ZyD5#Qnoppg Y7O;bsDhxZ^fKPpr5RnzG7Ss>;KMm1+Q2+n{ literal 0 HcmV?d00001 diff --git a/docs/clients/http.rst b/docs/clients/http.rst index e41adb5b..c6e8b7d8 100644 --- a/docs/clients/http.rst +++ b/docs/clients/http.rst @@ -4,11 +4,26 @@ HTTP clients ************ -Mopidy added an :ref:`http-frontend` in 0.10 which provides the building blocks -needed for creating web clients for Mopidy with the help of a WebSocket and a -JavaScript library provided by Mopidy. +Mopidy added an :ref:`HTTP frontend ` in 0.10 which provides the +building blocks needed for creating web clients for Mopidy with the help of a +WebSocket and a JavaScript library provided by Mopidy. This page will list any HTTP/web Mopidy clients. If you've created one, please notify us so we can include your client on this page. See :ref:`http-frontend` for details on how to build your own web client. + + +woutervanwijk/Mopidy-Webclient +============================== + +.. image:: /_static/woutervanwijk-mopidy-webclient.png + :width: 410 + :height: 511 + +The first web client for Mopidy is still under development, but is already very +usable. It targets both desktop and mobile browsers. + +To try it out, get a copy of https://github.com/woutervanwijk/Mopidy-WebClient +and point the :attr:`mopidy.settings.HTTP_SERVER_STATIC_DIR` setting towards +your copy of the web client. From 4f11ac77aede97af8edb00098561c838af2557ad Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 27 Dec 2012 03:20:05 +0100 Subject: [PATCH 028/151] settings: Update settings validator to support empty iterables. --- mopidy/utils/settings.py | 22 ++++++++++++++-------- tests/utils/settings_test.py | 4 ++-- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/mopidy/utils/settings.py b/mopidy/utils/settings.py index 6eb462ce..8ae61e5b 100644 --- a/mopidy/utils/settings.py +++ b/mopidy/utils/settings.py @@ -142,7 +142,13 @@ def validate_settings(defaults, settings): 'SPOTIFY_LIB_CACHE': 'SPOTIFY_CACHE_PATH', } - list_of_one_or_more = [ + must_be_iterable = [ + 'BACKENDS', + 'FRONTENDS', + 'STREAM_PROTOCOLS', + ] + + must_have_value_set = [ 'BACKENDS', 'FRONTENDS', ] @@ -171,13 +177,13 @@ def validate_settings(defaults, settings): 'Deprecated setting, please set the value via the GStreamer ' 'bin in OUTPUT.') - elif setting in list_of_one_or_more: - if not hasattr(value, '__iter__'): - errors[setting] = ( - 'Must be a tuple. ' - "Remember the comma after single values: (u'value',)") - if not value: - errors[setting] = 'Must contain at least one value.' + elif setting in must_be_iterable and not hasattr(value, '__iter__'): + errors[setting] = ( + 'Must be a tuple. ' + "Remember the comma after single values: (u'value',)") + + elif setting in must_have_value_set and not value: + errors[setting] = 'Must be set.' elif setting not in defaults and not setting.startswith('CUSTOM_'): errors[setting] = 'Unknown setting.' diff --git a/tests/utils/settings_test.py b/tests/utils/settings_test.py index 1dcac1bb..51f0d89c 100644 --- a/tests/utils/settings_test.py +++ b/tests/utils/settings_test.py @@ -79,13 +79,13 @@ class ValidateSettingsTest(unittest.TestCase): result = setting_utils.validate_settings( self.defaults, {'FRONTENDS': []}) self.assertEqual( - result['FRONTENDS'], 'Must contain at least one value.') + result['FRONTENDS'], 'Must be set.') def test_empty_backends_list_returns_error(self): result = setting_utils.validate_settings( self.defaults, {'BACKENDS': []}) self.assertEqual( - result['BACKENDS'], 'Must contain at least one value.') + result['BACKENDS'], 'Must be set.') def test_noniterable_multivalue_setting_returns_error(self): result = setting_utils.validate_settings( From 341dea7262071ba3384eede98ca7b22f97c596f5 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 27 Dec 2012 03:21:20 +0100 Subject: [PATCH 029/151] stream backend: Add StreamBackend, fixes #151 Adds a basic streaming backend simply handles streaming audio and nothing else. I.e. no metadata beyond the URI we where given. #270 still needs to be solved for actual metadata to make sense in this backend. --- mopidy/backends/stream/__init__.py | 23 ++++++++++++ mopidy/backends/stream/actor.py | 57 ++++++++++++++++++++++++++++++ mopidy/settings.py | 25 +++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 mopidy/backends/stream/__init__.py create mode 100644 mopidy/backends/stream/actor.py diff --git a/mopidy/backends/stream/__init__.py b/mopidy/backends/stream/__init__.py new file mode 100644 index 00000000..82755540 --- /dev/null +++ b/mopidy/backends/stream/__init__.py @@ -0,0 +1,23 @@ +"""A backend for playing music for streaming music. + +This backend will handle streaming of URIs in +:attr:`mopidy.settings.STREAM_PROTOCOLS` assuming the right plugins are +installed. + +**Issues:** + +https://github.com/mopidy/mopidy/issues?labels=Stream+backend + +**Dependencies:** + +- None + +**Settings:** + +- :attr:`mopidy.settings.STREAM_PROTOCOLS` +""" + +from __future__ import unicode_literals + +# flake8: noqa +from .actor import StreamBackend diff --git a/mopidy/backends/stream/actor.py b/mopidy/backends/stream/actor.py new file mode 100644 index 00000000..7fc28711 --- /dev/null +++ b/mopidy/backends/stream/actor.py @@ -0,0 +1,57 @@ +from __future__ import unicode_literals + +import pygst +pygst.require('0.10') +import gst + +import logging +import urlparse + +import pykka + +from mopidy import settings +from mopidy.backends import base +from mopidy.models import SearchResult, Track + +logger = logging.getLogger('mopidy.backends.stream') + + +class StreamBackend(pykka.ThreadingActor, base.Backend): + def __init__(self, audio): + super(StreamBackend, self).__init__() + + self.library = StreamLibraryProvider(backend=self) + self.playback = base.BasePlaybackProvider(audio=audio, backend=self) + self.playlists = None + + available_protocols = set() + + registry = gst.registry_get_default() + for factory in registry.get_feature_list(gst.TYPE_ELEMENT_FACTORY): + for uri in factory.get_uri_protocols(): + if uri in settings.STREAM_PROTOCOLS: + available_protocols.add(uri) + + self.uri_schemes = list(available_protocols) + + +# TODO: Should we consider letting lookup know how to expand common playlist +# formats (m3u, pls, etc) for http(s) URIs? +class StreamLibraryProvider(base.BaseLibraryProvider): + def lookup(self, uri): + if urlparse.urlsplit(uri).scheme not in self.backend.uri_schemes: + return [] + # TODO: actually lookup the stream metadata by getting tags in same + # way as we do for updating the local library with mopidy.scanner + # Note that we would only want the stream metadata at this stage, + # not the currently playing track's. + return [Track(uri=uri, name=uri)] + + def find_exact(self, **query): + return SearchResult() + + def search(self, **query): + return SearchResult() + + def refresh(self, uri=None): + pass diff --git a/mopidy/settings.py b/mopidy/settings.py index c2081e27..9d99a7cb 100644 --- a/mopidy/settings.py +++ b/mopidy/settings.py @@ -20,10 +20,12 @@ from __future__ import unicode_literals #: BACKENDS = ( #: u'mopidy.backends.local.LocalBackend', #: u'mopidy.backends.spotify.SpotifyBackend', +#: u'mopidy.backends.spotify.StreamBackend', #: ) BACKENDS = ( 'mopidy.backends.local.LocalBackend', 'mopidy.backends.spotify.SpotifyBackend', + 'mopidy.backends.stream.StreamBackend', ) #: The log format used for informational logging. @@ -301,3 +303,26 @@ SPOTIFY_PROXY_PASSWORD = None #: #: SPOTIFY_TIMEOUT = 10 SPOTIFY_TIMEOUT = 10 + +#: Whitelist of URIs to support streaming from. +#: +#: Used by :mod:`mopidy.backends.stream` +#: +#: Default:: +#: +#: STREAM_PROTOCOLS = ( +#: u'http', +#: u'https', +#: u'mms', +#: u'rtmp', +#: u'rtmps', +#: u'rtsp', +#: ) +STREAM_PROTOCOLS = ( + 'http', + 'https', + 'mms', + 'rtmp', + 'rtmps', + 'rtsp', +) From 5dd7f4b07a4a996032864ffa0e5622695d5b6534 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Tue, 1 Jan 2013 16:56:34 +0100 Subject: [PATCH 030/151] core: Update BaseLibraryProvider to not require refresh, search or find_exact. These methods may now return None, and the core code has been updated to filter out missing SearchResults. --- mopidy/backends/base.py | 12 ++++++------ mopidy/backends/stream/actor.py | 9 --------- mopidy/core/library.py | 4 ++-- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/mopidy/backends/base.py b/mopidy/backends/base.py index 8250a24c..f49aa89b 100644 --- a/mopidy/backends/base.py +++ b/mopidy/backends/base.py @@ -57,9 +57,9 @@ class BaseLibraryProvider(object): """ See :meth:`mopidy.core.LibraryController.find_exact`. - *MUST be implemented by subclass.* + *MAY be implemented by subclass.* """ - raise NotImplementedError + pass def lookup(self, uri): """ @@ -73,17 +73,17 @@ class BaseLibraryProvider(object): """ See :meth:`mopidy.core.LibraryController.refresh`. - *MUST be implemented by subclass.* + *MAY be implemented by subclass.* """ - raise NotImplementedError + pass def search(self, **query): """ See :meth:`mopidy.core.LibraryController.search`. - *MUST be implemented by subclass.* + *MAY be implemented by subclass.* """ - raise NotImplementedError + pass class BasePlaybackProvider(object): diff --git a/mopidy/backends/stream/actor.py b/mopidy/backends/stream/actor.py index 7fc28711..cdf777af 100644 --- a/mopidy/backends/stream/actor.py +++ b/mopidy/backends/stream/actor.py @@ -46,12 +46,3 @@ class StreamLibraryProvider(base.BaseLibraryProvider): # Note that we would only want the stream metadata at this stage, # not the currently playing track's. return [Track(uri=uri, name=uri)] - - def find_exact(self, **query): - return SearchResult() - - def search(self, **query): - return SearchResult() - - def refresh(self, uri=None): - pass diff --git a/mopidy/core/library.py b/mopidy/core/library.py index 39a1e99c..e4be7ce8 100644 --- a/mopidy/core/library.py +++ b/mopidy/core/library.py @@ -41,7 +41,7 @@ class LibraryController(object): query = query or kwargs futures = [ b.library.find_exact(**query) for b in self.backends.with_library] - return pykka.get_all(futures) + return [result for result in pykka.get_all(futures) if result] def lookup(self, uri): """ @@ -101,4 +101,4 @@ class LibraryController(object): query = query or kwargs futures = [ b.library.search(**query) for b in self.backends.with_library] - return pykka.get_all(futures) + return [result for result in pykka.get_all(futures) if result] From f1bd092e63f501bc5f3bb2dee3e65a267b61ccdc Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Tue, 1 Jan 2013 17:03:48 +0100 Subject: [PATCH 031/151] core: Update tests with cases for filtering out None results. --- tests/core/library_test.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/core/library_test.py b/tests/core/library_test.py index 32e618d2..e01696c7 100644 --- a/tests/core/library_test.py +++ b/tests/core/library_test.py @@ -90,6 +90,22 @@ class CoreLibraryTest(unittest.TestCase): self.library1.find_exact.assert_called_once_with(any=['a']) self.library2.find_exact.assert_called_once_with(any=['a']) + def test_find_exact_filters_out_none(self): + track1 = Track(uri='dummy1:a') + result1 = SearchResult(tracks=[track1]) + + self.library1.find_exact().get.return_value = result1 + self.library1.find_exact.reset_mock() + self.library2.find_exact().get.return_value = None + self.library2.find_exact.reset_mock() + + result = self.core.library.find_exact(any=['a']) + + self.assertIn(result1, result) + self.assertNotIn(None, result) + self.library1.find_exact.assert_called_once_with(any=['a']) + self.library2.find_exact.assert_called_once_with(any=['a']) + def test_find_accepts_query_dict_instead_of_kwargs(self): track1 = Track(uri='dummy1:a') track2 = Track(uri='dummy2:a') @@ -126,6 +142,22 @@ class CoreLibraryTest(unittest.TestCase): self.library1.search.assert_called_once_with(any=['a']) self.library2.search.assert_called_once_with(any=['a']) + def test_search_filters_out_none(self): + track1 = Track(uri='dummy1:a') + result1 = SearchResult(tracks=[track1]) + + self.library1.search().get.return_value = result1 + self.library1.search.reset_mock() + self.library2.search().get.return_value = None + self.library2.search.reset_mock() + + result = self.core.library.search(any=['a']) + + self.assertIn(result1, result) + self.assertNotIn(None, result) + self.library1.search.assert_called_once_with(any=['a']) + self.library2.search.assert_called_once_with(any=['a']) + def test_search_accepts_query_dict_instead_of_kwargs(self): track1 = Track(uri='dummy1:a') track2 = Track(uri='dummy2:a') From ca82565b0889f81f8ae9890d1a729a8f014a4458 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Tue, 1 Jan 2013 17:25:07 +0100 Subject: [PATCH 032/151] audio: Move supported URI checking to mopidy.audio.utils In order to avoid gstreamer imports leaking into more of our code I'm moving this to a new utils class in audio. --- mopidy/audio/utils.py | 23 +++++++++++++++++++++++ mopidy/backends/stream/actor.py | 16 +++------------- 2 files changed, 26 insertions(+), 13 deletions(-) create mode 100644 mopidy/audio/utils.py diff --git a/mopidy/audio/utils.py b/mopidy/audio/utils.py new file mode 100644 index 00000000..3f5f685e --- /dev/null +++ b/mopidy/audio/utils.py @@ -0,0 +1,23 @@ +from __future__ import unicode_literals + +import pygst +pygst.require('0.10') +import gst + + +def supported_uri_schemes(uri_schemes): + """Determine which URIs we can actually support from provided whitelist. + + :param uri_schemes: list/set of URIs to check support for. + :type uri_schemes: list or set or URI schemes as strings. + :rtype: set of URI schemes we can support via this GStreamer install. + """ + supported_schemes= set() + registry = gst.registry_get_default() + + for factory in registry.get_feature_list(gst.TYPE_ELEMENT_FACTORY): + for uri in factory.get_uri_protocols(): + if uri in uri_schemes: + supported_schemes.add(uri) + + return supported_schemes diff --git a/mopidy/backends/stream/actor.py b/mopidy/backends/stream/actor.py index cdf777af..0c91f291 100644 --- a/mopidy/backends/stream/actor.py +++ b/mopidy/backends/stream/actor.py @@ -1,15 +1,12 @@ from __future__ import unicode_literals -import pygst -pygst.require('0.10') -import gst - import logging import urlparse import pykka from mopidy import settings +from mopidy.audio import utils from mopidy.backends import base from mopidy.models import SearchResult, Track @@ -24,15 +21,8 @@ class StreamBackend(pykka.ThreadingActor, base.Backend): self.playback = base.BasePlaybackProvider(audio=audio, backend=self) self.playlists = None - available_protocols = set() - - registry = gst.registry_get_default() - for factory in registry.get_feature_list(gst.TYPE_ELEMENT_FACTORY): - for uri in factory.get_uri_protocols(): - if uri in settings.STREAM_PROTOCOLS: - available_protocols.add(uri) - - self.uri_schemes = list(available_protocols) + self.uri_schemes = utils.supported_uri_schemes( + settings.STREAM_PROTOCOLS) # TODO: Should we consider letting lookup know how to expand common playlist From dfa0d648f985a58ad536b3dc5bdbaf5ea20438b0 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 2 Jan 2013 21:39:14 +0100 Subject: [PATCH 033/151] scanner: Support symlinks --- docs/changes.rst | 4 ++++ mopidy/utils/path.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/changes.rst b/docs/changes.rst index 89707b6a..fba9b80e 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -14,6 +14,10 @@ v0.12.0 (in development) - Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`) +**Local backend** + +- Make ``mopidy-scan`` support symlinks. + v0.11.0 (2012-12-24) ==================== diff --git a/mopidy/utils/path.py b/mopidy/utils/path.py index c4fa0ce2..7d988a90 100644 --- a/mopidy/utils/path.py +++ b/mopidy/utils/path.py @@ -120,7 +120,7 @@ def find_files(path): if not os.path.basename(path).startswith(b'.'): yield path else: - for dirpath, dirnames, filenames in os.walk(path): + for dirpath, dirnames, filenames in os.walk(path, followlinks=True): for dirname in dirnames: if dirname.startswith(b'.'): # Skip hidden folders by modifying dirnames inplace From af6ee16b3a0bec886c312c2904a2e9cc8dcbee20 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 2 Jan 2013 22:25:32 +0100 Subject: [PATCH 034/151] Fix flake8 warnings --- mopidy/audio/utils.py | 2 +- mopidy/backends/stream/actor.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mopidy/audio/utils.py b/mopidy/audio/utils.py index 3f5f685e..e9eac9f8 100644 --- a/mopidy/audio/utils.py +++ b/mopidy/audio/utils.py @@ -12,7 +12,7 @@ def supported_uri_schemes(uri_schemes): :type uri_schemes: list or set or URI schemes as strings. :rtype: set of URI schemes we can support via this GStreamer install. """ - supported_schemes= set() + supported_schemes = set() registry = gst.registry_get_default() for factory in registry.get_feature_list(gst.TYPE_ELEMENT_FACTORY): diff --git a/mopidy/backends/stream/actor.py b/mopidy/backends/stream/actor.py index 0c91f291..b7070454 100644 --- a/mopidy/backends/stream/actor.py +++ b/mopidy/backends/stream/actor.py @@ -8,7 +8,7 @@ import pykka from mopidy import settings from mopidy.audio import utils from mopidy.backends import base -from mopidy.models import SearchResult, Track +from mopidy.models import Track logger = logging.getLogger('mopidy.backends.stream') From b009606df5eb5a74cf2d372a0ad6bca575afb87b Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 2 Jan 2013 22:29:07 +0100 Subject: [PATCH 035/151] docs: Document new backend --- docs/api/backends.rst | 3 ++- docs/modules/backends/stream.rst | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 docs/modules/backends/stream.rst diff --git a/docs/api/backends.rst b/docs/api/backends.rst index f0aadd53..32c04d37 100644 --- a/docs/api/backends.rst +++ b/docs/api/backends.rst @@ -46,5 +46,6 @@ Backend implementations ======================= * :mod:`mopidy.backends.dummy` -* :mod:`mopidy.backends.spotify` * :mod:`mopidy.backends.local` +* :mod:`mopidy.backends.spotify` +* :mod:`mopidy.backends.stream` diff --git a/docs/modules/backends/stream.rst b/docs/modules/backends/stream.rst new file mode 100644 index 00000000..73e53048 --- /dev/null +++ b/docs/modules/backends/stream.rst @@ -0,0 +1,7 @@ +*********************************************** +:mod:`mopidy.backends.stream` -- Stream backend +*********************************************** + +.. automodule:: mopidy.backends.stream + :synopsis: Backend for playing audio streams + :members: From 052efc23eda7e73c3db4b23a0c93986c1e85be50 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 2 Jan 2013 22:32:58 +0100 Subject: [PATCH 036/151] docs: Add stream backend to changelog --- docs/changes.rst | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/docs/changes.rst b/docs/changes.rst index fba9b80e..22f221cd 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -10,7 +10,7 @@ v0.12.0 (in development) (in development) -**Spotify** +**Spotify backend** - Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`) @@ -18,6 +18,23 @@ v0.12.0 (in development) - Make ``mopidy-scan`` support symlinks. +**Stream backend** + +We've added a new backend for playing audio streams, the :mod:`stream backend +`. It is activated by default. + +The stream backend supports the intersection of what your GStreamer +installation supports and what protocols are included in the +:attr:`mopidy.settings.STREAM_PROTOCOLS` settings. + +Current limitations: + +- No metadata about the current track in the stream is available. + +- Playlists are not parsed, so you can't play e.g. a M3U or PLS file which + contains stream URIs. You need to extract the stream URL from the playlist + yourself. See :issue:`303` for progress on this. + v0.11.0 (2012-12-24) ==================== From bd8ab175ed581527d16838aa1bfcb62c6d775409 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 2 Jan 2013 22:35:43 +0100 Subject: [PATCH 037/151] docs: Add period for consistency --- mopidy/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mopidy/settings.py b/mopidy/settings.py index 9d99a7cb..6ee9357e 100644 --- a/mopidy/settings.py +++ b/mopidy/settings.py @@ -306,7 +306,7 @@ SPOTIFY_TIMEOUT = 10 #: Whitelist of URIs to support streaming from. #: -#: Used by :mod:`mopidy.backends.stream` +#: Used by :mod:`mopidy.backends.stream`. #: #: Default:: #: From fa929fd01da8d5aad193102a16ff7a8b8265069f Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 2 Jan 2013 22:36:29 +0100 Subject: [PATCH 038/151] docs: Add more periods for consistency --- mopidy/settings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mopidy/settings.py b/mopidy/settings.py index 6ee9357e..fd3dfd6f 100644 --- a/mopidy/settings.py +++ b/mopidy/settings.py @@ -288,7 +288,7 @@ SPOTIFY_PROXY_USERNAME = None #: Spotify proxy password. #: -#: Used by :mod:`mopidy.backends.spotify` +#: Used by :mod:`mopidy.backends.spotify`. #: #: Default:: #: @@ -297,7 +297,7 @@ SPOTIFY_PROXY_PASSWORD = None #: Max number of seconds to wait for Spotify operations to complete. #: -#: Used by :mod:`mopidy.backends.spotify` +#: Used by :mod:`mopidy.backends.spotify`. #: #: Default:: #: From 62cbcee5d76d17035ce4d8fc04191214db29409f Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 2 Jan 2013 23:40:59 +0100 Subject: [PATCH 039/151] Fix Python 2.6.0/2.6.1 support (fixes #302) --- docs/changes.rst | 3 +++ mopidy/__main__.py | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index 22f221cd..dd82dd5f 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -10,6 +10,9 @@ v0.12.0 (in development) (in development) +- Make Mopidy work on Python 2.6 versions less than 2.6.2rc1. (Fixes: + :issue:`302`) + **Spotify backend** - Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`) diff --git a/mopidy/__main__.py b/mopidy/__main__.py index 952f158c..e111fcef 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -79,37 +79,40 @@ def main(): def parse_options(): parser = optparse.OptionParser( version='Mopidy %s' % versioning.get_version()) + # NOTE Python 2.6: To support Python versions < 2.6.2rc1 we must use + # bytestrings for the first argument to ``add_option`` + # See https://github.com/mopidy/mopidy/issues/302 for details parser.add_option( - '--help-gst', + b'--help-gst', action='store_true', dest='help_gst', help='show GStreamer help options') parser.add_option( - '-i', '--interactive', + b'-i', '--interactive', action='store_true', dest='interactive', help='ask interactively for required settings which are missing') parser.add_option( - '-q', '--quiet', + b'-q', '--quiet', action='store_const', const=0, dest='verbosity_level', help='less output (warning level)') parser.add_option( - '-v', '--verbose', + b'-v', '--verbose', action='count', default=1, dest='verbosity_level', help='more output (debug level)') parser.add_option( - '--save-debug-log', + b'--save-debug-log', action='store_true', dest='save_debug_log', help='save debug log to "./mopidy.log"') parser.add_option( - '--list-settings', + b'--list-settings', action='callback', callback=settings_utils.list_settings_optparse_callback, help='list current settings') parser.add_option( - '--list-deps', + b'--list-deps', action='callback', callback=deps.list_deps_optparse_callback, help='list dependencies and their versions') parser.add_option( - '--debug-thread', + b'--debug-thread', action='store_true', dest='debug_thread', help='run background thread that dumps tracebacks on SIGUSR1') return parser.parse_args(args=mopidy_args)[0] From d34ba24cfee27b12b9de0524453926ce80c42d59 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 3 Jan 2013 10:04:05 +0100 Subject: [PATCH 040/151] Use bytestrings for the keys of **kwargs dicts Python < 2.6.5rc1 does not work with unicode keys. Fixes #302. --- docs/changes.rst | 9 +++++-- mopidy/backends/local/translator.py | 39 ++++++++++++++++------------- mopidy/scanner.py | 10 +++++--- tests/scanner_test.py | 36 ++++++++++++++------------ 4 files changed, 55 insertions(+), 39 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index dd82dd5f..c2b076fc 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -10,8 +10,13 @@ v0.12.0 (in development) (in development) -- Make Mopidy work on Python 2.6 versions less than 2.6.2rc1. (Fixes: - :issue:`302`) +- Make Mopidy work on early Python 2.6 versions. (Fixes: :issue:`302`) + + - ``optparse`` fails if the first argument to ``add_option`` is a unicode + string on Python < 2.6.2rc1. + + - ``foo(**data)`` fails if the keys in ``data`` is unicode strings on Python + < 2.6.5rc1. **Spotify backend** diff --git a/mopidy/backends/local/translator.py b/mopidy/backends/local/translator.py index 390fd92a..157804b4 100644 --- a/mopidy/backends/local/translator.py +++ b/mopidy/backends/local/translator.py @@ -98,6 +98,9 @@ def _convert_mpd_data(data, tracks, music_dir): if not data: return + # NOTE: kwargs are explicitly made bytestrings to work on Python + # 2.6.0/2.6.1. See https://github.com/mopidy/mopidy/issues/302 for details. + track_kwargs = {} album_kwargs = {} artist_kwargs = {} @@ -105,38 +108,38 @@ def _convert_mpd_data(data, tracks, music_dir): if 'track' in data: if '/' in data['track']: - album_kwargs['num_tracks'] = int(data['track'].split('/')[1]) - track_kwargs['track_no'] = int(data['track'].split('/')[0]) + album_kwargs[b'num_tracks'] = int(data['track'].split('/')[1]) + track_kwargs[b'track_no'] = int(data['track'].split('/')[0]) else: - track_kwargs['track_no'] = int(data['track']) + track_kwargs[b'track_no'] = int(data['track']) if 'artist' in data: - artist_kwargs['name'] = data['artist'] - albumartist_kwargs['name'] = data['artist'] + artist_kwargs[b'name'] = data['artist'] + albumartist_kwargs[b'name'] = data['artist'] if 'albumartist' in data: - albumartist_kwargs['name'] = data['albumartist'] + albumartist_kwargs[b'name'] = data['albumartist'] if 'album' in data: - album_kwargs['name'] = data['album'] + album_kwargs[b'name'] = data['album'] if 'title' in data: - track_kwargs['name'] = data['title'] + track_kwargs[b'name'] = data['title'] if 'date' in data: - track_kwargs['date'] = data['date'] + track_kwargs[b'date'] = data['date'] if 'musicbrainz_trackid' in data: - track_kwargs['musicbrainz_id'] = data['musicbrainz_trackid'] + track_kwargs[b'musicbrainz_id'] = data['musicbrainz_trackid'] if 'musicbrainz_albumid' in data: - album_kwargs['musicbrainz_id'] = data['musicbrainz_albumid'] + album_kwargs[b'musicbrainz_id'] = data['musicbrainz_albumid'] if 'musicbrainz_artistid' in data: - artist_kwargs['musicbrainz_id'] = data['musicbrainz_artistid'] + artist_kwargs[b'musicbrainz_id'] = data['musicbrainz_artistid'] if 'musicbrainz_albumartistid' in data: - albumartist_kwargs['musicbrainz_id'] = ( + albumartist_kwargs[b'musicbrainz_id'] = ( data['musicbrainz_albumartistid']) if data['file'][0] == '/': @@ -147,18 +150,18 @@ def _convert_mpd_data(data, tracks, music_dir): if artist_kwargs: artist = Artist(**artist_kwargs) - track_kwargs['artists'] = [artist] + track_kwargs[b'artists'] = [artist] if albumartist_kwargs: albumartist = Artist(**albumartist_kwargs) - album_kwargs['artists'] = [albumartist] + album_kwargs[b'artists'] = [albumartist] if album_kwargs: album = Album(**album_kwargs) - track_kwargs['album'] = album + track_kwargs[b'album'] = album - track_kwargs['uri'] = path_to_uri(music_dir, path) - track_kwargs['length'] = int(data.get('time', 0)) * 1000 + track_kwargs[b'uri'] = path_to_uri(music_dir, path) + track_kwargs[b'length'] = int(data.get('time', 0)) * 1000 track = Track(**track_kwargs) tracks.add(track) diff --git a/mopidy/scanner.py b/mopidy/scanner.py index 0b10d061..68d7440a 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -96,9 +96,13 @@ def translator(data): artist_kwargs = {} track_kwargs = {} + # NOTE: kwargs are explicitly made bytestrings to work on Python + # 2.6.0/2.6.1. See https://github.com/mopidy/mopidy/issues/302 for + # details. + def _retrieve(source_key, target_key, target): if source_key in data: - target[target_key] = data[source_key] + target[str(target_key)] = data[source_key] _retrieve(gst.TAG_ALBUM, 'name', album_kwargs) _retrieve(gst.TAG_TRACK_COUNT, 'num_tracks', album_kwargs) @@ -111,7 +115,7 @@ def translator(data): except ValueError: pass # Ignore invalid dates else: - track_kwargs['date'] = date.isoformat() + track_kwargs[b'date'] = date.isoformat() _retrieve(gst.TAG_TITLE, 'name', track_kwargs) _retrieve(gst.TAG_TRACK_NUMBER, 'track_no', track_kwargs) @@ -125,7 +129,7 @@ def translator(data): 'musicbrainz-albumartistid', 'musicbrainz_id', albumartist_kwargs) if albumartist_kwargs: - album_kwargs['artists'] = [Artist(**albumartist_kwargs)] + album_kwargs[b'artists'] = [Artist(**albumartist_kwargs)] track_kwargs['uri'] = data['uri'] track_kwargs['length'] = data[gst.TAG_DURATION] diff --git a/tests/scanner_test.py b/tests/scanner_test.py index 92e9a269..d8466e26 100644 --- a/tests/scanner_test.py +++ b/tests/scanner_test.py @@ -32,36 +32,40 @@ class TranslatorTest(unittest.TestCase): 'musicbrainz-albumartistid': 'mbalbumartistid', } + # NOTE: kwargs are explicitly made bytestrings to work on Python + # 2.6.0/2.6.1. See https://github.com/mopidy/mopidy/issues/302 for + # details. + self.album = { - 'name': 'albumname', - 'num_tracks': 2, - 'musicbrainz_id': 'mbalbumid', + b'name': 'albumname', + b'num_tracks': 2, + b'musicbrainz_id': 'mbalbumid', } self.artist = { - 'name': 'name', - 'musicbrainz_id': 'mbartistid', + b'name': 'name', + b'musicbrainz_id': 'mbartistid', } self.albumartist = { - 'name': 'albumartistname', - 'musicbrainz_id': 'mbalbumartistid', + b'name': 'albumartistname', + b'musicbrainz_id': 'mbalbumartistid', } self.track = { - 'uri': 'uri', - 'name': 'trackname', - 'date': '2006-01-01', - 'track_no': 1, - 'length': 4531, - 'musicbrainz_id': 'mbtrackid', + b'uri': 'uri', + b'name': 'trackname', + b'date': '2006-01-01', + b'track_no': 1, + b'length': 4531, + b'musicbrainz_id': 'mbtrackid', } def build_track(self): if self.albumartist: - self.album['artists'] = [Artist(**self.albumartist)] - self.track['album'] = Album(**self.album) - self.track['artists'] = [Artist(**self.artist)] + self.album[b'artists'] = [Artist(**self.albumartist)] + self.track[b'album'] = Album(**self.album) + self.track[b'artists'] = [Artist(**self.artist)] return Track(**self.track) def check(self): From 5ff8ea451f0b8e08707822ed998327e21dd133be Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 3 Jan 2013 12:58:08 +0100 Subject: [PATCH 041/151] More **kwargs key fixing (#302) --- mopidy/scanner.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mopidy/scanner.py b/mopidy/scanner.py index 68d7440a..aba2491c 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -131,10 +131,10 @@ def translator(data): if albumartist_kwargs: album_kwargs[b'artists'] = [Artist(**albumartist_kwargs)] - track_kwargs['uri'] = data['uri'] - track_kwargs['length'] = data[gst.TAG_DURATION] - track_kwargs['album'] = Album(**album_kwargs) - track_kwargs['artists'] = [Artist(**artist_kwargs)] + track_kwargs[b'uri'] = data['uri'] + track_kwargs[b'length'] = data[gst.TAG_DURATION] + track_kwargs[b'album'] = Album(**album_kwargs) + track_kwargs[b'artists'] = [Artist(**artist_kwargs)] return Track(**track_kwargs) From ef3d5e92ceeb1ca0619885f4c6707ce6b4062b31 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 3 Jan 2013 13:14:21 +0100 Subject: [PATCH 042/151] scanner: Fix optparse on early 2.6 (#302) --- mopidy/scanner.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mopidy/scanner.py b/mopidy/scanner.py index aba2491c..9f8c12f7 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -79,12 +79,15 @@ def main(): def parse_options(): parser = optparse.OptionParser( version='Mopidy %s' % versioning.get_version()) + # NOTE Python 2.6: To support Python versions < 2.6.2rc1 we must use + # bytestrings for the first argument to ``add_option`` + # See https://github.com/mopidy/mopidy/issues/302 for details parser.add_option( - '-q', '--quiet', + b'-q', '--quiet', action='store_const', const=0, dest='verbosity_level', help='less output (warning level)') parser.add_option( - '-v', '--verbose', + b'-v', '--verbose', action='count', default=1, dest='verbosity_level', help='more output (debug level)') return parser.parse_args(args=mopidy_args)[0] From 8d2656f75c15f7e64e53d180566f425110f5ff9b Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 3 Jan 2013 14:27:13 +0100 Subject: [PATCH 043/151] Temporary workaround for #300 Likely cause of this issue is libspotify getting the intial seek to early. We have not yet had time to dig beyond this point and develop has been broken for to long due to this. As such this work aroundly simply ignores the first seek to position zero outright, this avoiding what is likely a race condition in libspotify. Next step will be to create a minimal libspotify/pyspotify test case for this to verify that assumption and hopefully figure out a correct fix. We also need to look into if the intial seek can be avoided in gstreamer. --- mopidy/backends/spotify/playback.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index d7e622fb..cead01bf 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -27,6 +27,10 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): 'width=(int)16, depth=(int)16, signed=(boolean)true, ' 'rate=(int)44100') + def __init__(self, *args, **kwargs): + super(SpotifyPlaybackProvider, self).__init__(*args, **kwargs) + self._first_seek = False + def play(self, track): if track.uri is None: return False @@ -35,6 +39,8 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): seek_data_callback_bound = functools.partial( seek_data_callback, spotify_backend) + self._first_seek = True + try: self.backend.spotify.session.load( Link.from_string(track.uri).as_track()) @@ -59,5 +65,11 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): def on_seek_data(self, time_position): logger.debug('playback.on_seek_data(%d) called', time_position) + + if time_position == 0 and self._first_seek: + self._first_seek = False + logger.debug('Skipping seek due to issue #300') + return + self.backend.spotify.buffer_timestamp = time_position * gst.MSECOND self.backend.spotify.session.seek(time_position) From 88398ea355dff692c93e0a3220deeaa60ebd00a1 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 3 Jan 2013 15:35:52 +0100 Subject: [PATCH 044/151] Add new mopidy.audio.utils functions (fixes #301). Adds functions to create buffers, calcalute buffer durations based on number of samples and the sample rate and converting milliseconds to gst internal clock time. This also alows for the removal of all gst imports outside of mopidy.audio. --- mopidy/audio/__init__.py | 2 ++ mopidy/audio/utils.py | 27 ++++++++++++++++++++++ mopidy/backends/spotify/playback.py | 8 +++---- mopidy/backends/spotify/session_manager.py | 15 +++++------- mopidy/backends/stream/actor.py | 8 +++---- 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/mopidy/audio/__init__.py b/mopidy/audio/__init__.py index 7cf1dcee..5adb333c 100644 --- a/mopidy/audio/__init__.py +++ b/mopidy/audio/__init__.py @@ -4,3 +4,5 @@ from __future__ import unicode_literals from .actor import Audio from .listener import AudioListener from .constants import PlaybackState +from .utils import (calculate_duration, create_buffer, millisecond_to_clocktime, + supported_uri_schemes) diff --git a/mopidy/audio/utils.py b/mopidy/audio/utils.py index e9eac9f8..af80b3ab 100644 --- a/mopidy/audio/utils.py +++ b/mopidy/audio/utils.py @@ -5,6 +5,33 @@ pygst.require('0.10') import gst +def calculate_duration(num_samples, sample_rate): + """Determine duration of samples using a gst helper for preciese math.""" + return gst.util_uint64_scale(num_samples, gst.SECOND, sample_rate) + + +def create_buffer(data, capabilites=None, timestamp=None, duration=None): + """Create a new gstreamer buffer based on provided data. + + Mainly intended to keep gst imports out of non audio modules. + """ + buffer_ = gst.Buffer(data) + if capabilites: + if isinstance(capabilites, basestring): + capabilites = gst.caps_from_string(capabilites) + buffer_.set_caps(capabilites) + if timestamp: + buffer_.timestamp = timestamp + if duration: + buffer_.duration = duration + return buffer_ + + +def millisecond_to_clocktime(value): + """Convert a millisecond time to internal gstreamer time.""" + return value * gst.MSECOND + + def supported_uri_schemes(uri_schemes): """Determine which URIs we can actually support from provided whitelist. diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index cead01bf..36d90cac 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -1,14 +1,11 @@ from __future__ import unicode_literals -import pygst -pygst.require('0.10') -import gst - import logging import functools from spotify import Link, SpotifyError +from mopidy import audio from mopidy.backends import base @@ -71,5 +68,6 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): logger.debug('Skipping seek due to issue #300') return - self.backend.spotify.buffer_timestamp = time_position * gst.MSECOND + self.backend.spotify.buffer_timestamp = audio.millisecond_to_clocktime( + time_position) self.backend.spotify.session.seek(time_position) diff --git a/mopidy/backends/spotify/session_manager.py b/mopidy/backends/spotify/session_manager.py index d372bfa4..7f71dc76 100644 --- a/mopidy/backends/spotify/session_manager.py +++ b/mopidy/backends/spotify/session_manager.py @@ -1,9 +1,5 @@ from __future__ import unicode_literals -import pygst -pygst.require('0.10') -import gst - import logging import os import threading @@ -122,12 +118,13 @@ class SpotifySessionManager(process.BaseThread, PyspotifySessionManager): 'channels': channels, } - buffer_ = gst.Buffer(bytes(frames)) - buffer_.set_caps(gst.caps_from_string(capabilites)) - buffer_.timestamp = self.buffer_timestamp - buffer_.duration = num_frames * gst.SECOND / sample_rate + duration = audio.calculate_duration(num_frames, sample_rate) + buffer_ = audio.create_buffer(bytes(frames), + capabilites=capabilites, + timestamp=self.buffer_timestamp, + duration=duration) - self.buffer_timestamp += buffer_.duration + self.buffer_timestamp += duration if self.audio.emit_data(buffer_).get(): return num_frames diff --git a/mopidy/backends/stream/actor.py b/mopidy/backends/stream/actor.py index b7070454..99b32195 100644 --- a/mopidy/backends/stream/actor.py +++ b/mopidy/backends/stream/actor.py @@ -5,8 +5,7 @@ import urlparse import pykka -from mopidy import settings -from mopidy.audio import utils +from mopidy import audio as audio_lib, settings from mopidy.backends import base from mopidy.models import Track @@ -18,10 +17,11 @@ class StreamBackend(pykka.ThreadingActor, base.Backend): super(StreamBackend, self).__init__() self.library = StreamLibraryProvider(backend=self) - self.playback = base.BasePlaybackProvider(audio=audio, backend=self) + self.playback = base.BasePlaybackProvider(audio=audio, + backend=self) self.playlists = None - self.uri_schemes = utils.supported_uri_schemes( + self.uri_schemes = audio_lib.supported_uri_schemes( settings.STREAM_PROTOCOLS) From d5b19ab213604d193d1059428df05a0f3287a165 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 3 Jan 2013 15:45:48 +0100 Subject: [PATCH 045/151] audio: Docstring typo fixing. --- mopidy/audio/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mopidy/audio/utils.py b/mopidy/audio/utils.py index af80b3ab..66084a16 100644 --- a/mopidy/audio/utils.py +++ b/mopidy/audio/utils.py @@ -6,14 +6,14 @@ import gst def calculate_duration(num_samples, sample_rate): - """Determine duration of samples using a gst helper for preciese math.""" + """Determine duration of samples using GStremer helper for precise math.""" return gst.util_uint64_scale(num_samples, gst.SECOND, sample_rate) def create_buffer(data, capabilites=None, timestamp=None, duration=None): - """Create a new gstreamer buffer based on provided data. + """Create a new GStreamer buffer based on provided data. - Mainly intended to keep gst imports out of non audio modules. + Mainly intended to keep gst imports out of non-audio modules. """ buffer_ = gst.Buffer(data) if capabilites: From 364f0c68e8325c24e7fb7f9e6c676df3fa62f80a Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 3 Jan 2013 15:47:03 +0100 Subject: [PATCH 046/151] audio: Unwrap line that was less than 80 chars. --- mopidy/backends/stream/actor.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mopidy/backends/stream/actor.py b/mopidy/backends/stream/actor.py index 99b32195..f80ac7a9 100644 --- a/mopidy/backends/stream/actor.py +++ b/mopidy/backends/stream/actor.py @@ -17,8 +17,7 @@ class StreamBackend(pykka.ThreadingActor, base.Backend): super(StreamBackend, self).__init__() self.library = StreamLibraryProvider(backend=self) - self.playback = base.BasePlaybackProvider(audio=audio, - backend=self) + self.playback = base.BasePlaybackProvider(audio=audio, backend=self) self.playlists = None self.uri_schemes = audio_lib.supported_uri_schemes( From 855987447b87f6a91f02a8dfd8751fc6d28cb08c Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 3 Jan 2013 15:51:09 +0100 Subject: [PATCH 047/151] audio: Docstring typo typo fixing. --- mopidy/audio/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mopidy/audio/utils.py b/mopidy/audio/utils.py index 66084a16..9d0f46dd 100644 --- a/mopidy/audio/utils.py +++ b/mopidy/audio/utils.py @@ -6,7 +6,7 @@ import gst def calculate_duration(num_samples, sample_rate): - """Determine duration of samples using GStremer helper for precise math.""" + """Determine duration of samples using GStreamer helper for precise math.""" return gst.util_uint64_scale(num_samples, gst.SECOND, sample_rate) From 64ae7865bb52cf5737595652fd8bf2a7629cc8d8 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 3 Jan 2013 19:38:31 +0100 Subject: [PATCH 048/151] audio: Add clocktime_to_millisecond util function --- mopidy/audio/utils.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mopidy/audio/utils.py b/mopidy/audio/utils.py index 9d0f46dd..5bb3c4ca 100644 --- a/mopidy/audio/utils.py +++ b/mopidy/audio/utils.py @@ -6,7 +6,8 @@ import gst def calculate_duration(num_samples, sample_rate): - """Determine duration of samples using GStreamer helper for precise math.""" + """Determine duration of samples using GStreamer helper for precise + math.""" return gst.util_uint64_scale(num_samples, gst.SECOND, sample_rate) @@ -28,10 +29,15 @@ def create_buffer(data, capabilites=None, timestamp=None, duration=None): def millisecond_to_clocktime(value): - """Convert a millisecond time to internal gstreamer time.""" + """Convert a millisecond time to internal GStreamer time.""" return value * gst.MSECOND +def clocktime_to_millisecond(value): + """Convert a millisecond time to internal GStreamer time.""" + return value // gst.MSECOND + + def supported_uri_schemes(uri_schemes): """Determine which URIs we can actually support from provided whitelist. From c76ac2d2126705d77cd4f556d5cf2b66cc3eefc9 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 3 Jan 2013 19:40:53 +0100 Subject: [PATCH 049/151] audio: Use time conversion utils --- mopidy/audio/actor.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 672aa540..b021c35a 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -12,7 +12,7 @@ import pykka from mopidy import settings from mopidy.utils import process -from . import mixers +from . import mixers, utils from .constants import PlaybackState from .listener import AudioListener @@ -124,10 +124,10 @@ class Audio(pykka.ThreadingActor): self._appsrc = source - def _appsrc_on_need_data(self, appsrc, length_hint_in_ns): - length_hint_in_ms = length_hint_in_ns // gst.MSECOND + def _appsrc_on_need_data(self, appsrc, gst_length_hint): + length_hint = utils.clocktime_to_millisecond(gst_length_hint) if self._appsrc_need_data_callback is not None: - self._appsrc_need_data_callback(length_hint_in_ms) + self._appsrc_need_data_callback(length_hint) return True def _appsrc_on_enough_data(self, appsrc): @@ -135,10 +135,10 @@ class Audio(pykka.ThreadingActor): self._appsrc_enough_data_callback() return True - def _appsrc_on_seek_data(self, appsrc, time_in_ns): - time_in_ms = time_in_ns // gst.MSECOND + def _appsrc_on_seek_data(self, appsrc, gst_position): + position = utils.clocktime_to_millisecond(gst_position) if self._appsrc_seek_data_callback is not None: - self._appsrc_seek_data_callback(time_in_ms) + self._appsrc_seek_data_callback(position) return True def _teardown_playbin(self): @@ -349,8 +349,8 @@ class Audio(pykka.ThreadingActor): :rtype: int """ try: - position = self._playbin.query_position(gst.FORMAT_TIME)[0] - return position // gst.MSECOND + gst_position = self._playbin.query_position(gst.FORMAT_TIME)[0] + return utils.clocktime_to_millisecond(gst_position) except gst.QueryError: logger.debug('Position query failed') return 0 @@ -363,9 +363,9 @@ class Audio(pykka.ThreadingActor): :type position: int :rtype: :class:`True` if successful, else :class:`False` """ + gst_position = utils.millisecond_to_clocktime(position) return self._playbin.seek_simple( - gst.Format(gst.FORMAT_TIME), gst.SEEK_FLAG_FLUSH, - position * gst.MSECOND) + gst.Format(gst.FORMAT_TIME), gst.SEEK_FLAG_FLUSH, gst_position) def start_playback(self): """ From e07a6e151aa1efde9b1aadcf0022ce488e226514 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 3 Jan 2013 21:37:31 +0100 Subject: [PATCH 050/151] js: Add a package.json to simplify JS dev env setup --- js/README.rst | 39 +++++++++++++-------------------------- js/grunt.js | 4 +++- js/package.json | 15 +++++++++++++++ 3 files changed, 31 insertions(+), 27 deletions(-) create mode 100644 js/package.json diff --git a/js/README.rst b/js/README.rst index a68dd9a0..e8782213 100644 --- a/js/README.rst +++ b/js/README.rst @@ -36,40 +36,27 @@ Building from source sudo apt-get update sudo apt-get install nodejs npm -2. Assuming you install from PPA, setup your ``NODE_PATH`` environment variable - to include ``/usr/lib/node_modules``. Add the following to your - ``~/.bashrc`` or equivalent:: - - export NODE_PATH=/usr/lib/node_modules:$NODE_PATH - -3. Install `Buster.js `_ and `Grunt - `_ globally (or locally, and make sure you get their - binaries on your ``PATH``):: - - sudo npm -g install buster grunt - -4. Install the grunt-buster Grunt plugin locally, when in the ``js/`` dir:: +2. Enter the ``js/`` dir and install development dependencies:: cd js/ - npm install grunt-buster + npm install -5. Install `PhantomJS `_ so that we can run the tests - without a browser:: +That's it. - sudo apt-get install phantomjs +You can now run the tests:: - It is packaged in Ubuntu since 12.04, but I haven't tested with versions - older than 1.6 which is the one packaged in Ubuntu 12.10. + npm test -6. Run Grunt to lint, test, concatenate, and minify the source:: +To run tests automatically when you save a file:: - grunt + npm run-script watch - The files in ``../mopidy/frontends/http/data/`` should now be up to date. +To run tests, concatenate, minify the source, and update the JavaScript files +in ``mopidy/frontends/http/data/``:: + npm run-script build -Development tips -================ +To run other `grunt `_ targets which isn't predefined in +``package.json`` and thus isn't available through ``npm run-script``:: -If you're coding on the JavaScript library, you should know about ``grunt -watch``. It lints and tests the code every time you save a file. + PATH=./node_modules/.bin:$PATH grunt foo diff --git a/js/grunt.js b/js/grunt.js index d835fd77..46afc8af 100644 --- a/js/grunt.js +++ b/js/grunt.js @@ -64,7 +64,9 @@ module.exports = function (grunt) { uglify: {} }); - grunt.registerTask("default", "lint buster concat min"); + grunt.registerTask("test", "lint buster"); + grunt.registerTask("build", "lint buster concat min"); + grunt.registerTask("default", "build"); grunt.loadNpmTasks("grunt-buster"); }; diff --git a/js/package.json b/js/package.json new file mode 100644 index 00000000..a8737cfb --- /dev/null +++ b/js/package.json @@ -0,0 +1,15 @@ +{ + "name": "mopidy", + "version": "0.0.0", + "devDependencies": { + "buster": "*", + "grunt": "*", + "grunt-buster": "*", + "phantomjs": "*" + }, + "scripts": { + "test": "grunt test", + "build": "grunt build", + "watch": "grunt watch" + } +} From edde1bc584aec31f1e2963d2197e3e78b9de0b45 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 3 Jan 2013 21:40:20 +0100 Subject: [PATCH 051/151] audio: Fix docstring --- mopidy/audio/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mopidy/audio/utils.py b/mopidy/audio/utils.py index 5bb3c4ca..15196b20 100644 --- a/mopidy/audio/utils.py +++ b/mopidy/audio/utils.py @@ -34,7 +34,7 @@ def millisecond_to_clocktime(value): def clocktime_to_millisecond(value): - """Convert a millisecond time to internal GStreamer time.""" + """Convert an internal GStreamer time to millisecond time.""" return value // gst.MSECOND From ea5bb18d5388119f399a834448d43906196c8dd1 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 3 Jan 2013 22:24:58 +0100 Subject: [PATCH 052/151] audio: Update mixer track selection logic (fixes #307) We now ensure that the track we choose has one or more volume channels we can control. This change also fixes that fact the MIXER_TRACK setting would not work if we happened to find a track that was flaged as MASTER OUPUT before finding the right label, so far no one has reported this as an issue. --- mopidy/audio/actor.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 65edd037..537a6ad5 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -173,15 +173,23 @@ class Audio(pykka.ThreadingActor): mixer.get_factory().get_name(), track.label) def _select_mixer_track(self, mixer, track_label): - # Look for track with label == MIXER_TRACK, otherwise fallback to - # master track which is also an output. + # Ignore tracks without volumes, then look for track with + # label == settings.MIXER_TRACK, otherwise fallback to first usable + # track hoping the mixer gave them to us in a sensible order. + + usable_tracks = [] for track in mixer.list_tracks(): - if track_label: - if track.label == track_label: - return track + if not mixer.get_volume(track): + continue + + if track_label and track.label == track_label: + return track elif track.flags & (gst.interfaces.MIXER_TRACK_MASTER | gst.interfaces.MIXER_TRACK_OUTPUT): - return track + usable_tracks.append(track) + + if usable_tracks: + return usable_tracks[0] def _teardown_mixer(self): if self._mixer is not None: From c03d99e55b2b0b1944b1f679e82b98483184d902 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 3 Jan 2013 22:45:30 +0100 Subject: [PATCH 053/151] mpd: Use bytestring for **kwargs key (#302) --- mopidy/frontends/mpd/actor.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mopidy/frontends/mpd/actor.py b/mopidy/frontends/mpd/actor.py index 11e07aa7..33ccd077 100644 --- a/mopidy/frontends/mpd/actor.py +++ b/mopidy/frontends/mpd/actor.py @@ -19,10 +19,12 @@ class MpdFrontend(pykka.ThreadingActor, CoreListener): hostname = network.format_hostname(settings.MPD_SERVER_HOSTNAME) port = settings.MPD_SERVER_PORT + # NOTE: dict key must be bytestring to work on Python < 2.6.5 + # See https://github.com/mopidy/mopidy/issues/302 for details try: network.Server( hostname, port, - protocol=session.MpdSession, protocol_kwargs={'core': core}, + protocol=session.MpdSession, protocol_kwargs={b'core': core}, max_connections=settings.MPD_SERVER_MAX_CONNECTIONS, timeout=settings.MPD_SERVER_CONNECTION_TIMEOUT) except IOError as error: From 91297c1ba892df5bc09514598152bb7fb60dacfb Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 3 Jan 2013 22:54:13 +0100 Subject: [PATCH 054/151] Update changelog with mixer track selection change. --- docs/changes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changes.rst b/docs/changes.rst index c2b076fc..b4a75f75 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -18,6 +18,8 @@ v0.12.0 (in development) - ``foo(**data)`` fails if the keys in ``data`` is unicode strings on Python < 2.6.5rc1. +- Improve selection of mixer tracks for volume control. (Fixes: :issuse:`307`) + **Spotify backend** - Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`) From cbb68f9cbee36487e7be6122a23801f9c0699db1 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 3 Jan 2013 23:13:06 +0100 Subject: [PATCH 055/151] docs: Bind console functions in JS examples For e.g. ``console.log`` to be used as a callback, it must be bound to the ``console`` object first: ``console.log.bind(console)``. If not, this will cause "Illegal invocation" errors in WebKit browsers. This change updates all our Mopidy.js examples to bind ``console`` functions before they are used as callbacks. Fixes #298. --- mopidy/frontends/http/__init__.py | 41 +++++++++++++++++-------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/mopidy/frontends/http/__init__.py b/mopidy/frontends/http/__init__.py index 94b8e58e..ab8dff42 100644 --- a/mopidy/frontends/http/__init__.py +++ b/mopidy/frontends/http/__init__.py @@ -198,7 +198,7 @@ them: .. code-block:: js - mopidy.on(console.log); + mopidy.on(console.log.bind(console)); Several types of events are emitted: @@ -289,7 +289,8 @@ Instead, typical usage will look like this: } }; - mopidy.playback.getCurrentTrack().then(printCurrentTrack, console.error); + mopidy.playback.getCurrentTrack().then( + printCurrentTrack, console.error.bind(console)); The first function passed to ``then()``, ``printCurrentTrack``, is the callback that will be called if the method call succeeds. The second function, @@ -303,7 +304,7 @@ callback: .. code-block:: js - mopidy.playback.next().then(null, console.error); + mopidy.playback.next().then(null, console.error.bind(console)); The promise objects returned by Mopidy.js adheres to the `CommonJS Promises/A `_ standard. We use the @@ -368,6 +369,8 @@ Example to get started with .. code-block:: js + var consoleError = console.error.bind(error); + var trackDesc = function (track) { return track.name + " by " + track.artists[0].name + " from " + track.album.name; @@ -381,14 +384,14 @@ Example to get started with mopidy.playback.play(tlTracks[0]).then(function () { mopidy.playback.getCurrentTrack().then(function (track) { console.log("Now playing:", trackDesc(track)); - }, console.error); - }, console.error); - }, console.error); - }, console.error); + }, consoleError); + }, consoleError); + }, consoleError); + }, consoleError); }; - var mopidy = new Mopidy(); // Connect to server - mopidy.on(console.log); // Log all events + var mopidy = new Mopidy(); // Connect to server + mopidy.on(console.log.bind(console)); // Log all events mopidy.on("state:online", queueAndPlayFirstPlaylist); Approximately the same behavior in a more functional style, using chaining @@ -396,6 +399,8 @@ Example to get started with .. code-block:: js + var consoleError = console.error.bind(error); + var getFirst = function (list) { return list[0]; }; @@ -429,23 +434,23 @@ Example to get started with var queueAndPlayFirstPlaylist = function () { mopidy.playlists.getPlaylists() // => list of Playlists - .then(getFirst, console.error) + .then(getFirst, consoleError) // => Playlist - .then(printTypeAndName, console.error) + .then(printTypeAndName, consoleError) // => Playlist - .then(extractTracks, console.error) + .then(extractTracks, consoleError) // => list of Tracks - .then(mopidy.tracklist.add, console.error) + .then(mopidy.tracklist.add, consoleError) // => list of TlTracks - .then(getFirst, console.error) + .then(getFirst, consoleError) // => TlTrack - .then(mopidy.playback.play, console.error) + .then(mopidy.playback.play, consoleError) // => null - .then(printNowPlaying, console.error); + .then(printNowPlaying, consoleError); }; - var mopidy = new Mopidy(); // Connect to server - mopidy.on(console.log); // Log all events + var mopidy = new Mopidy(); // Connect to server + mopidy.on(console.log.bind(console)); // Log all events mopidy.on("state:online", queueAndPlayFirstPlaylist); 9. The web page should now queue and play your first playlist every time your From 61dcb7d37da30a4e9af9e202f58a5da3a0f3ccb0 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 4 Jan 2013 10:26:30 +0100 Subject: [PATCH 056/151] mpd: Make request handler **kwargs keys bytestrings (#302) --- mopidy/frontends/mpd/protocol/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mopidy/frontends/mpd/protocol/__init__.py b/mopidy/frontends/mpd/protocol/__init__.py index 1827624b..55a1563b 100644 --- a/mopidy/frontends/mpd/protocol/__init__.py +++ b/mopidy/frontends/mpd/protocol/__init__.py @@ -56,7 +56,12 @@ def handle_request(pattern, auth_required=True): if match is not None: mpd_commands.add( MpdCommand(name=match.group(), auth_required=auth_required)) - compiled_pattern = re.compile(pattern, flags=re.UNICODE) + # NOTE: Make pattern a bytestring to get bytestring keys in the dict + # returned from matches.groupdict(), which is again used as a **kwargs + # dict. This is needed to work on Python < 2.6.5. See + # https://github.com/mopidy/mopidy/issues/302 for details. + bytestring_pattern = pattern.encode('utf-8') + compiled_pattern = re.compile(bytestring_pattern, flags=re.UNICODE) if compiled_pattern in request_handlers: raise ValueError('Tried to redefine handler for %s with %s' % ( pattern, func)) From 39580e19485b707fa0dc4e0a1deeecc9011c513a Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 5 Jan 2013 16:46:16 +0100 Subject: [PATCH 057/151] Use blocking calls when changing tracks on EOT. This ensures that we block about-to-finish and the pipeline until the next URI is set, alowing for at least EOS free playback. If the uri is set quickly enough this will also be gapless. --- mopidy/audio/actor.py | 5 +++++ mopidy/core/playback.py | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index e3d5ac87..701fe2ac 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -95,6 +95,11 @@ class Audio(pykka.ThreadingActor): from mopidy.core import Core logger.debug(u'Triggering reached end of track event') core = pykka.ActorRegistry.get_by_class(Core)[0].proxy() + + # Note that we can not let this function return until we have the next + # URI set for gapless / EOS free playback. This means all the + # subsequent remote calls to backends etc. down this code path need to + # block. core.playback.on_end_of_track().get() def _on_new_source(self, element, pad): diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index afd34394..1c105f0c 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -330,10 +330,13 @@ class PlaybackController(object): original_tl_track = self.current_tl_track + # As noted in mopidy.audio which calls this code, we need to make sure + # the calls to the backend are blocking or gapless / EOS free playback + # will break. if self.tl_track_at_eot: self.current_tl_track = self.tl_track_at_eot self._trigger_track_playback_ended() - self._get_backend().playback.change_track(self.current_track) + self._get_backend().playback.change_track(self.current_track).get() self._trigger_track_playback_started() if self.consume: From 81b6620799311d08233d8eaa77ff6279d1ff8388 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 5 Jan 2013 17:37:16 +0100 Subject: [PATCH 058/151] audio: Handle about to finish for non appsrc playback The appsrc cleanup code was still short circuiting the about to finish handler, this meant that EOT handling never happened for local files and playback stopped. With this change proper EOT handling works for all track types. --- mopidy/audio/actor.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 701fe2ac..f812d49f 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -82,13 +82,14 @@ class Audio(pykka.ThreadingActor): 'notify::source', self._on_new_source) def _on_about_to_finish(self, element): - source, self._appsrc = self._appsrc, None - if source is None: - return + # Cleanup appsrc related stuff. + old_appsrc, self._appsrc = self._appsrc, None + + if self._appsrc_seek_data_id is not None and old_appsrc: + old_appsrc.disconnect(self._appsrc_seek_data_id) + self._appsrc_caps = None - if self._appsrc_seek_data_id is not None: - source.disconnect(self._appsrc_seek_data_id) - self._appsrc_seek_data_id = None + self._appsrc_seek_data_id = None # TODO: this is just a horrible hack to get us started. the # comunication is correct, but this way of hooking it up is not. From 711dbe87384c7e7d025d541ae5f08cacb1733045 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 5 Jan 2013 18:35:43 +0100 Subject: [PATCH 059/151] audio: Create GStreaner connect/disconnect helper. The audio class had to many attributes for simply tracking connected signals in my opinion. This change adds a helper for adding and removing signals and storing the tracking data in a common dictionary instead of a ton of instance attributes. --- mopidy/audio/actor.py | 67 +++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 37 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index f81cbf6d..b154e21a 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -42,6 +42,7 @@ class Audio(pykka.ThreadingActor): super(Audio, self).__init__() self._playbin = None + self._signal_ids = {} # {(element, event): signal_id} self._mixer = None self._mixer_track = None @@ -52,15 +53,8 @@ class Audio(pykka.ThreadingActor): self._appsrc = None self._appsrc_caps = None self._appsrc_need_data_callback = None - self._appsrc_need_data_id = None self._appsrc_enough_data_callback = None - self._appsrc_enough_data_id = None self._appsrc_seek_data_callback = None - self._appsrc_seek_data_id = None - - self._notify_source_signal_id = None - self._about_to_finish_id = None - self._message_signal_id = None def on_start(self): try: @@ -77,31 +71,36 @@ class Audio(pykka.ThreadingActor): self._teardown_mixer() self._teardown_playbin() + def _connect(self, element, event, *args): + """Helper to keep track of signal ids based on element+event""" + self._signal_ids[(element, event)] = element.connect(event, *args) + + def _disconnect(self, element, event): + """Helper to disconnect signals created with _connect helper.""" + signal_id = self._signal_ids.pop((element, event), None) + if signal_id is not None: + element.disconnect(signal_id) + def _setup_playbin(self): - self._playbin = gst.element_factory_make('playbin2') + playbin = gst.element_factory_make('playbin2') fakesink = gst.element_factory_make('fakesink') - self._playbin.set_property('video-sink', fakesink) + playbin.set_property('video-sink', fakesink) - self._about_to_finish_id = self._playbin.connect( - 'about-to-finish', self._on_about_to_finish) - self._notify_source_signal_id = self._playbin.connect( - 'notify::source', self._on_new_source) + self._connect(playbin, 'about-to-finish', self._on_about_to_finish) + self._connect(playbin, 'notify::source', self._on_new_source) + + self._playbin = playbin def _on_about_to_finish(self, element): source, self._appsrc = self._appsrc, None if source is None: return self._appsrc_caps = None - if self._appsrc_need_data_id is not None: - source.disconnect(self._appsrc_need_data_id) - self._appsrc_need_data_id = None - if self._appsrc_enough_data_id is not None: - source.disconnect(self._appsrc_enough_data_id) - self._appsrc_enough_data_id = None - if self._appsrc_seek_data_id is not None: - source.disconnect(self._appsrc_seek_data_id) - self._appsrc_seek_data_id = None + + self._disconnect(source, 'need-data') + self._disconnect(source, 'enough-data') + self._disconnect(source, 'seek-data') def _on_new_source(self, element, pad): uri = element.get_property('uri') @@ -115,12 +114,9 @@ class Audio(pykka.ThreadingActor): source.set_property('max-bytes', 1 * MB) source.set_property('min-percent', 50) - self._appsrc_need_data_id = source.connect( - 'need-data', self._appsrc_on_need_data) - self._appsrc_enough_data_id = source.connect( - 'enough-data', self._appsrc_on_enough_data) - self._appsrc_seek_data_id = source.connect( - 'seek-data', self._appsrc_on_seek_data) + self._connect(source, 'need-data', self._appsrc_on_need_data) + self._connect(source, 'enough-data', self._appsrc_on_enough_data) + self._connect(source, 'seek-data', self._appsrc_on_seek_data) self._appsrc = source @@ -142,10 +138,8 @@ class Audio(pykka.ThreadingActor): return True def _teardown_playbin(self): - if self._about_to_finish_id: - self._playbin.disconnect(self._about_to_finish_id) - if self._notify_source_signal_id: - self._playbin.disconnect(self._notify_source_signal_id) + self._disconnect(self._playbin, 'about-to-finish') + self._disconnect(self._playbin, 'notify::source') self._playbin.set_state(gst.STATE_NULL) def _setup_output(self): @@ -228,13 +222,12 @@ class Audio(pykka.ThreadingActor): def _setup_message_processor(self): bus = self._playbin.get_bus() bus.add_signal_watch() - self._message_signal_id = bus.connect('message', self._on_message) + self._connect(bus, 'message', self._on_message) def _teardown_message_processor(self): - if self._message_signal_id: - bus = self._playbin.get_bus() - bus.disconnect(self._message_signal_id) - bus.remove_signal_watch() + bus = self._playbin.get_bus() + self._disconnect(bus, 'message') + bus.remove_signal_watch() def _on_message(self, bus, message): if (message.type == gst.MESSAGE_STATE_CHANGED From 0d7b7e29a3594474e06d0649b3fe39a8c31aeecc Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 5 Jan 2013 21:35:41 +0100 Subject: [PATCH 060/151] audio: Remove test for error handling that no longer happens. --- tests/backends/base/playback.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tests/backends/base/playback.py b/tests/backends/base/playback.py index ea6cbbf4..155fa661 100644 --- a/tests/backends/base/playback.py +++ b/tests/backends/base/playback.py @@ -362,16 +362,6 @@ class PlaybackControllerTest(object): self.playback.on_end_of_track() self.assertEqual(self.playback.state, PlaybackState.STOPPED) - @populate_tracklist - def test_end_of_track_skips_to_next_track_on_failure(self): - # If backend's play() returns False, it is a failure. - self.backend.playback.play = lambda track: track != self.tracks[1] - self.playback.play() - self.assertEqual(self.playback.current_track, self.tracks[0]) - self.playback.on_end_of_track() - self.assertNotEqual(self.playback.current_track, self.tracks[1]) - self.assertEqual(self.playback.current_track, self.tracks[2]) - @populate_tracklist def test_end_of_track_track_before_play(self): self.assertEqual(self.playback.tl_track_at_next, self.tl_tracks[0]) From 6b922066bb82553c8b9bbef8b46d73056309436b Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 5 Jan 2013 22:47:07 +0100 Subject: [PATCH 061/151] core: Trigger playback ended before switching tracks --- mopidy/core/playback.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index 1c105f0c..1f2e0384 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -334,8 +334,8 @@ class PlaybackController(object): # the calls to the backend are blocking or gapless / EOS free playback # will break. if self.tl_track_at_eot: - self.current_tl_track = self.tl_track_at_eot self._trigger_track_playback_ended() + self.current_tl_track = self.tl_track_at_eot self._get_backend().playback.change_track(self.current_track).get() self._trigger_track_playback_started() From fb8fba243ab4de10452c0c179eba76301e77dea5 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 5 Jan 2013 23:16:42 +0100 Subject: [PATCH 062/151] audio/core: Rework how we hook up end of track handling. --- mopidy/audio/actor.py | 15 ++++++++------- mopidy/core/actor.py | 4 ++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 206eae09..04b0ab06 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -49,6 +49,8 @@ class Audio(pykka.ThreadingActor): self._software_mixing = False self._volume_set = None + self._end_of_track_callback = None + self._appsrc = None self._appsrc_caps = None self._appsrc_need_data_callback = None @@ -101,17 +103,12 @@ class Audio(pykka.ThreadingActor): self._appsrc_caps = None - # TODO: this is just a horrible hack to get us started. the - # comunication is correct, but this way of hooking it up is not. - from mopidy.core import Core - logger.debug(u'Triggering reached end of track event') - core = pykka.ActorRegistry.get_by_class(Core)[0].proxy() - # Note that we can not let this function return until we have the next # URI set for gapless / EOS free playback. This means all the # subsequent remote calls to backends etc. down this code path need to # block. - core.playback.on_end_of_track().get() + if self._end_of_track_callback: + self._end_of_track_callback() def _on_new_source(self, element, pad): source = element.get_property('source') @@ -291,6 +288,10 @@ class Audio(pykka.ThreadingActor): logger.debug('Triggering reached_end_of_stream event') AudioListener.send('reached_end_of_stream') + def set_on_end_of_track(self, callback): + """Set callback to be called on end of track.""" + self._end_of_track_callback = callback + def set_uri(self, uri): """ Set URI of audio to be played. diff --git a/mopidy/core/actor.py b/mopidy/core/actor.py index 072a989b..1c635799 100644 --- a/mopidy/core/actor.py +++ b/mopidy/core/actor.py @@ -46,6 +46,10 @@ class Core(pykka.ThreadingActor, AudioListener, BackendListener): self.tracklist = TracklistController(core=self) + # Hook up blocking on end of track handler to audio sub-system. + audio.set_on_end_of_track( + lambda: self.actor_ref.proxy().playback.on_end_of_track().get()) + def get_uri_schemes(self): futures = [b.uri_schemes for b in self.backends] results = pykka.get_all(futures) From 3857eaa8400a2fd9ca637365dd10935b7d96e19d Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 5 Jan 2013 23:32:35 +0100 Subject: [PATCH 063/151] core: Unbreak end of track related tests. We should only be hooking up end of track when an audio instance is passed in. Additionally the tracklist tests where wrongly sending in the audio module instead of the mock audio.Audio instance. --- mopidy/core/actor.py | 7 ++++--- tests/backends/base/tracklist.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mopidy/core/actor.py b/mopidy/core/actor.py index 1c635799..03ad2712 100644 --- a/mopidy/core/actor.py +++ b/mopidy/core/actor.py @@ -46,9 +46,10 @@ class Core(pykka.ThreadingActor, AudioListener, BackendListener): self.tracklist = TracklistController(core=self) - # Hook up blocking on end of track handler to audio sub-system. - audio.set_on_end_of_track( - lambda: self.actor_ref.proxy().playback.on_end_of_track().get()) + if audio: + # Hook up blocking on end of track handler to audio sub-system. + audio.set_on_end_of_track( + lambda: self.actor_ref.proxy().playback.on_end_of_track().get()) def get_uri_schemes(self): futures = [b.uri_schemes for b in self.backends] diff --git a/tests/backends/base/tracklist.py b/tests/backends/base/tracklist.py index 71f44018..39536edc 100644 --- a/tests/backends/base/tracklist.py +++ b/tests/backends/base/tracklist.py @@ -18,7 +18,7 @@ class TracklistControllerTest(object): def setUp(self): self.audio = mock.Mock(spec=audio.Audio) self.backend = self.backend_class.start(audio=self.audio).proxy() - self.core = core.Core(audio=audio, backends=[self.backend]) + self.core = core.Core(audio=self.audio, backends=[self.backend]) self.controller = self.core.tracklist self.playback = self.core.playback From 42e84c8e2ea62ced1fe8c226df9d3fe158ff69e1 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sun, 6 Jan 2013 11:32:37 +0100 Subject: [PATCH 064/151] docs: Add changelog entry for EOT/EOS fixing. --- docs/changes.rst | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/changes.rst b/docs/changes.rst index a0562628..3773d575 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -18,8 +18,30 @@ v0.12.0 (in development) - ``foo(**data)`` fails if the keys in ``data`` is unicode strings on Python < 2.6.5rc1. +**Audio sub-system** + - Improve selection of mixer tracks for volume control. (Fixes: :issuse:`307`) +- EOT (end of track) and EOS (end of stream) handling has finally been fixed. + Problem with the old code was that we simply used EOS for everything, and let + the EOS propagate for the end of each track. What this means is basically that + we would disrupt the pipeline at the end of every track. This work was + concluded in the pull request :issue:`231`. Changes and issues fixed by this + include: + + - A new method ``change_track(track)`` for playback provider which is where + doing everything like setting the URI and starting to push data should be + done. The ``play(track)`` method and EOT track changing uses this new + method. + + - We've started using the about to finish signal from playbin2 to ensure + gapless playback as part of our EOT cleanup. (Fixes: :issue:`160`) + + - Mopidy now distinguishes between EOT and EOS properly. (Fixes: :issue:`222`) + + - Since we no longer let EOS disrupt the pipeline streaming OGG via SHOUTcast + now works. (Fixes: :issue:`168`) + **Spotify backend** - Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`) From 358de3b088c6742b855e5880ef9f3f3009131058 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 6 Jan 2013 20:48:38 +0100 Subject: [PATCH 065/151] Fix more unicode kwargs dict keys (#302) --- mopidy/__main__.py | 3 +-- mopidy/backends/local/translator.py | 4 +-- mopidy/frontends/mpd/actor.py | 4 +-- mopidy/frontends/mpd/protocol/__init__.py | 6 ++--- mopidy/frontends/mpd/translator.py | 7 ++--- mopidy/models.py | 32 ++++++++++++++++------- mopidy/scanner.py | 8 +++--- 7 files changed, 37 insertions(+), 27 deletions(-) diff --git a/mopidy/__main__.py b/mopidy/__main__.py index e111fcef..2847497a 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -79,8 +79,7 @@ def main(): def parse_options(): parser = optparse.OptionParser( version='Mopidy %s' % versioning.get_version()) - # NOTE Python 2.6: To support Python versions < 2.6.2rc1 we must use - # bytestrings for the first argument to ``add_option`` + # NOTE First argument to add_option must be bytestrings on Python < 2.6.2 # See https://github.com/mopidy/mopidy/issues/302 for details parser.add_option( b'--help-gst', diff --git a/mopidy/backends/local/translator.py b/mopidy/backends/local/translator.py index 157804b4..b029d367 100644 --- a/mopidy/backends/local/translator.py +++ b/mopidy/backends/local/translator.py @@ -98,8 +98,8 @@ def _convert_mpd_data(data, tracks, music_dir): if not data: return - # NOTE: kwargs are explicitly made bytestrings to work on Python - # 2.6.0/2.6.1. See https://github.com/mopidy/mopidy/issues/302 for details. + # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 + # See https://github.com/mopidy/mopidy/issues/302 for details. track_kwargs = {} album_kwargs = {} diff --git a/mopidy/frontends/mpd/actor.py b/mopidy/frontends/mpd/actor.py index 33ccd077..8907fe22 100644 --- a/mopidy/frontends/mpd/actor.py +++ b/mopidy/frontends/mpd/actor.py @@ -19,8 +19,8 @@ class MpdFrontend(pykka.ThreadingActor, CoreListener): hostname = network.format_hostname(settings.MPD_SERVER_HOSTNAME) port = settings.MPD_SERVER_PORT - # NOTE: dict key must be bytestring to work on Python < 2.6.5 - # See https://github.com/mopidy/mopidy/issues/302 for details + # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 + # See https://github.com/mopidy/mopidy/issues/302 for details. try: network.Server( hostname, port, diff --git a/mopidy/frontends/mpd/protocol/__init__.py b/mopidy/frontends/mpd/protocol/__init__.py index 55a1563b..2b2260ef 100644 --- a/mopidy/frontends/mpd/protocol/__init__.py +++ b/mopidy/frontends/mpd/protocol/__init__.py @@ -56,10 +56,10 @@ def handle_request(pattern, auth_required=True): if match is not None: mpd_commands.add( MpdCommand(name=match.group(), auth_required=auth_required)) - # NOTE: Make pattern a bytestring to get bytestring keys in the dict + # NOTE Make pattern a bytestring to get bytestring keys in the dict # returned from matches.groupdict(), which is again used as a **kwargs - # dict. This is needed to work on Python < 2.6.5. See - # https://github.com/mopidy/mopidy/issues/302 for details. + # dict. This is needed to work on Python < 2.6.5. + # See https://github.com/mopidy/mopidy/issues/302 for details. bytestring_pattern = pattern.encode('utf-8') compiled_pattern = re.compile(bytestring_pattern, flags=re.UNICODE) if compiled_pattern in request_handlers: diff --git a/mopidy/frontends/mpd/translator.py b/mopidy/frontends/mpd/translator.py index e26d7dce..15ca181d 100644 --- a/mopidy/frontends/mpd/translator.py +++ b/mopidy/frontends/mpd/translator.py @@ -140,6 +140,8 @@ def query_from_mpd_list_format(field, mpd_query): """ Converts an MPD ``list`` query to a Mopidy query. """ + # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 + # See https://github.com/mopidy/mopidy/issues/302 for details if mpd_query is None: return {} try: @@ -155,15 +157,14 @@ def query_from_mpd_list_format(field, mpd_query): if field == 'album': if not tokens[0]: raise ValueError - return {'artist': [tokens[0]]} + return {b'artist': [tokens[0]]} # See above NOTE else: raise MpdArgError( 'should be "Album" for 3 arguments', command='list') elif len(tokens) % 2 == 0: query = {} while tokens: - key = tokens[0].lower() - key = str(key) # Needed for kwargs keys on OS X and Windows + key = str(tokens[0].lower()) # See above NOTE value = tokens[1] tokens = tokens[2:] if key not in ('artist', 'album', 'date', 'genre'): diff --git a/mopidy/models.py b/mopidy/models.py index 73209b6e..1fb3d7a7 100644 --- a/mopidy/models.py +++ b/mopidy/models.py @@ -66,13 +66,15 @@ class ImmutableObject(object): :type values: dict :rtype: new instance of the model being copied """ + # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 + # See https://github.com/mopidy/mopidy/issues/302 for details data = {} for key in self.__dict__.keys(): public_key = key.lstrip('_') - data[public_key] = values.pop(public_key, self.__dict__[key]) + data[str(public_key)] = values.pop(public_key, self.__dict__[key]) for key in values.keys(): if hasattr(self, key): - data[key] = values.pop(key) + data[str(key)] = values.pop(key) if values: raise TypeError( 'copy() got an unexpected keyword argument "%s"' % key) @@ -186,7 +188,9 @@ class Album(ImmutableObject): musicbrainz_id = None def __init__(self, *args, **kwargs): - self.__dict__['artists'] = frozenset(kwargs.pop('artists', [])) + # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 + # See https://github.com/mopidy/mopidy/issues/302 for details + self.__dict__[b'artists'] = frozenset(kwargs.pop('artists', [])) super(Album, self).__init__(*args, **kwargs) @@ -240,7 +244,9 @@ class Track(ImmutableObject): musicbrainz_id = None def __init__(self, *args, **kwargs): - self.__dict__['artists'] = frozenset(kwargs.pop('artists', [])) + # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 + # See https://github.com/mopidy/mopidy/issues/302 for details + self.__dict__[b'artists'] = frozenset(kwargs.pop('artists', [])) super(Track, self).__init__(*args, **kwargs) @@ -272,9 +278,11 @@ class TlTrack(ImmutableObject): track = None def __init__(self, *args, **kwargs): + # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 + # See https://github.com/mopidy/mopidy/issues/302 for details if len(args) == 2 and len(kwargs) == 0: - kwargs['tlid'] = args[0] - kwargs['track'] = args[1] + kwargs[b'tlid'] = args[0] + kwargs[b'track'] = args[1] args = [] super(TlTrack, self).__init__(*args, **kwargs) @@ -309,7 +317,9 @@ class Playlist(ImmutableObject): last_modified = None def __init__(self, *args, **kwargs): - self.__dict__['tracks'] = tuple(kwargs.pop('tracks', [])) + # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 + # See https://github.com/mopidy/mopidy/issues/302 for details + self.__dict__[b'tracks'] = tuple(kwargs.pop('tracks', [])) super(Playlist, self).__init__(*args, **kwargs) # TODO: def insert(self, pos, track): ... ? @@ -345,7 +355,9 @@ class SearchResult(ImmutableObject): albums = tuple() def __init__(self, *args, **kwargs): - self.__dict__['tracks'] = tuple(kwargs.pop('tracks', [])) - self.__dict__['artists'] = tuple(kwargs.pop('artists', [])) - self.__dict__['albums'] = tuple(kwargs.pop('albums', [])) + # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 + # See https://github.com/mopidy/mopidy/issues/302 for details + self.__dict__[b'tracks'] = tuple(kwargs.pop('tracks', [])) + self.__dict__[b'artists'] = tuple(kwargs.pop('artists', [])) + self.__dict__[b'albums'] = tuple(kwargs.pop('albums', [])) super(SearchResult, self).__init__(*args, **kwargs) diff --git a/mopidy/scanner.py b/mopidy/scanner.py index 9f8c12f7..bfeb9fd1 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -79,8 +79,7 @@ def main(): def parse_options(): parser = optparse.OptionParser( version='Mopidy %s' % versioning.get_version()) - # NOTE Python 2.6: To support Python versions < 2.6.2rc1 we must use - # bytestrings for the first argument to ``add_option`` + # NOTE First argument to add_option must be bytestrings on Python < 2.6.2 # See https://github.com/mopidy/mopidy/issues/302 for details parser.add_option( b'-q', '--quiet', @@ -99,9 +98,8 @@ def translator(data): artist_kwargs = {} track_kwargs = {} - # NOTE: kwargs are explicitly made bytestrings to work on Python - # 2.6.0/2.6.1. See https://github.com/mopidy/mopidy/issues/302 for - # details. + # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 + # See https://github.com/mopidy/mopidy/issues/302 for details. def _retrieve(source_key, target_key, target): if source_key in data: From 2eb9ad710a2acf23fc037ecf992b58e9c12584d6 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 6 Jan 2013 21:04:27 +0100 Subject: [PATCH 066/151] core: Add 'include_tracks' argument to 'get_playlists()' --- docs/changes.rst | 9 +++++++++ mopidy/core/playlists.py | 7 +++++-- tests/core/playlists_test.py | 16 ++++++++++++++++ tests/utils/jsonrpc_test.py | 2 +- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index 3773d575..2e63c05f 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -67,6 +67,15 @@ Current limitations: contains stream URIs. You need to extract the stream URL from the playlist yourself. See :issue:`303` for progress on this. +**Core API** + +- :meth:`mopidy.core.PlaylistsController.get_playlists` now accepts an argument + ``include_tracks``. This defaults to :class:`True`, which has the same old + behavior. If set to :class:`False`, the tracks are stripped from the + playlists before they are returned. This can be used to limit the amount of + data returned if the response is to be passed out of the application, e.g. to + a web client. (Fixes: :issue:`297`) + v0.11.1 (2012-12-24) ==================== diff --git a/mopidy/core/playlists.py b/mopidy/core/playlists.py index 62098c7f..f0187d44 100644 --- a/mopidy/core/playlists.py +++ b/mopidy/core/playlists.py @@ -15,11 +15,14 @@ class PlaylistsController(object): self.backends = backends self.core = core - def get_playlists(self): + def get_playlists(self, include_tracks=True): futures = [ b.playlists.playlists for b in self.backends.with_playlists] results = pykka.get_all(futures) - return list(itertools.chain(*results)) + playlists = list(itertools.chain(*results)) + if not include_tracks: + playlists = [p.copy(tracks=[]) for p in playlists] + return playlists playlists = property(get_playlists) """ diff --git a/tests/core/playlists_test.py b/tests/core/playlists_test.py index cea93c5b..f11e1776 100644 --- a/tests/core/playlists_test.py +++ b/tests/core/playlists_test.py @@ -46,6 +46,22 @@ class PlaylistsTest(unittest.TestCase): self.assertIn(self.pl2a, result) self.assertIn(self.pl2b, result) + def test_get_playlists_includes_tracks_by_default(self): + result = self.core.playlists.get_playlists() + + self.assertEqual(result[0].name, 'A') + self.assertEqual(len(result[0].tracks), 1) + self.assertEqual(result[1].name, 'B') + self.assertEqual(len(result[1].tracks), 1) + + def test_get_playlist_can_strip_tracks_from_returned_playlists(self): + result = self.core.playlists.get_playlists(include_tracks=False) + + self.assertEqual(result[0].name, 'A') + self.assertEqual(len(result[0].tracks), 0) + self.assertEqual(result[1].name, 'B') + self.assertEqual(len(result[1].tracks), 0) + def test_create_without_uri_scheme_uses_first_backend(self): playlist = Playlist() self.sp1.create().get.return_value = playlist diff --git a/tests/utils/jsonrpc_test.py b/tests/utils/jsonrpc_test.py index 59cb89b5..db53d4e4 100644 --- a/tests/utils/jsonrpc_test.py +++ b/tests/utils/jsonrpc_test.py @@ -603,7 +603,7 @@ class JsonRpcInspectorTest(JsonRpcTestBase): self.assertIn('core.playlists.get_playlists', methods) self.assertEquals( - len(methods['core.playlists.get_playlists']['params']), 0) + len(methods['core.playlists.get_playlists']['params']), 1) self.assertIn('core.tracklist.filter', methods.keys()) self.assertEquals( From 65bab05ce08d9ec89af4920559b47b3d91366c62 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 6 Jan 2013 21:33:01 +0100 Subject: [PATCH 067/151] Don't exit autotest if a test fails --- fabfile.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fabfile.py b/fabfile.py index 370c81be..3321cb16 100644 --- a/fabfile.py +++ b/fabfile.py @@ -1,4 +1,4 @@ -from fabric.api import local +from fabric.api import local, settings def test(path=None): @@ -9,7 +9,8 @@ def test(path=None): def autotest(path=None): while True: local('clear') - test(path) + with settings(warn_only=True): + test(path) local( 'inotifywait -q -e create -e modify -e delete ' '--exclude ".*\.(pyc|sw.)" -r mopidy/ tests/') From 6599094b1e6a6a92bae197cd1d03410ee468f01f Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 6 Jan 2013 21:43:12 +0100 Subject: [PATCH 068/151] models: Add Album.images field (#263) --- docs/changes.rst | 5 +++++ mopidy/models.py | 6 ++++++ tests/models_test.py | 11 +++++++++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index 2e63c05f..5e412754 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -76,6 +76,11 @@ Current limitations: data returned if the response is to be passed out of the application, e.g. to a web client. (Fixes: :issue:`297`) +**Models** + +- Add :attr:`mopidy.models.Album.images` field for including album art URIs. + (Partly fixes :issue:`263`) + v0.11.1 (2012-12-24) ==================== diff --git a/mopidy/models.py b/mopidy/models.py index 1fb3d7a7..1a165222 100644 --- a/mopidy/models.py +++ b/mopidy/models.py @@ -167,6 +167,8 @@ class Album(ImmutableObject): :type date: string :param musicbrainz_id: MusicBrainz ID :type musicbrainz_id: string + :param images: album image URIs + :type images: list of strings """ #: The album URI. Read-only. @@ -187,10 +189,14 @@ class Album(ImmutableObject): #: The MusicBrainz ID of the album. Read-only. musicbrainz_id = None + #: The album image URIs. Read-only. + images = frozenset() + def __init__(self, *args, **kwargs): # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 # See https://github.com/mopidy/mopidy/issues/302 for details self.__dict__[b'artists'] = frozenset(kwargs.pop('artists', [])) + self.__dict__[b'images'] = frozenset(kwargs.pop('images', [])) super(Album, self).__init__(*args, **kwargs) diff --git a/tests/models_test.py b/tests/models_test.py index 89d0b132..ef3fd68c 100644 --- a/tests/models_test.py +++ b/tests/models_test.py @@ -216,18 +216,25 @@ class AlbumTest(unittest.TestCase): self.assertRaises( AttributeError, setattr, album, 'musicbrainz_id', None) + def test_images(self): + image = 'data:foobar' + album = Album(images=[image]) + self.assertIn(image, album.images) + self.assertRaises(AttributeError, setattr, album, 'images', None) + def test_invalid_kwarg(self): test = lambda: Album(foo='baz') self.assertRaises(TypeError, test) def test_repr_without_artists(self): self.assertEquals( - "Album(artists=[], name=u'name', uri=u'uri')", + "Album(artists=[], images=[], name=u'name', uri=u'uri')", repr(Album(uri='uri', name='name'))) def test_repr_with_artists(self): self.assertEquals( - "Album(artists=[Artist(name=u'foo')], name=u'name', uri=u'uri')", + "Album(artists=[Artist(name=u'foo')], images=[], name=u'name', " + "uri=u'uri')", repr(Album(uri='uri', name='name', artists=[Artist(name='foo')]))) def test_serialize_without_artists(self): From 99593fd357217a393b8abe2aa510b8b9ab13c466 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 6 Jan 2013 22:02:26 +0100 Subject: [PATCH 069/151] models: Add Track.disc_no (#286) --- docs/changes.rst | 2 ++ mopidy/models.py | 7 ++++++- tests/models_test.py | 6 ++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/changes.rst b/docs/changes.rst index 5e412754..dc4a10fe 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -81,6 +81,8 @@ Current limitations: - Add :attr:`mopidy.models.Album.images` field for including album art URIs. (Partly fixes :issue:`263`) +- Add :attr:`mopidy.models.Track.disc_no` field. (Partly fixes: :issue:`286`) + v0.11.1 (2012-12-24) ==================== diff --git a/mopidy/models.py b/mopidy/models.py index 1a165222..1e9ad2c1 100644 --- a/mopidy/models.py +++ b/mopidy/models.py @@ -212,6 +212,8 @@ class Track(ImmutableObject): :type album: :class:`Album` :param track_no: track number in album :type track_no: integer + :param disc_no: disc number in album + :type disc_no: integer or :class:`None` if unknown :param date: track release date (YYYY or YYYY-MM-DD) :type date: string :param length: track length in milliseconds @@ -234,9 +236,12 @@ class Track(ImmutableObject): #: The track :class:`Album`. Read-only. album = None - #: The track number in album. Read-only. + #: The track number in the album. Read-only. track_no = 0 + #: The disc number in the album. Read-only. + disc_no = None + #: The track release date. Read-only. date = None diff --git a/tests/models_test.py b/tests/models_test.py index ef3fd68c..fdac575b 100644 --- a/tests/models_test.py +++ b/tests/models_test.py @@ -396,6 +396,12 @@ class TrackTest(unittest.TestCase): self.assertEqual(track.track_no, track_no) self.assertRaises(AttributeError, setattr, track, 'track_no', None) + def test_disc_no(self): + disc_no = 2 + track = Track(disc_no=disc_no) + self.assertEqual(track.disc_no, disc_no) + self.assertRaises(AttributeError, setattr, track, 'disc_no', None) + def test_date(self): date = '1977-01-01' track = Track(date=date) From 1a0842117f3cebc670be44ddf0ac086498a2dd11 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 6 Jan 2013 22:04:56 +0100 Subject: [PATCH 070/151] models: Add Album.num_discs (#286) --- docs/changes.rst | 2 ++ mopidy/models.py | 5 +++++ tests/models_test.py | 8 +++++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/changes.rst b/docs/changes.rst index dc4a10fe..51ae094d 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -83,6 +83,8 @@ Current limitations: - Add :attr:`mopidy.models.Track.disc_no` field. (Partly fixes: :issue:`286`) +- Add :attr:`mopidy.models.Album.num_discs` field. (Partly fixes: :issue:`286`) + v0.11.1 (2012-12-24) ==================== diff --git a/mopidy/models.py b/mopidy/models.py index 1e9ad2c1..39d29fd3 100644 --- a/mopidy/models.py +++ b/mopidy/models.py @@ -163,6 +163,8 @@ class Album(ImmutableObject): :type artists: list of :class:`Artist` :param num_tracks: number of tracks in album :type num_tracks: integer + :param num_discs: number of discs in album + :type num_discs: integer or :class:`None` if unknown :param date: album release date (YYYY or YYYY-MM-DD) :type date: string :param musicbrainz_id: MusicBrainz ID @@ -183,6 +185,9 @@ class Album(ImmutableObject): #: The number of tracks in the album. Read-only. num_tracks = 0 + #: The number of discs in the album. Read-only. + num_discs = None + #: The album release date. Read-only. date = None diff --git a/tests/models_test.py b/tests/models_test.py index fdac575b..08a8c6f0 100644 --- a/tests/models_test.py +++ b/tests/models_test.py @@ -199,10 +199,16 @@ class AlbumTest(unittest.TestCase): def test_num_tracks(self): num_tracks = 11 - album = Album(num_tracks=11) + album = Album(num_tracks=num_tracks) self.assertEqual(album.num_tracks, num_tracks) self.assertRaises(AttributeError, setattr, album, 'num_tracks', None) + def test_num_discs(self): + num_discs = 2 + album = Album(num_discs=num_discs) + self.assertEqual(album.num_discs, num_discs) + self.assertRaises(AttributeError, setattr, album, 'num_discs', None) + def test_date(self): date = '1977-01-01' album = Album(date=date) From af10e642f24e92b8ae3e7c8a482a9f1a91a2cf35 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 6 Jan 2013 22:37:37 +0100 Subject: [PATCH 071/151] models: Support serialization of lists of strings --- mopidy/models.py | 4 +++- tests/models_test.py | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/mopidy/models.py b/mopidy/models.py index 1a165222..3acf5f73 100644 --- a/mopidy/models.py +++ b/mopidy/models.py @@ -87,7 +87,9 @@ class ImmutableObject(object): public_key = key.lstrip('_') value = self.__dict__[key] if isinstance(value, (set, frozenset, list, tuple)): - value = [o.serialize() for o in value] + value = [ + v.serialize() if isinstance(v, ImmutableObject) else v + for v in value] elif isinstance(value, ImmutableObject): value = value.serialize() if value: diff --git a/tests/models_test.py b/tests/models_test.py index ef3fd68c..c624addd 100644 --- a/tests/models_test.py +++ b/tests/models_test.py @@ -249,6 +249,13 @@ class AlbumTest(unittest.TestCase): 'artists': [artist.serialize()]}, Album(uri='uri', name='name', artists=[artist]).serialize()) + def test_serialize_with_images(self): + image = 'data:foobar' + self.assertDictEqual( + {'__model__': 'Album', 'uri': 'uri', 'name': 'name', + 'images': [image]}, + Album(uri='uri', name='name', images=[image]).serialize()) + def test_to_json_and_back(self): album1 = Album(uri='uri', name='name', artists=[Artist(name='foo')]) serialized = json.dumps(album1, cls=ModelJSONEncoder) From 542979f09a841fb89d89c3032ed935b98a0de316 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 6 Jan 2013 23:48:53 +0100 Subject: [PATCH 072/151] Fix more unicode kwargs dict keys (#302) --- mopidy/models.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mopidy/models.py b/mopidy/models.py index 3acf5f73..d6290f9a 100644 --- a/mopidy/models.py +++ b/mopidy/models.py @@ -127,11 +127,16 @@ def model_json_decoder(dct): {u'a_track': Track(artists=[], name=u'name')} """ + # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 + # See https://github.com/mopidy/mopidy/issues/302 for details. if '__model__' in dct: model_name = dct.pop('__model__') cls = globals().get(model_name, None) if issubclass(cls, ImmutableObject): - return cls(**dct) + kwargs = {} + for key, value in dct.items(): + kwargs[str(key)] = value + return cls(**kwargs) return dct From 19f4ea8889f05643d8128a37ed09585886342100 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 7 Jan 2013 21:50:40 +0100 Subject: [PATCH 073/151] Fix one more kwargs dict (#302) --- tests/utils/jsonrpc_test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/utils/jsonrpc_test.py b/tests/utils/jsonrpc_test.py index db53d4e4..44ec1b09 100644 --- a/tests/utils/jsonrpc_test.py +++ b/tests/utils/jsonrpc_test.py @@ -201,10 +201,12 @@ class JsonRpcSingleCommandTest(JsonRpcTestBase): self.assertEqual(self.core.playback.get_volume().get(), 37) def test_call_methods_with_named_params(self): + # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 + # See https://github.com/mopidy/mopidy/issues/302 for details. request = { 'jsonrpc': '2.0', 'method': 'core.playback.set_volume', - 'params': {'volume': 37}, + 'params': {b'volume': 37}, 'id': 1, } response = self.jrw.handle_data(request) From c0c67e48351c79676907e530a6582f6399f8d6f4 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 7 Jan 2013 21:51:11 +0100 Subject: [PATCH 074/151] tests: Add better error message to debug test failure --- tests/utils/encoding_test.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/utils/encoding_test.py b/tests/utils/encoding_test.py index 1a4e56c5..b7292de0 100644 --- a/tests/utils/encoding_test.py +++ b/tests/utils/encoding_test.py @@ -15,15 +15,19 @@ class LocaleDecodeTest(unittest.TestCase): result = locale_decode( b'[Errno 98] Adresse d\xc3\xa9j\xc3\xa0 utilis\xc3\xa9e') - self.assertEquals('[Errno 98] Adresse d\xe9j\xe0 utilis\xe9e', result) + self.assertEqual('[Errno 98] Adresse d\xe9j\xe0 utilis\xe9e', result) def test_can_decode_an_ioerror_with_french_content(self, mock): mock.return_value = 'UTF-8' error = IOError(98, b'Adresse d\xc3\xa9j\xc3\xa0 utilis\xc3\xa9e') result = locale_decode(error) + expected = '[Errno 98] Adresse d\xe9j\xe0 utilis\xe9e' - self.assertEquals('[Errno 98] Adresse d\xe9j\xe0 utilis\xe9e', result) + self.assertEqual( + expected, result, + '%r decoded to %r does not match expected %r' % ( + error, result, expected)) def test_does_not_use_locale_to_decode_unicode_strings(self, mock): mock.return_value = 'UTF-8' From 7f81b7c34c22adf9ee5fabdcc4a925b211205a5b Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 8 Jan 2013 00:05:27 +0100 Subject: [PATCH 075/151] docs: Fix typos in changelog --- docs/changes.rst | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index 51ae094d..330118a8 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -20,7 +20,7 @@ v0.12.0 (in development) **Audio sub-system** -- Improve selection of mixer tracks for volume control. (Fixes: :issuse:`307`) +- Improve selection of mixer tracks for volume control. (Fixes: :issue:`307`) - EOT (end of track) and EOS (end of stream) handling has finally been fixed. Problem with the old code was that we simply used EOS for everything, and let @@ -53,11 +53,9 @@ v0.12.0 (in development) **Stream backend** We've added a new backend for playing audio streams, the :mod:`stream backend -`. It is activated by default. - -The stream backend supports the intersection of what your GStreamer -installation supports and what protocols are included in the -:attr:`mopidy.settings.STREAM_PROTOCOLS` settings. +`. It is activated by default. The stream backend +supports the intersection of what your GStreamer installation supports and what +protocols are included in the :attr:`mopidy.settings.STREAM_PROTOCOLS` setting. Current limitations: From 78f4a85e921af6ea8e5f1377c892fd2a6b634e75 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 8 Jan 2013 00:05:51 +0100 Subject: [PATCH 076/151] docs: Prefix issue numbers with '#' instead of 'GH-' --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 04d15067..55f415b4 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -265,4 +265,4 @@ latex_documents = [ needs_sphinx = '1.0' -extlinks = {'issue': ('https://github.com/mopidy/mopidy/issues/%s', 'GH-')} +extlinks = {'issue': ('https://github.com/mopidy/mopidy/issues/%s', '#')} From 63df51ac7306ebb1c889c6d3c6a82c5f1733e2a6 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Tue, 8 Jan 2013 23:20:41 +0100 Subject: [PATCH 077/151] tests: Pass audio actor proxy to backends not audio module --- tests/backends/base/events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/backends/base/events.py b/tests/backends/base/events.py index 0a2e6722..2b6df347 100644 --- a/tests/backends/base/events.py +++ b/tests/backends/base/events.py @@ -11,7 +11,7 @@ from mopidy.backends import listener class BackendEventsTest(object): def setUp(self): self.audio = mock.Mock(spec=audio.Audio) - self.backend = self.backend_class.start(audio=audio).proxy() + self.backend = self.backend_class.start(audio=self.audio).proxy() self.core = core.Core.start(backends=[self.backend]).proxy() def tearDown(self): From 947b68b1be33ce4fc888d2f6558a9bd75111bc91 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 10 Jan 2013 21:47:21 +0100 Subject: [PATCH 078/151] docs: Fix syntax error --- docs/installation/index.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/installation/index.rst b/docs/installation/index.rst index bc54ed99..2b9806fd 100644 --- a/docs/installation/index.rst +++ b/docs/installation/index.rst @@ -177,7 +177,8 @@ can install Mopidy from PyPI using Pip. sudo pip install -U pykka - # On Fedora the binary is called pip-python: + On Fedora the binary is called ``pip-python``:: + sudo pip-python install -U pykka - GStreamer 0.10.x, with Python bindings. GStreamer is packaged for most @@ -209,8 +210,8 @@ can install Mopidy from PyPI using Pip. versions of libspotify and pyspotify are tightly coupled, so you'll need to get this right. - #. Download and install the appropriate version of libspotify for your OS and - CPU architecture from `Spotify + #. Download and install the appropriate version of libspotify for your OS + and CPU architecture from `Spotify `_. For libspotify 12.1.51 for 64-bit Linux the process is as follows:: @@ -225,7 +226,7 @@ can install Mopidy from PyPI using Pip. supported by pyspotify, your OS, and your CPU architecture. #. If you're on Fedora, you must add a configuration file so libspotify.so - can be found: + can be found:: su -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/libspotify.conf' sudo ldconfig From 3c8304108456391b70f793191d6e678e33578bed Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 10 Jan 2013 22:12:44 +0100 Subject: [PATCH 079/151] docs: Add rompr to web client list (fixes #321) --- docs/_static/rompr.png | Bin 0 -> 290257 bytes docs/clients/http.rst | 12 ++++++++++++ 2 files changed, 12 insertions(+) create mode 100644 docs/_static/rompr.png diff --git a/docs/_static/rompr.png b/docs/_static/rompr.png new file mode 100644 index 0000000000000000000000000000000000000000..d9dcf9b32a6cdc767c214c85db2a10a61ba1728b GIT binary patch literal 290257 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�igMv#v}#22xW49+MT+7wu@Ac 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%0D_(IL~wWk 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 z AN(m3i^dIwN8)fps^AYA2_7;sDy{gUy)Rd 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 Y!0>u%)1?CC4G4J2d{LCB5;F|^KQWci7XSbN literal 0 HcmV?d00001 diff --git a/docs/clients/http.rst b/docs/clients/http.rst index c6e8b7d8..85ad1375 100644 --- a/docs/clients/http.rst +++ b/docs/clients/http.rst @@ -27,3 +27,15 @@ usable. It targets both desktop and mobile browsers. To try it out, get a copy of https://github.com/woutervanwijk/Mopidy-WebClient and point the :attr:`mopidy.settings.HTTP_SERVER_STATIC_DIR` setting towards your copy of the web client. + + +Rompr +===== + +.. image:: /_static/rompr.png + :width: 557 + :height: 600 + +`Rompr `_ is a web based MPD client. +`mrvanes `, a Mopidy and Rompr user, said: "These +projects are a real match made in heaven." From 689e7c5f3db8b66cc405a9f44fc92d0de0cb4543 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 10 Jan 2013 22:13:44 +0100 Subject: [PATCH 080/151] docs: Refer to HTTP clients page for web based MPD clients --- docs/clients/mpd.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/clients/mpd.rst b/docs/clients/mpd.rst index a8cae367..878b01f0 100644 --- a/docs/clients/mpd.rst +++ b/docs/clients/mpd.rst @@ -318,3 +318,9 @@ purchased from `MPaD at iTunes Store - The server menu can be very slow top open, and there is no visible feedback when waiting for the connection to a server to succeed. + + +Web clients +=========== + +See :ref:`http-clients`. From 3ee8485d7e500aaa3d743775ce0615999481065e Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 10 Jan 2013 22:16:25 +0100 Subject: [PATCH 081/151] docs: Fix syntax error --- docs/clients/http.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/clients/http.rst b/docs/clients/http.rst index 85ad1375..54d87d62 100644 --- a/docs/clients/http.rst +++ b/docs/clients/http.rst @@ -37,5 +37,5 @@ Rompr :height: 600 `Rompr `_ is a web based MPD client. -`mrvanes `, a Mopidy and Rompr user, said: "These +`mrvanes `_, a Mopidy and Rompr user, said: "These projects are a real match made in heaven." From a032e45c354bcb0bc5e90b9ca2b155b5fb22d4b5 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 16 Jan 2013 20:38:52 +0100 Subject: [PATCH 082/151] js: Make 'Mopidy()' work without 'new' --- js/src/mopidy.js | 4 ++++ js/test/mopidy-test.js | 9 +++++++++ mopidy/frontends/http/data/mopidy.js | 8 ++++++-- mopidy/frontends/http/data/mopidy.min.js | 6 +++--- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/js/src/mopidy.js b/js/src/mopidy.js index 3485b442..5a75a836 100644 --- a/js/src/mopidy.js +++ b/js/src/mopidy.js @@ -1,6 +1,10 @@ /*global bane:false, when:false*/ function Mopidy(settings) { + if (!(this instanceof Mopidy)) { + return new Mopidy(settings); + } + this._settings = this._configure(settings || {}); this._console = this._getConsole(); diff --git a/js/test/mopidy-test.js b/js/test/mopidy-test.js index 7dcc5972..8842ebf4 100644 --- a/js/test/mopidy-test.js +++ b/js/test/mopidy-test.js @@ -48,6 +48,15 @@ buster.testCase("Mopidy", { new Mopidy({webSocket: {}}); refute.called(this.webSocketConstructorStub); + }, + + "works without 'new' keyword": function () { + var mopidyConstructor = Mopidy; // To trick jshint into submission + + var mopidy = mopidyConstructor({webSocket: {}}); + + assert.isObject(mopidy); + assert(mopidy instanceof Mopidy); } }, diff --git a/mopidy/frontends/http/data/mopidy.js b/mopidy/frontends/http/data/mopidy.js index 5b022c0c..f41695e6 100644 --- a/mopidy/frontends/http/data/mopidy.js +++ b/mopidy/frontends/http/data/mopidy.js @@ -1,6 +1,6 @@ -/*! Mopidy.js - built 2012-12-04 +/*! Mopidy.js - built 2013-01-16 * http://www.mopidy.com/ - * Copyright (c) 2012 Stein Magnus Jodal and contributors + * Copyright (c) 2013 Stein Magnus Jodal and contributors * Licensed under the Apache License, Version 2.0 */ /** @@ -910,6 +910,10 @@ define(['module'], function () { /*global bane:false, when:false*/ function Mopidy(settings) { + if (!(this instanceof Mopidy)) { + return new Mopidy(settings); + } + this._settings = this._configure(settings || {}); this._console = this._getConsole(); diff --git a/mopidy/frontends/http/data/mopidy.min.js b/mopidy/frontends/http/data/mopidy.min.js index 797b47ec..e727cefd 100644 --- a/mopidy/frontends/http/data/mopidy.min.js +++ b/mopidy/frontends/http/data/mopidy.min.js @@ -1,5 +1,5 @@ -/*! Mopidy.js - built 2012-12-04 +/*! Mopidy.js - built 2013-01-16 * http://www.mopidy.com/ - * Copyright (c) 2012 Stein Magnus Jodal and contributors + * Copyright (c) 2013 Stein Magnus Jodal and contributors * Licensed under the Apache License, Version 2.0 */ -function Mopidy(e){this._settings=this._configure(e||{}),this._console=this._getConsole(),this._backoffDelay=this._settings.backoffDelayMin,this._pendingRequests={},this._webSocket=null,bane.createEventEmitter(this),this._delegateEvents(),this._settings.autoConnect&&this.connect()}(typeof define=="function"&&define.amd&&function(e){define(e)}||typeof module=="object"&&function(e){module.exports=e()}||function(e){this.bane=e()})(function(){"use strict";function t(e,t,n){var r,i=n.length;if(i>0){for(r=0;r>>0,o=Math.max(0,Math.min(t,v)),a=[],u=v-o+1,l=[],c=f();if(!o)c.resolve(a);else{d=c.progress,p=function(e){l.push(e),--u||(h=p=w,c.reject(l))},h=function(e){a.push(e),--o||(h=p=w,c.resolve(a))};for(m=0;m>>0,n=[],l=f();if(!s)l.resolve(n);else{u=l.reject,o=function(i,o){r(i,t).then(function(e){n[o]=e,--s||l.resolve(n)},u)};for(a=0;a2;return r(e,function(e){return t.resolve(i?n:e)},t.reject,t.progress)}function y(e,t){var n,r=0;while(n=e[r++])n(t)}function b(e,t){var n,r=t.length;while(r>e){n=t[--r];if(n!=null&&typeof n!="function")throw new Error("arg "+r+" must be a function")}}function w(){}function E(e){return e}var e,t,n;return r.defer=f,r.resolve=i,r.reject=s,r.join=d,r.all=p,r.some=c,r.any=h,r.map=v,r.reduce=m,r.chain=g,r.isPromise=l,o.prototype={always:function(e,t){return this.then(e,e,t)},otherwise:function(e){return this.then(n,e)}},t=[].slice,e=[].reduce||function(e){var t,n,r,i,s;s=0,t=Object(this),i=t.length>>>0,n=arguments;if(n.length<=1)for(;;){if(s in t){r=t[s++];break}if(++s>=i)throw new TypeError}else r=n[1];for(;sthis._settings.backoffDelayMax&&(this._backoffDelay=this._settings.backoffDelayMax)},Mopidy.prototype._resetBackoffDelay=function(){this._backoffDelay=this._settings.backoffDelayMin},Mopidy.prototype.close=function(){this.off("state:offline",this._reconnect),this._webSocket.close()},Mopidy.prototype._handleWebSocketError=function(e){this._console.warn("WebSocket error:",e.stack||e)},Mopidy.prototype._send=function(e){var t=when.defer();switch(this._webSocket.readyState){case WebSocket.CONNECTING:t.resolver.reject({message:"WebSocket is still connecting"});break;case WebSocket.CLOSING:t.resolver.reject({message:"WebSocket is closing"});break;case WebSocket.CLOSED:t.resolver.reject({message:"WebSocket is closed"});break;default:e.jsonrpc="2.0",e.id=this._nextRequestId(),this._pendingRequests[e.id]=t.resolver,this._webSocket.send(JSON.stringify(e)),this.emit("websocket:outgoingMessage",e)}return t.promise},Mopidy.prototype._nextRequestId=function(){var e=-1;return function(){return e+=1,e}}(),Mopidy.prototype._handleMessage=function(e){try{var t=JSON.parse(e.data);t.hasOwnProperty("id")?this._handleResponse(t):t.hasOwnProperty("event")?this._handleEvent(t):this._console.warn("Unknown message type received. Message was: "+e.data)}catch(n){if(!(n instanceof SyntaxError))throw n;this._console.warn("WebSocket message parsing failed. Message was: "+e.data)}},Mopidy.prototype._handleResponse=function(e){if(!this._pendingRequests.hasOwnProperty(e.id)){this._console.warn("Unexpected response received. Message was:",e);return}var t=this._pendingRequests[e.id];delete this._pendingRequests[e.id],e.hasOwnProperty("result")?t.resolve(e.result):e.hasOwnProperty("error")?(t.reject(e.error),this._console.warn("Server returned error:",e.error)):(t.reject({message:"Response without 'result' or 'error' received",data:{response:e}}),this._console.warn("Response without 'result' or 'error' received. Message was:",e))},Mopidy.prototype._handleEvent=function(e){var t=e.event,n=e;delete n.event,this.emit("event:"+this._snakeToCamel(t),n)},Mopidy.prototype._getApiSpec=function(){this._send({method:"core.describe"}).then(this._createApi.bind(this),this._handleWebSocketError).then(null,this._handleWebSocketError)},Mopidy.prototype._createApi=function(e){var t=function(e){return function(){var t=Array.prototype.slice.call(arguments);return this._send({method:e,params:t})}.bind(this)}.bind(this),n=function(e){var t=e.split(".");return t.length>=1&&t[0]==="core"&&(t=t.slice(1)),t},r=function(e){var t=this;return e.forEach(function(e){e=this._snakeToCamel(e),t[e]=t[e]||{},t=t[e]}.bind(this)),t}.bind(this),i=function(i){var s=n(i),o=this._snakeToCamel(s.slice(-1)[0]),u=r(s.slice(0,-1));u[o]=t(i),u[o].description=e[i].description,u[o].params=e[i].params}.bind(this);Object.keys(e).forEach(i),this.emit("state:online")},Mopidy.prototype._snakeToCamel=function(e){return e.replace(/(_[a-z])/g,function(e){return e.toUpperCase().replace("_","")})}; \ No newline at end of file +function Mopidy(e){if(!(this instanceof Mopidy))return new Mopidy(e);this._settings=this._configure(e||{}),this._console=this._getConsole(),this._backoffDelay=this._settings.backoffDelayMin,this._pendingRequests={},this._webSocket=null,bane.createEventEmitter(this),this._delegateEvents(),this._settings.autoConnect&&this.connect()}(typeof define=="function"&&define.amd&&function(e){define(e)}||typeof module=="object"&&function(e){module.exports=e()}||function(e){this.bane=e()})(function(){"use strict";function t(e,t,n){var r,i=n.length;if(i>0){for(r=0;r>>0,o=Math.max(0,Math.min(t,v)),a=[],u=v-o+1,l=[],c=f();if(!o)c.resolve(a);else{d=c.progress,p=function(e){l.push(e),--u||(h=p=w,c.reject(l))},h=function(e){a.push(e),--o||(h=p=w,c.resolve(a))};for(m=0;m>>0,n=[],l=f();if(!s)l.resolve(n);else{u=l.reject,o=function(i,o){r(i,t).then(function(e){n[o]=e,--s||l.resolve(n)},u)};for(a=0;a2;return r(e,function(e){return t.resolve(i?n:e)},t.reject,t.progress)}function y(e,t){var n,r=0;while(n=e[r++])n(t)}function b(e,t){var n,r=t.length;while(r>e){n=t[--r];if(n!=null&&typeof n!="function")throw new Error("arg "+r+" must be a function")}}function w(){}function E(e){return e}var e,t,n;return r.defer=f,r.resolve=i,r.reject=s,r.join=d,r.all=p,r.some=c,r.any=h,r.map=v,r.reduce=m,r.chain=g,r.isPromise=l,o.prototype={always:function(e,t){return this.then(e,e,t)},otherwise:function(e){return this.then(n,e)}},t=[].slice,e=[].reduce||function(e){var t,n,r,i,s;s=0,t=Object(this),i=t.length>>>0,n=arguments;if(n.length<=1)for(;;){if(s in t){r=t[s++];break}if(++s>=i)throw new TypeError}else r=n[1];for(;sthis._settings.backoffDelayMax&&(this._backoffDelay=this._settings.backoffDelayMax)},Mopidy.prototype._resetBackoffDelay=function(){this._backoffDelay=this._settings.backoffDelayMin},Mopidy.prototype.close=function(){this.off("state:offline",this._reconnect),this._webSocket.close()},Mopidy.prototype._handleWebSocketError=function(e){this._console.warn("WebSocket error:",e.stack||e)},Mopidy.prototype._send=function(e){var t=when.defer();switch(this._webSocket.readyState){case WebSocket.CONNECTING:t.resolver.reject({message:"WebSocket is still connecting"});break;case WebSocket.CLOSING:t.resolver.reject({message:"WebSocket is closing"});break;case WebSocket.CLOSED:t.resolver.reject({message:"WebSocket is closed"});break;default:e.jsonrpc="2.0",e.id=this._nextRequestId(),this._pendingRequests[e.id]=t.resolver,this._webSocket.send(JSON.stringify(e)),this.emit("websocket:outgoingMessage",e)}return t.promise},Mopidy.prototype._nextRequestId=function(){var e=-1;return function(){return e+=1,e}}(),Mopidy.prototype._handleMessage=function(e){try{var t=JSON.parse(e.data);t.hasOwnProperty("id")?this._handleResponse(t):t.hasOwnProperty("event")?this._handleEvent(t):this._console.warn("Unknown message type received. Message was: "+e.data)}catch(n){if(!(n instanceof SyntaxError))throw n;this._console.warn("WebSocket message parsing failed. Message was: "+e.data)}},Mopidy.prototype._handleResponse=function(e){if(!this._pendingRequests.hasOwnProperty(e.id)){this._console.warn("Unexpected response received. Message was:",e);return}var t=this._pendingRequests[e.id];delete this._pendingRequests[e.id],e.hasOwnProperty("result")?t.resolve(e.result):e.hasOwnProperty("error")?(t.reject(e.error),this._console.warn("Server returned error:",e.error)):(t.reject({message:"Response without 'result' or 'error' received",data:{response:e}}),this._console.warn("Response without 'result' or 'error' received. Message was:",e))},Mopidy.prototype._handleEvent=function(e){var t=e.event,n=e;delete n.event,this.emit("event:"+this._snakeToCamel(t),n)},Mopidy.prototype._getApiSpec=function(){this._send({method:"core.describe"}).then(this._createApi.bind(this),this._handleWebSocketError).then(null,this._handleWebSocketError)},Mopidy.prototype._createApi=function(e){var t=function(e){return function(){var t=Array.prototype.slice.call(arguments);return this._send({method:e,params:t})}.bind(this)}.bind(this),n=function(e){var t=e.split(".");return t.length>=1&&t[0]==="core"&&(t=t.slice(1)),t},r=function(e){var t=this;return e.forEach(function(e){e=this._snakeToCamel(e),t[e]=t[e]||{},t=t[e]}.bind(this)),t}.bind(this),i=function(i){var s=n(i),o=this._snakeToCamel(s.slice(-1)[0]),u=r(s.slice(0,-1));u[o]=t(i),u[o].description=e[i].description,u[o].params=e[i].params}.bind(this);Object.keys(e).forEach(i),this.emit("state:online")},Mopidy.prototype._snakeToCamel=function(e){return e.replace(/(_[a-z])/g,function(e){return e.toUpperCase().replace("_","")})}; \ No newline at end of file From 22f386cf73aba0ec68cf7bc0c98f0cba9740887e Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 7 Feb 2013 22:25:27 +0100 Subject: [PATCH 083/151] docs: Spotify now works on armhf --- docs/installation/raspberrypi.rst | 42 ++++++------------------------- 1 file changed, 8 insertions(+), 34 deletions(-) diff --git a/docs/installation/raspberrypi.rst b/docs/installation/raspberrypi.rst index 8a4d9409..f1f61204 100644 --- a/docs/installation/raspberrypi.rst +++ b/docs/installation/raspberrypi.rst @@ -10,10 +10,9 @@ significant drawbacks to doing so. This document is intended to help you get Mopidy running on your Raspberry Pi and to document the progress made and issues surrounding running Mopidy on the Raspberry Pi. -Mopidy will not currently run with Spotify support on the foundation-provided -`Raspbian `_ distribution. See :ref:`not-raspbian` for -details. However, Mopidy should run with Spotify support on any ARM Debian -image that has hardware floating-point support **disabled**. +As of January 2013, Mopidy will run with Spotify support on both the armel +(soft-float) and armhf (hard-float) architectures, which includes the Raspbian +distribution. .. image:: /_static/raspberry-pi-by-jwrodgers.jpg :width: 640 @@ -219,11 +218,8 @@ software packages, as Wheezy is going to be the next release of Debian. booting. -Known Issues -============ - -Audio Quality -------------- +Audio quality issues +==================== The Raspberry Pi's audio quality can be sub-par through the analog output. This is known and unlikely to be fixed as including any higher-quality hardware @@ -232,31 +228,9 @@ skipping audio, you may want to try a USB sound card. Additionally, you could lower your default ALSA sampling rate to 22KHz, though this will lead to a substantial decrease in sound quality. - -.. _not-raspbian: - -Why Not Raspbian? ------------------ - -Mopidy with Spotify support is currently unavailable on the recommended -`Raspbian `_ Debian distribution that the Raspberry Pi -foundation has made available. This is due to Raspbian's hardware -floating-point support. The Raspberry Pi comes with a co-processor designed -specifically for floating-point computations (commonly called an FPU). Taking -advantage of the FPU can speed up many computations significantly over -software-emulated floating point routines. Most of Mopidy's dependencies are -open-source and have been (or can be) compiled to support the ``armhf`` -architecture. However, there is one component of Mopidy's stack which is -closed-source and crucial to Mopidy's Spotify support: libspotify. - -The ARM distributions of libspotify available on `Spotify's developer website -`_ are compiled for the ``armel`` architecture, -which has software floating-point support. ``armel`` and ``armhf`` software -cannot be mixed, and pyspotify links with libspotify as C extensions. Thus, -Mopidy will not run with Spotify support on ``armhf`` distributions. - -If the Spotify folks ever release builds of libspotify with ``armhf`` support, -Mopidy *should* work on Raspbian. +As of January 2013, some reports also indicate that pushing the audio through +PulseAudio may help. We hope to, in the future, provide a complete set of +instructions here leading to acceptable analog audio quality. Support From 15e6128c2a5805c2bd20eed3f34ddf6140f7b4cc Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 24 Feb 2013 20:25:30 +0100 Subject: [PATCH 084/151] audio: Add dummy implementation of the audio actor --- mopidy/audio/__init__.py | 1 + mopidy/audio/dummy.py | 62 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 mopidy/audio/dummy.py diff --git a/mopidy/audio/__init__.py b/mopidy/audio/__init__.py index 5adb333c..d38358c4 100644 --- a/mopidy/audio/__init__.py +++ b/mopidy/audio/__init__.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals # flake8: noqa from .actor import Audio +from .dummy import DummyAudio from .listener import AudioListener from .constants import PlaybackState from .utils import (calculate_duration, create_buffer, millisecond_to_clocktime, diff --git a/mopidy/audio/dummy.py b/mopidy/audio/dummy.py new file mode 100644 index 00000000..6628d069 --- /dev/null +++ b/mopidy/audio/dummy.py @@ -0,0 +1,62 @@ +from __future__ import unicode_literals + +import pykka + +from .constants import PlaybackState +from .listener import AudioListener + + +class DummyAudio(pykka.ThreadingActor): + def __init__(self): + super(DummyAudio, self).__init__() + self.state = PlaybackState.STOPPED + self._position = 0 + + def set_on_end_of_track(self, callback): + pass + + def set_uri(self, uri): + pass + + def set_appsrc(self, *args, **kwargs): + pass + + def emit_data(self, buffer_): + pass + + def emit_end_of_stream(self): + pass + + def get_position(self): + return self._position + + def set_position(self, position): + self._position = position + return True + + def start_playback(self): + return self._change_state(PlaybackState.PLAYING) + + def pause_playback(self): + return self._change_state(PlaybackState.PAUSED) + + def prepare_change(self): + return True + + def stop_playback(self): + return self._change_state(PlaybackState.STOPPED) + + def get_volume(self): + return 0 + + def set_volume(self, volume): + pass + + def set_metadata(self, track): + pass + + def _change_state(self, new_state): + old_state, self.state = self.state, new_state + AudioListener.send( + 'state_changed', old_state=old_state, new_state=new_state) + return True From 804a945e426bb4188027f1cbf86885262724ded7 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 24 Feb 2013 21:10:20 +0100 Subject: [PATCH 085/151] tests: Use DummyAudio instead of mocks --- tests/backends/base/events.py | 2 +- tests/backends/base/playback.py | 7 ++++++- tests/backends/base/playlists.py | 3 +-- tests/backends/base/tracklist.py | 3 +-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/backends/base/events.py b/tests/backends/base/events.py index 2b6df347..1d31a721 100644 --- a/tests/backends/base/events.py +++ b/tests/backends/base/events.py @@ -10,7 +10,7 @@ from mopidy.backends import listener @mock.patch.object(listener.BackendListener, 'send') class BackendEventsTest(object): def setUp(self): - self.audio = mock.Mock(spec=audio.Audio) + self.audio = audio.DummyAudio.start().proxy() self.backend = self.backend_class.start(audio=self.audio).proxy() self.core = core.Core.start(backends=[self.backend]).proxy() diff --git a/tests/backends/base/playback.py b/tests/backends/base/playback.py index 155fa661..d7979018 100644 --- a/tests/backends/base/playback.py +++ b/tests/backends/base/playback.py @@ -4,6 +4,8 @@ import mock import random import time +import pykka + from mopidy import audio, core from mopidy.core import PlaybackState from mopidy.models import Track @@ -18,7 +20,7 @@ class PlaybackControllerTest(object): tracks = [] def setUp(self): - self.audio = mock.Mock(spec=audio.Audio) + self.audio = audio.DummyAudio.start().proxy() self.backend = self.backend_class.start(audio=self.audio).proxy() self.core = core.Core(backends=[self.backend]) self.playback = self.core.playback @@ -29,6 +31,9 @@ class PlaybackControllerTest(object): assert self.tracks[0].length >= 2000, \ 'First song needs to be at least 2000 miliseconds' + def tearDown(self): + pykka.ActorRegistry.stop_all() + def test_initial_state_is_stopped(self): self.assertEqual(self.playback.state, PlaybackState.STOPPED) diff --git a/tests/backends/base/playlists.py b/tests/backends/base/playlists.py index c162e500..2184168f 100644 --- a/tests/backends/base/playlists.py +++ b/tests/backends/base/playlists.py @@ -4,7 +4,6 @@ import os import shutil import tempfile -import mock import pykka from mopidy import audio, core, settings @@ -19,7 +18,7 @@ class PlaylistsControllerTest(object): settings.LOCAL_TAG_CACHE_FILE = path_to_data_dir('library_tag_cache') settings.LOCAL_MUSIC_PATH = path_to_data_dir('') - self.audio = mock.Mock(spec=audio.Audio) + self.audio = audio.DummyAudio.start().proxy() self.backend = self.backend_class.start(audio=self.audio).proxy() self.core = core.Core(backends=[self.backend]) diff --git a/tests/backends/base/tracklist.py b/tests/backends/base/tracklist.py index 39536edc..39fb020d 100644 --- a/tests/backends/base/tracklist.py +++ b/tests/backends/base/tracklist.py @@ -1,6 +1,5 @@ from __future__ import unicode_literals -import mock import random import pykka @@ -16,7 +15,7 @@ class TracklistControllerTest(object): tracks = [] def setUp(self): - self.audio = mock.Mock(spec=audio.Audio) + self.audio = audio.DummyAudio.start().proxy() self.backend = self.backend_class.start(audio=self.audio).proxy() self.core = core.Core(audio=self.audio, backends=[self.backend]) self.controller = self.core.tracklist From 7bad64fccc5de86b172ea0de9b10258907261452 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 25 Feb 2013 23:11:41 +0100 Subject: [PATCH 086/151] audio: Add docstring to DummyAudio --- mopidy/audio/dummy.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mopidy/audio/dummy.py b/mopidy/audio/dummy.py index 6628d069..ad14390f 100644 --- a/mopidy/audio/dummy.py +++ b/mopidy/audio/dummy.py @@ -1,3 +1,9 @@ +"""A dummy audio actor for use in tests. + +This class implements the audio API in the simplest way possible. It is used in +tests of the core and backends. +""" + from __future__ import unicode_literals import pykka From 0e2f512498d1c558b1192c6652c2937f961134a1 Mon Sep 17 00:00:00 2001 From: 0xadam Date: Fri, 1 Mar 2013 22:24:13 -0800 Subject: [PATCH 087/151] docs: Append to /etc/modules, not overwrite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes the snd_bcm2835 module not being loaded and therefore sound output not working --- docs/installation/raspberrypi.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation/raspberrypi.rst b/docs/installation/raspberrypi.rst index fbb07364..da636a06 100644 --- a/docs/installation/raspberrypi.rst +++ b/docs/installation/raspberrypi.rst @@ -113,7 +113,7 @@ squeeze distribution. - Add ``ipv6`` to ``/etc/modules`` to ensure the IPv6 kernel module is loaded on boot:: - echo ipv6 | sudo tee /etc/modules + echo ipv6 | sudo tee -a /etc/modules 8. Installing Mopidy and its dependencies from `apt.mopidy.com `_, as described in :ref:`installation`. In short:: @@ -189,7 +189,7 @@ software packages, as Wheezy is going to be the next release of Debian. - Add ``ipv6`` to ``/etc/modules`` to ensure the IPv6 kernel module is loaded on boot:: - echo ipv6 | sudo tee /etc/modules + echo ipv6 | sudo tee -a /etc/modules 8. Installing Mopidy and its dependencies from `apt.mopidy.com `_, as described in :ref:`installation`. In short:: From 51b782e9260a2b867287b9269cd4fb83b0ea6af4 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 12 Mar 2013 23:28:54 +0100 Subject: [PATCH 088/151] js: Migrate Grunt from 0.3 to 0.4 --- js/Gruntfile.js | 83 ++++++++++++++++++++++++ js/grunt.js | 72 -------------------- js/package.json | 30 +++++---- mopidy/frontends/http/data/mopidy.js | 15 +---- mopidy/frontends/http/data/mopidy.min.js | 4 +- 5 files changed, 103 insertions(+), 101 deletions(-) create mode 100644 js/Gruntfile.js delete mode 100644 js/grunt.js diff --git a/js/Gruntfile.js b/js/Gruntfile.js new file mode 100644 index 00000000..f290250a --- /dev/null +++ b/js/Gruntfile.js @@ -0,0 +1,83 @@ +/*global module:false*/ +module.exports = function (grunt) { + + grunt.initConfig({ + meta: { + banner: "/*! Mopidy.js - built " + + "<%= grunt.template.today('yyyy-mm-dd') %>\n" + + " * http://www.mopidy.com/\n" + + " * Copyright (c) <%= grunt.template.today('yyyy') %> " + + "Stein Magnus Jodal and contributors\n" + + " * Licensed under the Apache License, Version 2.0 */\n", + files: { + own: ["Gruntfile.js", "src/**/*.js", "test/**/*-test.js"], + concat: "../mopidy/frontends/http/data/mopidy.js", + minified: "../mopidy/frontends/http/data/mopidy.min.js" + } + }, + buster: { + test: { + config: "buster.js" + } + }, + concat: { + options: { + banner: "<%= meta.banner %>", + stripBanners: true + }, + all: { + files: { + "<%= meta.files.concat %>": [ + "lib/bane-*.js", + "lib/when-*.js", + "src/mopidy.js" + ] + } + } + }, + jshint: { + options: { + curly: true, + eqeqeq: true, + immed: true, + indent: 4, + latedef: true, + newcap: true, + noarg: true, + sub: true, + quotmark: "double", + undef: true, + unused: true, + eqnull: true, + browser: true, + devel: true, + globals: {} + }, + files: "<%= meta.files.own %>" + }, + uglify: { + options: { + banner: "<%= meta.banner %>" + }, + all: { + files: { + "<%= meta.files.minified %>": ["<%= meta.files.concat %>"] + } + } + }, + watch: { + files: "<%= meta.files.own %>", + tasks: ["default"] + } + }); + + grunt.registerTask("test", ["jshint", "buster"]); + grunt.registerTask("build", ["test", "concat", "uglify"]); + grunt.registerTask("default", ["build"]); + + grunt.loadNpmTasks("grunt-buster"); + grunt.loadNpmTasks("grunt-contrib-concat"); + grunt.loadNpmTasks("grunt-contrib-jshint"); + grunt.loadNpmTasks("grunt-contrib-uglify"); + grunt.loadNpmTasks("grunt-contrib-watch"); +}; diff --git a/js/grunt.js b/js/grunt.js deleted file mode 100644 index 46afc8af..00000000 --- a/js/grunt.js +++ /dev/null @@ -1,72 +0,0 @@ -/*global module:false*/ -module.exports = function (grunt) { - - grunt.initConfig({ - meta: { - banner: "/*! Mopidy.js - built " + - "<%= grunt.template.today('yyyy-mm-dd') %>\n" + - " * http://www.mopidy.com/\n" + - " * Copyright (c) <%= grunt.template.today('yyyy') %> " + - "Stein Magnus Jodal and contributors\n" + - " * Licensed under the Apache License, Version 2.0 */" - }, - dirs: { - dest: "../mopidy/frontends/http/data" - }, - lint: { - files: ["grunt.js", "src/**/*.js", "test/**/*-test.js"] - }, - buster: { - test: { - config: "buster.js" - } - }, - concat: { - dist: { - src: [ - "", - "lib/bane-*.js", - "lib/when-*.js", - "src/mopidy.js" - ], - dest: "<%= dirs.dest %>/mopidy.js" - } - }, - min: { - dist: { - src: ["", ""], - dest: "<%= dirs.dest %>/mopidy.min.js" - } - }, - watch: { - files: "", - tasks: "lint buster concat min" - }, - jshint: { - options: { - curly: true, - eqeqeq: true, - immed: true, - indent: 4, - latedef: true, - newcap: true, - noarg: true, - sub: true, - quotmark: "double", - undef: true, - unused: true, - eqnull: true, - browser: true, - devel: true - }, - globals: {} - }, - uglify: {} - }); - - grunt.registerTask("test", "lint buster"); - grunt.registerTask("build", "lint buster concat min"); - grunt.registerTask("default", "build"); - - grunt.loadNpmTasks("grunt-buster"); -}; diff --git a/js/package.json b/js/package.json index a8737cfb..6638c705 100644 --- a/js/package.json +++ b/js/package.json @@ -1,15 +1,19 @@ { - "name": "mopidy", - "version": "0.0.0", - "devDependencies": { - "buster": "*", - "grunt": "*", - "grunt-buster": "*", - "phantomjs": "*" - }, - "scripts": { - "test": "grunt test", - "build": "grunt build", - "watch": "grunt watch" - } + "name": "mopidy", + "version": "0.0.0", + "devDependencies": { + "buster": "~0.6.12", + "grunt": "~0.4.0", + "grunt-buster": "~0.1.2", + "grunt-contrib-concat": "~0.1.3", + "grunt-contrib-jshint": "~0.2.0", + "grunt-contrib-uglify": "~0.1.2", + "grunt-contrib-watch": "~0.3.1", + "phantomjs": "~1.8.2" + }, + "scripts": { + "test": "grunt test", + "build": "grunt build", + "watch": "grunt watch" + } } diff --git a/mopidy/frontends/http/data/mopidy.js b/mopidy/frontends/http/data/mopidy.js index f41695e6..449e43b3 100644 --- a/mopidy/frontends/http/data/mopidy.js +++ b/mopidy/frontends/http/data/mopidy.js @@ -1,16 +1,7 @@ -/*! Mopidy.js - built 2013-01-16 +/*! Mopidy.js - built 2013-03-12 * http://www.mopidy.com/ * Copyright (c) 2013 Stein Magnus Jodal and contributors * Licensed under the Apache License, Version 2.0 */ - -/** - * BANE - Browser globals, AMD and Node Events - * - * https://github.com/busterjs/bane - * - * @version 0.4.0 - */ - ((typeof define === "function" && define.amd && function (m) { define(m); }) || (typeof module === "object" && function (m) { module.exports = m(); }) || function (m) { this.bane = m(); } @@ -175,8 +166,6 @@ return { createEventEmitter: createEventEmitter }; }); -/** @license MIT License (c) copyright B Cavalier & J Hann */ - /** * A lightweight CommonJS Promises/A and when() implementation * when is part of the cujo.js family of libraries (http://cujojs.com/) @@ -907,8 +896,6 @@ define(['module'], function () { // Boilerplate for AMD, Node, and browser global ); -/*global bane:false, when:false*/ - function Mopidy(settings) { if (!(this instanceof Mopidy)) { return new Mopidy(settings); diff --git a/mopidy/frontends/http/data/mopidy.min.js b/mopidy/frontends/http/data/mopidy.min.js index e727cefd..7bb82336 100644 --- a/mopidy/frontends/http/data/mopidy.min.js +++ b/mopidy/frontends/http/data/mopidy.min.js @@ -1,5 +1,5 @@ -/*! Mopidy.js - built 2013-01-16 +/*! Mopidy.js - built 2013-03-12 * http://www.mopidy.com/ * Copyright (c) 2013 Stein Magnus Jodal and contributors * Licensed under the Apache License, Version 2.0 */ -function Mopidy(e){if(!(this instanceof Mopidy))return new Mopidy(e);this._settings=this._configure(e||{}),this._console=this._getConsole(),this._backoffDelay=this._settings.backoffDelayMin,this._pendingRequests={},this._webSocket=null,bane.createEventEmitter(this),this._delegateEvents(),this._settings.autoConnect&&this.connect()}(typeof define=="function"&&define.amd&&function(e){define(e)}||typeof module=="object"&&function(e){module.exports=e()}||function(e){this.bane=e()})(function(){"use strict";function t(e,t,n){var r,i=n.length;if(i>0){for(r=0;r>>0,o=Math.max(0,Math.min(t,v)),a=[],u=v-o+1,l=[],c=f();if(!o)c.resolve(a);else{d=c.progress,p=function(e){l.push(e),--u||(h=p=w,c.reject(l))},h=function(e){a.push(e),--o||(h=p=w,c.resolve(a))};for(m=0;m>>0,n=[],l=f();if(!s)l.resolve(n);else{u=l.reject,o=function(i,o){r(i,t).then(function(e){n[o]=e,--s||l.resolve(n)},u)};for(a=0;a2;return r(e,function(e){return t.resolve(i?n:e)},t.reject,t.progress)}function y(e,t){var n,r=0;while(n=e[r++])n(t)}function b(e,t){var n,r=t.length;while(r>e){n=t[--r];if(n!=null&&typeof n!="function")throw new Error("arg "+r+" must be a function")}}function w(){}function E(e){return e}var e,t,n;return r.defer=f,r.resolve=i,r.reject=s,r.join=d,r.all=p,r.some=c,r.any=h,r.map=v,r.reduce=m,r.chain=g,r.isPromise=l,o.prototype={always:function(e,t){return this.then(e,e,t)},otherwise:function(e){return this.then(n,e)}},t=[].slice,e=[].reduce||function(e){var t,n,r,i,s;s=0,t=Object(this),i=t.length>>>0,n=arguments;if(n.length<=1)for(;;){if(s in t){r=t[s++];break}if(++s>=i)throw new TypeError}else r=n[1];for(;sthis._settings.backoffDelayMax&&(this._backoffDelay=this._settings.backoffDelayMax)},Mopidy.prototype._resetBackoffDelay=function(){this._backoffDelay=this._settings.backoffDelayMin},Mopidy.prototype.close=function(){this.off("state:offline",this._reconnect),this._webSocket.close()},Mopidy.prototype._handleWebSocketError=function(e){this._console.warn("WebSocket error:",e.stack||e)},Mopidy.prototype._send=function(e){var t=when.defer();switch(this._webSocket.readyState){case WebSocket.CONNECTING:t.resolver.reject({message:"WebSocket is still connecting"});break;case WebSocket.CLOSING:t.resolver.reject({message:"WebSocket is closing"});break;case WebSocket.CLOSED:t.resolver.reject({message:"WebSocket is closed"});break;default:e.jsonrpc="2.0",e.id=this._nextRequestId(),this._pendingRequests[e.id]=t.resolver,this._webSocket.send(JSON.stringify(e)),this.emit("websocket:outgoingMessage",e)}return t.promise},Mopidy.prototype._nextRequestId=function(){var e=-1;return function(){return e+=1,e}}(),Mopidy.prototype._handleMessage=function(e){try{var t=JSON.parse(e.data);t.hasOwnProperty("id")?this._handleResponse(t):t.hasOwnProperty("event")?this._handleEvent(t):this._console.warn("Unknown message type received. Message was: "+e.data)}catch(n){if(!(n instanceof SyntaxError))throw n;this._console.warn("WebSocket message parsing failed. Message was: "+e.data)}},Mopidy.prototype._handleResponse=function(e){if(!this._pendingRequests.hasOwnProperty(e.id)){this._console.warn("Unexpected response received. Message was:",e);return}var t=this._pendingRequests[e.id];delete this._pendingRequests[e.id],e.hasOwnProperty("result")?t.resolve(e.result):e.hasOwnProperty("error")?(t.reject(e.error),this._console.warn("Server returned error:",e.error)):(t.reject({message:"Response without 'result' or 'error' received",data:{response:e}}),this._console.warn("Response without 'result' or 'error' received. Message was:",e))},Mopidy.prototype._handleEvent=function(e){var t=e.event,n=e;delete n.event,this.emit("event:"+this._snakeToCamel(t),n)},Mopidy.prototype._getApiSpec=function(){this._send({method:"core.describe"}).then(this._createApi.bind(this),this._handleWebSocketError).then(null,this._handleWebSocketError)},Mopidy.prototype._createApi=function(e){var t=function(e){return function(){var t=Array.prototype.slice.call(arguments);return this._send({method:e,params:t})}.bind(this)}.bind(this),n=function(e){var t=e.split(".");return t.length>=1&&t[0]==="core"&&(t=t.slice(1)),t},r=function(e){var t=this;return e.forEach(function(e){e=this._snakeToCamel(e),t[e]=t[e]||{},t=t[e]}.bind(this)),t}.bind(this),i=function(i){var s=n(i),o=this._snakeToCamel(s.slice(-1)[0]),u=r(s.slice(0,-1));u[o]=t(i),u[o].description=e[i].description,u[o].params=e[i].params}.bind(this);Object.keys(e).forEach(i),this.emit("state:online")},Mopidy.prototype._snakeToCamel=function(e){return e.replace(/(_[a-z])/g,function(e){return e.toUpperCase().replace("_","")})}; \ No newline at end of file +function Mopidy(e){return this instanceof Mopidy?(this._settings=this._configure(e||{}),this._console=this._getConsole(),this._backoffDelay=this._settings.backoffDelayMin,this._pendingRequests={},this._webSocket=null,bane.createEventEmitter(this),this._delegateEvents(),this._settings.autoConnect&&this.connect(),void 0):new Mopidy(e)}("function"==typeof define&&define.amd&&function(e){define(e)}||"object"==typeof module&&function(e){module.exports=e()}||function(e){this.bane=e()})(function(){"use strict";function e(e,t,n){var o,r=n.length;if(r>0)for(o=0;r>o;++o)n[o](e,t);else setTimeout(function(){throw t.message=e+" listener threw error: "+t.message,t},0)}function t(e){if("function"!=typeof e)throw new TypeError("Listener is not function");return e}function n(e){return e.supervisors||(e.supervisors=[]),e.supervisors}function o(e,t){return e.listeners||(e.listeners={}),t&&!e.listeners[t]&&(e.listeners[t]=[]),t?e.listeners[t]:e.listeners}function r(e){return e.errbacks||(e.errbacks=[]),e.errbacks}function i(i){function c(t,n,o){try{n.listener.apply(n.thisp||i,o)}catch(s){e(t,s,r(i))}}return i=i||{},i.on=function(e,r,i){return"function"==typeof e?n(this).push({listener:e,thisp:r}):(o(this,e).push({listener:t(r),thisp:i}),void 0)},i.off=function(e,t){var i,s,c,u;if(!e){i=n(this),i.splice(0,i.length),s=o(this);for(c in s)s.hasOwnProperty(c)&&(i=o(this,c),i.splice(0,i.length));return i=r(this),i.splice(0,i.length),void 0}if("function"==typeof e?(i=n(this),t=e):i=o(this,e),!t)return i.splice(0,i.length),void 0;for(c=0,u=i.length;u>c;++c)if(i[c].listener===t)return i.splice(c,1),void 0},i.once=function(e,t,n){var o=function(){i.off(e,o),t.apply(this,arguments)};i.on(e,o,n)},i.bind=function(e,t){var n,o,r;if(t)for(o=0,r=t.length;r>o;++o){if("function"!=typeof e[t[o]])throw Error("No such method "+t[o]);this.on(t[o],e[t[o]],e)}else for(n in e)"function"==typeof e[n]&&this.on(n,e[n],e);return e},i.emit=function(e){var t,r,i=n(this),u=s.call(arguments);for(t=0,r=i.length;r>t;++t)c(e,i[t],u);for(i=o(this,e).slice(),u=s.call(arguments,1),t=0,r=i.length;r>t;++t)c(e,i[t],u)},i.errback=function(e){this.errbacks||(this.errbacks=[]),this.errbacks.push(t(e))},i}var s=Array.prototype.slice;return{createEventEmitter:i}}),function(e){"use strict";e(["module"],function(){function e(e,n,o,r){return t(e).then(n,o,r)}function t(e){var t,n;return e instanceof o?t=e:(c(e)&&"function"==typeof e.valueOf&&(e=e.valueOf()),c(e)?(n=s(),e.then(n.resolve,n.reject,n.progress),t=n.promise):t=r(e)),t}function n(t){return e(t,function(e){return i(e)})}function o(e){this.then=e}function r(e){var n=new o(function(n){try{return t(n?n(e):e)}catch(o){return i(o)}});return n}function i(e){var n=new o(function(n,o){try{return o?t(o(e)):i(e)}catch(r){return i(r)}});return n}function s(){function e(e,t,n){return l(e,t,n)}function n(e){return d(e)}function r(e){return d(i(e))}function c(e){return p(e)}var u,f,a,h,l,p,d;return f=new o(e),u={then:e,resolve:n,reject:r,progress:c,promise:f,resolver:{resolve:n,reject:r,progress:c}},a=[],h=[],l=function(e,t,n){var o,r;return o=s(),r=n?function(e){try{o.progress(n(e))}catch(t){o.progress(t)}}:o.progress,a.push(function(n){n.then(e,t).then(o.resolve,o.reject,r)}),h.push(r),o.promise},p=function(e){return y(h,e),e},d=function(e){return e=t(e),l=e.then,d=t,p=g,y(a,e),h=a=w,e},u}function c(e){return e&&"function"==typeof e.then}function u(t,n,o,r,i){return b(2,arguments),e(t,function(t){function c(e){y(e)}function u(e){d(e)}var f,a,h,l,p,d,y,b,k,_;if(k=t.length>>>0,f=Math.max(0,Math.min(n,k)),h=[],a=k-f+1,l=[],p=s(),f)for(b=p.progress,y=function(e){l.push(e),--a||(d=y=g,p.reject(l))},d=function(e){h.push(e),--f||(d=y=g,p.resolve(h))},_=0;k>_;++_)_ in t&&e(t[_],u,c,b);else p.resolve(h);return p.then(o,r,i)})}function f(e,t,n,o){function r(e){return t?t(e[0]):e[0]}return u(e,1,r,n,o)}function a(e,t,n,o){return b(1,arguments),l(e,k).then(t,n,o)}function h(){return l(arguments,k)}function l(t,n){return e(t,function(t){var o,r,i,c,u,f,a;if(i=r=t.length>>>0,o=[],a=s(),i)for(u=a.reject,c=function(t,r){e(t,n).then(function(e){o[r]=e,--i||a.resolve(o)},u)},f=0;r>f;f++)f in t?c(t[f],f):--i;else a.resolve(o);return a.promise})}function p(t,n){var o=v.call(arguments,1);return e(t,function(t){var r;return r=t.length,o[0]=function(t,o,i){return e(t,function(t){return e(o,function(e){return n(t,e,i,r)})})},_.apply(t,o)})}function d(t,n,o){var r=arguments.length>2;return e(t,function(e){return n.resolve(r?o:e)},n.reject,n.progress)}function y(e,t){for(var n,o=0;n=e[o++];)n(t)}function b(e,t){for(var n,o=t.length;o>e;)if(n=t[--o],null!=n&&"function"!=typeof n)throw Error("arg "+o+" must be a function")}function g(){}function k(e){return e}var _,v,w;return e.defer=s,e.resolve=t,e.reject=n,e.join=h,e.all=a,e.some=u,e.any=f,e.map=l,e.reduce=p,e.chain=d,e.isPromise=c,o.prototype={always:function(e,t){return this.then(e,e,t)},otherwise:function(e){return this.then(w,e)}},v=[].slice,_=[].reduce||function(e){var t,n,o,r,i;if(i=0,t=Object(this),r=t.length>>>0,n=arguments,1>=n.length)for(;;){if(i in t){o=t[i++];break}if(++i>=r)throw new TypeError}else o=n[1];for(;r>i;++i)i in t&&(o=e(o,t[i],i,t));return o},e})}("function"==typeof define&&define.amd?define:function(e,t){"object"==typeof exports?module.exports=t():this.when=t()}),Mopidy.prototype._configure=function(e){return e.webSocketUrl=e.webSocketUrl||"ws://"+document.location.host+"/mopidy/ws/",e.autoConnect!==!1&&(e.autoConnect=!0),e.backoffDelayMin=e.backoffDelayMin||1e3,e.backoffDelayMax=e.backoffDelayMax||64e3,e},Mopidy.prototype._getConsole=function(){var e=window.console||{};return e.log=e.log||function(){},e.warn=e.warn||function(){},e.error=e.error||function(){},e},Mopidy.prototype._delegateEvents=function(){this.off("websocket:close"),this.off("websocket:error"),this.off("websocket:incomingMessage"),this.off("websocket:open"),this.off("state:offline"),this.on("websocket:close",this._cleanup),this.on("websocket:error",this._handleWebSocketError),this.on("websocket:incomingMessage",this._handleMessage),this.on("websocket:open",this._resetBackoffDelay),this.on("websocket:open",this._getApiSpec),this.on("state:offline",this._reconnect)},Mopidy.prototype.connect=function(){if(this._webSocket){if(this._webSocket.readyState===WebSocket.OPEN)return;this._webSocket.close()}this._webSocket=this._settings.webSocket||new WebSocket(this._settings.webSocketUrl),this._webSocket.onclose=function(e){this.emit("websocket:close",e)}.bind(this),this._webSocket.onerror=function(e){this.emit("websocket:error",e)}.bind(this),this._webSocket.onopen=function(){this.emit("websocket:open")}.bind(this),this._webSocket.onmessage=function(e){this.emit("websocket:incomingMessage",e)}.bind(this)},Mopidy.prototype._cleanup=function(e){Object.keys(this._pendingRequests).forEach(function(t){var n=this._pendingRequests[t];delete this._pendingRequests[t],n.reject({message:"WebSocket closed",closeEvent:e})}.bind(this)),this.emit("state:offline")},Mopidy.prototype._reconnect=function(){this.emit("reconnectionPending",{timeToAttempt:this._backoffDelay}),setTimeout(function(){this.emit("reconnecting"),this.connect()}.bind(this),this._backoffDelay),this._backoffDelay=2*this._backoffDelay,this._backoffDelay>this._settings.backoffDelayMax&&(this._backoffDelay=this._settings.backoffDelayMax)},Mopidy.prototype._resetBackoffDelay=function(){this._backoffDelay=this._settings.backoffDelayMin},Mopidy.prototype.close=function(){this.off("state:offline",this._reconnect),this._webSocket.close()},Mopidy.prototype._handleWebSocketError=function(e){this._console.warn("WebSocket error:",e.stack||e)},Mopidy.prototype._send=function(e){var t=when.defer();switch(this._webSocket.readyState){case WebSocket.CONNECTING:t.resolver.reject({message:"WebSocket is still connecting"});break;case WebSocket.CLOSING:t.resolver.reject({message:"WebSocket is closing"});break;case WebSocket.CLOSED:t.resolver.reject({message:"WebSocket is closed"});break;default:e.jsonrpc="2.0",e.id=this._nextRequestId(),this._pendingRequests[e.id]=t.resolver,this._webSocket.send(JSON.stringify(e)),this.emit("websocket:outgoingMessage",e)}return t.promise},Mopidy.prototype._nextRequestId=function(){var e=-1;return function(){return e+=1}}(),Mopidy.prototype._handleMessage=function(e){try{var t=JSON.parse(e.data);t.hasOwnProperty("id")?this._handleResponse(t):t.hasOwnProperty("event")?this._handleEvent(t):this._console.warn("Unknown message type received. Message was: "+e.data)}catch(n){if(!(n instanceof SyntaxError))throw n;this._console.warn("WebSocket message parsing failed. Message was: "+e.data)}},Mopidy.prototype._handleResponse=function(e){if(!this._pendingRequests.hasOwnProperty(e.id))return this._console.warn("Unexpected response received. Message was:",e),void 0;var t=this._pendingRequests[e.id];delete this._pendingRequests[e.id],e.hasOwnProperty("result")?t.resolve(e.result):e.hasOwnProperty("error")?(t.reject(e.error),this._console.warn("Server returned error:",e.error)):(t.reject({message:"Response without 'result' or 'error' received",data:{response:e}}),this._console.warn("Response without 'result' or 'error' received. Message was:",e))},Mopidy.prototype._handleEvent=function(e){var t=e.event,n=e;delete n.event,this.emit("event:"+this._snakeToCamel(t),n)},Mopidy.prototype._getApiSpec=function(){this._send({method:"core.describe"}).then(this._createApi.bind(this),this._handleWebSocketError).then(null,this._handleWebSocketError)},Mopidy.prototype._createApi=function(e){var t=function(e){return function(){var t=Array.prototype.slice.call(arguments);return this._send({method:e,params:t})}.bind(this)}.bind(this),n=function(e){var t=e.split(".");return t.length>=1&&"core"===t[0]&&(t=t.slice(1)),t},o=function(e){var t=this;return e.forEach(function(e){e=this._snakeToCamel(e),t[e]=t[e]||{},t=t[e]}.bind(this)),t}.bind(this),r=function(r){var i=n(r),s=this._snakeToCamel(i.slice(-1)[0]),c=o(i.slice(0,-1));c[s]=t(r),c[s].description=e[r].description,c[s].params=e[r].params}.bind(this);Object.keys(e).forEach(r),this.emit("state:online")},Mopidy.prototype._snakeToCamel=function(e){return e.replace(/(_[a-z])/g,function(e){return e.toUpperCase().replace("_","")})}; \ No newline at end of file From cf2d22c2819b6b4838ae5c63361926b3bb1460b3 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 12 Mar 2013 23:39:14 +0100 Subject: [PATCH 089/151] js: Upgrade when.js from 1.6.1 to 1.8.1 --- js/lib/{when-1.6.1.js => when-1.8.1.js} | 384 ++++++++++++----------- mopidy/frontends/http/data/mopidy.js | 382 +++++++++++----------- mopidy/frontends/http/data/mopidy.min.js | 2 +- 3 files changed, 412 insertions(+), 356 deletions(-) rename js/lib/{when-1.6.1.js => when-1.8.1.js} (60%) diff --git a/js/lib/when-1.6.1.js b/js/lib/when-1.8.1.js similarity index 60% rename from js/lib/when-1.6.1.js rename to js/lib/when-1.8.1.js index e9a3bfc3..05c5a429 100644 --- a/js/lib/when-1.6.1.js +++ b/js/lib/when-1.8.1.js @@ -1,4 +1,4 @@ -/** @license MIT License (c) copyright B Cavalier & J Hann */ +/** @license MIT License (c) copyright 2011-2013 original author or authors */ /** * A lightweight CommonJS Promises/A and when() implementation @@ -7,11 +7,14 @@ * Licensed under the MIT License at: * http://www.opensource.org/licenses/mit-license.php * - * @version 1.6.1 + * @author Brian Cavalier + * @author John Hann + * + * @version 1.8.1 */ (function(define) { 'use strict'; -define(['module'], function () { +define(function () { var reduceArray, slice, undef; // @@ -25,110 +28,106 @@ define(['module'], function () { when.join = join; // Join 2 or more promises when.all = all; // Resolve a list of promises - when.some = some; // Resolve a sub-set of promises - when.any = any; // Resolve one promise in a list - when.map = map; // Array.map() for promises when.reduce = reduce; // Array.reduce() for promises + when.any = any; // One-winner race + when.some = some; // Multi-winner race + when.chain = chain; // Make a promise trigger another resolver when.isPromise = isPromise; // Determine if a thing is a promise /** * Register an observer for a promise or immediate value. - * @function - * @name when - * @namespace * - * @param promiseOrValue {*} - * @param {Function} [callback] callback to be called when promiseOrValue is + * @param {*} promiseOrValue + * @param {function?} [onFulfilled] callback to be called when promiseOrValue is * successfully fulfilled. If promiseOrValue is an immediate value, callback * will be invoked immediately. - * @param {Function} [errback] callback to be called when promiseOrValue is + * @param {function?} [onRejected] callback to be called when promiseOrValue is * rejected. - * @param {Function} [progressHandler] callback to be called when progress updates + * @param {function?} [onProgress] callback to be called when progress updates * are issued for promiseOrValue. * @returns {Promise} a new {@link Promise} that will complete with the return * value of callback or errback or the completion value of promiseOrValue if * callback and/or errback is not supplied. */ - function when(promiseOrValue, callback, errback, progressHandler) { + function when(promiseOrValue, onFulfilled, onRejected, onProgress) { // Get a trusted promise for the input promiseOrValue, and then // register promise handlers - return resolve(promiseOrValue).then(callback, errback, progressHandler); + return resolve(promiseOrValue).then(onFulfilled, onRejected, onProgress); } /** * Returns promiseOrValue if promiseOrValue is a {@link Promise}, a new Promise if * promiseOrValue is a foreign promise, or a new, already-fulfilled {@link Promise} * whose value is promiseOrValue if promiseOrValue is an immediate value. - * @memberOf when * - * @param promiseOrValue {*} - * @returns Guaranteed to return a trusted Promise. If promiseOrValue is a when.js {@link Promise} - * returns promiseOrValue, otherwise, returns a new, already-resolved, when.js {@link Promise} - * whose resolution value is: + * @param {*} promiseOrValue + * @returns {Promise} Guaranteed to return a trusted Promise. If promiseOrValue + * is trusted, returns promiseOrValue, otherwise, returns a new, already-resolved + * when.js promise whose resolution value is: * * the resolution value of promiseOrValue if it's a foreign promise, or * * promiseOrValue if it's a value */ function resolve(promiseOrValue) { - var promise, deferred; + var promise; if(promiseOrValue instanceof Promise) { // It's a when.js promise, so we trust it promise = promiseOrValue; + } else if(isPromise(promiseOrValue)) { + // Assimilate foreign promises + promise = assimilate(promiseOrValue); } else { - // It's not a when.js promise. See if it's a foreign promise or a value. - - // Some promises, particularly Q promises, provide a valueOf method that - // attempts to synchronously return the fulfilled value of the promise, or - // returns the unresolved promise itself. Attempting to break a fulfillment - // value out of a promise appears to be necessary to break cycles between - // Q and When attempting to coerce each-other's promises in an infinite loop. - // For promises that do not implement "valueOf", the Object#valueOf is harmless. - // See: https://github.com/kriskowal/q/issues/106 - // IMPORTANT: Must check for a promise here, since valueOf breaks other things - // like Date. - if (isPromise(promiseOrValue) && typeof promiseOrValue.valueOf === 'function') { - promiseOrValue = promiseOrValue.valueOf(); - } - - if(isPromise(promiseOrValue)) { - // It looks like a thenable, but we don't know where it came from, - // so we don't trust its implementation entirely. Introduce a trusted - // middleman when.js promise - deferred = defer(); - - // IMPORTANT: This is the only place when.js should ever call .then() on - // an untrusted promise. - promiseOrValue.then(deferred.resolve, deferred.reject, deferred.progress); - promise = deferred.promise; - - } else { - // It's a value, not a promise. Create a resolved promise for it. - promise = fulfilled(promiseOrValue); - } + // It's a value, create a fulfilled promise for it. + promise = fulfilled(promiseOrValue); } return promise; } /** - * Returns a rejected promise for the supplied promiseOrValue. If - * promiseOrValue is a value, it will be the rejection value of the - * returned promise. If promiseOrValue is a promise, its - * completion value will be the rejected value of the returned promise - * @memberOf when + * Assimilate an untrusted thenable by introducing a trusted middle man. + * Not a perfect strategy, but possibly the best we can do. + * IMPORTANT: This is the only place when.js should ever call an untrusted + * thenable's then() on an. Don't expose the return value to the untrusted thenable * - * @param promiseOrValue {*} the rejected value of the returned {@link Promise} + * @param {*} thenable + * @param {function} thenable.then + * @returns {Promise} + */ + function assimilate(thenable) { + var d = defer(); + + // TODO: Enqueue this for future execution in 2.0 + try { + thenable.then( + function(value) { d.resolve(value); }, + function(reason) { d.reject(reason); }, + function(update) { d.progress(update); } + ); + } catch(e) { + d.reject(e); + } + + return d.promise; + } + + /** + * Returns a rejected promise for the supplied promiseOrValue. The returned + * promise will be rejected with: + * - promiseOrValue, if it is a value, or + * - if promiseOrValue is a promise + * - promiseOrValue's value after it is fulfilled + * - promiseOrValue's reason after it is rejected + * @param {*} promiseOrValue the rejected value of the returned {@link Promise} * @return {Promise} rejected {@link Promise} */ function reject(promiseOrValue) { - return when(promiseOrValue, function(value) { - return rejected(value); - }); + return when(promiseOrValue, rejected); } /** @@ -145,25 +144,53 @@ define(['module'], function () { Promise.prototype = { /** * Register a callback that will be called when a promise is - * resolved or rejected. Optionally also register a progress handler. - * Shortcut for .then(alwaysback, alwaysback, progback) - * @memberOf Promise - * @param alwaysback {Function} - * @param progback {Function} + * fulfilled or rejected. Optionally also register a progress handler. + * Shortcut for .then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress) + * @param {function?} [onFulfilledOrRejected] + * @param {function?} [onProgress] * @return {Promise} */ - always: function(alwaysback, progback) { - return this.then(alwaysback, alwaysback, progback); + always: function(onFulfilledOrRejected, onProgress) { + return this.then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress); }, /** - * Register a rejection handler. Shortcut for .then(null, errback) - * @memberOf Promise - * @param errback {Function} + * Register a rejection handler. Shortcut for .then(undefined, onRejected) + * @param {function?} onRejected * @return {Promise} */ - otherwise: function(errback) { - return this.then(undef, errback); + otherwise: function(onRejected) { + return this.then(undef, onRejected); + }, + + /** + * Shortcut for .then(function() { return value; }) + * @param {*} value + * @return {Promise} a promise that: + * - is fulfilled if value is not a promise, or + * - if value is a promise, will fulfill with its value, or reject + * with its reason. + */ + 'yield': function(value) { + return this.then(function() { + return value; + }); + }, + + /** + * Assumes that this promise will fulfill with an array, and arranges + * for the onFulfilled to be called with the array as its argument list + * i.e. onFulfilled.apply(undefined, array). + * @param {function} onFulfilled function to receive spread arguments + * @return {Promise} + */ + spread: function(onFulfilled) { + return this.then(function(array) { + // array may contain promises, so resolve its contents. + return all(array, function(array) { + return onFulfilled.apply(undef, array); + }); + }); } }; @@ -171,13 +198,13 @@ define(['module'], function () { * Create an already-resolved promise for the supplied value * @private * - * @param value anything - * @return {Promise} + * @param {*} value + * @return {Promise} fulfilled promise */ function fulfilled(value) { - var p = new Promise(function(callback) { + var p = new Promise(function(onFulfilled) { try { - return resolve(callback ? callback(value) : value); + return resolve(typeof onFulfilled == 'function' ? onFulfilled(value) : value); } catch(e) { return rejected(e); } @@ -191,13 +218,13 @@ define(['module'], function () { * rejection reason. * @private * - * @param reason rejection reason - * @return {Promise} + * @param {*} reason + * @return {Promise} rejected promise */ function rejected(reason) { - var p = new Promise(function(callback, errback) { + var p = new Promise(function(_, onRejected) { try { - return errback ? resolve(errback(reason)) : rejected(reason); + return resolve(typeof onRejected == 'function' ? onRejected(reason) : rejected(reason)); } catch(e) { return rejected(e); } @@ -212,14 +239,12 @@ define(['module'], function () { * The Deferred itself has the full API: resolve, reject, progress, and * then. The resolver has resolve, reject, and progress. The promise * only has then. - * @memberOf when - * @function * * @return {Deferred} */ function defer() { var deferred, promise, handlers, progressHandlers, - _then, _progress, _resolve; + _then, _notify, _resolve; /** * The promise for the new deferred @@ -233,18 +258,19 @@ define(['module'], function () { * @name Deferred */ deferred = { - then: then, + then: then, // DEPRECATED: use deferred.promise.then resolve: promiseResolve, reject: promiseReject, - // TODO: Consider renaming progress() to notify() - progress: promiseProgress, + progress: promiseNotify, // DEPRECATED: use deferred.notify + notify: promiseNotify, promise: promise, resolver: { resolve: promiseResolve, reject: promiseReject, - progress: promiseProgress + progress: promiseNotify, // DEPRECATED: use deferred.notify + notify: promiseNotify } }; @@ -256,29 +282,29 @@ define(['module'], function () { * functions to the registered listeners * @private * - * @param [callback] {Function} resolution handler - * @param [errback] {Function} rejection handler - * @param [progback] {Function} progress handler - * @throws {Error} if any argument is not null, undefined, or a Function + * @param {function?} [onFulfilled] resolution handler + * @param {function?} [onRejected] rejection handler + * @param {function?} [onProgress] progress handler */ - _then = function(callback, errback, progback) { + _then = function(onFulfilled, onRejected, onProgress) { var deferred, progressHandler; deferred = defer(); - progressHandler = progback + + progressHandler = typeof onProgress === 'function' ? function(update) { try { // Allow progress handler to transform progress event - deferred.progress(progback(update)); + deferred.notify(onProgress(update)); } catch(e) { // Use caught value as progress - deferred.progress(e); + deferred.notify(e); } } - : deferred.progress; + : function(update) { deferred.notify(update); }; handlers.push(function(promise) { - promise.then(callback, errback) + promise.then(onFulfilled, onRejected) .then(deferred.resolve, deferred.reject, progressHandler); }); @@ -290,9 +316,9 @@ define(['module'], function () { /** * Issue a progress event, notifying all progress listeners * @private - * @param update {*} progress event payload to pass to all listeners + * @param {*} update progress event payload to pass to all listeners */ - _progress = function(update) { + _notify = function(update) { processQueue(progressHandlers, update); return update; }; @@ -301,61 +327,58 @@ define(['module'], function () { * Transition from pre-resolution state to post-resolution state, notifying * all listeners of the resolution or rejection * @private - * @param completed {Promise} the completed value of this deferred + * @param {*} value the value of this deferred */ - _resolve = function(completed) { - completed = resolve(completed); - + _resolve = function(value) { // Replace _then with one that directly notifies with the result. - _then = completed.then; - // Replace _resolve so that this Deferred can only be completed once + _then = value.then; + // Replace _resolve so that this Deferred can only be resolved once _resolve = resolve; // Make _progress a noop, to disallow progress for the resolved promise. - _progress = noop; + _notify = identity; // Notify handlers - processQueue(handlers, completed); + processQueue(handlers, value); // Free progressHandlers array since we'll never issue progress events progressHandlers = handlers = undef; - return completed; + return value; }; return deferred; /** * Wrapper to allow _then to be replaced safely - * @param [callback] {Function} resolution handler - * @param [errback] {Function} rejection handler - * @param [progback] {Function} progress handler - * @return {Promise} new Promise - * @throws {Error} if any argument is not null, undefined, or a Function + * @param {function?} [onFulfilled] resolution handler + * @param {function?} [onRejected] rejection handler + * @param {function?} [onProgress] progress handler + * @return {Promise} new promise */ - function then(callback, errback, progback) { - return _then(callback, errback, progback); + function then(onFulfilled, onRejected, onProgress) { + // TODO: Promises/A+ check typeof onFulfilled, onRejected, onProgress + return _then(onFulfilled, onRejected, onProgress); } /** * Wrapper to allow _resolve to be replaced */ function promiseResolve(val) { - return _resolve(val); + return _resolve(resolve(val)); } /** - * Wrapper to allow _resolve to be replaced + * Wrapper to allow _reject to be replaced */ function promiseReject(err) { return _resolve(rejected(err)); } /** - * Wrapper to allow _progress to be replaced - * @param {*} update progress update + * Wrapper to allow _notify to be replaced */ - function promiseProgress(update) { - return _progress(update); + function promiseNotify(update) { + return _notify(update); } } @@ -365,7 +388,7 @@ define(['module'], function () { * promiseOrValue is a promise. * * @param {*} promiseOrValue anything - * @returns {Boolean} true if promiseOrValue is a {@link Promise} + * @returns {boolean} true if promiseOrValue is a {@link Promise} */ function isPromise(promiseOrValue) { return promiseOrValue && typeof promiseOrValue.then === 'function'; @@ -376,25 +399,24 @@ define(['module'], function () { * howMany of the supplied promisesOrValues have resolved, or will reject when * it becomes impossible for howMany to resolve, for example, when * (promisesOrValues.length - howMany) + 1 input promises reject. - * @memberOf when * - * @param promisesOrValues {Array} array of anything, may contain a mix - * of {@link Promise}s and values - * @param howMany {Number} number of promisesOrValues to resolve - * @param [callback] {Function} resolution handler - * @param [errback] {Function} rejection handler - * @param [progback] {Function} progress handler + * @param {Array} promisesOrValues array of anything, may contain a mix + * of promises and values + * @param howMany {number} number of promisesOrValues to resolve + * @param {function?} [onFulfilled] resolution handler + * @param {function?} [onRejected] rejection handler + * @param {function?} [onProgress] progress handler * @returns {Promise} promise that will resolve to an array of howMany values that * resolved first, or will reject with an array of (promisesOrValues.length - howMany) + 1 * rejection reasons. */ - function some(promisesOrValues, howMany, callback, errback, progback) { + function some(promisesOrValues, howMany, onFulfilled, onRejected, onProgress) { checkCallbacks(2, arguments); return when(promisesOrValues, function(promisesOrValues) { - var toResolve, toReject, values, reasons, deferred, fulfillOne, rejectOne, progress, len, i; + var toResolve, toReject, values, reasons, deferred, fulfillOne, rejectOne, notify, len, i; len = promisesOrValues.length >>> 0; @@ -411,7 +433,7 @@ define(['module'], function () { deferred.resolve(values); } else { - progress = deferred.progress; + notify = deferred.notify; rejectOne = function(reason) { reasons.push(reason); @@ -435,12 +457,12 @@ define(['module'], function () { for(i = 0; i < len; ++i) { if(i in promisesOrValues) { - when(promisesOrValues[i], fulfiller, rejecter, progress); + when(promisesOrValues[i], fulfiller, rejecter, notify); } } } - return deferred.then(callback, errback, progback); + return deferred.promise.then(onFulfilled, onRejected, onProgress); function rejecter(reason) { rejectOne(reason); @@ -457,23 +479,22 @@ define(['module'], function () { * Initiates a competitive race, returning a promise that will resolve when * any one of the supplied promisesOrValues has resolved or will reject when * *all* promisesOrValues have rejected. - * @memberOf when * - * @param promisesOrValues {Array|Promise} array of anything, may contain a mix + * @param {Array|Promise} promisesOrValues array of anything, may contain a mix * of {@link Promise}s and values - * @param [callback] {Function} resolution handler - * @param [errback] {Function} rejection handler - * @param [progback] {Function} progress handler + * @param {function?} [onFulfilled] resolution handler + * @param {function?} [onRejected] rejection handler + * @param {function?} [onProgress] progress handler * @returns {Promise} promise that will resolve to the value that resolved first, or * will reject with an array of all rejected inputs. */ - function any(promisesOrValues, callback, errback, progback) { + function any(promisesOrValues, onFulfilled, onRejected, onProgress) { function unwrapSingleResult(val) { - return callback ? callback(val[0]) : val[0]; + return onFulfilled ? onFulfilled(val[0]) : val[0]; } - return some(promisesOrValues, 1, unwrapSingleResult, errback, progback); + return some(promisesOrValues, 1, unwrapSingleResult, onRejected, onProgress); } /** @@ -482,22 +503,20 @@ define(['module'], function () { * containing the resolution values of each of the promisesOrValues. * @memberOf when * - * @param promisesOrValues {Array|Promise} array of anything, may contain a mix + * @param {Array|Promise} promisesOrValues array of anything, may contain a mix * of {@link Promise}s and values - * @param [callback] {Function} - * @param [errback] {Function} - * @param [progressHandler] {Function} + * @param {function?} [onFulfilled] resolution handler + * @param {function?} [onRejected] rejection handler + * @param {function?} [onProgress] progress handler * @returns {Promise} */ - function all(promisesOrValues, callback, errback, progressHandler) { + function all(promisesOrValues, onFulfilled, onRejected, onProgress) { checkCallbacks(1, arguments); - return map(promisesOrValues, identity).then(callback, errback, progressHandler); + return map(promisesOrValues, identity).then(onFulfilled, onRejected, onProgress); } /** * Joins multiple promises into a single returned promise. - * @memberOf when - * @param {Promise|*} [...promises] two or more promises to join * @return {Promise} a promise that will fulfill when *all* the input promises * have fulfilled, or will reject when *any one* of the input promises rejects. */ @@ -510,18 +529,16 @@ define(['module'], function () { * input to contain {@link Promise}s and/or values, and mapFunc may return * either a value or a {@link Promise} * - * @memberOf when - * - * @param promise {Array|Promise} array of anything, may contain a mix + * @param {Array|Promise} promise array of anything, may contain a mix * of {@link Promise}s and values - * @param mapFunc {Function} mapping function mapFunc(value) which may return + * @param {function} mapFunc mapping function mapFunc(value) which may return * either a {@link Promise} or value * @returns {Promise} a {@link Promise} that will resolve to an array containing * the mapped output values. */ function map(promise, mapFunc) { return when(promise, function(array) { - var results, len, toResolve, resolve, reject, i, d; + var results, len, toResolve, resolve, i, d; // Since we know the resulting length, we can preallocate the results // array to avoid array expansions. @@ -533,7 +550,6 @@ define(['module'], function () { d.resolve(results); } else { - reject = d.reject; resolve = function resolveOne(item, i) { when(item, mapFunc).then(function(mapped) { results[i] = mapped; @@ -541,7 +557,7 @@ define(['module'], function () { if(!--toResolve) { d.resolve(results); } - }, reject); + }, d.reject); }; // Since mapFunc may be async, get all invocations of it into flight @@ -562,18 +578,15 @@ define(['module'], function () { /** * Traditional reduce function, similar to `Array.prototype.reduce()`, but - * input may contain {@link Promise}s and/or values, and reduceFunc - * may return either a value or a {@link Promise}, *and* initialValue may - * be a {@link Promise} for the starting value. - * @memberOf when + * input may contain promises and/or values, and reduceFunc + * may return either a value or a promise, *and* initialValue may + * be a promise for the starting value. * - * @param promise {Array|Promise} array of anything, may contain a mix - * of {@link Promise}s and values. May also be a {@link Promise} for - * an array. - * @param reduceFunc {Function} reduce function reduce(currentValue, nextValue, index, total), + * @param {Array|Promise} promise array or promise for an array of anything, + * may contain a mix of promises and values. + * @param {function} reduceFunc reduce function reduce(currentValue, nextValue, index, total), * where total is the total number of items being reduced, and will be the same * in each call to reduceFunc. - * @param [initialValue] {*} starting value, or a {@link Promise} for the starting value * @returns {Promise} that will resolve to the final reduced value */ function reduce(promise, reduceFunc /*, initialValue */) { @@ -599,13 +612,14 @@ define(['module'], function () { } /** - * Ensure that resolution of promiseOrValue will complete resolver with the completion - * value of promiseOrValue, or instead with resolveValue if it is provided. - * @memberOf when + * Ensure that resolution of promiseOrValue will trigger resolver with the + * value or reason of promiseOrValue, or instead with resolveValue if it is provided. * * @param promiseOrValue - * @param resolver {Resolver} - * @param [resolveValue] anything + * @param {Object} resolver + * @param {function} resolver.resolve + * @param {function} resolver.reject + * @param {*} [resolveValue] * @returns {Promise} */ function chain(promiseOrValue, resolver, resolveValue) { @@ -613,10 +627,18 @@ define(['module'], function () { return when(promiseOrValue, function(val) { - return resolver.resolve(useResolveValue ? resolveValue : val); + val = useResolveValue ? resolveValue : val; + resolver.resolve(val); + return val; }, - resolver.reject, - resolver.progress + function(reason) { + resolver.reject(reason); + return rejected(reason); + }, + function(update) { + typeof resolver.notify === 'function' && resolver.notify(update); + return update; + } ); } @@ -624,6 +646,11 @@ define(['module'], function () { // Utility functions // + /** + * Apply all functions in queue to value + * @param {Array} queue array of functions to execute + * @param {*} value argument passed to each function + */ function processQueue(queue, value) { var handler, i = 0; @@ -636,12 +663,13 @@ define(['module'], function () { * Helper that checks arrayOfCallbacks to ensure that each element is either * a function, or null or undefined. * @private - * - * @param arrayOfCallbacks {Array} array to check + * @param {number} start index at which to start checking items in arrayOfCallbacks + * @param {Array} arrayOfCallbacks array to check * @throws {Error} if any element of arrayOfCallbacks is something other than - * a Functions, null, or undefined. + * a functions, null, or undefined. */ function checkCallbacks(start, arrayOfCallbacks) { + // TODO: Promises/A+ update type checking and docs var arg, i = arrayOfCallbacks.length; while(i > start) { @@ -723,7 +751,7 @@ define(['module'], function () { }); })(typeof define == 'function' && define.amd ? define - : function (deps, factory) { typeof exports === 'object' + : function (factory) { typeof exports === 'object' ? (module.exports = factory()) : (this.when = factory()); } diff --git a/mopidy/frontends/http/data/mopidy.js b/mopidy/frontends/http/data/mopidy.js index 449e43b3..20e43014 100644 --- a/mopidy/frontends/http/data/mopidy.js +++ b/mopidy/frontends/http/data/mopidy.js @@ -173,11 +173,14 @@ * Licensed under the MIT License at: * http://www.opensource.org/licenses/mit-license.php * - * @version 1.6.1 + * @author Brian Cavalier + * @author John Hann + * + * @version 1.8.1 */ (function(define) { 'use strict'; -define(['module'], function () { +define(function () { var reduceArray, slice, undef; // @@ -191,110 +194,106 @@ define(['module'], function () { when.join = join; // Join 2 or more promises when.all = all; // Resolve a list of promises - when.some = some; // Resolve a sub-set of promises - when.any = any; // Resolve one promise in a list - when.map = map; // Array.map() for promises when.reduce = reduce; // Array.reduce() for promises + when.any = any; // One-winner race + when.some = some; // Multi-winner race + when.chain = chain; // Make a promise trigger another resolver when.isPromise = isPromise; // Determine if a thing is a promise /** * Register an observer for a promise or immediate value. - * @function - * @name when - * @namespace * - * @param promiseOrValue {*} - * @param {Function} [callback] callback to be called when promiseOrValue is + * @param {*} promiseOrValue + * @param {function?} [onFulfilled] callback to be called when promiseOrValue is * successfully fulfilled. If promiseOrValue is an immediate value, callback * will be invoked immediately. - * @param {Function} [errback] callback to be called when promiseOrValue is + * @param {function?} [onRejected] callback to be called when promiseOrValue is * rejected. - * @param {Function} [progressHandler] callback to be called when progress updates + * @param {function?} [onProgress] callback to be called when progress updates * are issued for promiseOrValue. * @returns {Promise} a new {@link Promise} that will complete with the return * value of callback or errback or the completion value of promiseOrValue if * callback and/or errback is not supplied. */ - function when(promiseOrValue, callback, errback, progressHandler) { + function when(promiseOrValue, onFulfilled, onRejected, onProgress) { // Get a trusted promise for the input promiseOrValue, and then // register promise handlers - return resolve(promiseOrValue).then(callback, errback, progressHandler); + return resolve(promiseOrValue).then(onFulfilled, onRejected, onProgress); } /** * Returns promiseOrValue if promiseOrValue is a {@link Promise}, a new Promise if * promiseOrValue is a foreign promise, or a new, already-fulfilled {@link Promise} * whose value is promiseOrValue if promiseOrValue is an immediate value. - * @memberOf when * - * @param promiseOrValue {*} - * @returns Guaranteed to return a trusted Promise. If promiseOrValue is a when.js {@link Promise} - * returns promiseOrValue, otherwise, returns a new, already-resolved, when.js {@link Promise} - * whose resolution value is: + * @param {*} promiseOrValue + * @returns {Promise} Guaranteed to return a trusted Promise. If promiseOrValue + * is trusted, returns promiseOrValue, otherwise, returns a new, already-resolved + * when.js promise whose resolution value is: * * the resolution value of promiseOrValue if it's a foreign promise, or * * promiseOrValue if it's a value */ function resolve(promiseOrValue) { - var promise, deferred; + var promise; if(promiseOrValue instanceof Promise) { // It's a when.js promise, so we trust it promise = promiseOrValue; + } else if(isPromise(promiseOrValue)) { + // Assimilate foreign promises + promise = assimilate(promiseOrValue); } else { - // It's not a when.js promise. See if it's a foreign promise or a value. - - // Some promises, particularly Q promises, provide a valueOf method that - // attempts to synchronously return the fulfilled value of the promise, or - // returns the unresolved promise itself. Attempting to break a fulfillment - // value out of a promise appears to be necessary to break cycles between - // Q and When attempting to coerce each-other's promises in an infinite loop. - // For promises that do not implement "valueOf", the Object#valueOf is harmless. - // See: https://github.com/kriskowal/q/issues/106 - // IMPORTANT: Must check for a promise here, since valueOf breaks other things - // like Date. - if (isPromise(promiseOrValue) && typeof promiseOrValue.valueOf === 'function') { - promiseOrValue = promiseOrValue.valueOf(); - } - - if(isPromise(promiseOrValue)) { - // It looks like a thenable, but we don't know where it came from, - // so we don't trust its implementation entirely. Introduce a trusted - // middleman when.js promise - deferred = defer(); - - // IMPORTANT: This is the only place when.js should ever call .then() on - // an untrusted promise. - promiseOrValue.then(deferred.resolve, deferred.reject, deferred.progress); - promise = deferred.promise; - - } else { - // It's a value, not a promise. Create a resolved promise for it. - promise = fulfilled(promiseOrValue); - } + // It's a value, create a fulfilled promise for it. + promise = fulfilled(promiseOrValue); } return promise; } /** - * Returns a rejected promise for the supplied promiseOrValue. If - * promiseOrValue is a value, it will be the rejection value of the - * returned promise. If promiseOrValue is a promise, its - * completion value will be the rejected value of the returned promise - * @memberOf when + * Assimilate an untrusted thenable by introducing a trusted middle man. + * Not a perfect strategy, but possibly the best we can do. + * IMPORTANT: This is the only place when.js should ever call an untrusted + * thenable's then() on an. Don't expose the return value to the untrusted thenable * - * @param promiseOrValue {*} the rejected value of the returned {@link Promise} + * @param {*} thenable + * @param {function} thenable.then + * @returns {Promise} + */ + function assimilate(thenable) { + var d = defer(); + + // TODO: Enqueue this for future execution in 2.0 + try { + thenable.then( + function(value) { d.resolve(value); }, + function(reason) { d.reject(reason); }, + function(update) { d.progress(update); } + ); + } catch(e) { + d.reject(e); + } + + return d.promise; + } + + /** + * Returns a rejected promise for the supplied promiseOrValue. The returned + * promise will be rejected with: + * - promiseOrValue, if it is a value, or + * - if promiseOrValue is a promise + * - promiseOrValue's value after it is fulfilled + * - promiseOrValue's reason after it is rejected + * @param {*} promiseOrValue the rejected value of the returned {@link Promise} * @return {Promise} rejected {@link Promise} */ function reject(promiseOrValue) { - return when(promiseOrValue, function(value) { - return rejected(value); - }); + return when(promiseOrValue, rejected); } /** @@ -311,25 +310,53 @@ define(['module'], function () { Promise.prototype = { /** * Register a callback that will be called when a promise is - * resolved or rejected. Optionally also register a progress handler. - * Shortcut for .then(alwaysback, alwaysback, progback) - * @memberOf Promise - * @param alwaysback {Function} - * @param progback {Function} + * fulfilled or rejected. Optionally also register a progress handler. + * Shortcut for .then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress) + * @param {function?} [onFulfilledOrRejected] + * @param {function?} [onProgress] * @return {Promise} */ - always: function(alwaysback, progback) { - return this.then(alwaysback, alwaysback, progback); + always: function(onFulfilledOrRejected, onProgress) { + return this.then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress); }, /** - * Register a rejection handler. Shortcut for .then(null, errback) - * @memberOf Promise - * @param errback {Function} + * Register a rejection handler. Shortcut for .then(undefined, onRejected) + * @param {function?} onRejected * @return {Promise} */ - otherwise: function(errback) { - return this.then(undef, errback); + otherwise: function(onRejected) { + return this.then(undef, onRejected); + }, + + /** + * Shortcut for .then(function() { return value; }) + * @param {*} value + * @return {Promise} a promise that: + * - is fulfilled if value is not a promise, or + * - if value is a promise, will fulfill with its value, or reject + * with its reason. + */ + 'yield': function(value) { + return this.then(function() { + return value; + }); + }, + + /** + * Assumes that this promise will fulfill with an array, and arranges + * for the onFulfilled to be called with the array as its argument list + * i.e. onFulfilled.apply(undefined, array). + * @param {function} onFulfilled function to receive spread arguments + * @return {Promise} + */ + spread: function(onFulfilled) { + return this.then(function(array) { + // array may contain promises, so resolve its contents. + return all(array, function(array) { + return onFulfilled.apply(undef, array); + }); + }); } }; @@ -337,13 +364,13 @@ define(['module'], function () { * Create an already-resolved promise for the supplied value * @private * - * @param value anything - * @return {Promise} + * @param {*} value + * @return {Promise} fulfilled promise */ function fulfilled(value) { - var p = new Promise(function(callback) { + var p = new Promise(function(onFulfilled) { try { - return resolve(callback ? callback(value) : value); + return resolve(typeof onFulfilled == 'function' ? onFulfilled(value) : value); } catch(e) { return rejected(e); } @@ -357,13 +384,13 @@ define(['module'], function () { * rejection reason. * @private * - * @param reason rejection reason - * @return {Promise} + * @param {*} reason + * @return {Promise} rejected promise */ function rejected(reason) { - var p = new Promise(function(callback, errback) { + var p = new Promise(function(_, onRejected) { try { - return errback ? resolve(errback(reason)) : rejected(reason); + return resolve(typeof onRejected == 'function' ? onRejected(reason) : rejected(reason)); } catch(e) { return rejected(e); } @@ -378,14 +405,12 @@ define(['module'], function () { * The Deferred itself has the full API: resolve, reject, progress, and * then. The resolver has resolve, reject, and progress. The promise * only has then. - * @memberOf when - * @function * * @return {Deferred} */ function defer() { var deferred, promise, handlers, progressHandlers, - _then, _progress, _resolve; + _then, _notify, _resolve; /** * The promise for the new deferred @@ -399,18 +424,19 @@ define(['module'], function () { * @name Deferred */ deferred = { - then: then, + then: then, // DEPRECATED: use deferred.promise.then resolve: promiseResolve, reject: promiseReject, - // TODO: Consider renaming progress() to notify() - progress: promiseProgress, + progress: promiseNotify, // DEPRECATED: use deferred.notify + notify: promiseNotify, promise: promise, resolver: { resolve: promiseResolve, reject: promiseReject, - progress: promiseProgress + progress: promiseNotify, // DEPRECATED: use deferred.notify + notify: promiseNotify } }; @@ -422,29 +448,29 @@ define(['module'], function () { * functions to the registered listeners * @private * - * @param [callback] {Function} resolution handler - * @param [errback] {Function} rejection handler - * @param [progback] {Function} progress handler - * @throws {Error} if any argument is not null, undefined, or a Function + * @param {function?} [onFulfilled] resolution handler + * @param {function?} [onRejected] rejection handler + * @param {function?} [onProgress] progress handler */ - _then = function(callback, errback, progback) { + _then = function(onFulfilled, onRejected, onProgress) { var deferred, progressHandler; deferred = defer(); - progressHandler = progback + + progressHandler = typeof onProgress === 'function' ? function(update) { try { // Allow progress handler to transform progress event - deferred.progress(progback(update)); + deferred.notify(onProgress(update)); } catch(e) { // Use caught value as progress - deferred.progress(e); + deferred.notify(e); } } - : deferred.progress; + : function(update) { deferred.notify(update); }; handlers.push(function(promise) { - promise.then(callback, errback) + promise.then(onFulfilled, onRejected) .then(deferred.resolve, deferred.reject, progressHandler); }); @@ -456,9 +482,9 @@ define(['module'], function () { /** * Issue a progress event, notifying all progress listeners * @private - * @param update {*} progress event payload to pass to all listeners + * @param {*} update progress event payload to pass to all listeners */ - _progress = function(update) { + _notify = function(update) { processQueue(progressHandlers, update); return update; }; @@ -467,61 +493,58 @@ define(['module'], function () { * Transition from pre-resolution state to post-resolution state, notifying * all listeners of the resolution or rejection * @private - * @param completed {Promise} the completed value of this deferred + * @param {*} value the value of this deferred */ - _resolve = function(completed) { - completed = resolve(completed); - + _resolve = function(value) { // Replace _then with one that directly notifies with the result. - _then = completed.then; - // Replace _resolve so that this Deferred can only be completed once + _then = value.then; + // Replace _resolve so that this Deferred can only be resolved once _resolve = resolve; // Make _progress a noop, to disallow progress for the resolved promise. - _progress = noop; + _notify = identity; // Notify handlers - processQueue(handlers, completed); + processQueue(handlers, value); // Free progressHandlers array since we'll never issue progress events progressHandlers = handlers = undef; - return completed; + return value; }; return deferred; /** * Wrapper to allow _then to be replaced safely - * @param [callback] {Function} resolution handler - * @param [errback] {Function} rejection handler - * @param [progback] {Function} progress handler - * @return {Promise} new Promise - * @throws {Error} if any argument is not null, undefined, or a Function + * @param {function?} [onFulfilled] resolution handler + * @param {function?} [onRejected] rejection handler + * @param {function?} [onProgress] progress handler + * @return {Promise} new promise */ - function then(callback, errback, progback) { - return _then(callback, errback, progback); + function then(onFulfilled, onRejected, onProgress) { + // TODO: Promises/A+ check typeof onFulfilled, onRejected, onProgress + return _then(onFulfilled, onRejected, onProgress); } /** * Wrapper to allow _resolve to be replaced */ function promiseResolve(val) { - return _resolve(val); + return _resolve(resolve(val)); } /** - * Wrapper to allow _resolve to be replaced + * Wrapper to allow _reject to be replaced */ function promiseReject(err) { return _resolve(rejected(err)); } /** - * Wrapper to allow _progress to be replaced - * @param {*} update progress update + * Wrapper to allow _notify to be replaced */ - function promiseProgress(update) { - return _progress(update); + function promiseNotify(update) { + return _notify(update); } } @@ -531,7 +554,7 @@ define(['module'], function () { * promiseOrValue is a promise. * * @param {*} promiseOrValue anything - * @returns {Boolean} true if promiseOrValue is a {@link Promise} + * @returns {boolean} true if promiseOrValue is a {@link Promise} */ function isPromise(promiseOrValue) { return promiseOrValue && typeof promiseOrValue.then === 'function'; @@ -542,25 +565,24 @@ define(['module'], function () { * howMany of the supplied promisesOrValues have resolved, or will reject when * it becomes impossible for howMany to resolve, for example, when * (promisesOrValues.length - howMany) + 1 input promises reject. - * @memberOf when * - * @param promisesOrValues {Array} array of anything, may contain a mix - * of {@link Promise}s and values - * @param howMany {Number} number of promisesOrValues to resolve - * @param [callback] {Function} resolution handler - * @param [errback] {Function} rejection handler - * @param [progback] {Function} progress handler + * @param {Array} promisesOrValues array of anything, may contain a mix + * of promises and values + * @param howMany {number} number of promisesOrValues to resolve + * @param {function?} [onFulfilled] resolution handler + * @param {function?} [onRejected] rejection handler + * @param {function?} [onProgress] progress handler * @returns {Promise} promise that will resolve to an array of howMany values that * resolved first, or will reject with an array of (promisesOrValues.length - howMany) + 1 * rejection reasons. */ - function some(promisesOrValues, howMany, callback, errback, progback) { + function some(promisesOrValues, howMany, onFulfilled, onRejected, onProgress) { checkCallbacks(2, arguments); return when(promisesOrValues, function(promisesOrValues) { - var toResolve, toReject, values, reasons, deferred, fulfillOne, rejectOne, progress, len, i; + var toResolve, toReject, values, reasons, deferred, fulfillOne, rejectOne, notify, len, i; len = promisesOrValues.length >>> 0; @@ -577,7 +599,7 @@ define(['module'], function () { deferred.resolve(values); } else { - progress = deferred.progress; + notify = deferred.notify; rejectOne = function(reason) { reasons.push(reason); @@ -601,12 +623,12 @@ define(['module'], function () { for(i = 0; i < len; ++i) { if(i in promisesOrValues) { - when(promisesOrValues[i], fulfiller, rejecter, progress); + when(promisesOrValues[i], fulfiller, rejecter, notify); } } } - return deferred.then(callback, errback, progback); + return deferred.promise.then(onFulfilled, onRejected, onProgress); function rejecter(reason) { rejectOne(reason); @@ -623,23 +645,22 @@ define(['module'], function () { * Initiates a competitive race, returning a promise that will resolve when * any one of the supplied promisesOrValues has resolved or will reject when * *all* promisesOrValues have rejected. - * @memberOf when * - * @param promisesOrValues {Array|Promise} array of anything, may contain a mix + * @param {Array|Promise} promisesOrValues array of anything, may contain a mix * of {@link Promise}s and values - * @param [callback] {Function} resolution handler - * @param [errback] {Function} rejection handler - * @param [progback] {Function} progress handler + * @param {function?} [onFulfilled] resolution handler + * @param {function?} [onRejected] rejection handler + * @param {function?} [onProgress] progress handler * @returns {Promise} promise that will resolve to the value that resolved first, or * will reject with an array of all rejected inputs. */ - function any(promisesOrValues, callback, errback, progback) { + function any(promisesOrValues, onFulfilled, onRejected, onProgress) { function unwrapSingleResult(val) { - return callback ? callback(val[0]) : val[0]; + return onFulfilled ? onFulfilled(val[0]) : val[0]; } - return some(promisesOrValues, 1, unwrapSingleResult, errback, progback); + return some(promisesOrValues, 1, unwrapSingleResult, onRejected, onProgress); } /** @@ -648,22 +669,20 @@ define(['module'], function () { * containing the resolution values of each of the promisesOrValues. * @memberOf when * - * @param promisesOrValues {Array|Promise} array of anything, may contain a mix + * @param {Array|Promise} promisesOrValues array of anything, may contain a mix * of {@link Promise}s and values - * @param [callback] {Function} - * @param [errback] {Function} - * @param [progressHandler] {Function} + * @param {function?} [onFulfilled] resolution handler + * @param {function?} [onRejected] rejection handler + * @param {function?} [onProgress] progress handler * @returns {Promise} */ - function all(promisesOrValues, callback, errback, progressHandler) { + function all(promisesOrValues, onFulfilled, onRejected, onProgress) { checkCallbacks(1, arguments); - return map(promisesOrValues, identity).then(callback, errback, progressHandler); + return map(promisesOrValues, identity).then(onFulfilled, onRejected, onProgress); } /** * Joins multiple promises into a single returned promise. - * @memberOf when - * @param {Promise|*} [...promises] two or more promises to join * @return {Promise} a promise that will fulfill when *all* the input promises * have fulfilled, or will reject when *any one* of the input promises rejects. */ @@ -676,18 +695,16 @@ define(['module'], function () { * input to contain {@link Promise}s and/or values, and mapFunc may return * either a value or a {@link Promise} * - * @memberOf when - * - * @param promise {Array|Promise} array of anything, may contain a mix + * @param {Array|Promise} promise array of anything, may contain a mix * of {@link Promise}s and values - * @param mapFunc {Function} mapping function mapFunc(value) which may return + * @param {function} mapFunc mapping function mapFunc(value) which may return * either a {@link Promise} or value * @returns {Promise} a {@link Promise} that will resolve to an array containing * the mapped output values. */ function map(promise, mapFunc) { return when(promise, function(array) { - var results, len, toResolve, resolve, reject, i, d; + var results, len, toResolve, resolve, i, d; // Since we know the resulting length, we can preallocate the results // array to avoid array expansions. @@ -699,7 +716,6 @@ define(['module'], function () { d.resolve(results); } else { - reject = d.reject; resolve = function resolveOne(item, i) { when(item, mapFunc).then(function(mapped) { results[i] = mapped; @@ -707,7 +723,7 @@ define(['module'], function () { if(!--toResolve) { d.resolve(results); } - }, reject); + }, d.reject); }; // Since mapFunc may be async, get all invocations of it into flight @@ -728,18 +744,15 @@ define(['module'], function () { /** * Traditional reduce function, similar to `Array.prototype.reduce()`, but - * input may contain {@link Promise}s and/or values, and reduceFunc - * may return either a value or a {@link Promise}, *and* initialValue may - * be a {@link Promise} for the starting value. - * @memberOf when + * input may contain promises and/or values, and reduceFunc + * may return either a value or a promise, *and* initialValue may + * be a promise for the starting value. * - * @param promise {Array|Promise} array of anything, may contain a mix - * of {@link Promise}s and values. May also be a {@link Promise} for - * an array. - * @param reduceFunc {Function} reduce function reduce(currentValue, nextValue, index, total), + * @param {Array|Promise} promise array or promise for an array of anything, + * may contain a mix of promises and values. + * @param {function} reduceFunc reduce function reduce(currentValue, nextValue, index, total), * where total is the total number of items being reduced, and will be the same * in each call to reduceFunc. - * @param [initialValue] {*} starting value, or a {@link Promise} for the starting value * @returns {Promise} that will resolve to the final reduced value */ function reduce(promise, reduceFunc /*, initialValue */) { @@ -765,13 +778,14 @@ define(['module'], function () { } /** - * Ensure that resolution of promiseOrValue will complete resolver with the completion - * value of promiseOrValue, or instead with resolveValue if it is provided. - * @memberOf when + * Ensure that resolution of promiseOrValue will trigger resolver with the + * value or reason of promiseOrValue, or instead with resolveValue if it is provided. * * @param promiseOrValue - * @param resolver {Resolver} - * @param [resolveValue] anything + * @param {Object} resolver + * @param {function} resolver.resolve + * @param {function} resolver.reject + * @param {*} [resolveValue] * @returns {Promise} */ function chain(promiseOrValue, resolver, resolveValue) { @@ -779,10 +793,18 @@ define(['module'], function () { return when(promiseOrValue, function(val) { - return resolver.resolve(useResolveValue ? resolveValue : val); + val = useResolveValue ? resolveValue : val; + resolver.resolve(val); + return val; }, - resolver.reject, - resolver.progress + function(reason) { + resolver.reject(reason); + return rejected(reason); + }, + function(update) { + typeof resolver.notify === 'function' && resolver.notify(update); + return update; + } ); } @@ -790,6 +812,11 @@ define(['module'], function () { // Utility functions // + /** + * Apply all functions in queue to value + * @param {Array} queue array of functions to execute + * @param {*} value argument passed to each function + */ function processQueue(queue, value) { var handler, i = 0; @@ -802,12 +829,13 @@ define(['module'], function () { * Helper that checks arrayOfCallbacks to ensure that each element is either * a function, or null or undefined. * @private - * - * @param arrayOfCallbacks {Array} array to check + * @param {number} start index at which to start checking items in arrayOfCallbacks + * @param {Array} arrayOfCallbacks array to check * @throws {Error} if any element of arrayOfCallbacks is something other than - * a Functions, null, or undefined. + * a functions, null, or undefined. */ function checkCallbacks(start, arrayOfCallbacks) { + // TODO: Promises/A+ update type checking and docs var arg, i = arrayOfCallbacks.length; while(i > start) { @@ -889,7 +917,7 @@ define(['module'], function () { }); })(typeof define == 'function' && define.amd ? define - : function (deps, factory) { typeof exports === 'object' + : function (factory) { typeof exports === 'object' ? (module.exports = factory()) : (this.when = factory()); } diff --git a/mopidy/frontends/http/data/mopidy.min.js b/mopidy/frontends/http/data/mopidy.min.js index 7bb82336..fd8a0baf 100644 --- a/mopidy/frontends/http/data/mopidy.min.js +++ b/mopidy/frontends/http/data/mopidy.min.js @@ -2,4 +2,4 @@ * http://www.mopidy.com/ * Copyright (c) 2013 Stein Magnus Jodal and contributors * Licensed under the Apache License, Version 2.0 */ -function Mopidy(e){return this instanceof Mopidy?(this._settings=this._configure(e||{}),this._console=this._getConsole(),this._backoffDelay=this._settings.backoffDelayMin,this._pendingRequests={},this._webSocket=null,bane.createEventEmitter(this),this._delegateEvents(),this._settings.autoConnect&&this.connect(),void 0):new Mopidy(e)}("function"==typeof define&&define.amd&&function(e){define(e)}||"object"==typeof module&&function(e){module.exports=e()}||function(e){this.bane=e()})(function(){"use strict";function e(e,t,n){var o,r=n.length;if(r>0)for(o=0;r>o;++o)n[o](e,t);else setTimeout(function(){throw t.message=e+" listener threw error: "+t.message,t},0)}function t(e){if("function"!=typeof e)throw new TypeError("Listener is not function");return e}function n(e){return e.supervisors||(e.supervisors=[]),e.supervisors}function o(e,t){return e.listeners||(e.listeners={}),t&&!e.listeners[t]&&(e.listeners[t]=[]),t?e.listeners[t]:e.listeners}function r(e){return e.errbacks||(e.errbacks=[]),e.errbacks}function i(i){function c(t,n,o){try{n.listener.apply(n.thisp||i,o)}catch(s){e(t,s,r(i))}}return i=i||{},i.on=function(e,r,i){return"function"==typeof e?n(this).push({listener:e,thisp:r}):(o(this,e).push({listener:t(r),thisp:i}),void 0)},i.off=function(e,t){var i,s,c,u;if(!e){i=n(this),i.splice(0,i.length),s=o(this);for(c in s)s.hasOwnProperty(c)&&(i=o(this,c),i.splice(0,i.length));return i=r(this),i.splice(0,i.length),void 0}if("function"==typeof e?(i=n(this),t=e):i=o(this,e),!t)return i.splice(0,i.length),void 0;for(c=0,u=i.length;u>c;++c)if(i[c].listener===t)return i.splice(c,1),void 0},i.once=function(e,t,n){var o=function(){i.off(e,o),t.apply(this,arguments)};i.on(e,o,n)},i.bind=function(e,t){var n,o,r;if(t)for(o=0,r=t.length;r>o;++o){if("function"!=typeof e[t[o]])throw Error("No such method "+t[o]);this.on(t[o],e[t[o]],e)}else for(n in e)"function"==typeof e[n]&&this.on(n,e[n],e);return e},i.emit=function(e){var t,r,i=n(this),u=s.call(arguments);for(t=0,r=i.length;r>t;++t)c(e,i[t],u);for(i=o(this,e).slice(),u=s.call(arguments,1),t=0,r=i.length;r>t;++t)c(e,i[t],u)},i.errback=function(e){this.errbacks||(this.errbacks=[]),this.errbacks.push(t(e))},i}var s=Array.prototype.slice;return{createEventEmitter:i}}),function(e){"use strict";e(["module"],function(){function e(e,n,o,r){return t(e).then(n,o,r)}function t(e){var t,n;return e instanceof o?t=e:(c(e)&&"function"==typeof e.valueOf&&(e=e.valueOf()),c(e)?(n=s(),e.then(n.resolve,n.reject,n.progress),t=n.promise):t=r(e)),t}function n(t){return e(t,function(e){return i(e)})}function o(e){this.then=e}function r(e){var n=new o(function(n){try{return t(n?n(e):e)}catch(o){return i(o)}});return n}function i(e){var n=new o(function(n,o){try{return o?t(o(e)):i(e)}catch(r){return i(r)}});return n}function s(){function e(e,t,n){return l(e,t,n)}function n(e){return d(e)}function r(e){return d(i(e))}function c(e){return p(e)}var u,f,a,h,l,p,d;return f=new o(e),u={then:e,resolve:n,reject:r,progress:c,promise:f,resolver:{resolve:n,reject:r,progress:c}},a=[],h=[],l=function(e,t,n){var o,r;return o=s(),r=n?function(e){try{o.progress(n(e))}catch(t){o.progress(t)}}:o.progress,a.push(function(n){n.then(e,t).then(o.resolve,o.reject,r)}),h.push(r),o.promise},p=function(e){return y(h,e),e},d=function(e){return e=t(e),l=e.then,d=t,p=g,y(a,e),h=a=w,e},u}function c(e){return e&&"function"==typeof e.then}function u(t,n,o,r,i){return b(2,arguments),e(t,function(t){function c(e){y(e)}function u(e){d(e)}var f,a,h,l,p,d,y,b,k,_;if(k=t.length>>>0,f=Math.max(0,Math.min(n,k)),h=[],a=k-f+1,l=[],p=s(),f)for(b=p.progress,y=function(e){l.push(e),--a||(d=y=g,p.reject(l))},d=function(e){h.push(e),--f||(d=y=g,p.resolve(h))},_=0;k>_;++_)_ in t&&e(t[_],u,c,b);else p.resolve(h);return p.then(o,r,i)})}function f(e,t,n,o){function r(e){return t?t(e[0]):e[0]}return u(e,1,r,n,o)}function a(e,t,n,o){return b(1,arguments),l(e,k).then(t,n,o)}function h(){return l(arguments,k)}function l(t,n){return e(t,function(t){var o,r,i,c,u,f,a;if(i=r=t.length>>>0,o=[],a=s(),i)for(u=a.reject,c=function(t,r){e(t,n).then(function(e){o[r]=e,--i||a.resolve(o)},u)},f=0;r>f;f++)f in t?c(t[f],f):--i;else a.resolve(o);return a.promise})}function p(t,n){var o=v.call(arguments,1);return e(t,function(t){var r;return r=t.length,o[0]=function(t,o,i){return e(t,function(t){return e(o,function(e){return n(t,e,i,r)})})},_.apply(t,o)})}function d(t,n,o){var r=arguments.length>2;return e(t,function(e){return n.resolve(r?o:e)},n.reject,n.progress)}function y(e,t){for(var n,o=0;n=e[o++];)n(t)}function b(e,t){for(var n,o=t.length;o>e;)if(n=t[--o],null!=n&&"function"!=typeof n)throw Error("arg "+o+" must be a function")}function g(){}function k(e){return e}var _,v,w;return e.defer=s,e.resolve=t,e.reject=n,e.join=h,e.all=a,e.some=u,e.any=f,e.map=l,e.reduce=p,e.chain=d,e.isPromise=c,o.prototype={always:function(e,t){return this.then(e,e,t)},otherwise:function(e){return this.then(w,e)}},v=[].slice,_=[].reduce||function(e){var t,n,o,r,i;if(i=0,t=Object(this),r=t.length>>>0,n=arguments,1>=n.length)for(;;){if(i in t){o=t[i++];break}if(++i>=r)throw new TypeError}else o=n[1];for(;r>i;++i)i in t&&(o=e(o,t[i],i,t));return o},e})}("function"==typeof define&&define.amd?define:function(e,t){"object"==typeof exports?module.exports=t():this.when=t()}),Mopidy.prototype._configure=function(e){return e.webSocketUrl=e.webSocketUrl||"ws://"+document.location.host+"/mopidy/ws/",e.autoConnect!==!1&&(e.autoConnect=!0),e.backoffDelayMin=e.backoffDelayMin||1e3,e.backoffDelayMax=e.backoffDelayMax||64e3,e},Mopidy.prototype._getConsole=function(){var e=window.console||{};return e.log=e.log||function(){},e.warn=e.warn||function(){},e.error=e.error||function(){},e},Mopidy.prototype._delegateEvents=function(){this.off("websocket:close"),this.off("websocket:error"),this.off("websocket:incomingMessage"),this.off("websocket:open"),this.off("state:offline"),this.on("websocket:close",this._cleanup),this.on("websocket:error",this._handleWebSocketError),this.on("websocket:incomingMessage",this._handleMessage),this.on("websocket:open",this._resetBackoffDelay),this.on("websocket:open",this._getApiSpec),this.on("state:offline",this._reconnect)},Mopidy.prototype.connect=function(){if(this._webSocket){if(this._webSocket.readyState===WebSocket.OPEN)return;this._webSocket.close()}this._webSocket=this._settings.webSocket||new WebSocket(this._settings.webSocketUrl),this._webSocket.onclose=function(e){this.emit("websocket:close",e)}.bind(this),this._webSocket.onerror=function(e){this.emit("websocket:error",e)}.bind(this),this._webSocket.onopen=function(){this.emit("websocket:open")}.bind(this),this._webSocket.onmessage=function(e){this.emit("websocket:incomingMessage",e)}.bind(this)},Mopidy.prototype._cleanup=function(e){Object.keys(this._pendingRequests).forEach(function(t){var n=this._pendingRequests[t];delete this._pendingRequests[t],n.reject({message:"WebSocket closed",closeEvent:e})}.bind(this)),this.emit("state:offline")},Mopidy.prototype._reconnect=function(){this.emit("reconnectionPending",{timeToAttempt:this._backoffDelay}),setTimeout(function(){this.emit("reconnecting"),this.connect()}.bind(this),this._backoffDelay),this._backoffDelay=2*this._backoffDelay,this._backoffDelay>this._settings.backoffDelayMax&&(this._backoffDelay=this._settings.backoffDelayMax)},Mopidy.prototype._resetBackoffDelay=function(){this._backoffDelay=this._settings.backoffDelayMin},Mopidy.prototype.close=function(){this.off("state:offline",this._reconnect),this._webSocket.close()},Mopidy.prototype._handleWebSocketError=function(e){this._console.warn("WebSocket error:",e.stack||e)},Mopidy.prototype._send=function(e){var t=when.defer();switch(this._webSocket.readyState){case WebSocket.CONNECTING:t.resolver.reject({message:"WebSocket is still connecting"});break;case WebSocket.CLOSING:t.resolver.reject({message:"WebSocket is closing"});break;case WebSocket.CLOSED:t.resolver.reject({message:"WebSocket is closed"});break;default:e.jsonrpc="2.0",e.id=this._nextRequestId(),this._pendingRequests[e.id]=t.resolver,this._webSocket.send(JSON.stringify(e)),this.emit("websocket:outgoingMessage",e)}return t.promise},Mopidy.prototype._nextRequestId=function(){var e=-1;return function(){return e+=1}}(),Mopidy.prototype._handleMessage=function(e){try{var t=JSON.parse(e.data);t.hasOwnProperty("id")?this._handleResponse(t):t.hasOwnProperty("event")?this._handleEvent(t):this._console.warn("Unknown message type received. Message was: "+e.data)}catch(n){if(!(n instanceof SyntaxError))throw n;this._console.warn("WebSocket message parsing failed. Message was: "+e.data)}},Mopidy.prototype._handleResponse=function(e){if(!this._pendingRequests.hasOwnProperty(e.id))return this._console.warn("Unexpected response received. Message was:",e),void 0;var t=this._pendingRequests[e.id];delete this._pendingRequests[e.id],e.hasOwnProperty("result")?t.resolve(e.result):e.hasOwnProperty("error")?(t.reject(e.error),this._console.warn("Server returned error:",e.error)):(t.reject({message:"Response without 'result' or 'error' received",data:{response:e}}),this._console.warn("Response without 'result' or 'error' received. Message was:",e))},Mopidy.prototype._handleEvent=function(e){var t=e.event,n=e;delete n.event,this.emit("event:"+this._snakeToCamel(t),n)},Mopidy.prototype._getApiSpec=function(){this._send({method:"core.describe"}).then(this._createApi.bind(this),this._handleWebSocketError).then(null,this._handleWebSocketError)},Mopidy.prototype._createApi=function(e){var t=function(e){return function(){var t=Array.prototype.slice.call(arguments);return this._send({method:e,params:t})}.bind(this)}.bind(this),n=function(e){var t=e.split(".");return t.length>=1&&"core"===t[0]&&(t=t.slice(1)),t},o=function(e){var t=this;return e.forEach(function(e){e=this._snakeToCamel(e),t[e]=t[e]||{},t=t[e]}.bind(this)),t}.bind(this),r=function(r){var i=n(r),s=this._snakeToCamel(i.slice(-1)[0]),c=o(i.slice(0,-1));c[s]=t(r),c[s].description=e[r].description,c[s].params=e[r].params}.bind(this);Object.keys(e).forEach(r),this.emit("state:online")},Mopidy.prototype._snakeToCamel=function(e){return e.replace(/(_[a-z])/g,function(e){return e.toUpperCase().replace("_","")})}; \ No newline at end of file +function Mopidy(e){return this instanceof Mopidy?(this._settings=this._configure(e||{}),this._console=this._getConsole(),this._backoffDelay=this._settings.backoffDelayMin,this._pendingRequests={},this._webSocket=null,bane.createEventEmitter(this),this._delegateEvents(),this._settings.autoConnect&&this.connect(),void 0):new Mopidy(e)}("function"==typeof define&&define.amd&&function(e){define(e)}||"object"==typeof module&&function(e){module.exports=e()}||function(e){this.bane=e()})(function(){"use strict";function e(e,t,n){var o,r=n.length;if(r>0)for(o=0;r>o;++o)n[o](e,t);else setTimeout(function(){throw t.message=e+" listener threw error: "+t.message,t},0)}function t(e){if("function"!=typeof e)throw new TypeError("Listener is not function");return e}function n(e){return e.supervisors||(e.supervisors=[]),e.supervisors}function o(e,t){return e.listeners||(e.listeners={}),t&&!e.listeners[t]&&(e.listeners[t]=[]),t?e.listeners[t]:e.listeners}function r(e){return e.errbacks||(e.errbacks=[]),e.errbacks}function i(i){function c(t,n,o){try{n.listener.apply(n.thisp||i,o)}catch(s){e(t,s,r(i))}}return i=i||{},i.on=function(e,r,i){return"function"==typeof e?n(this).push({listener:e,thisp:r}):(o(this,e).push({listener:t(r),thisp:i}),void 0)},i.off=function(e,t){var i,s,c,f;if(!e){i=n(this),i.splice(0,i.length),s=o(this);for(c in s)s.hasOwnProperty(c)&&(i=o(this,c),i.splice(0,i.length));return i=r(this),i.splice(0,i.length),void 0}if("function"==typeof e?(i=n(this),t=e):i=o(this,e),!t)return i.splice(0,i.length),void 0;for(c=0,f=i.length;f>c;++c)if(i[c].listener===t)return i.splice(c,1),void 0},i.once=function(e,t,n){var o=function(){i.off(e,o),t.apply(this,arguments)};i.on(e,o,n)},i.bind=function(e,t){var n,o,r;if(t)for(o=0,r=t.length;r>o;++o){if("function"!=typeof e[t[o]])throw Error("No such method "+t[o]);this.on(t[o],e[t[o]],e)}else for(n in e)"function"==typeof e[n]&&this.on(n,e[n],e);return e},i.emit=function(e){var t,r,i=n(this),f=s.call(arguments);for(t=0,r=i.length;r>t;++t)c(e,i[t],f);for(i=o(this,e).slice(),f=s.call(arguments,1),t=0,r=i.length;r>t;++t)c(e,i[t],f)},i.errback=function(e){this.errbacks||(this.errbacks=[]),this.errbacks.push(t(e))},i}var s=Array.prototype.slice;return{createEventEmitter:i}}),function(e){"use strict";e(function(){function e(e,n,o,r){return t(e).then(n,o,r)}function t(e){var t;return t=e instanceof r?e:f(e)?n(e):i(e)}function n(e){var t=c();try{e.then(function(e){t.resolve(e)},function(e){t.reject(e)},function(e){t.progress(e)})}catch(n){t.reject(n)}return t.promise}function o(t){return e(t,s)}function r(e){this.then=e}function i(e){var n=new r(function(n){try{return t("function"==typeof n?n(e):e)}catch(o){return s(o)}});return n}function s(e){var n=new r(function(n,o){try{return t("function"==typeof o?o(e):s(e))}catch(r){return s(r)}});return n}function c(){function e(e,t,n){return l(e,t,n)}function n(e){return d(t(e))}function o(e){return d(s(e))}function i(e){return p(e)}var f,u,a,h,l,p,d;return u=new r(e),f={then:e,resolve:n,reject:o,progress:i,notify:i,promise:u,resolver:{resolve:n,reject:o,progress:i,notify:i}},a=[],h=[],l=function(e,t,n){var o,r;return o=c(),r="function"==typeof n?function(e){try{o.notify(n(e))}catch(t){o.notify(t)}}:function(e){o.notify(e)},a.push(function(n){n.then(e,t).then(o.resolve,o.reject,r)}),h.push(r),o.promise},p=function(e){return b(h,e),e},d=function(e){return l=e.then,d=t,p=_,b(a,e),h=a=m,e},f}function f(e){return e&&"function"==typeof e.then}function u(t,n,o,r,i){return g(2,arguments),e(t,function(t){function s(e){y(e)}function f(e){d(e)}var u,a,h,l,p,d,y,b,g,_;if(g=t.length>>>0,u=Math.max(0,Math.min(n,g)),h=[],a=g-u+1,l=[],p=c(),u)for(b=p.notify,y=function(e){l.push(e),--a||(d=y=k,p.reject(l))},d=function(e){h.push(e),--u||(d=y=k,p.resolve(h))},_=0;g>_;++_)_ in t&&e(t[_],f,s,b);else p.resolve(h);return p.promise.then(o,r,i)})}function a(e,t,n,o){function r(e){return t?t(e[0]):e[0]}return u(e,1,r,n,o)}function h(e,t,n,o){return g(1,arguments),p(e,_).then(t,n,o)}function l(){return p(arguments,_)}function p(t,n){return e(t,function(t){var o,r,i,s,f,u;if(i=r=t.length>>>0,o=[],u=c(),i)for(s=function(t,r){e(t,n).then(function(e){o[r]=e,--i||u.resolve(o)},u.reject)},f=0;r>f;f++)f in t?s(t[f],f):--i;else u.resolve(o);return u.promise})}function d(t,n){var o=w.call(arguments,1);return e(t,function(t){var r;return r=t.length,o[0]=function(t,o,i){return e(t,function(t){return e(o,function(e){return n(t,e,i,r)})})},v.apply(t,o)})}function y(t,n,o){var r=arguments.length>2;return e(t,function(e){return e=r?o:e,n.resolve(e),e},function(e){return n.reject(e),s(e)},function(e){return"function"==typeof n.notify&&n.notify(e),e})}function b(e,t){for(var n,o=0;n=e[o++];)n(t)}function g(e,t){for(var n,o=t.length;o>e;)if(n=t[--o],null!=n&&"function"!=typeof n)throw Error("arg "+o+" must be a function")}function k(){}function _(e){return e}var v,w,m;return e.defer=c,e.resolve=t,e.reject=o,e.join=l,e.all=h,e.map=p,e.reduce=d,e.any=a,e.some=u,e.chain=y,e.isPromise=f,r.prototype={always:function(e,t){return this.then(e,e,t)},otherwise:function(e){return this.then(m,e)},yield:function(e){return this.then(function(){return e})},spread:function(e){return this.then(function(t){return h(t,function(t){return e.apply(m,t)})})}},w=[].slice,v=[].reduce||function(e){var t,n,o,r,i;if(i=0,t=Object(this),r=t.length>>>0,n=arguments,1>=n.length)for(;;){if(i in t){o=t[i++];break}if(++i>=r)throw new TypeError}else o=n[1];for(;r>i;++i)i in t&&(o=e(o,t[i],i,t));return o},e})}("function"==typeof define&&define.amd?define:function(e){"object"==typeof exports?module.exports=e():this.when=e()}),Mopidy.prototype._configure=function(e){return e.webSocketUrl=e.webSocketUrl||"ws://"+document.location.host+"/mopidy/ws/",e.autoConnect!==!1&&(e.autoConnect=!0),e.backoffDelayMin=e.backoffDelayMin||1e3,e.backoffDelayMax=e.backoffDelayMax||64e3,e},Mopidy.prototype._getConsole=function(){var e=window.console||{};return e.log=e.log||function(){},e.warn=e.warn||function(){},e.error=e.error||function(){},e},Mopidy.prototype._delegateEvents=function(){this.off("websocket:close"),this.off("websocket:error"),this.off("websocket:incomingMessage"),this.off("websocket:open"),this.off("state:offline"),this.on("websocket:close",this._cleanup),this.on("websocket:error",this._handleWebSocketError),this.on("websocket:incomingMessage",this._handleMessage),this.on("websocket:open",this._resetBackoffDelay),this.on("websocket:open",this._getApiSpec),this.on("state:offline",this._reconnect)},Mopidy.prototype.connect=function(){if(this._webSocket){if(this._webSocket.readyState===WebSocket.OPEN)return;this._webSocket.close()}this._webSocket=this._settings.webSocket||new WebSocket(this._settings.webSocketUrl),this._webSocket.onclose=function(e){this.emit("websocket:close",e)}.bind(this),this._webSocket.onerror=function(e){this.emit("websocket:error",e)}.bind(this),this._webSocket.onopen=function(){this.emit("websocket:open")}.bind(this),this._webSocket.onmessage=function(e){this.emit("websocket:incomingMessage",e)}.bind(this)},Mopidy.prototype._cleanup=function(e){Object.keys(this._pendingRequests).forEach(function(t){var n=this._pendingRequests[t];delete this._pendingRequests[t],n.reject({message:"WebSocket closed",closeEvent:e})}.bind(this)),this.emit("state:offline")},Mopidy.prototype._reconnect=function(){this.emit("reconnectionPending",{timeToAttempt:this._backoffDelay}),setTimeout(function(){this.emit("reconnecting"),this.connect()}.bind(this),this._backoffDelay),this._backoffDelay=2*this._backoffDelay,this._backoffDelay>this._settings.backoffDelayMax&&(this._backoffDelay=this._settings.backoffDelayMax)},Mopidy.prototype._resetBackoffDelay=function(){this._backoffDelay=this._settings.backoffDelayMin},Mopidy.prototype.close=function(){this.off("state:offline",this._reconnect),this._webSocket.close()},Mopidy.prototype._handleWebSocketError=function(e){this._console.warn("WebSocket error:",e.stack||e)},Mopidy.prototype._send=function(e){var t=when.defer();switch(this._webSocket.readyState){case WebSocket.CONNECTING:t.resolver.reject({message:"WebSocket is still connecting"});break;case WebSocket.CLOSING:t.resolver.reject({message:"WebSocket is closing"});break;case WebSocket.CLOSED:t.resolver.reject({message:"WebSocket is closed"});break;default:e.jsonrpc="2.0",e.id=this._nextRequestId(),this._pendingRequests[e.id]=t.resolver,this._webSocket.send(JSON.stringify(e)),this.emit("websocket:outgoingMessage",e)}return t.promise},Mopidy.prototype._nextRequestId=function(){var e=-1;return function(){return e+=1}}(),Mopidy.prototype._handleMessage=function(e){try{var t=JSON.parse(e.data);t.hasOwnProperty("id")?this._handleResponse(t):t.hasOwnProperty("event")?this._handleEvent(t):this._console.warn("Unknown message type received. Message was: "+e.data)}catch(n){if(!(n instanceof SyntaxError))throw n;this._console.warn("WebSocket message parsing failed. Message was: "+e.data)}},Mopidy.prototype._handleResponse=function(e){if(!this._pendingRequests.hasOwnProperty(e.id))return this._console.warn("Unexpected response received. Message was:",e),void 0;var t=this._pendingRequests[e.id];delete this._pendingRequests[e.id],e.hasOwnProperty("result")?t.resolve(e.result):e.hasOwnProperty("error")?(t.reject(e.error),this._console.warn("Server returned error:",e.error)):(t.reject({message:"Response without 'result' or 'error' received",data:{response:e}}),this._console.warn("Response without 'result' or 'error' received. Message was:",e))},Mopidy.prototype._handleEvent=function(e){var t=e.event,n=e;delete n.event,this.emit("event:"+this._snakeToCamel(t),n)},Mopidy.prototype._getApiSpec=function(){this._send({method:"core.describe"}).then(this._createApi.bind(this),this._handleWebSocketError).then(null,this._handleWebSocketError)},Mopidy.prototype._createApi=function(e){var t=function(e){return function(){var t=Array.prototype.slice.call(arguments);return this._send({method:e,params:t})}.bind(this)}.bind(this),n=function(e){var t=e.split(".");return t.length>=1&&"core"===t[0]&&(t=t.slice(1)),t},o=function(e){var t=this;return e.forEach(function(e){e=this._snakeToCamel(e),t[e]=t[e]||{},t=t[e]}.bind(this)),t}.bind(this),r=function(r){var i=n(r),s=this._snakeToCamel(i.slice(-1)[0]),c=o(i.slice(0,-1));c[s]=t(r),c[s].description=e[r].description,c[s].params=e[r].params}.bind(this);Object.keys(e).forEach(r),this.emit("state:online")},Mopidy.prototype._snakeToCamel=function(e){return e.replace(/(_[a-z])/g,function(e){return e.toUpperCase().replace("_","")})}; \ No newline at end of file From 02b845bd4ba6dc63d89a2abe8dc1d4a1b20a7d14 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 19 Mar 2013 23:23:14 +0100 Subject: [PATCH 090/151] Revert "Merge pull request #231 from adamcik/feature/end-of-track" This reverts commit 1cf9826f8742f798fa78c45f123fce05f42bd6cc, reversing changes made to 711dbe87384c7e7d025d541ae5f08cacb1733045. --- mopidy/audio/actor.py | 32 +++++++++-------------------- mopidy/backends/base.py | 21 +++---------------- mopidy/backends/spotify/playback.py | 25 +++++++++++++--------- mopidy/core/actor.py | 7 +------ mopidy/core/playback.py | 14 +++---------- tests/backends/base/playback.py | 16 +++++++++------ tests/backends/base/tracklist.py | 2 +- 7 files changed, 43 insertions(+), 74 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 04b0ab06..b154e21a 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -20,6 +20,7 @@ logger = logging.getLogger('mopidy.audio') mixers.register_mixers() + MB = 1 << 20 @@ -49,8 +50,6 @@ class Audio(pykka.ThreadingActor): self._software_mixing = False self._volume_set = None - self._end_of_track_callback = None - self._appsrc = None self._appsrc_caps = None self._appsrc_need_data_callback = None @@ -94,28 +93,21 @@ class Audio(pykka.ThreadingActor): self._playbin = playbin def _on_about_to_finish(self, element): - # Cleanup appsrc related stuff. - old_appsrc, self._appsrc = self._appsrc, None - - self._disconnect(old_appsrc, 'need-data') - self._disconnect(old_appsrc, 'enough-data') - self._disconnect(old_appsrc, 'seek-data') - + source, self._appsrc = self._appsrc, None + if source is None: + return self._appsrc_caps = None - # Note that we can not let this function return until we have the next - # URI set for gapless / EOS free playback. This means all the - # subsequent remote calls to backends etc. down this code path need to - # block. - if self._end_of_track_callback: - self._end_of_track_callback() + self._disconnect(source, 'need-data') + self._disconnect(source, 'enough-data') + self._disconnect(source, 'seek-data') def _on_new_source(self, element, pad): - source = element.get_property('source') - - if source.get_factory().get_name() != 'appsrc': + uri = element.get_property('uri') + if not uri or not uri.startswith('appsrc://'): return + source = element.get_property('source') source.set_property('caps', self._appsrc_caps) source.set_property('format', b'time') source.set_property('stream-type', b'seekable') @@ -288,10 +280,6 @@ class Audio(pykka.ThreadingActor): logger.debug('Triggering reached_end_of_stream event') AudioListener.send('reached_end_of_stream') - def set_on_end_of_track(self, callback): - """Set callback to be called on end of track.""" - self._end_of_track_callback = callback - def set_uri(self, uri): """ Set URI of audio to be played. diff --git a/mopidy/backends/base.py b/mopidy/backends/base.py index 2f077e49..f49aa89b 100644 --- a/mopidy/backends/base.py +++ b/mopidy/backends/base.py @@ -88,8 +88,8 @@ class BaseLibraryProvider(object): class BasePlaybackProvider(object): """ - :param audio: audio sub-system - :type audio: actor proxy to a :class:`mopidy.audio.Audio` actor. + :param audio: the audio actor + :type audio: actor proxy to an instance of :class:`mopidy.audio.Audio` :param backend: the backend :type backend: :class:`mopidy.backends.base.Backend` """ @@ -121,23 +121,8 @@ class BasePlaybackProvider(object): :rtype: :class:`True` if successful, else :class:`False` """ self.audio.prepare_change() - self.change_track(track) - return self.audio.start_playback().get() - - def change_track(self, track): - """ - Swith to provided track. - - Used for handling of EOT and and in :meth:`play`. - - *MAY be reimplemented by subclass.* - - :param track: the track to play - :type track: :class:`mopidy.models.Track` - :rtype: :class:`True` if successful, else :class:`False` - """ self.audio.set_uri(track.uri).get() - return True + return self.audio.start_playback().get() def resume(self): """ diff --git a/mopidy/backends/spotify/playback.py b/mopidy/backends/spotify/playback.py index f8de2e57..bda17634 100644 --- a/mopidy/backends/spotify/playback.py +++ b/mopidy/backends/spotify/playback.py @@ -35,9 +35,11 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): super(SpotifyPlaybackProvider, self).__init__(*args, **kwargs) self._first_seek = False - def change_track(self, track): - spotify_backend = self.backend.actor_ref.proxy() + def play(self, track): + if track.uri is None: + return False + spotify_backend = self.backend.actor_ref.proxy() need_data_callback_bound = functools.partial( need_data_callback, spotify_backend) enough_data_callback_bound = functools.partial( @@ -47,18 +49,21 @@ class SpotifyPlaybackProvider(base.BasePlaybackProvider): self._first_seek = True - self.audio.set_appsrc( - self._caps, - need_data=need_data_callback_bound, - enough_data=enough_data_callback_bound, - seek_data=seek_data_callback_bound) - self.audio.set_metadata(track) - try: self.backend.spotify.session.load( Link.from_string(track.uri).as_track()) - self.backend.spotify.buffer_timestamp = 0 self.backend.spotify.session.play(1) + self.backend.spotify.buffer_timestamp = 0 + + self.audio.prepare_change() + self.audio.set_appsrc( + self._caps, + need_data=need_data_callback_bound, + enough_data=enough_data_callback_bound, + seek_data=seek_data_callback_bound) + self.audio.start_playback() + self.audio.set_metadata(track) + return True except SpotifyError as e: logger.info('Playback of %s failed: %s', track.uri, e) diff --git a/mopidy/core/actor.py b/mopidy/core/actor.py index 03ad2712..cd4ba180 100644 --- a/mopidy/core/actor.py +++ b/mopidy/core/actor.py @@ -46,11 +46,6 @@ class Core(pykka.ThreadingActor, AudioListener, BackendListener): self.tracklist = TracklistController(core=self) - if audio: - # Hook up blocking on end of track handler to audio sub-system. - audio.set_on_end_of_track( - lambda: self.actor_ref.proxy().playback.on_end_of_track().get()) - def get_uri_schemes(self): futures = [b.uri_schemes for b in self.backends] results = pykka.get_all(futures) @@ -61,7 +56,7 @@ class Core(pykka.ThreadingActor, AudioListener, BackendListener): """List of URI schemes we can handle""" def reached_end_of_stream(self): - self.playback.on_end_of_stream() + self.playback.on_end_of_track() def state_changed(self, old_state, new_state): # XXX: This is a temporary fix for issue #232 while we wait for a more diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index 1f2e0384..21f09ad2 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -314,11 +314,6 @@ class PlaybackController(object): elif old_state == PlaybackState.PAUSED: self.pause() - def on_end_of_stream(self): - self._trigger_track_playback_ended() - self.state = PlaybackState.STOPPED - self.current_tl_track = None - def on_end_of_track(self): """ Tell the playback controller that end of track is reached. @@ -330,14 +325,11 @@ class PlaybackController(object): original_tl_track = self.current_tl_track - # As noted in mopidy.audio which calls this code, we need to make sure - # the calls to the backend are blocking or gapless / EOS free playback - # will break. if self.tl_track_at_eot: self._trigger_track_playback_ended() - self.current_tl_track = self.tl_track_at_eot - self._get_backend().playback.change_track(self.current_track).get() - self._trigger_track_playback_started() + self.play(self.tl_track_at_eot) + else: + self.stop(clear_current_track=True) if self.consume: self.core.tracklist.remove(tlid=original_tl_track.tlid) diff --git a/tests/backends/base/playback.py b/tests/backends/base/playback.py index d7979018..e12d54a5 100644 --- a/tests/backends/base/playback.py +++ b/tests/backends/base/playback.py @@ -115,7 +115,6 @@ class PlaybackControllerTest(object): def test_current_track_after_completed_playlist(self): self.playback.play(self.tracklist.tl_tracks[-1]) self.playback.on_end_of_track() - self.playback.on_end_of_stream() self.assertEqual(self.playback.state, PlaybackState.STOPPED) self.assertEqual(self.playback.current_track, None) @@ -344,8 +343,6 @@ class PlaybackControllerTest(object): self.playback.on_end_of_track() - self.playback.on_end_of_stream() - self.assertEqual(self.playback.state, PlaybackState.STOPPED) @populate_tracklist @@ -354,7 +351,6 @@ class PlaybackControllerTest(object): for _ in self.tracks: self.playback.on_end_of_track() - self.playback.on_end_of_stream() self.assertEqual(self.playback.current_track, None) self.assertEqual(self.playback.state, PlaybackState.STOPPED) @@ -367,6 +363,16 @@ class PlaybackControllerTest(object): self.playback.on_end_of_track() self.assertEqual(self.playback.state, PlaybackState.STOPPED) + @populate_tracklist + def test_end_of_track_skips_to_next_track_on_failure(self): + # If backend's play() returns False, it is a failure. + self.backend.playback.play = lambda track: track != self.tracks[1] + self.playback.play() + self.assertEqual(self.playback.current_track, self.tracks[0]) + self.playback.on_end_of_track() + self.assertNotEqual(self.playback.current_track, self.tracks[1]) + self.assertEqual(self.playback.current_track, self.tracks[2]) + @populate_tracklist def test_end_of_track_track_before_play(self): self.assertEqual(self.playback.tl_track_at_next, self.tl_tracks[0]) @@ -509,7 +515,6 @@ class PlaybackControllerTest(object): def test_tracklist_position_at_end_of_playlist(self): self.playback.play(self.tracklist.tl_tracks[-1]) self.playback.on_end_of_track() - self.playback.on_end_of_stream() self.assertEqual(self.playback.tracklist_position, None) def test_on_tracklist_change_gets_called(self): @@ -815,7 +820,6 @@ class PlaybackControllerTest(object): def test_end_of_playlist_stops(self): self.playback.play(self.tracklist.tl_tracks[-1]) self.playback.on_end_of_track() - self.playback.on_end_of_stream() self.assertEqual(self.playback.state, PlaybackState.STOPPED) def test_repeat_off_by_default(self): diff --git a/tests/backends/base/tracklist.py b/tests/backends/base/tracklist.py index 39fb020d..bbde4bcc 100644 --- a/tests/backends/base/tracklist.py +++ b/tests/backends/base/tracklist.py @@ -17,7 +17,7 @@ class TracklistControllerTest(object): def setUp(self): self.audio = audio.DummyAudio.start().proxy() self.backend = self.backend_class.start(audio=self.audio).proxy() - self.core = core.Core(audio=self.audio, backends=[self.backend]) + self.core = core.Core(audio=audio, backends=[self.backend]) self.controller = self.core.tracklist self.playback = self.core.playback From f74b59aced6f5ab172096b25d6ff77166986246d Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 19 Mar 2013 23:32:42 +0100 Subject: [PATCH 091/151] Revert "docs: Add changelog entry for EOT/EOS fixing." This reverts commit 42e84c8e2ea62ced1fe8c226df9d3fe158ff69e1. Conflicts: docs/changes.rst --- docs/changes.rst | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index 2a8f3443..624b05ac 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -10,28 +10,6 @@ v0.13.0 (in development) (in development) -**Audio sub-system** - -- EOT (end of track) and EOS (end of stream) handling has finally been fixed. - Problem with the old code was that we simply used EOS for everything, and let - the EOS propagate for the end of each track. What this means is basically that - we would disrupt the pipeline at the end of every track. This work was - concluded in the pull request :issue:`231`. Changes and issues fixed by this - include: - - - A new method ``change_track(track)`` for playback provider which is where - doing everything like setting the URI and starting to push data should be - done. The ``play(track)`` method and EOT track changing uses this new - method. - - - We've started using the about to finish signal from playbin2 to ensure - gapless playback as part of our EOT cleanup. (Fixes: :issue:`160`) - - - Mopidy now distinguishes between EOT and EOS properly. (Fixes: :issue:`222`) - - - Since we no longer let EOS disrupt the pipeline streaming OGG via SHOUTcast - now works. (Fixes: :issue:`168`) - **Spotify backend** - Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`) From c45db5388a0106d6c2bbcf6aa88b9eee28599e6c Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 19 Mar 2013 23:49:46 +0100 Subject: [PATCH 092/151] tests: Use audio instancee, not module --- tests/backends/base/tracklist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/backends/base/tracklist.py b/tests/backends/base/tracklist.py index bbde4bcc..39fb020d 100644 --- a/tests/backends/base/tracklist.py +++ b/tests/backends/base/tracklist.py @@ -17,7 +17,7 @@ class TracklistControllerTest(object): def setUp(self): self.audio = audio.DummyAudio.start().proxy() self.backend = self.backend_class.start(audio=self.audio).proxy() - self.core = core.Core(audio=audio, backends=[self.backend]) + self.core = core.Core(audio=self.audio, backends=[self.backend]) self.controller = self.core.tracklist self.playback = self.core.playback From 2e98dbeebd4ef7dc85ff35b2e15f4b5e5bb7f294 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 20 Mar 2013 01:09:42 +0100 Subject: [PATCH 093/151] docs: Formatting. Remove promises of sound quality --- docs/installation/raspberrypi.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/installation/raspberrypi.rst b/docs/installation/raspberrypi.rst index f163657a..020b6edd 100644 --- a/docs/installation/raspberrypi.rst +++ b/docs/installation/raspberrypi.rst @@ -209,12 +209,12 @@ software packages, as Wheezy is going to be the next release of Debian. aplay /usr/share/sounds/alsa/Front_Center.wav - If you hear a voice saying "Front Center," then your sound is working. Don't - be concerned if this test sound includes static, output from Mopidy will not. - Test your sound with gstreamer to determine sound quality. + If you hear a voice saying "Front Center", then your sound is working. Don't + be concerned if this test sound includes static. Test your sound with + GStreamer to determine the sound quality of Mopidy. - To make the change to analog output stick, you can add the ``amixer`` command - to e.g. ``/etc/rc.local``, which will be executed when the system is + To make the change to analog output stick, you can add the ``amixer`` + command to e.g. ``/etc/rc.local``, which will be executed when the system is booting. From 3a3a5219eb4b484d76bbd3fb75974124c167c728 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 20 Mar 2013 01:17:20 +0100 Subject: [PATCH 094/151] Update changelog --- docs/changes.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/changes.rst b/docs/changes.rst index 624b05ac..4e0a9639 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -14,6 +14,12 @@ v0.13.0 (in development) - Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`) +**HTTP frontend** + +- Upgrade Mopidy.js' build system Grunt from 0.3 to 0.4. + +- Upgrade Mopidy.js' dependencies when.js from 1.6.1 to 1.8.1. + v0.12.0 (2013-03-12) ==================== From eb459c81f0a351ca2c69297b4588eca707da0164 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 22 Mar 2013 08:33:44 +0100 Subject: [PATCH 095/151] docs: library.{find_exact,search}() returns all tracks if no query --- mopidy/core/library.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mopidy/core/library.py b/mopidy/core/library.py index e4be7ce8..29b2e797 100644 --- a/mopidy/core/library.py +++ b/mopidy/core/library.py @@ -20,6 +20,9 @@ class LibraryController(object): """ Search the library for tracks where ``field`` is ``values``. + If the query is empty, and the backend can support it, all available + tracks are returned. + Examples:: # Returns results matching 'a' @@ -80,6 +83,9 @@ class LibraryController(object): """ Search the library for tracks where ``field`` contains ``values``. + If the query is empty, and the backend can support it, all available + tracks are returned. + Examples:: # Returns results matching 'a' From ea029de50390eacd6ee8b9dd5b621108a4c8f72b Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 22 Mar 2013 09:20:11 +0100 Subject: [PATCH 096/151] docs: Add SearchResult to models diagram --- docs/api/models.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/api/models.rst b/docs/api/models.rst index 5833e58c..4171acb6 100644 --- a/docs/api/models.rst +++ b/docs/api/models.rst @@ -18,6 +18,10 @@ Data model relations Track -> Artist [ label="has 0..n" ] Album -> Artist [ label="has 0..n" ] + SearchResult -> Artist [ label="has 0..n" ] + SearchResult -> Album [ label="has 0..n" ] + SearchResult -> Track [ label="has 0..n" ] + Data model API ============== From 50cce23d822841550677794796b5b51c606b73fa Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 23 Mar 2013 20:46:43 +0100 Subject: [PATCH 097/151] mpris: Add artUrl support --- docs/changes.rst | 4 ++++ mopidy/frontends/mpris/objects.py | 4 ++++ .../frontends/mpris/player_interface_test.py | 24 +++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/docs/changes.rst b/docs/changes.rst index 4e0a9639..92f52356 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -20,6 +20,10 @@ v0.13.0 (in development) - Upgrade Mopidy.js' dependencies when.js from 1.6.1 to 1.8.1. +**MPRIS frontend** + +- Publish album art URIs if available. + v0.12.0 (2013-03-12) ==================== diff --git a/mopidy/frontends/mpris/objects.py b/mopidy/frontends/mpris/objects.py index 15ef9383..4c72a85b 100644 --- a/mopidy/frontends/mpris/objects.py +++ b/mopidy/frontends/mpris/objects.py @@ -375,6 +375,10 @@ class MprisObject(dbus.service.Object): artists.sort(key=lambda a: a.name) metadata['xesam:albumArtist'] = dbus.Array( [a.name for a in artists if a.name], signature='s') + if track.album and track.album.images: + url = list(track.album.images)[0] + if url: + metadata['mpris:artUrl'] = url if track.track_no: metadata['xesam:trackNumber'] = track.track_no return dbus.Dictionary(metadata, signature='sv') diff --git a/tests/frontends/mpris/player_interface_test.py b/tests/frontends/mpris/player_interface_test.py index c48ffa98..5832c710 100644 --- a/tests/frontends/mpris/player_interface_test.py +++ b/tests/frontends/mpris/player_interface_test.py @@ -200,6 +200,30 @@ class PlayerInterfaceTest(unittest.TestCase): self.assertIn('xesam:albumArtist', result.keys()) self.assertEqual(result['xesam:albumArtist'], ['a', 'b']) + def test_get_metadata_use_first_album_image_as_art_url(self): + # XXX Currently, the album image order isn't preserved because they + # are stored as a frozenset(). We pick the first in the set, which is + # sorted alphabetically, thus we get 'bar.jpg', not 'foo.jpg', which + # would probably make more sense. + self.core.tracklist.add([Track(album=Album(images=[ + 'http://example.com/foo.jpg', 'http://example.com/bar.jpg']))]) + self.core.playback.play() + result = self.mpris.Get(objects.PLAYER_IFACE, 'Metadata') + self.assertIn('mpris:artUrl', result.keys()) + self.assertEqual(result['mpris:artUrl'], 'http://example.com/bar.jpg') + + def test_get_metadata_has_no_art_url_if_no_album(self): + self.core.tracklist.add([Track()]) + self.core.playback.play() + result = self.mpris.Get(objects.PLAYER_IFACE, 'Metadata') + self.assertNotIn('mpris:artUrl', result.keys()) + + def test_get_metadata_has_no_art_url_if_no_album_images(self): + self.core.tracklist.add([Track(Album(images=[]))]) + self.core.playback.play() + result = self.mpris.Get(objects.PLAYER_IFACE, 'Metadata') + self.assertNotIn('mpris:artUrl', result.keys()) + def test_get_metadata_has_track_number_in_album(self): self.core.tracklist.add([Track(track_no=7)]) self.core.playback.play() From 49c8062ba6ab55b982d8f8b2c0f357ccd1c18a85 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 23 Mar 2013 20:58:22 +0100 Subject: [PATCH 098/151] mpris: Add discNumber support --- docs/changes.rst | 2 ++ mopidy/frontends/mpris/objects.py | 2 ++ tests/frontends/mpris/player_interface_test.py | 7 +++++++ 3 files changed, 11 insertions(+) diff --git a/docs/changes.rst b/docs/changes.rst index 92f52356..defe0033 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -24,6 +24,8 @@ v0.13.0 (in development) - Publish album art URIs if available. +- Publish disc number of track if available. + v0.12.0 (2013-03-12) ==================== diff --git a/mopidy/frontends/mpris/objects.py b/mopidy/frontends/mpris/objects.py index 4c72a85b..a9a93b45 100644 --- a/mopidy/frontends/mpris/objects.py +++ b/mopidy/frontends/mpris/objects.py @@ -379,6 +379,8 @@ class MprisObject(dbus.service.Object): url = list(track.album.images)[0] if url: metadata['mpris:artUrl'] = url + if track.disc_no: + metadata['xesam:discNumber'] = track.disc_no if track.track_no: metadata['xesam:trackNumber'] = track.track_no return dbus.Dictionary(metadata, signature='sv') diff --git a/tests/frontends/mpris/player_interface_test.py b/tests/frontends/mpris/player_interface_test.py index 5832c710..0c477dc8 100644 --- a/tests/frontends/mpris/player_interface_test.py +++ b/tests/frontends/mpris/player_interface_test.py @@ -224,6 +224,13 @@ class PlayerInterfaceTest(unittest.TestCase): result = self.mpris.Get(objects.PLAYER_IFACE, 'Metadata') self.assertNotIn('mpris:artUrl', result.keys()) + def test_get_metadata_has_disc_number_in_album(self): + self.core.tracklist.add([Track(disc_no=2)]) + self.core.playback.play() + result = self.mpris.Get(objects.PLAYER_IFACE, 'Metadata') + self.assertIn('xesam:discNumber', result.keys()) + self.assertEqual(result['xesam:discNumber'], 2) + def test_get_metadata_has_track_number_in_album(self): self.core.tracklist.add([Track(track_no=7)]) self.core.playback.play() From dffea519a79977c068a97ea294e4de4aed313518 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 23 Mar 2013 23:48:18 +0100 Subject: [PATCH 099/151] core: Warn if track isn't playable --- docs/changes.rst | 5 +++++ mopidy/core/playback.py | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/changes.rst b/docs/changes.rst index defe0033..a8012710 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -10,6 +10,11 @@ v0.13.0 (in development) (in development) +**Core** + +- Log a warning if a track isn't playable to make it more obvious that backend + X needs backend Y to be present for playback to work. + **Spotify backend** - Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`) diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index 21f09ad2..2e79827a 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -397,13 +397,14 @@ class PlaybackController(object): self.state = PlaybackState.PLAYING backend = self._get_backend() if not backend or not backend.playback.play(tl_track.track).get(): - # Track is not playable + logger.warning('Track is not playable: %s', tl_track.track.uri) if self.random and self._shuffled: self._shuffled.remove(tl_track) if on_error_step == 1: self.next() elif on_error_step == -1: self.previous() + return if self.random and self.current_tl_track in self._shuffled: self._shuffled.remove(self.current_tl_track) From 59bcabfdfe56ef9139efd1704a30c51f824ffc81 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 23 Mar 2013 23:53:32 +0100 Subject: [PATCH 100/151] docs: Add info about mailing list --- README.rst | 1 + docs/index.rst | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index c7eea228..8598b153 100644 --- a/README.rst +++ b/README.rst @@ -22,4 +22,5 @@ To get started with Mopidy, check out `the docs `_. - `Issue tracker `_ - `CI server `_ - IRC: ``#mopidy`` at `irc.freenode.net `_ +- Mailing list: `mopidy@googlegroups.com `_ - `Download development snapshot `_ diff --git a/docs/index.rst b/docs/index.rst index bce84b5a..00f3871b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -17,9 +17,10 @@ including Windows, Mac OS X, Linux, Android, and iOS. To install Mopidy, start by reading :ref:`installation`. If you get stuck, we usually hang around at ``#mopidy`` at `irc.freenode.net -`_. If you stumble into a bug or got a feature request, -please create an issue in the `issue tracker -`_. +`_ and also got a `mailing list at Google Groups +`_. If you stumble +into a bug or got a feature request, please create an issue in the `issue +tracker `_. Project resources @@ -30,6 +31,7 @@ Project resources - `Issue tracker `_ - `CI server `_ - IRC: ``#mopidy`` at `irc.freenode.net `_ +- Mailing list: `mopidy@googlegroups.com `_ User documentation From fc76318f209a68c170c175c3d00f2e13d85ca578 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 24 Mar 2013 00:03:42 +0100 Subject: [PATCH 101/151] models: Comment Album.images not preserving order --- mopidy/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mopidy/models.py b/mopidy/models.py index e14fd8b4..4020febb 100644 --- a/mopidy/models.py +++ b/mopidy/models.py @@ -203,6 +203,9 @@ class Album(ImmutableObject): #: The album image URIs. Read-only. images = frozenset() + # XXX If we want to keep the order of images we shouldn't use frozenset() + # as it doesn't preserve order. I'm deferring this issue until we got + # actual usage of this field with more than one image. def __init__(self, *args, **kwargs): # NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5 From c90322f1e2a36bb79425048a0a56b2bc97d53da6 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 24 Mar 2013 00:23:50 +0100 Subject: [PATCH 102/151] Use thread traceback logger from Pykka 1.1 --- docs/changes.rst | 4 ++++ mopidy/__main__.py | 6 +++--- mopidy/utils/process.py | 28 ---------------------------- requirements/core.txt | 2 +- 4 files changed, 8 insertions(+), 32 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index a8012710..776aada4 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -10,6 +10,10 @@ v0.13.0 (in development) (in development) +**Dependencies** + +- Pykka >= 1.1 is now required. + **Core** - Log a warning if a track isn't playable to make it more obvious that backend diff --git a/mopidy/__main__.py b/mopidy/__main__.py index 2847497a..5c049daf 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -9,6 +9,8 @@ import sys import gobject gobject.threads_init() +import pykka.debug + # Extract any non-GStreamer arguments, and leave the GStreamer arguments for # processing by GStreamer. This needs to be done before GStreamer is imported, @@ -48,9 +50,7 @@ def main(): options = parse_options() if options.debug_thread or settings.DEBUG_THREAD: - debug_thread = process.DebugThread() - debug_thread.start() - signal.signal(signal.SIGUSR1, debug_thread.handler) + signal.signal(signal.SIGUSR1, pykka.debug.log_thread_tracebacks) try: log.setup_logging(options.verbosity_level, options.save_debug_log) diff --git a/mopidy/utils/process.py b/mopidy/utils/process.py index 6be8937c..c8c85f59 100644 --- a/mopidy/utils/process.py +++ b/mopidy/utils/process.py @@ -2,10 +2,8 @@ from __future__ import unicode_literals import logging import signal -import sys import thread import threading -import traceback from pykka import ActorDeadError from pykka.registry import ActorRegistry @@ -79,29 +77,3 @@ class BaseThread(threading.Thread): def run_inside_try(self): raise NotImplementedError - - -class DebugThread(threading.Thread): - daemon = True - name = 'DebugThread' - - event = threading.Event() - - def handler(self, signum, frame): - logger.info('Got %s signal', SIGNALS[signum]) - self.event.set() - - def run(self): - while True: - self.event.wait() - threads = dict((t.ident, t.name) for t in threading.enumerate()) - - for ident, frame in sys._current_frames().items(): - if self.ident != ident: - stack = ''.join(traceback.format_stack(frame)) - logger.debug( - 'Current state of %s (%s):\n%s', - threads.get(ident, '?'), ident, stack) - del frame - - self.event.clear() diff --git a/requirements/core.txt b/requirements/core.txt index 7a28564f..9ffac2cf 100644 --- a/requirements/core.txt +++ b/requirements/core.txt @@ -1,2 +1,2 @@ -Pykka >= 1.0 +Pykka >= 1.1 # Available as python-pykka from apt.mopidy.com From f843b32e882516b5c3fa25d82822715fc0e1bad1 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 24 Mar 2013 00:24:13 +0100 Subject: [PATCH 103/151] Turn thread traceback logger on by default It no longer requires an additional thread to work and it is very useful to have this enabled when you hit an issue that is hard to reproduce. --- docs/changes.rst | 5 +++++ docs/development.rst | 25 +++++++++++++++++++++---- mopidy/__main__.py | 4 +--- mopidy/settings.py | 8 -------- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index 776aada4..47786a56 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -19,6 +19,11 @@ v0.13.0 (in development) - Log a warning if a track isn't playable to make it more obvious that backend X needs backend Y to be present for playback to work. +- Removed the :attr:`mopidy.settings.DEBUG_THREAD` setting and the + :option:`--debug-thread` command line option. Sending SIGUSR1 to + the Mopidy process will now always make it log tracebacks for all alive + threads. + **Spotify backend** - Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`) diff --git a/docs/development.rst b/docs/development.rst index 1211cec4..a0392f81 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -305,10 +305,27 @@ Debugging deadlocks Between the numerous Pykka threads and GStreamer interactions there can sometimes be a potential for deadlocks. In an effort to make these slightly -simpler to debug the setting :attr:`mopidy.settings.DEBUG_THREAD` or the option -``--debug-thread`` can be used to turn on an extra debug thread. This thread is -not linked to the regular program flow, and it's only task is to dump traceback -showing the other threads state when we get a ``SIGUSR1``. +simpler to debug Mopidy registers a ``SIGUSR1`` signal handler which logs the +traceback of all alive threads. + +To trigger the signal handler, you need the process ID (PID) of Mopidy. This +can for example be found by running ``ps``:: + + $ ps aux | grep mopidy + jodal 4313 2.0 1.7 2573592 69804 pts/14 Sl+ 00:15 0:02 python + mopidy + jodal 4700 0.0 0.0 9392 924 pts/10 S+ 00:17 0:00 grep + mopidy + $ + +In this example, Mopidy's PID is 4313. You can then use the ``kill`` command to +send the ``SIGUSR1`` signal to the Mopidy proces:: + + $ kill -SIGUSR1 4313 + $ + +If you check the log, you should now find one log record with a full traceback +for each of the currently alive threads in Mopidy. Writing documentation diff --git a/mopidy/__main__.py b/mopidy/__main__.py index 5c049daf..a7e914a9 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -45,13 +45,11 @@ logger = logging.getLogger('mopidy.main') def main(): signal.signal(signal.SIGTERM, process.exit_handler) + signal.signal(signal.SIGUSR1, pykka.debug.log_thread_tracebacks) loop = gobject.MainLoop() options = parse_options() - if options.debug_thread or settings.DEBUG_THREAD: - signal.signal(signal.SIGUSR1, pykka.debug.log_thread_tracebacks) - try: log.setup_logging(options.verbosity_level, options.save_debug_log) check_old_folders() diff --git a/mopidy/settings.py b/mopidy/settings.py index fd3dfd6f..c7c5bb4c 100644 --- a/mopidy/settings.py +++ b/mopidy/settings.py @@ -49,14 +49,6 @@ DEBUG_LOG_FORMAT = '%(levelname)-8s %(asctime)s' + \ #: DEBUG_LOG_FILENAME = u'mopidy.log' DEBUG_LOG_FILENAME = 'mopidy.log' -#: If we should start a background thread that dumps thread's traceback when we -#: get a SIGUSR1. Mainly a debug tool for figuring out deadlocks. -#: -#: Default:: -#: -#: DEBUG_THREAD = False -DEBUG_THREAD = False - #: Location of the Mopidy .desktop file. #: #: Used by :mod:`mopidy.frontends.mpris`. From c1c5fff01f472bfc6cde591937480dfc5a774b02 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 24 Mar 2013 01:05:53 +0100 Subject: [PATCH 104/151] docs: Recommend pkill instead of ps+kill --- docs/development.rst | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/docs/development.rst b/docs/development.rst index a0392f81..c1c1d291 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -308,21 +308,10 @@ sometimes be a potential for deadlocks. In an effort to make these slightly simpler to debug Mopidy registers a ``SIGUSR1`` signal handler which logs the traceback of all alive threads. -To trigger the signal handler, you need the process ID (PID) of Mopidy. This -can for example be found by running ``ps``:: +To trigger the signal handler, you can use the ``pkill`` command to +send the ``SIGUSR1`` signal to any Mopidy processes:: - $ ps aux | grep mopidy - jodal 4313 2.0 1.7 2573592 69804 pts/14 Sl+ 00:15 0:02 python - mopidy - jodal 4700 0.0 0.0 9392 924 pts/10 S+ 00:17 0:00 grep - mopidy - $ - -In this example, Mopidy's PID is 4313. You can then use the ``kill`` command to -send the ``SIGUSR1`` signal to the Mopidy proces:: - - $ kill -SIGUSR1 4313 - $ + pkill -SIGUSR1 mopidy If you check the log, you should now find one log record with a full traceback for each of the currently alive threads in Mopidy. From 5214927d141d45303df3a007fb60a0d2443b7de5 Mon Sep 17 00:00:00 2001 From: herrernst Date: Sun, 24 Mar 2013 15:01:09 +0100 Subject: [PATCH 105/151] fix lookup of filenames containing non-ascii characters --- mopidy/backends/local/translator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mopidy/backends/local/translator.py b/mopidy/backends/local/translator.py index b029d367..e5c214d7 100644 --- a/mopidy/backends/local/translator.py +++ b/mopidy/backends/local/translator.py @@ -146,7 +146,7 @@ def _convert_mpd_data(data, tracks, music_dir): path = data['file'][1:] else: path = data['file'] - path = urllib.unquote(path) + path = urllib.unquote(path.encode('ascii')).decode('utf-8') if artist_kwargs: artist = Artist(**artist_kwargs) From 19e3059a69f096f46febe52a849208fb5b19a4f8 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 23 Mar 2013 19:44:46 +0100 Subject: [PATCH 106/151] docs: Add initial extension development docs --- docs/index.rst | 1 + extensiondev.rst | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 extensiondev.rst diff --git a/docs/index.rst b/docs/index.rst index 00f3871b..5450ea5c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -67,6 +67,7 @@ Development documentation :maxdepth: 3 development + extensiondev Indices and tables diff --git a/extensiondev.rst b/extensiondev.rst new file mode 100644 index 00000000..7fe5a2f4 --- /dev/null +++ b/extensiondev.rst @@ -0,0 +1,22 @@ +********************* +Extension development +********************* + +.. warning:: Draft + + This document is a draft open for discussion. It shows how we imagine that + development of Mopidy extensions should become in the future, not how to + currently develop an extension for Mopidy. + +An extension wants to: + +- Be automatically found if installed +- Provide default config +- Validate configuration +- Validate presence of dependencies + - Python packages (e.g. pyspotify) + - Other software + - Other extensions (e.g. SoundCloud depends on stream backend) +- Validate that needed TCP ports are free +- Be asked to start running +- Be asked to shut down From 3c685eb93c8d19e58c55b0278532b8b2e179969a Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 26 Mar 2013 17:45:45 +0100 Subject: [PATCH 107/151] docs: Move extensiondev file --- extensiondev.rst => docs/extensiondev.rst | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename extensiondev.rst => docs/extensiondev.rst (100%) diff --git a/extensiondev.rst b/docs/extensiondev.rst similarity index 100% rename from extensiondev.rst rename to docs/extensiondev.rst From 0e03c3f26e965a303c1445f2679c7b5362fceb5c Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 27 Mar 2013 10:17:23 +0100 Subject: [PATCH 108/151] docs: Add intro to extdev --- docs/extensiondev.rst | 49 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/docs/extensiondev.rst b/docs/extensiondev.rst index 7fe5a2f4..f93cd645 100644 --- a/docs/extensiondev.rst +++ b/docs/extensiondev.rst @@ -8,6 +8,55 @@ Extension development development of Mopidy extensions should become in the future, not how to currently develop an extension for Mopidy. + +Mopidy started as simply an MPD server that could play music from Spotify. +Early on Mopidy got multiple "frontends" to expose Mopidy to more than just MPD +clients: for example the Last.fm frontend what scrobbles what you've listened +to to your Last.fm account, the MPRIS frontend that integrates Mopidy into the +Ubuntu Sound Menu, and the HTTP server and JavaScript player API making web +based Mopidy clients possible. In Mopidy 0.9 we added support for multiple +music sources without stopping and reconfiguring Mopidy: for example the local +backend for playing music from your disk, the stream backend for playing +Internet radio streams, and the Spotify and SoundCloud backends, for playing +music directly from those services. + +All of these are examples of what you can accomplish by creating a Mopidy +extension. If you want to create your own Mopidy extension for something that +does not exist yet, this guide to extension development will help you get your +extension running in no time, and make it feel the way users would expect your +extension to behave. + + +Anatomy of an extension +======================= + +Extensions are all located in a Python package called ``mopidy_something`` +where "something" is the name of the application, library or web service you +want to integrated with Mopidy. So for example if you plan to add support for a +service named Soundspot to Mopidy, you would name your extension's Python +package ``mopidy_soundspot``. + +The name of the actual extension (the human readable name) however 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. + +The extension must be shipped with a ``setup.py`` file and be registered on +`PyPI `_. Also make sure the development version link +in your package details work so that people can easily install the development +version into their virtualenv simply by running e.g. ``pip install +Mopidy-Soundspot==dev``. + +Mopidy extensions must be licensed under an Apache 2.0 (like Mopidy itself), +BSD, MIT or more liberal license to be able to be enlisted in the Mopidy +Extension Registry. Keep in mind that the Mopidy Extension Registry is a +moderated place and libraries will be reviewed upfront if they behave as +required. + + +Notes +===== + An extension wants to: - Be automatically found if installed From b421b02a1edafb88f650299215b93648e6c810fb Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 27 Mar 2013 15:39:04 +0100 Subject: [PATCH 109/151] docs: More extdev notes --- docs/extensiondev.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/extensiondev.rst b/docs/extensiondev.rst index f93cd645..19cbd1e4 100644 --- a/docs/extensiondev.rst +++ b/docs/extensiondev.rst @@ -60,12 +60,18 @@ Notes An extension wants to: - Be automatically found if installed + - Either register a setuptools entry points on installation, or + - Require a line of configuration to activate the extension - Provide default config - Validate configuration + - Pass all configuration to every extension, let the extension complain on + anything it wants to - Validate presence of dependencies - Python packages (e.g. pyspotify) - Other software - - Other extensions (e.g. SoundCloud depends on stream backend) + - The presence of other extensions can be validated in the configuration + validation step - Validate that needed TCP ports are free +- Register new GStreamer elements - Be asked to start running - Be asked to shut down From 8ba9e3a442c2ae779a689001909c499501e07811 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 27 Mar 2013 16:20:17 +0100 Subject: [PATCH 110/151] docs: Initial example files for new extensions --- docs/extensiondev.rst | 88 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 3 deletions(-) diff --git a/docs/extensiondev.rst b/docs/extensiondev.rst index 19cbd1e4..49ecffa7 100644 --- a/docs/extensiondev.rst +++ b/docs/extensiondev.rst @@ -49,10 +49,92 @@ Mopidy-Soundspot==dev``. Mopidy extensions must be licensed under an Apache 2.0 (like Mopidy itself), BSD, MIT or more liberal license to be able to be enlisted in the Mopidy -Extension Registry. Keep in mind that the Mopidy Extension Registry is a -moderated place and libraries will be reviewed upfront if they behave as -required. +Extension Registry. The license text should be included in the ``LICENSE`` file +in the root of the extension's Git repo. +Combining this together, we get the following folder structure for our +extension, Mopidy-Soundspot:: + + mopidy-soundspot/ # The Git repo root + mopidy_soundspot/ # The Python package + __init__.py + LICENSE # The license text + README.rst # Document what it is and how to use it + setup.py # Installation script + +Example content for the most important files follows below. + +README.rst +---------- + +.. code-block:: rst + + Mopidy-Soundspot + ================ + + `Mopidy `_ extension for playing music from + `Soundspot `_. + + Usage + ----- + + Requires a Soundspot Platina subscription and the pysoundspot library. + + Install by running:: + + sudo pip install Mopidy-Soundspot + + Or install the Debian/Ubuntu package from `apt.mopidy.com + `_. + + Before starting Mopidy, you must add your Soundspot username and password + to the Mopidy configuration file:: + + [soundspot] + username = alice + password = secret + + Project resources + ----------------- + + - `Source code `_ + - `Issue tracker `_ + - `Download development snapshot `_ + + +setup.py +-------- + +:: + + from setuptools import setup + + setup( + name='Mopidy-Soundspot', + version='1.0', + url='http://example.com/mopidy-soundspot/', + license='Apache License, Version 2.0', + author='Your Name', + author_email='your-email@example.com', + description='Very short description', + long_description=open('README.rst').read(), + packages=['mopidy_soundspot'], + zip_safe=False, + include_package_data=True, + platforms='any', + install_requires=[ + 'Mopidy', + 'pysoundspot', + ], + classifiers=[ + 'Environment :: No Input/Output (Daemon)', + 'Intended Audience :: End Users/Desktop', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: OS Independent', + 'Programming Language :: Python', + 'Topic :: Multimedia :: Sound/Audio :: Players', + ], + ) Notes ===== From e0ec4a52f18aa5c1d28bd1a94bc66e1f46aa7a9f Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 27 Mar 2013 16:21:50 +0100 Subject: [PATCH 111/151] docs: Fix list formatting --- docs/extensiondev.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/extensiondev.rst b/docs/extensiondev.rst index 49ecffa7..5d87dc7e 100644 --- a/docs/extensiondev.rst +++ b/docs/extensiondev.rst @@ -144,16 +144,27 @@ An extension wants to: - Be automatically found if installed - Either register a setuptools entry points on installation, or - Require a line of configuration to activate the extension + - Provide default config + - Validate configuration + - Pass all configuration to every extension, let the extension complain on anything it wants to + - Validate presence of dependencies + - Python packages (e.g. pyspotify) + - Other software + - The presence of other extensions can be validated in the configuration validation step + - Validate that needed TCP ports are free + - Register new GStreamer elements + - Be asked to start running + - Be asked to shut down From 75ec28bcc04618ec9fb4eec147e45074c6545157 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 28 Mar 2013 19:31:02 +0100 Subject: [PATCH 112/151] docs: Started on example files for an extension --- docs/extensiondev.rst | 119 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 115 insertions(+), 4 deletions(-) diff --git a/docs/extensiondev.rst b/docs/extensiondev.rst index 5d87dc7e..05a62c2f 100644 --- a/docs/extensiondev.rst +++ b/docs/extensiondev.rst @@ -56,14 +56,16 @@ Combining this together, we get the following folder structure for our extension, Mopidy-Soundspot:: mopidy-soundspot/ # The Git repo root - mopidy_soundspot/ # The Python package - __init__.py LICENSE # The license text README.rst # Document what it is and how to use it + mopidy_soundspot/ # Your code + __init__.py + ... setup.py # Installation script Example content for the most important files follows below. + README.rst ---------- @@ -107,11 +109,17 @@ setup.py :: + import re from setuptools import setup + def get_version(filename): + content = open(filename).read() + metadata = dict(re.findall("__([a-z]+)__ = '([^']+)'", content)) + return metadata['version'] + setup( name='Mopidy-Soundspot', - version='1.0', + version=get_version('mopidy_soundspot/__init__.py'), url='http://example.com/mopidy-soundspot/', license='Apache License, Version 2.0', author='Your Name', @@ -119,23 +127,126 @@ setup.py description='Very short description', long_description=open('README.rst').read(), packages=['mopidy_soundspot'], + # If you ship package instead of a single module instead, use + # 'py_modules' instead of 'packages': + #py_modules=['mopidy_soundspot'], zip_safe=False, include_package_data=True, platforms='any', install_requires=[ + 'setuptools', 'Mopidy', 'pysoundspot', ], + entry_points=[ + 'mopidy.extension': [ + 'mopidy_soundspot = mopidy_soundspot:EntryPoint', + ], + ], classifiers=[ 'Environment :: No Input/Output (Daemon)', 'Intended Audience :: End Users/Desktop', 'License :: OSI Approved :: Apache Software License', 'Operating System :: OS Independent', - 'Programming Language :: Python', + 'Programming Language :: Python :: 2', 'Topic :: Multimedia :: Sound/Audio :: Players', ], ) + +mopidy_soundspot/__init__.py +---------------------------- + +:: + + from mopidy.exceptions import ExtensionError + + __version__ = '0.1' + + + class EntryPoint(object): + + name = 'Mopidy-Soundspot' + version = __version__ + + @classmethod + def get_default_config(cls): + return """ + [soundspot] + enabled = true + username = + password = + """ + + @classmethod + def validate_config(cls, config): + if not config.getboolean('soundspot', 'enabled'): + return + if not config.get('soundspot', 'username'): + raise ExtensionError('Config soundspot.username not set') + if not config.get('soundspot', 'password'): + raise ExtensionError('Config soundspot.password not set') + + @classmethod + def validate_environment(cls): + try: + import pysoundspot + except ImportError as e: + raise ExtensionError('pysoundspot library not found', e) + + @classmethod + def start_frontend(cls, core): + from .frontend import SoundspotFrontend + cls._frontend = SoundspotFrontend.start(core=core) + + @classmethod + def stop_frontend(cls): + cls._frontend.stop() + + @classmethod + def start_backend(cls, audio): + from .backend import SoundspotBackend + cls._backend = SoundspotBackend.start(audio=audio) + + @classmethod + def stop_backend(cls): + cls._backend.stop() + + +mopidy_soundspot/frontend.py +---------------------------- + +:: + + import pykka + + from mopidy.core import CoreListener + + class SoundspotFrontend(pykka.ThreadingActor, CoreListener): + def __init__(self, core): + super(SoundspotFrontend, self).__init__() + self.core = core + + # Your frontend implementation + + +mopidy_soundspot/backend.py +--------------------------- + +:: + + import pykka + + from mopidy.backends import base + + class SoundspotBackend(pykka.ThreadingActor, base.BaseBackend): + def __init__(self, audio): + super(SoundspotBackend, self).__init__() + self.audio = audio + + # Your backend implementation + + Notes ===== From 5e29647897505cdcf79596e7303b5f97171297a3 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 28 Mar 2013 23:53:29 +0100 Subject: [PATCH 113/151] js: Remove redundant config not working on Node 0.10 --- js/Gruntfile.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/js/Gruntfile.js b/js/Gruntfile.js index f290250a..195decd6 100644 --- a/js/Gruntfile.js +++ b/js/Gruntfile.js @@ -15,11 +15,6 @@ module.exports = function (grunt) { minified: "../mopidy/frontends/http/data/mopidy.min.js" } }, - buster: { - test: { - config: "buster.js" - } - }, concat: { options: { banner: "<%= meta.banner %>", From 74b4fdc7ee471ad9ac477c719fc6ea2dcc5a6019 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 29 Mar 2013 13:51:28 +0100 Subject: [PATCH 114/151] js: Make test suite run on Node.js using faye-websocket --- js/buster.js | 10 +++++++++- js/package.json | 5 +++++ js/src/mopidy.js | 34 ++++++++++++++++++++++++++-------- js/test/mopidy-test.js | 35 ++++++++++++++++++++++++----------- 4 files changed, 64 insertions(+), 20 deletions(-) diff --git a/js/buster.js b/js/buster.js index f789885a..37f41d8a 100644 --- a/js/buster.js +++ b/js/buster.js @@ -1,9 +1,17 @@ var config = module.exports; -config["tests"] = { +config.browser_tests = { environment: "browser", libs: ["lib/**/*.js"], sources: ["src/**/*.js"], testHelpers: ["test/**/*-helper.js"], tests: ["test/**/*-test.js"] }; + +config.node_tests = { + environment: "node", + libs: ["lib/**/*.js"], + sources: ["src/**/*.js"], + testHelpers: ["test/**/*-helper.js"], + tests: ["test/**/*-test.js"] +}; diff --git a/js/package.json b/js/package.json index 6638c705..f83c9273 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,11 @@ { "name": "mopidy", "version": "0.0.0", + "dependencies": { + "bane": "~0.4.0", + "faye-websocket": "~0.4.4", + "when": "~1.8.1" + }, "devDependencies": { "buster": "~0.6.12", "grunt": "~0.4.0", diff --git a/js/src/mopidy.js b/js/src/mopidy.js index 5a75a836..011aec09 100644 --- a/js/src/mopidy.js +++ b/js/src/mopidy.js @@ -1,4 +1,10 @@ -/*global bane:false, when:false*/ +/*global exports:false, require:false*/ + +if (typeof module === "object" && typeof require === "function") { + var bane = require("bane"); + var websocket = require("faye-websocket"); + var when = require("when"); +} function Mopidy(settings) { if (!(this instanceof Mopidy)) { @@ -20,9 +26,17 @@ function Mopidy(settings) { } } +if (typeof module === "object" && typeof require === "function") { + Mopidy.WebSocket = websocket.Client; +} else { + Mopidy.WebSocket = window.WebSocket; +} + Mopidy.prototype._configure = function (settings) { + var currentHost = (typeof document !== "undefined" && + document.location.host) || "localhost"; settings.webSocketUrl = settings.webSocketUrl || - "ws://" + document.location.host + "/mopidy/ws/"; + "ws://" + currentHost + "/mopidy/ws/"; if (settings.autoConnect !== false) { settings.autoConnect = true; @@ -35,7 +49,7 @@ Mopidy.prototype._configure = function (settings) { }; Mopidy.prototype._getConsole = function () { - var console = window.console || {}; + var console = typeof console !== "undefined" && console || {}; console.log = console.log || function () {}; console.warn = console.warn || function () {}; @@ -63,7 +77,7 @@ Mopidy.prototype._delegateEvents = function () { Mopidy.prototype.connect = function () { if (this._webSocket) { - if (this._webSocket.readyState === WebSocket.OPEN) { + if (this._webSocket.readyState === Mopidy.WebSocket.OPEN) { return; } else { this._webSocket.close(); @@ -71,7 +85,7 @@ Mopidy.prototype.connect = function () { } this._webSocket = this._settings.webSocket || - new WebSocket(this._settings.webSocketUrl); + new Mopidy.WebSocket(this._settings.webSocketUrl); this._webSocket.onclose = function (close) { this.emit("websocket:close", close); @@ -136,17 +150,17 @@ Mopidy.prototype._send = function (message) { var deferred = when.defer(); switch (this._webSocket.readyState) { - case WebSocket.CONNECTING: + case Mopidy.WebSocket.CONNECTING: deferred.resolver.reject({ message: "WebSocket is still connecting" }); break; - case WebSocket.CLOSING: + case Mopidy.WebSocket.CLOSING: deferred.resolver.reject({ message: "WebSocket is closing" }); break; - case WebSocket.CLOSED: + case Mopidy.WebSocket.CLOSED: deferred.resolver.reject({ message: "WebSocket is closed" }); @@ -280,3 +294,7 @@ Mopidy.prototype._snakeToCamel = function (name) { return match.toUpperCase().replace("_", ""); }); }; + +if (typeof exports === "object") { + exports.Mopidy = Mopidy; +} diff --git a/js/test/mopidy-test.js b/js/test/mopidy-test.js index 8842ebf4..b694fd7e 100644 --- a/js/test/mopidy-test.js +++ b/js/test/mopidy-test.js @@ -1,4 +1,10 @@ -/*global buster:false, assert:false, refute:false, when:false, Mopidy:false*/ +/*global require:false, assert:false, refute:false*/ + +if (typeof module === "object" && typeof require === "function") { + var buster = require("buster"); + var Mopidy = require("../src/mopidy").Mopidy; + var when = require("when"); +} buster.testCase("Mopidy", { setUp: function () { @@ -14,10 +20,11 @@ buster.testCase("Mopidy", { fakeWebSocket.OPEN = 1; fakeWebSocket.CLOSING = 2; fakeWebSocket.CLOSED = 3; - this.realWebSocket = WebSocket; - window.WebSocket = fakeWebSocket; - this.webSocketConstructorStub = this.stub(window, "WebSocket"); + this.realWebSocket = Mopidy.WebSocket; + Mopidy.WebSocket = fakeWebSocket; + + this.webSocketConstructorStub = this.stub(Mopidy, "WebSocket"); this.webSocket = { close: this.stub(), @@ -27,15 +34,18 @@ buster.testCase("Mopidy", { }, tearDown: function () { - window.WebSocket = this.realWebSocket; + Mopidy.WebSocket = this.realWebSocket; }, "constructor": { "connects when autoConnect is true": function () { new Mopidy({autoConnect: true}); + var currentHost = typeof document !== "undefined" && + document.location.host || "localhost"; + assert.calledOnceWith(this.webSocketConstructorStub, - "ws://" + document.location.host + "/mopidy/ws/"); + "ws://" + currentHost + "/mopidy/ws/"); }, "does not connect when autoConnect is false": function () { @@ -67,12 +77,15 @@ buster.testCase("Mopidy", { mopidy.connect(); + var currentHost = typeof document !== "undefined" && + document.location.host || "localhost"; + assert.calledOnceWith(this.webSocketConstructorStub, - "ws://" + document.location.host + "/mopidy/ws/"); + "ws://" + currentHost + "/mopidy/ws/"); }, "does nothing when the WebSocket is open": function () { - this.webSocket.readyState = WebSocket.OPEN; + this.webSocket.readyState = Mopidy.WebSocket.OPEN; var mopidy = new Mopidy({webSocket: this.webSocket}); mopidy.connect(); @@ -367,7 +380,7 @@ buster.testCase("Mopidy", { }, "immediately rejects request if CONNECTING": function (done) { - this.mopidy._webSocket.readyState = WebSocket.CONNECTING; + this.mopidy._webSocket.readyState = Mopidy.WebSocket.CONNECTING; var promise = this.mopidy._send({method: "foo"}); @@ -381,7 +394,7 @@ buster.testCase("Mopidy", { }, "immediately rejects request if CLOSING": function (done) { - this.mopidy._webSocket.readyState = WebSocket.CLOSING; + this.mopidy._webSocket.readyState = Mopidy.WebSocket.CLOSING; var promise = this.mopidy._send({method: "foo"}); @@ -395,7 +408,7 @@ buster.testCase("Mopidy", { }, "immediately rejects request if CLOSED": function (done) { - this.mopidy._webSocket.readyState = WebSocket.CLOSED; + this.mopidy._webSocket.readyState = Mopidy.WebSocket.CLOSED; var promise = this.mopidy._send({method: "foo"}); From 461265f121415b556ba4cfb3cefa75e6eb6a5e49 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 01:09:34 +0100 Subject: [PATCH 115/151] docs: Add Node.js installation instructions --- mopidy/frontends/http/__init__.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/mopidy/frontends/http/__init__.py b/mopidy/frontends/http/__init__.py index ab8dff42..3be4993e 100644 --- a/mopidy/frontends/http/__init__.py +++ b/mopidy/frontends/http/__init__.py @@ -128,8 +128,8 @@ you quickly started with working on your client instead of figuring out how to communicate with Mopidy. -Getting the library -------------------- +Getting the library for browser use +----------------------------------- Regular and minified versions of Mopidy.js, ready for use, is installed together with Mopidy. When the HTTP frontend is running, the files are @@ -154,6 +154,25 @@ the Git repo at: - ``mopidy/frontends/http/data/mopidy.js`` - ``mopidy/frontends/http/data/mopidy.min.js`` + +Getting the library for Node.js use +----------------------------------- + +If you want to use Mopidy.js from Node.js instead of a browser, you can install +Mopidy.js using npm:: + + npm install mopidy + +After npm completes, you can import Mopidy.js using ``require()``: + +.. code-block:: js + + var Mopidy = require("mopidy").Mopidy; + + +Getting the library for development on the library +-------------------------------------------------- + If you want to work on the Mopidy.js library itself, you'll find a complete development setup in the ``js/`` dir in our repo. The instructions in ``js/README.rst`` will guide you on your way. @@ -170,8 +189,8 @@ Once you got Mopidy.js loaded, you need to create an instance of the wrapper: When you instantiate ``Mopidy()`` without arguments, it will connect to the WebSocket at ``/mopidy/ws/`` on the current host. Thus, if you don't host -your web client using Mopidy's web server, you'll need to pass the URL to the -WebSocket end point: +your web client using Mopidy's web server, or if you use Mopidy.js from a +Node.js environment, you'll need to pass the URL to the WebSocket end point: .. code-block:: js From 5e374350f5d3debd4e4a45dc215aa7ecdbf59125 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 01:18:31 +0100 Subject: [PATCH 116/151] js: Add more metadata to package.json for npm publishing --- js/README.md | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ js/README.rst | 62 ------------------------------------- js/package.json | 14 ++++++++- 3 files changed, 95 insertions(+), 63 deletions(-) create mode 100644 js/README.md delete mode 100644 js/README.rst diff --git a/js/README.md b/js/README.md new file mode 100644 index 00000000..9601b64a --- /dev/null +++ b/js/README.md @@ -0,0 +1,82 @@ +Mopidy.js +========= + +Mopidy.js is a JavaScript library that is installed as a part of Mopidy's HTTP +frontend or from npm. The library makes Mopidy's core API available from the +browser or a Node.js environment, using JSON-RPC messages over a WebSocket to +communicate with Mopidy. + + +Getting it for browser use +-------------------------- + +Regular and minified versions of Mopidy.js, ready for use, is installed +together with Mopidy. When the HTTP frontend is running, the files are +available at: + +- http://localhost:6680/mopidy/mopidy.js +- http://localhost:6680/mopidy/mopidy.min.js + +You may need to adjust hostname and port for your local setup. + +In the source repo, you can find the files at: + +- `mopidy/frontends/http/data/mopidy.js` +- `mopidy/frontends/http/data/mopidy.min.js` + + +Getting it for Node.js use +-------------------------- + +If you want to use Mopidy.js from Node.js instead of a browser, you can install +Mopidy.js using npm: + + npm install mopidy + +After npm completes, you can import Mopidy.js using ``require()``: + + var Mopidy = require("mopidy").Mopidy; + + +Using the library +----------------- + +See Mopidy's [HTTP frontend +documentation](http://docs.mopidy.com/en/latest/modules/frontends/http/). + + +Building from source +-------------------- + +1. Install [Node.js](http://nodejs.org/) and npm. There is a PPA if you're + running Ubuntu: + + sudo apt-get install python-software-properties + sudo add-apt-repository ppa:chris-lea/node.js + sudo apt-get update + sudo apt-get install nodejs npm + +2. Enter the `js/` in Mopidy's Git repo dir and install all dependencies: + + cd js/ + npm install + +That's it. + +You can now run the tests: + + npm test + +To run tests automatically when you save a file: + + npm run-script watch + +To run tests, concatenate, minify the source, and update the JavaScript files +in `mopidy/frontends/http/data/`: + + npm run-script build + +To run other [grunt](http://gruntjs.com/) targets which isn't predefined in +`package.json` and thus isn't available through `npm run-script`: + + PATH=./node_modules/.bin:$PATH grunt foo diff --git a/js/README.rst b/js/README.rst deleted file mode 100644 index e8782213..00000000 --- a/js/README.rst +++ /dev/null @@ -1,62 +0,0 @@ -********* -Mopidy.js -********* - -This is the source for the JavaScript library that is installed as a part of -Mopidy's HTTP frontend. The library makes Mopidy's core API available from the -browser, using JSON-RPC messages over a WebSocket to communicate with Mopidy. - - -Getting it -========== - -Regular and minified versions of Mopidy.js, ready for use, is installed -together with Mopidy. When the HTTP frontend is running, the files are -available at: - -- http://localhost:6680/mopidy/mopidy.js -- http://localhost:6680/mopidy/mopidy.min.js - -You may need to adjust hostname and port for your local setup. - -In the source repo, you can find the files at: - -- ``mopidy/frontends/http/data/mopidy.js`` -- ``mopidy/frontends/http/data/mopidy.min.js`` - - -Building from source -==================== - -1. Install `Node.js `_ and npm. There is a PPA if you're - running Ubuntu:: - - sudo apt-get install python-software-properties - sudo add-apt-repository ppa:chris-lea/node.js - sudo apt-get update - sudo apt-get install nodejs npm - -2. Enter the ``js/`` dir and install development dependencies:: - - cd js/ - npm install - -That's it. - -You can now run the tests:: - - npm test - -To run tests automatically when you save a file:: - - npm run-script watch - -To run tests, concatenate, minify the source, and update the JavaScript files -in ``mopidy/frontends/http/data/``:: - - npm run-script build - -To run other `grunt `_ targets which isn't predefined in -``package.json`` and thus isn't available through ``npm run-script``:: - - PATH=./node_modules/.bin:$PATH grunt foo diff --git a/js/package.json b/js/package.json index f83c9273..d3398ca0 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,18 @@ { "name": "mopidy", - "version": "0.0.0", + "version": "0.0.1", + "description": "Client lib for controlling a Mopidy music server over a WebSocket", + "homepage": "http://www.mopidy.com/", + "author": { + "name": "Stein Magnus Jodal", + "email": "stein.magnus@jodal.no", + "url": "http://www.jodal.no" + }, + "repository": { + "type": "git", + "url": "git://github.com/mopidy/mopidy.git" + }, + "main": "src/mopidy.js", "dependencies": { "bane": "~0.4.0", "faye-websocket": "~0.4.4", From 1c0601e9d486a764d2054efb3b164cc20d7e64b3 Mon Sep 17 00:00:00 2001 From: Nick Steel Date: Mon, 25 Mar 2013 22:40:08 +0000 Subject: [PATCH 117/151] Append the Spotify playlist's owner to the playlist name for followed (subscribed) playlists (cherry picked from commit 176d3cca652ebbc98b68470ffa400e785ce20661) --- mopidy/backends/spotify/translator.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mopidy/backends/spotify/translator.py b/mopidy/backends/spotify/translator.py index 4d2f36a0..ba5f85da 100644 --- a/mopidy/backends/spotify/translator.py +++ b/mopidy/backends/spotify/translator.py @@ -70,13 +70,16 @@ def to_mopidy_playlist(spotify_playlist): uri = str(Link.from_playlist(spotify_playlist)) if not spotify_playlist.is_loaded(): return Playlist(uri=uri, name='[loading...]') - if not spotify_playlist.name(): + name = spotify_playlist.name() + if not name: # Other user's "starred" playlists isn't handled properly by pyspotify # See https://github.com/mopidy/pyspotify/issues/81 return + if spotify_playlist.owner().canonical_name() != settings.SPOTIFY_USERNAME: + name += ' by ' + spotify_playlist.owner().canonical_name() return Playlist( uri=uri, - name=spotify_playlist.name(), + name=name, tracks=[ to_mopidy_track(spotify_track) for spotify_track in spotify_playlist From e9292776d6ad25c94c229e0776c356a33196b302 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 01:47:12 +0100 Subject: [PATCH 118/151] Update changelog --- docs/changes.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/changes.rst b/docs/changes.rst index 47786a56..a5268d8f 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -28,6 +28,9 @@ v0.13.0 (in development) - Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`) +- For all playlists owned by other Spotify users, we now append the owner's + username to the playlist name. (Partly fixes: :issue:`114`) + **HTTP frontend** - Upgrade Mopidy.js' build system Grunt from 0.3 to 0.4. From 3c9f4e7183ed09ea9a5d6629a4b5b08f5ea7155a Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 01:47:18 +0100 Subject: [PATCH 119/151] Update authors --- AUTHORS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AUTHORS b/AUTHORS index 45e1a37e..72de1a7c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -14,3 +14,5 @@ - Trygve Aaberge - Wouter van Wijk - Jeremy B. Merrill +- 0xadam +- Nick Steel From 228f9bbf6b87741bdb4415f0c600020463dbc228 Mon Sep 17 00:00:00 2001 From: Zan Dobersek Date: Mon, 25 Mar 2013 09:47:28 +0100 Subject: [PATCH 120/151] Scanner doesn't work with Ogg Vorbis files Enhance the caps for the uridecodebin element by appending to them structures covering both audio/x-raw-int and audio/x-raw-float formats. (cherry picked from commit bc33fce7b1e30745a4d2fc7e96e1a3c2640cc40e) --- mopidy/scanner.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mopidy/scanner.py b/mopidy/scanner.py index bfeb9fd1..041f6fc4 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -152,8 +152,12 @@ class Scanner(object): self.fakesink.set_property('signal-handoffs', True) self.fakesink.connect('handoff', self.process_handoff) + uribin_caps = gst.Caps() + uribin_caps.append_structure(gst.structure_from_string(b'audio/x-raw-int')) + uribin_caps.append_structure(gst.structure_from_string(b'audio/x-raw-float')) + self.uribin = gst.element_factory_make('uridecodebin') - self.uribin.set_property('caps', gst.Caps(b'audio/x-raw-int')) + self.uribin.set_property('caps', uribin_caps) self.uribin.connect('pad-added', self.process_new_pad) self.pipe = gst.element_factory_make('pipeline') From 7c115076b0b043365690353f75ceba3d05a39916 Mon Sep 17 00:00:00 2001 From: Zan Dobersek Date: Mon, 25 Mar 2013 12:51:37 +0100 Subject: [PATCH 121/151] Add test coverage for scanning of Ogg files Provide a song1.ogg audio file, converted from the tests/data/scanner/simple/song1.mp3 file, and perform the same test checks on its scanned data that are performed for song1.mp3. The expected results are the same except for a small difference in the reported duration. (cherry picked from commit 61aa28f8a562f0b0722e2b3414677da82588fdb8) --- tests/data/scanner/simple/song1.ogg | Bin 0 -> 16415 bytes tests/scanner_test.py | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 tests/data/scanner/simple/song1.ogg diff --git a/tests/data/scanner/simple/song1.ogg b/tests/data/scanner/simple/song1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ee9aa6eed642622fac6a2361f96e67448b2b36df GIT binary patch literal 16415 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 Y`ENoIoN(g*P#+a6UUV2_Kp?>X0}ycUKmY&$ literal 0 HcmV?d00001 diff --git a/tests/scanner_test.py b/tests/scanner_test.py index d8466e26..585288f3 100644 --- a/tests/scanner_test.py +++ b/tests/scanner_test.py @@ -172,22 +172,29 @@ class ScannerTest(unittest.TestCase): self.check( 'scanner/simple/song1.mp3', 'uri', 'file://%s' % path_to_data_dir('scanner/simple/song1.mp3')) + self.check( + 'scanner/simple/song1.ogg', 'uri', + 'file://%s' % path_to_data_dir('scanner/simple/song1.ogg')) def test_duration_is_set(self): self.scan('scanner/simple') self.check('scanner/simple/song1.mp3', 'duration', 4680) + self.check('scanner/simple/song1.ogg', 'duration', 4608) def test_artist_is_set(self): self.scan('scanner/simple') self.check('scanner/simple/song1.mp3', 'artist', 'name') + self.check('scanner/simple/song1.ogg', 'artist', 'name') def test_album_is_set(self): self.scan('scanner/simple') self.check('scanner/simple/song1.mp3', 'album', 'albumname') + self.check('scanner/simple/song1.ogg', 'album', 'albumname') def test_track_is_set(self): self.scan('scanner/simple') self.check('scanner/simple/song1.mp3', 'title', 'trackname') + self.check('scanner/simple/song1.ogg', 'title', 'trackname') def test_nonexistant_folder_does_not_fail(self): self.scan('scanner/does-not-exist') From b2657566f46d75cf3e8d771f0ede83071e90feeb Mon Sep 17 00:00:00 2001 From: Zan Dobersek Date: Mon, 25 Mar 2013 16:40:30 +0100 Subject: [PATCH 122/151] Update the song1.ogg file Provide the Ogg file that matches the MP3 file (i.e. the file from which it was converted) in duration, specifically 4680 milliseconds. (cherry picked from commit e42c359821c410f10251ead492659a1f9563d2d7) --- tests/data/scanner/simple/song1.ogg | Bin 16415 -> 16466 bytes tests/scanner_test.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/data/scanner/simple/song1.ogg b/tests/data/scanner/simple/song1.ogg index ee9aa6eed642622fac6a2361f96e67448b2b36df..18f5a2d914749daa52516ab173dd3174fb8361d6 100644 GIT binary patch delta 14000 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 diff --git a/tests/scanner_test.py b/tests/scanner_test.py index 585288f3..617f2537 100644 --- a/tests/scanner_test.py +++ b/tests/scanner_test.py @@ -179,7 +179,7 @@ class ScannerTest(unittest.TestCase): def test_duration_is_set(self): self.scan('scanner/simple') self.check('scanner/simple/song1.mp3', 'duration', 4680) - self.check('scanner/simple/song1.ogg', 'duration', 4608) + self.check('scanner/simple/song1.ogg', 'duration', 4680) def test_artist_is_set(self): self.scan('scanner/simple') From 129894c01ed90609aae953aee800e4cb6d6322e8 Mon Sep 17 00:00:00 2001 From: Zan Dobersek Date: Mon, 25 Mar 2013 20:10:05 +0100 Subject: [PATCH 123/151] Clean up gst.Caps initialization There's no need for appending every audio/x-raw-* structure to the gst.Caps individually, they can all be listed inline inside the gst.Caps initialization. (cherry picked from commit 13f0bfffe17c07ddbc3a8e5fc1e29c0015502392) --- mopidy/scanner.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/mopidy/scanner.py b/mopidy/scanner.py index 041f6fc4..4b057774 100644 --- a/mopidy/scanner.py +++ b/mopidy/scanner.py @@ -152,12 +152,9 @@ class Scanner(object): self.fakesink.set_property('signal-handoffs', True) self.fakesink.connect('handoff', self.process_handoff) - uribin_caps = gst.Caps() - uribin_caps.append_structure(gst.structure_from_string(b'audio/x-raw-int')) - uribin_caps.append_structure(gst.structure_from_string(b'audio/x-raw-float')) - self.uribin = gst.element_factory_make('uridecodebin') - self.uribin.set_property('caps', uribin_caps) + self.uribin.set_property('caps', + gst.Caps(b'audio/x-raw-int; audio/x-raw-float')) self.uribin.connect('pad-added', self.process_new_pad) self.pipe = gst.element_factory_make('pipeline') From e21de8dc8c59274a7420634ae566d52213ec2b64 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 01:58:23 +0100 Subject: [PATCH 124/151] Update changelog and authors --- AUTHORS | 1 + docs/changes.rst | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/AUTHORS b/AUTHORS index 72de1a7c..1530f523 100644 --- a/AUTHORS +++ b/AUTHORS @@ -16,3 +16,4 @@ - Jeremy B. Merrill - 0xadam - Nick Steel +- Zan Dobersek diff --git a/docs/changes.rst b/docs/changes.rst index a5268d8f..0fed14b8 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -24,6 +24,10 @@ v0.13.0 (in development) the Mopidy process will now always make it log tracebacks for all alive threads. +**Local backend** + +- Make ``mopidy-scan`` work with Ogg Vorbis files. (Fixes: :issue:`275`) + **Spotify backend** - Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`) From 13f39c8bf72c583dcf2cb811b58a592a2c3087aa Mon Sep 17 00:00:00 2001 From: Nick Steel Date: Sat, 30 Mar 2013 11:54:06 +0000 Subject: [PATCH 125/151] Wrong module path for StreamBackend example --- mopidy/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mopidy/settings.py b/mopidy/settings.py index c7c5bb4c..d0d279c2 100644 --- a/mopidy/settings.py +++ b/mopidy/settings.py @@ -20,7 +20,7 @@ from __future__ import unicode_literals #: BACKENDS = ( #: u'mopidy.backends.local.LocalBackend', #: u'mopidy.backends.spotify.SpotifyBackend', -#: u'mopidy.backends.spotify.StreamBackend', +#: u'mopidy.backends.stream.StreamBackend', #: ) BACKENDS = ( 'mopidy.backends.local.LocalBackend', From 9e5f0703c71fb5b0c18778a48d221d1b4ade7264 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 13:16:19 +0100 Subject: [PATCH 126/151] audio: Fix UnicodeDecodeError when logging errors Fixes #347 --- docs/changes.rst | 5 +++++ mopidy/audio/actor.py | 12 ++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index 0fed14b8..46f266f4 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -24,6 +24,11 @@ v0.13.0 (in development) the Mopidy process will now always make it log tracebacks for all alive threads. +**Audio sub-system** + +- Make audio error logging handle log messages with non-ASCII chars. (Fixes: + :issue:`347`) + **Local backend** - Make ``mopidy-scan`` work with Ogg Vorbis files. (Fixes: :issue:`275`) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index b154e21a..d8d4e9bc 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -241,11 +241,19 @@ class Audio(pykka.ThreadingActor): self._on_end_of_stream() elif message.type == gst.MESSAGE_ERROR: error, debug = message.parse_error() - logger.error('%s %s', error, debug) + logger.error( + '%s\nError message: %s\nDebug message: %s', + str(error).decode('utf-8'), + error.message.decode('utf-8') or 'None', + debug.decode('utf-8') or 'None') self.stop_playback() elif message.type == gst.MESSAGE_WARNING: error, debug = message.parse_warning() - logger.warning('%s %s', error, debug) + logger.warning( + '%s\nError message: %s\nDebug message: %s', + str(error).decode('utf-8'), + error.message.decode('utf-8') or 'None', + debug.decode('utf-8') or 'None') def _on_playbin_state_changed(self, old_state, new_state, pending_state): if new_state == gst.STATE_READY and pending_state == gst.STATE_NULL: From 8a8a5109d610386170b56a17affeddad3a7ce3f3 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 14:57:37 +0100 Subject: [PATCH 127/151] audio: Remove redundant logging --- mopidy/audio/actor.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index d8d4e9bc..11d2741f 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -242,18 +242,14 @@ class Audio(pykka.ThreadingActor): elif message.type == gst.MESSAGE_ERROR: error, debug = message.parse_error() logger.error( - '%s\nError message: %s\nDebug message: %s', - str(error).decode('utf-8'), - error.message.decode('utf-8') or 'None', - debug.decode('utf-8') or 'None') + '%s Debug message: %s', + str(error).decode('utf-8'), debug.decode('utf-8') or 'None') self.stop_playback() elif message.type == gst.MESSAGE_WARNING: error, debug = message.parse_warning() logger.warning( - '%s\nError message: %s\nDebug message: %s', - str(error).decode('utf-8'), - error.message.decode('utf-8') or 'None', - debug.decode('utf-8') or 'None') + '%s Debug message: %s', + str(error).decode('utf-8'), debug.decode('utf-8') or 'None') def _on_playbin_state_changed(self, old_state, new_state, pending_state): if new_state == gst.STATE_READY and pending_state == gst.STATE_NULL: From eb58296d61856b9d10234ead5c5930f499fa0e50 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 15:02:04 +0100 Subject: [PATCH 128/151] Update changelog and authors --- AUTHORS | 1 + docs/changes.rst | 3 +++ 2 files changed, 4 insertions(+) diff --git a/AUTHORS b/AUTHORS index 1530f523..d6ede848 100644 --- a/AUTHORS +++ b/AUTHORS @@ -15,5 +15,6 @@ - Wouter van Wijk - Jeremy B. Merrill - 0xadam +- herrernst - Nick Steel - Zan Dobersek diff --git a/docs/changes.rst b/docs/changes.rst index 46f266f4..fd065b34 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -33,6 +33,9 @@ v0.13.0 (in development) - Make ``mopidy-scan`` work with Ogg Vorbis files. (Fixes: :issue:`275`) +- Fix playback of files with non-ASCII chars in their file path. (Fixes: + :issue:`353`) + **Spotify backend** - Let GStreamer handle time position tracking and seeks. (Fixes: :issue:`191`) From 31afbf6d708bd4194cb4fef86811d5d97b98e71a Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 15:19:26 +0100 Subject: [PATCH 129/151] docs: Add Mopidy Lux to client list --- docs/_static/dz0ny-mopidy-lux.png | Bin 0 -> 531799 bytes docs/clients/http.rst | 11 +++++++++++ 2 files changed, 11 insertions(+) create mode 100644 docs/_static/dz0ny-mopidy-lux.png diff --git a/docs/_static/dz0ny-mopidy-lux.png b/docs/_static/dz0ny-mopidy-lux.png new file mode 100644 index 0000000000000000000000000000000000000000..ffdd67ace2f9726cb0735a8774ad5705cda1e3bc GIT binary patch literal 531799 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

WSY)4%fL&pq?F6?>e_{XhTs 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໴W!yZJ9Z`p|<92F4WZrT^n|pZlZ#{Gaz-dF4<1 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

bL1sNIR*W>tY!@wv*YKc*qh zAqbzmM)#FD?M^k}U)Dm%$bHa;xjdHSCzfH@5JX%-hQ`02JQHE8I3_4-cKocE%3SAy z%|U;*RK~MC+q_RR%Wm%vs45Q^yi{qQnL3>dbTHtaaBAV_ z)hL<4rolnI*5lEKw`tkZyIbE*RS!@q-0Vr0vi#52nya76QMt6jaoeLbVOZk2rm!~~ za0EVdzjYy>weK$vUMni~NK&=Lh8j%;dp2`(18d`=!{JzYc}L~|@zIh_XKqoTcuPY< zD~$m+Pr<=2Hs{WQCugSovGtxAVXLF#sOlK7<4ZkApS59I!M%t`lBT#8l62^99voTN zUVxTsZB-$u+?uaiu|6aLGcNnXoN70z#uZfbmUPC>@KI#h!q>jdI%n=8!&wZ5i}eKI1{;hxpT{_vy#L;) zxiW=u+8al#0MWzPl0UdFxP11^Fb>&+AtUC}0SZQe!L4n;j2_+2VPu;zYZ_0&D7@az z?4gcevzA_1a_JUjjwxRQ9;M=%=9e!;eoQe;N;BmsB zyzb=4nvAF|4`Xl!+77M|YO*MAatM^g8I00SG9Ht$iDgCOcF1M-%hH>hcf)p#+Ew9k z7O-SE3Q~fMy^eg3XopWxb#j>nqVcvf3#X1iWC)}b)zFdgBnRk<*}2nXIACe4%DKFd zG9Wo|k<@1vnMqkcl0dPr!RUrf*aI65cfFiqcckXu8brLO1l6A5gC5(*<3KU?8MS(6 zM+hxtKU({vNB+be*kBq< zFB9QiWy>-)3lWxVn=Gl12El70mj>OgcElm-?LWKpTG)DqiT1`Uw&V33czvyHkG~4P zbjz^fIIf1Sr~;$PQ)19&825$y0_m`Pp*_a$evDRPOt;n`NaQt-yZOeH)T+3nA*!gG zF}5%s4tu))?y46YUHH}Xte4k26gK7L!sA)VVwZm&_I;08#q}Y$oEUb-hl_)+`)~?Msm_mC$(cOlXgEbI|0YY#VNEC-5<1;?eV z&Y(L^oGio@6PrQI?dmdLq7ixcRiuJ(Oz!%{b4sm52i4urZ;g$RnbY%6Sei;`OV|cD z9+M%L^QVj69KaOWmU}L>YC_#22}}yku#FV;m`}}K99>;5Jks>!XY`bmQYOhDg0qVV zrY@8=p&bx^!{u!O8Ev~1JHV`dX?(%`jfSf_w`q%(B!lifJH1ac$h3pdT$x#a@e|7T z`IM0N^k}{+MM=OT5DaYGbsbl^go|ub>uCR^CqLXdPXmkshe;A!^o&=2!4Go@S)n_bhx8)3 z)}Loa5s^|3M~bhXMp9r5&>kwo9@I>Kj0SUULA*s3G?n( zB2H5oLkVg(C*1=0%$RFvaeDbGK%%r^5$L)s(b(fKs^G-QZ{&>q6DSDogw|fbJ*@ou z>vhrYEYYh!44VEpdRSax&cVb~yg;C5STc5&Auv@?M<=7*LD=o5KH!=7=uCE3v1V<| zjfF#KO@Sl*ED7eklSiQA(_q@>j++(d-`r>rEIXQoEu|QO?VtmUO2w$>?2|-`

1O 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

eO$5 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 rD_@>Ul@}>W9|!$+`PXSL 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 Nl)q2Vljlfu4q@kfh& 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 xB~BBk6d05imGZP`SN! Date: Sat, 30 Mar 2013 15:19:36 +0100 Subject: [PATCH 130/151] docs: Add JukePi to clients list --- docs/clients/http.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/clients/http.rst b/docs/clients/http.rst index 76255561..67282396 100644 --- a/docs/clients/http.rst +++ b/docs/clients/http.rst @@ -40,6 +40,13 @@ New web client developed by Janez Troha. See https://github.com/dz0ny/mopidy-lux for details. +JukePi +====== + +New web client developed by Meantime IT in the UK for their office jukebox. See +https://github.com/meantimeit/jukepi for details. + + Rompr ===== From 0c05d7c60e05d799286a9012232d6d7432af1b19 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 15:20:55 +0100 Subject: [PATCH 131/151] docs: Update screenshot of woutervanwijk/Mopidy-Webclient --- .../woutervanwijk-mopidy-webclient.png | Bin 46487 -> 47992 bytes docs/clients/http.rst | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_static/woutervanwijk-mopidy-webclient.png b/docs/_static/woutervanwijk-mopidy-webclient.png index 0dd99acc9b9a52cc21dc994d12dd5b68f6615a8f..eee7516839f7766f4b6cfb74c7991d25c31e20c0 100644 GIT binary patch literal 47992 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]t{@&IJ{aTXA>sUjz55}`kjdD&V@BX>R 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 literal 46487 zcmafabyQqWmu*KN!IR(~+}$05yIbShc;nD$2o~I38h3XmxVw9BclXEdn|bri%zA6R zKl*g7>RWYBRoA^|pIy6x6y(H_;Bnvq005GtgoqLV@Gkl7^ZNPyTg|#o=*rs{wxg(q zqcYgk(Z#^t1R!J#HZ=JzX>9;9Q8FgIOIV%(eslJe4UO>~06_Surs>=74lw}0f>zt;Fh2XMSY)HY zZN1(2`nMl3pUz5F){n{tNWM85d|7t3vWmu4=HSBV;VkuW5|^d(he-fn++%8Fa+0~S zVd3;su!ymcNH*r-VKhq?%&C=y62?0h;Jb{T08%21AYdM4)%Ra!TY&OIH9_g*vY>w& zs|ZJ%bufvuy8Y~W^BBO!1^PJg3x$KVjW&`60I--$!0=QlJ~x?ZbcU^#1pxRgD>ssr zM+HX!f2UNddl6(>Lo8PZ$Uox%JgP=Dhsx8~iW)GIt$;vaC=Qp!%4s`CX7Wff*X5s% z4~>nG@ne7>oSq(`o}K_ECg?sr^(fV^+wX9$+@Z0>G}(%~nR6`hJmzT(33oO>FQ-jB zW`vxGv%y6|LLvraX=2UhesgqocJ}*s$hhY_Bq4R7X@~Locs=cj0!u;u;LW=2kOCMA zioPfkacpetqHxSBIK(68gXsbHTSGRNF&zGO;sZ!^RpY7EY+1aw)%^Fhbbg}%oSw=W zk@(uWx=B(F*;q|Bq;G@l*1RYLypb^}OFwbmLvhriSAV})=TImNttz!QS4BY?C^mW=H@BQ4u@1#&<>zT0H9p*fiJi&tihirqKFN1za&4F}p&ZzCP zI50XYgb(}tD1@1*D@I3$UQ0_xcD>r#4CC)_mNH`KayTo?e|vR%D=jVE>VB%*ieL61 zZ7)6PXbBQ=%D0;4$(Na0#&Mw#+{wdNIL)hVG4Z*LaXOr(I!@yE?ER$f2OO7?X!G3Y z9>C?Wq4Y{gOq|b?#m#Z)7ZUbH#$n~;=l2;Zy*Bx7`0LN%W|}ILZuU{`S3{*G2o32f zJ3b;gmWZeoG?r8nD(e3KyCdB~{58v5osqG{wAtNIxX=i6Av}Bez9j$ag zr+5gD#Ol>~Czr;PjiOZk^y_`@`XbeL{U<-T$#&=C<(c78&8gBff4`4`0e)>1vLU2S zqp4g5>jvXPKHN!smKX<&3kwUD#pFS_uXov_*?F?i)f(*C;?JsxNGA2nsNcR>$U~kV zoC;HCHX!}zuw7@sTC4X|#*@cEsM*~ZaGW}!3 z@x2X-$9ksL;&W{FvU+KBcp?4+)k7bD82@ApqTbII)>I|dRz>^jaju2WsAOeb&)t&uJWVt?pFUP9HV9lQ0d|R zeh9tdhPMZY)|4m;s9YQo&<4y7ikA$wj0LOR8Y@3!mnQSG51x&N-vm*zlp!WV%Z+$&EIr`z0 zpX3IkM_dI{SzfiK$2j}xvMKCTx%cONgt!h3J#4zAltmFO|2wxV^Tu zO0~12AR)ma9h0okQ&KiK+}f;E%Z~iIRac8G*R8cbX}Pa+cAlxRni(7%3^r}No!GKh z%WsV8&cIM*HDvj{1Cx^ycKQX7VT&>fd;t#;>gvVT$dsAUOUILU_vPp15%2cD{RP%b zbz)*-7at#QPm8s5K38g#?BlWz4biBTYBPaf-WO&O(FuE7F!!m@mO-{lB!ATtwL;Kd z&4vpqWgk%;9j}*M^cgr!1Rd@km2QjT`89{slkv)u%9U={--e_%!+c+Y>Y0194!L9-_v z)PS0r%~BXIF)_;U2nZXSn}<&$KZy;Q#4>A^vDsd(yH8bZtpNbm=_;mL%OrAXBb)~5 z#0Ii8Tsi#_Ty5NL#JjyD4p6#dq2)}n>Li~QJGk(&fJ!-^)jHssx^r=`34?BF4h=}| zl=!&>W`#v&d00T`6W<4Z=hc|4qLZ|_8 zy=Gfr_QQti`?>-^*(%`7tJAQOls{QEF8^&ctH`oKdLY$lCQAYpq ztGDc-xbjr%698ZqDG*THWO^OXauMe2_cW8@dOa+-^j7b~m77(vejUTov(1u}Wl-hv zc}|ny&9}=tP(zWD`BoYgO|tg%o42bUDA_)L%hfG>^JrC`uFC>)f{2C$_=zGhRIvz# zp(LOp*FPo%{JfRxWQ}97oqd~;NIw*rx0d~HqxqK+RLy;?=TTY~;3Nwbt7N(}E1WOtAHS?i`#GT_py!gsY2!db6V-{BE9-JHX}h=YMZvg0 z%v_J)gE;FniuV9P&uy7uIyzKFYd6F_gUoDKhpFX(5n+W`d~8Vlg(o**R0X53HpK%7}=FDpyGB{%3M08s=iFhpA-CjtZ+EJfV42122=H+T?|F2 z)gk{^0H8>@&tH$U0Bzj*0aQhMm}tQ=o%eSx2T{fO zF(bVfagrsPoam#4Y2LLxI{HPX*?z?tIp14Xthb}x9%cQx?ipS)!XR|8Jt4mwI+NoH zPYsKKv=?@f^};Oh)@IR?^@xfUw$(yY;?Hg{oIPetc<>hlR}UsGu%QCe*90x9Z&S67 ziNtI?3upru@d|%X&tQzx&B{bUY9sZ=_Zh!zD4(YRfU`! zJpA;>WLygVu3H(dh1QP$#W=s`+K)g@H_afT8~TKbZo=nTd^}wi2gl`tdhRf_X@tsh|HC)D zwOJ#{Qj*5%bY)0_ayYa(NvBKZSk~FT!&0fyo|ynsU--#NBS%?8eHMwR+>b_o-qrE) zs$zrDOobXdr+&lQz`nC}+N1i<$?-n%S5a+OiU%TUvF>8yCFj$lOorY9FbhjD#Q%pd zSWkc*CSS$0w>wuQHa@84=()*lDS3}^kCW&Jwc5>w=Emmm(L?%Y0Klm{t#ZV=HmCCE z=acOD8kZB;UUyrTy5-f6ef#JzWM;{x7Fk{0wl*-RF?m^s8i|LQd>_lB$&>mdQL$VO z_JM3kS(DR8Xlg14&7W@1t6e!@j2W#~c;@F5{q;h<5+WqU{UwRJCVMD;YC&j1tSv{Q z#-RJ$+yPi>0|v7t@6j&AD2O)fqG(iv z=pt%W_jG^ui#3cz%C>gb`Y^EELYoV0bw_nG~~stgnzzIR>R=%c)J=gR82)ZK5jc#mzYW0^;$7=8a6V*IBMijY&%LSC*v1gEZaL&9Pq>(hAPb zQZz-Yh-FHtlTQ*pT5^ z=irZV0oI=w$$VQb?ps5mA|}Mtn4D}~c$6x%Q_bWji%oy}t22niqi!@zKaG8YWK&Vd zbrgt*+5qw7=VpgRQ&fC*;r7e#YNxxGt1kuRO@urzNO1>Zv#`xtILxtWWn@&^WJ2ZL zW&bXUnt1ShAb$uSFl=*8-3Oh9*Kw)cOfQXH;p>=Ok4e*%-Gd%E{eP(^#f&mJRnWT{Ll(=D#cqSa)`vV6spZjaljwOrwSzQ%H^#l+|HZW!Kl+jCf{JKShXMVs zKuA-3pXxUvMNzMdG#>EE5(Mb(!JfsUEZJ&qGG-64*5d&S=1!Ej1?7Ct#+uf~ zh@&p}BE4cnz0@%^=7XlDC?t0>)%}>&`}V~AOr>)Fq5_;5MgXNGS#EM|PiE5ZsGiBT ze0TyLMth&zPwMrjlEe0W>C%;0jmh$&3jV7G&$gr~t0*!_#_ai_$tpKU>#XU#e3)iL z&NEp{io`^CxRjEve@xvezxzGE!4X@Qyw+ed9Fv}4ZgqjGr7qg~W*?ZYwI4Uzrp?E3 zpeFWj>o9GJ?9cusTG62V(H8UFnZ?D8sagxHHVxz^!rv+&wa=ROXG9|iV z*EnaE9Yu3ZxGpAFLGk+$c&UNQeBN>ZYu|KrZ0Q5KN$woIxZiJS4vTHWJk<;G%Y)X# zA9-z+m9jiw5S`K-R=gOnF&8}<`p6-wxoZ-v`%}HqRH^_3cdZ_b3k$u~>*$>!sNeJ!>zVR1 z@2wBZ__Sz-ISE&#OWGtDX38zb5;jy|>l^U8`YHPN0@RL?N_9W$3G`EygV_pBNh3NK z;!MmozH$zdR6MY1P(xfFVzkEuEf=0@?)*L8$)%%+-pgBfSzwq7!`H`KrxT_dmgpKZC;U87xOvVMocRs4(*|=)#}0RGU%+)nDp|4})%e0f zORXdD!9VR?tKg zFki4nGChA{BVeM!m+N;Geq=Z`AYY$ZRJyx?X#ao}Gf*ldj{50Qh%@u2r@6NF%$mHB z@Q$Itf~_dy31VHEv23AQs;RyaF~)fz_ehx%z&=iE)^DsY)BuTUF0 zB8$lQLHEax06@;RfRFj{y8e$Yg<`vO3X`2nIH&C7{rq{0MboNTl{pKkAOZf(ejaNj zqJtS&ZGua?oxU|$EH{jJQ!%VOs8ARUCYxO~wF_gAf690TQZ&nt$ZOVOZ3IkZC%mJu zagS>gHMOKjG4$55es{=mQGB9SCq)j!F$Ubn9MR8FTS%+Ku2Hw%0fiye#tqSYvlG3X z0>@!ZD#Sf%o4YFsb*4z_85aNHL8*jHdWOUUMN;V9@5i8{5+=n z`LJ}@P!}W98_lp9DSDN z2Bf>m{ko9spHzR6$Mg8HLE|u+N&dG;`6R)r~3&F0Jajzl)wcCvsA9v#6 z1mjnZd)=$*7DMCKvG+%-d40X4JH+i>)zT=q$P7ChGfLUcE1sn^7YH90^P;b|&+Q7y z%dF|HY-PITn+cye^Us7?V-NbtWXM236;jirq>SpWJ98HkP`>r?OwUlbWDiUa*nZF) zgZ${KIVg|+Sk=U*$YdLJx?}QZo~!EzimI>_SZU-wDwQUy4arPP^UB1B09qk`LD~sm z)X$+!>d&p|;K% z=Dw<(eGVP8N7^$emKB{fQZiq(YGQpC(v?+Rv!{Z040_92;^R%Nm{3OM3Kp$Bmo)c+ z8qJWUO*rpiu@nRZS@w&t8>?8@SU5~CsRyvRxq0-IW*zzXFKfkty$lTK7T8N#*o@ee zWO;RC6*9DRHU2Zmui&i`vD+}0SGR5&dM>?27pe_|#bzgd1dzK5>8Wh*N;A_f;Z7E+ zVPXRoi>*ScY0qp={E@KeShd49z4#b+ZS4~De1PPH`dBJ2t`nWMb@4=!<9?5nN^-&z zDc^cW_ErmK<=hO#%U-Cmf5q8k5<&vKc0Voor<{uU%+ zs03aKAxi6Lq!7Z?I9i?QFm1{9@2=p^F}()Yd!I;No@q^61PY#u1C2xsuX8044V5Tk zBxDNs>09i~i*>qY=e(#749&(-;aW4?Og{8S-xz+HZ;bQJXF}M}3x3EjxiC}UCR^-X zVP8|Jwj$n+x{~|v$6tZ zG)`36JS171zWjTjHp2!c#yJxzEX0`=p1xABP^3pn6b-^}@ql<+d$E3+mfFf=5S2AY z?xp;vzQ!;fB+z2d@FCy61Ru{aDK6LJy-5E3c%{>9N3J?=Q5}IQX=j0oW9x(qBZy2A zQSYApZS9e$e@1kIuVP7m3)DSMTD7P8)_*Rn)(-A#DJ)REjeDcAO)NzFbU#PhFcmkV z0L4tPZhmFhIToRir)J%)1%C3C>$o$#_c(NVH#QiY%W6O52m6f=Q!=flXe&{p>aYA9 z8^~y1JG>TIH-)x<;AM3H8(pWR-`V&s;A#Yd@z|hUC-5rDZ)%cjeT@Ax1wKhEzE@_; zB9C7VcEY^wka}dG!>`4!EjZ%0T-=HIQfs>}zs>PhYAm%iU9iXJB5O9!W@l?!+h3N+ zXQb-M@p@{MW$AaqsbC9Zyebyy6^5a7zF+X&i#xDedmicW;*7%s&)juBX$y&MOdqOccG*!%DAyXMvE$aS0wyMv@^OXIQKNtz=As}YynYAeUH&xdqZJ!5m(&-*}ljt}e zougZJDK45pH&84Xoe%fCM0;JI0`8Q-Y_-p7v;|w+2DG5)>mNrF31gwJW3$$Zi z%gewUDC7+pcwBj%q&e9wZbrFL!1#a1sD6h@ex=%O zbg=QZK3X}&N<^f+`FrZ%vND+?g)hdS!!`T-RK)=18cwjW3g7whVa|AdI-lWq8R?KU z;nq*pGEj?9^Jb>bOgD{=GIwoQb?xS+j)mM?_x471FihB+ZW*2Ixo9_5wL0()i+K=v z47-uONC{ZKg7A0I4Wrk8NT186@Tqt7A4e5haA#vsX0nRSHmSCaa-6J@m za4f~U-9+7Iv2c9$9PnVQh@y)j7|(~NT{#L2zup~zw+#V;u4fv8XlS#P2(`}L_>o+)+8`UqvF<#fV_Qs}7? zhO#4dlhVf^p{>I+4^e#g;$pS!reEO@oSFUfi1_kncJ#AXlt+pd?cs8(>9H%CJH!iA zclF?K2OO@|LHLDv)Z}ixc5v-Zu+om|?H>YJLx_fPx9#nIGz?}@eSAge(PL%(wJ%e^{|Jubs|c-ZaL;i=(+_5vMG00cazHB zJT@537mBRK(>Rn*;%x6wSQ|OE@4yT}Xvt>#&NoqI?8U=q3BbO)Owh2c#Df7PQ=sb$nG>-`%b0KC36b#9?D172!q` z

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 Y7O;bsDhxZ^fKPpr5RnzG7Ss>;KMm1+Q2+n{ diff --git a/docs/clients/http.rst b/docs/clients/http.rst index 67282396..5381eaff 100644 --- a/docs/clients/http.rst +++ b/docs/clients/http.rst @@ -18,8 +18,8 @@ woutervanwijk/Mopidy-Webclient ============================== .. image:: /_static/woutervanwijk-mopidy-webclient.png - :width: 410 - :height: 511 + :width: 382 + :height: 621 The first web client for Mopidy is still under development, but is already very usable. It targets both desktop and mobile browsers. From e6460b69457db35c44da27015e20b2580a1c74fb Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 21:01:01 +0100 Subject: [PATCH 132/151] jsonrpc: Handle Pykka's CallableProxy objects as regular methods --- mopidy/utils/jsonrpc.py | 2 +- tests/utils/jsonrpc_test.py | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/mopidy/utils/jsonrpc.py b/mopidy/utils/jsonrpc.py index 8230aada..503921dc 100644 --- a/mopidy/utils/jsonrpc.py +++ b/mopidy/utils/jsonrpc.py @@ -181,7 +181,7 @@ class JsonRpcWrapper(object): data='"params", if given, must be an array or an object') def _get_method(self, method_path): - if inspect.isroutine(self.objects.get(method_path, None)): + if callable(self.objects.get(method_path, None)): # The mounted object is the callable return self.objects[method_path] diff --git a/tests/utils/jsonrpc_test.py b/tests/utils/jsonrpc_test.py index 44ec1b09..226d4614 100644 --- a/tests/utils/jsonrpc_test.py +++ b/tests/utils/jsonrpc_test.py @@ -48,6 +48,7 @@ class JsonRpcTestBase(unittest.TestCase): 'core': self.core, 'core.playback': self.core.playback, 'core.tracklist': self.core.tracklist, + 'get_uri_schemes': self.core.get_uri_schemes, }, encoders=[models.ModelJSONEncoder], decoders=[models.model_json_decoder]) @@ -188,6 +189,23 @@ class JsonRpcSingleCommandTest(JsonRpcTestBase): self.assertEqual(response['result'], None) + def test_call_method_which_is_a_directly_mounted_actor_member(self): + # 'get_uri_schemes' isn't a regular callable, but a Pykka + # CallableProxy. This test checks that CallableProxy objects are + # threated by JsonRpcWrapper like any other callable. + + request = { + 'jsonrpc': '2.0', + 'method': 'get_uri_schemes', + 'id': 1, + } + response = self.jrw.handle_data(request) + + self.assertEqual(response['jsonrpc'], '2.0') + self.assertEqual(response['id'], 1) + self.assertNotIn('error', response) + self.assertEqual(response['result'], ['dummy']) + def test_call_method_with_positional_params(self): request = { 'jsonrpc': '2.0', @@ -588,6 +606,7 @@ class JsonRpcInspectorTest(JsonRpcTestBase): def test_inspector_can_describe_a_bunch_of_large_classes(self): inspector = jsonrpc.JsonRpcInspector({ + 'core.get_uri_schemes': core.Core.get_uri_schemes, 'core.library': core.LibraryController, 'core.playback': core.PlaybackController, 'core.playlists': core.PlaylistsController, @@ -596,6 +615,9 @@ class JsonRpcInspectorTest(JsonRpcTestBase): methods = inspector.describe() + self.assertIn('core.get_uri_schemes', methods) + self.assertEquals(len(methods['core.get_uri_schemes']['params']), 0) + self.assertIn('core.library.lookup', methods.keys()) self.assertEquals( methods['core.library.lookup']['params'][0]['name'], 'uri') From 4414deae1dc15740e90ff19a1817d4ba7768f056 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 21:01:35 +0100 Subject: [PATCH 133/151] http: Expose core.get_uri_schemes (Fixes #361) --- docs/changes.rst | 3 +++ mopidy/frontends/http/ws.py | 2 ++ 2 files changed, 5 insertions(+) diff --git a/docs/changes.rst b/docs/changes.rst index fd065b34..af54fd83 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -49,6 +49,9 @@ v0.13.0 (in development) - Upgrade Mopidy.js' dependencies when.js from 1.6.1 to 1.8.1. +- Expose :meth:`mopidy.core.Core.get_uri_schemes` to HTTP clients. It is + available through Mopidy.js as ``mopidy.getUriSchemes()``. + **MPRIS frontend** - Publish album art URIs if available. diff --git a/mopidy/frontends/http/ws.py b/mopidy/frontends/http/ws.py index d325c359..7f24850f 100644 --- a/mopidy/frontends/http/ws.py +++ b/mopidy/frontends/http/ws.py @@ -20,6 +20,7 @@ class WebSocketResource(object): self._core = core_proxy inspector = jsonrpc.JsonRpcInspector( objects={ + 'core.get_uri_schemes': core.Core.get_uri_schemes, 'core.library': core.LibraryController, 'core.playback': core.PlaybackController, 'core.playlists': core.PlaylistsController, @@ -28,6 +29,7 @@ class WebSocketResource(object): self.jsonrpc = jsonrpc.JsonRpcWrapper( objects={ 'core.describe': inspector.describe, + 'core.get_uri_schemes': self._core.get_uri_schemes, 'core.library': self._core.library, 'core.playback': self._core.playback, 'core.playlists': self._core.playlists, From 1704828504f703709d92c43cf148362196ae7f35 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 22:14:33 +0100 Subject: [PATCH 134/151] backends: Make search/find_exact take a query dict instead of kwargs --- mopidy/backends/base.py | 4 ++-- mopidy/backends/local/library.py | 8 +++++-- mopidy/backends/spotify/library.py | 6 ++--- mopidy/core/library.py | 5 +++-- tests/core/library_test.py | 36 ++++++++++++++++++++---------- 5 files changed, 38 insertions(+), 21 deletions(-) diff --git a/mopidy/backends/base.py b/mopidy/backends/base.py index f49aa89b..f7871d44 100644 --- a/mopidy/backends/base.py +++ b/mopidy/backends/base.py @@ -53,7 +53,7 @@ class BaseLibraryProvider(object): def __init__(self, backend): self.backend = backend - def find_exact(self, **query): + def find_exact(self, query=None): """ See :meth:`mopidy.core.LibraryController.find_exact`. @@ -77,7 +77,7 @@ class BaseLibraryProvider(object): """ pass - def search(self, **query): + def search(self, query=None): """ See :meth:`mopidy.core.LibraryController.search`. diff --git a/mopidy/backends/local/library.py b/mopidy/backends/local/library.py index eb328ce2..ebdd6f9d 100644 --- a/mopidy/backends/local/library.py +++ b/mopidy/backends/local/library.py @@ -35,7 +35,9 @@ class LocalLibraryProvider(base.BaseLibraryProvider): logger.debug('Failed to lookup %r', uri) return [] - def find_exact(self, **query): + def find_exact(self, query=None): + if query is None: + query = {} self._validate_query(query) result_tracks = self._uri_mapping.values() @@ -72,7 +74,9 @@ class LocalLibraryProvider(base.BaseLibraryProvider): raise LookupError('Invalid lookup field: %s' % field) return SearchResult(uri='file:search', tracks=result_tracks) - def search(self, **query): + def search(self, query=None): + if query is None: + query = {} self._validate_query(query) result_tracks = self._uri_mapping.values() diff --git a/mopidy/backends/spotify/library.py b/mopidy/backends/spotify/library.py index 96e5f616..0a58a79a 100644 --- a/mopidy/backends/spotify/library.py +++ b/mopidy/backends/spotify/library.py @@ -62,8 +62,8 @@ class SpotifyTrack(Track): class SpotifyLibraryProvider(base.BaseLibraryProvider): - def find_exact(self, **query): - return self.search(**query) + def find_exact(self, query=None): + return self.search(query=query) def lookup(self, uri): try: @@ -131,7 +131,7 @@ class SpotifyLibraryProvider(base.BaseLibraryProvider): def refresh(self, uri=None): pass # TODO - def search(self, **query): + def search(self, query=None): if not query: return self._get_all_tracks() diff --git a/mopidy/core/library.py b/mopidy/core/library.py index 29b2e797..26216846 100644 --- a/mopidy/core/library.py +++ b/mopidy/core/library.py @@ -43,7 +43,8 @@ class LibraryController(object): """ query = query or kwargs futures = [ - b.library.find_exact(**query) for b in self.backends.with_library] + b.library.find_exact(query=query) + for b in self.backends.with_library] return [result for result in pykka.get_all(futures) if result] def lookup(self, uri): @@ -106,5 +107,5 @@ class LibraryController(object): """ query = query or kwargs futures = [ - b.library.search(**query) for b in self.backends.with_library] + b.library.search(query=query) for b in self.backends.with_library] return [result for result in pykka.get_all(futures) if result] diff --git a/tests/core/library_test.py b/tests/core/library_test.py index e01696c7..603a8109 100644 --- a/tests/core/library_test.py +++ b/tests/core/library_test.py @@ -87,8 +87,10 @@ class CoreLibraryTest(unittest.TestCase): self.assertIn(result1, result) self.assertIn(result2, result) - self.library1.find_exact.assert_called_once_with(any=['a']) - self.library2.find_exact.assert_called_once_with(any=['a']) + self.library1.find_exact.assert_called_once_with( + query=dict(any=['a'])) + self.library2.find_exact.assert_called_once_with( + query=dict(any=['a'])) def test_find_exact_filters_out_none(self): track1 = Track(uri='dummy1:a') @@ -103,8 +105,10 @@ class CoreLibraryTest(unittest.TestCase): self.assertIn(result1, result) self.assertNotIn(None, result) - self.library1.find_exact.assert_called_once_with(any=['a']) - self.library2.find_exact.assert_called_once_with(any=['a']) + self.library1.find_exact.assert_called_once_with( + query=dict(any=['a'])) + self.library2.find_exact.assert_called_once_with( + query=dict(any=['a'])) def test_find_accepts_query_dict_instead_of_kwargs(self): track1 = Track(uri='dummy1:a') @@ -121,8 +125,10 @@ class CoreLibraryTest(unittest.TestCase): self.assertIn(result1, result) self.assertIn(result2, result) - self.library1.find_exact.assert_called_once_with(any=['a']) - self.library2.find_exact.assert_called_once_with(any=['a']) + self.library1.find_exact.assert_called_once_with( + query=dict(any=['a'])) + self.library2.find_exact.assert_called_once_with( + query=dict(any=['a'])) def test_search_combines_results_from_all_backends(self): track1 = Track(uri='dummy1:a') @@ -139,8 +145,10 @@ class CoreLibraryTest(unittest.TestCase): self.assertIn(result1, result) self.assertIn(result2, result) - self.library1.search.assert_called_once_with(any=['a']) - self.library2.search.assert_called_once_with(any=['a']) + self.library1.search.assert_called_once_with( + query=dict(any=['a'])) + self.library2.search.assert_called_once_with( + query=dict(any=['a'])) def test_search_filters_out_none(self): track1 = Track(uri='dummy1:a') @@ -155,8 +163,10 @@ class CoreLibraryTest(unittest.TestCase): self.assertIn(result1, result) self.assertNotIn(None, result) - self.library1.search.assert_called_once_with(any=['a']) - self.library2.search.assert_called_once_with(any=['a']) + self.library1.search.assert_called_once_with( + query=dict(any=['a'])) + self.library2.search.assert_called_once_with( + query=dict(any=['a'])) def test_search_accepts_query_dict_instead_of_kwargs(self): track1 = Track(uri='dummy1:a') @@ -173,5 +183,7 @@ class CoreLibraryTest(unittest.TestCase): self.assertIn(result1, result) self.assertIn(result2, result) - self.library1.search.assert_called_once_with(any=['a']) - self.library2.search.assert_called_once_with(any=['a']) + self.library1.search.assert_called_once_with( + query=dict(any=['a'])) + self.library2.search.assert_called_once_with( + query=dict(any=['a'])) From c54db3298f1958a50d0ebdf2327b0e1df4ea15b7 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 22:19:13 +0100 Subject: [PATCH 135/151] backends: Make search/find_exact accept 'uris' kwarg --- mopidy/backends/base.py | 4 ++-- mopidy/backends/local/library.py | 8 ++++++-- mopidy/backends/spotify/library.py | 8 +++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/mopidy/backends/base.py b/mopidy/backends/base.py index f7871d44..415ef2a5 100644 --- a/mopidy/backends/base.py +++ b/mopidy/backends/base.py @@ -53,7 +53,7 @@ class BaseLibraryProvider(object): def __init__(self, backend): self.backend = backend - def find_exact(self, query=None): + def find_exact(self, query=None, uris=None): """ See :meth:`mopidy.core.LibraryController.find_exact`. @@ -77,7 +77,7 @@ class BaseLibraryProvider(object): """ pass - def search(self, query=None): + def search(self, query=None, uris=None): """ See :meth:`mopidy.core.LibraryController.search`. diff --git a/mopidy/backends/local/library.py b/mopidy/backends/local/library.py index ebdd6f9d..f2a1a520 100644 --- a/mopidy/backends/local/library.py +++ b/mopidy/backends/local/library.py @@ -35,7 +35,9 @@ class LocalLibraryProvider(base.BaseLibraryProvider): logger.debug('Failed to lookup %r', uri) return [] - def find_exact(self, query=None): + def find_exact(self, query=None, uris=None): + # TODO Only return results within URI roots given by ``uris`` + if query is None: query = {} self._validate_query(query) @@ -74,7 +76,9 @@ class LocalLibraryProvider(base.BaseLibraryProvider): raise LookupError('Invalid lookup field: %s' % field) return SearchResult(uri='file:search', tracks=result_tracks) - def search(self, query=None): + def search(self, query=None, uris=None): + # TODO Only return results within URI roots given by ``uris`` + if query is None: query = {} self._validate_query(query) diff --git a/mopidy/backends/spotify/library.py b/mopidy/backends/spotify/library.py index 0a58a79a..7afde913 100644 --- a/mopidy/backends/spotify/library.py +++ b/mopidy/backends/spotify/library.py @@ -62,8 +62,8 @@ class SpotifyTrack(Track): class SpotifyLibraryProvider(base.BaseLibraryProvider): - def find_exact(self, query=None): - return self.search(query=query) + def find_exact(self, query=None, uris=None): + return self.search(query=query, uris=uris) def lookup(self, uri): try: @@ -131,7 +131,9 @@ class SpotifyLibraryProvider(base.BaseLibraryProvider): def refresh(self, uri=None): pass # TODO - def search(self, query=None): + def search(self, query=None, uris=None): + # TODO Only return results within URI roots given by ``uris`` + if not query: return self._get_all_tracks() From 2abce2af38dcf3c4c7e16506cf9eb4855115bcd0 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 22:20:12 +0100 Subject: [PATCH 136/151] core: Limit search to backends matching URI roots Fixes #337 --- mopidy/core/library.py | 61 +++++++++++++++++++++++++++++++------- tests/core/library_test.py | 58 ++++++++++++++++++++++++++++-------- 2 files changed, 96 insertions(+), 23 deletions(-) diff --git a/mopidy/core/library.py b/mopidy/core/library.py index 26216846..50d75144 100644 --- a/mopidy/core/library.py +++ b/mopidy/core/library.py @@ -1,5 +1,6 @@ from __future__ import unicode_literals +from collections import defaultdict import urlparse import pykka @@ -16,35 +17,60 @@ class LibraryController(object): uri_scheme = urlparse.urlparse(uri).scheme return self.backends.with_library_by_uri_scheme.get(uri_scheme, None) - def find_exact(self, query=None, **kwargs): + def _get_backends_to_uris(self, uris): + if uris: + backends_to_uris = defaultdict(list) + for uri in uris: + backend = self._get_backend(uri) + if backend is not None: + backends_to_uris[backend].append(uri) + else: + backends_to_uris = dict([ + (b, None) for b in self.backends.with_library]) + return backends_to_uris + + def find_exact(self, query=None, uris=None, **kwargs): """ Search the library for tracks where ``field`` is ``values``. If the query is empty, and the backend can support it, all available tracks are returned. + If ``uris`` is given, the search is limited to results from within the + URI roots. For example passing ``uris=['file:']`` will limit the search + to the local backend. + Examples:: - # Returns results matching 'a' + # Returns results matching 'a' from any backend find_exact({'any': ['a']}) find_exact(any=['a']) - # Returns results matching artist 'xyz' + # Returns results matching artist 'xyz' from any backend find_exact({'artist': ['xyz']}) find_exact(artist=['xyz']) - # Returns results matching 'a' and 'b' and artist 'xyz' + # Returns results matching 'a' and 'b' and artist 'xyz' from any + # backend find_exact({'any': ['a', 'b'], 'artist': ['xyz']}) find_exact(any=['a', 'b'], artist=['xyz']) + # Returns results matching 'a' if within the given URI roots + # "file:///media/music" and "spotify:" + find_exact( + {'any': ['a']}, uris=['file:///media/music', 'spotify:']) + find_exact(any=['a'], uris=['file:///media/music', 'spotify:']) + :param query: one or more queries to search for :type query: dict + :param uris: zero or more URI roots to limit the search to + :type uris: list of strings or :class:`None` :rtype: list of :class:`mopidy.models.SearchResult` """ query = query or kwargs futures = [ - b.library.find_exact(query=query) - for b in self.backends.with_library] + backend.library.find_exact(query=query, uris=uris) + for (backend, uris) in self._get_backends_to_uris(uris).items()] return [result for result in pykka.get_all(futures) if result] def lookup(self, uri): @@ -80,32 +106,45 @@ class LibraryController(object): b.library.refresh(uri) for b in self.backends.with_library] pykka.get_all(futures) - def search(self, query=None, **kwargs): + def search(self, query=None, uris=None, **kwargs): """ Search the library for tracks where ``field`` contains ``values``. If the query is empty, and the backend can support it, all available tracks are returned. + If ``uris`` is given, the search is limited to results from within the + URI roots. For example passing ``uris=['file:']`` will limit the search + to the local backend. + Examples:: - # Returns results matching 'a' + # Returns results matching 'a' in any backend search({'any': ['a']}) search(any=['a']) - # Returns results matching artist 'xyz' + # Returns results matching artist 'xyz' in any backend search({'artist': ['xyz']}) search(artist=['xyz']) - # Returns results matching 'a' and 'b' and artist 'xyz' + # Returns results matching 'a' and 'b' and artist 'xyz' in any + # backend search({'any': ['a', 'b'], 'artist': ['xyz']}) search(any=['a', 'b'], artist=['xyz']) + # Returns results matching 'a' if within the given URI roots + # "file:///media/music" and "spotify:" + search({'any': ['a']}, uris=['file:///media/music', 'spotify:']) + search(any=['a'], uris=['file:///media/music', 'spotify:']) + :param query: one or more queries to search for :type query: dict + :param uris: zero or more URI roots to limit the search to + :type uris: list of strings or :class:`None` :rtype: list of :class:`mopidy.models.SearchResult` """ query = query or kwargs futures = [ - b.library.search(query=query) for b in self.backends.with_library] + backend.library.search(query=query, uris=uris) + for (backend, uris) in self._get_backends_to_uris(uris).items()] return [result for result in pykka.get_all(futures) if result] diff --git a/tests/core/library_test.py b/tests/core/library_test.py index 603a8109..6e9d240a 100644 --- a/tests/core/library_test.py +++ b/tests/core/library_test.py @@ -88,9 +88,26 @@ class CoreLibraryTest(unittest.TestCase): self.assertIn(result1, result) self.assertIn(result2, result) self.library1.find_exact.assert_called_once_with( - query=dict(any=['a'])) + query=dict(any=['a']), uris=None) self.library2.find_exact.assert_called_once_with( - query=dict(any=['a'])) + query=dict(any=['a']), uris=None) + + def test_find_exact_with_uris_selects_dummy1_backend(self): + self.core.library.find_exact( + any=['a'], uris=['dummy1:', 'dummy1:foo', 'dummy3:']) + + self.library1.find_exact.assert_called_once_with( + query=dict(any=['a']), uris=['dummy1:', 'dummy1:foo']) + self.assertFalse(self.library2.find_exact.called) + + def test_find_exact_with_uris_selects_both_backends(self): + self.core.library.find_exact( + any=['a'], uris=['dummy1:', 'dummy1:foo', 'dummy2:']) + + self.library1.find_exact.assert_called_once_with( + query=dict(any=['a']), uris=['dummy1:', 'dummy1:foo']) + self.library2.find_exact.assert_called_once_with( + query=dict(any=['a']), uris=['dummy2:']) def test_find_exact_filters_out_none(self): track1 = Track(uri='dummy1:a') @@ -106,9 +123,9 @@ class CoreLibraryTest(unittest.TestCase): self.assertIn(result1, result) self.assertNotIn(None, result) self.library1.find_exact.assert_called_once_with( - query=dict(any=['a'])) + query=dict(any=['a']), uris=None) self.library2.find_exact.assert_called_once_with( - query=dict(any=['a'])) + query=dict(any=['a']), uris=None) def test_find_accepts_query_dict_instead_of_kwargs(self): track1 = Track(uri='dummy1:a') @@ -126,9 +143,9 @@ class CoreLibraryTest(unittest.TestCase): self.assertIn(result1, result) self.assertIn(result2, result) self.library1.find_exact.assert_called_once_with( - query=dict(any=['a'])) + query=dict(any=['a']), uris=None) self.library2.find_exact.assert_called_once_with( - query=dict(any=['a'])) + query=dict(any=['a']), uris=None) def test_search_combines_results_from_all_backends(self): track1 = Track(uri='dummy1:a') @@ -146,9 +163,26 @@ class CoreLibraryTest(unittest.TestCase): self.assertIn(result1, result) self.assertIn(result2, result) self.library1.search.assert_called_once_with( - query=dict(any=['a'])) + query=dict(any=['a']), uris=None) self.library2.search.assert_called_once_with( - query=dict(any=['a'])) + query=dict(any=['a']), uris=None) + + def test_search_with_uris_selects_dummy1_backend(self): + self.core.library.search( + query=dict(any=['a']), uris=['dummy1:', 'dummy1:foo', 'dummy3:']) + + self.library1.search.assert_called_once_with( + query=dict(any=['a']), uris=['dummy1:', 'dummy1:foo']) + self.assertFalse(self.library2.search.called) + + def test_search_with_uris_selects_both_backends(self): + self.core.library.search( + query=dict(any=['a']), uris=['dummy1:', 'dummy1:foo', 'dummy2:']) + + self.library1.search.assert_called_once_with( + query=dict(any=['a']), uris=['dummy1:', 'dummy1:foo']) + self.library2.search.assert_called_once_with( + query=dict(any=['a']), uris=['dummy2:']) def test_search_filters_out_none(self): track1 = Track(uri='dummy1:a') @@ -164,9 +198,9 @@ class CoreLibraryTest(unittest.TestCase): self.assertIn(result1, result) self.assertNotIn(None, result) self.library1.search.assert_called_once_with( - query=dict(any=['a'])) + query=dict(any=['a']), uris=None) self.library2.search.assert_called_once_with( - query=dict(any=['a'])) + query=dict(any=['a']), uris=None) def test_search_accepts_query_dict_instead_of_kwargs(self): track1 = Track(uri='dummy1:a') @@ -184,6 +218,6 @@ class CoreLibraryTest(unittest.TestCase): self.assertIn(result1, result) self.assertIn(result2, result) self.library1.search.assert_called_once_with( - query=dict(any=['a'])) + query=dict(any=['a']), uris=None) self.library2.search.assert_called_once_with( - query=dict(any=['a'])) + query=dict(any=['a']), uris=None) From 8ab0f0974342275a8ec2e967264104ea03dbeba6 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 22:27:28 +0100 Subject: [PATCH 137/151] docs: Update changelog --- docs/changes.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/changes.rst b/docs/changes.rst index fd065b34..4b81a4e1 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -24,6 +24,19 @@ v0.13.0 (in development) the Mopidy process will now always make it log tracebacks for all alive threads. +- Change the following methods to accept an ``uris`` keyword argument: + + - :meth:`mopidy.core.LibraryController.find_exact` + - :meth:`mopidy.core.LibraryController.search` + + Search queries will only be forwarded to backends handling the given URI + roots, and the backends may use the URI roots to further limit what results + are returned. For example, a search with ``uris=['file:']`` will only be + processed by the local backend. A search with + ``uris=['file:///media/music']`` will only be processed by the local backend, + and, if such filtering is supported by the backend, will only return results + with URIs within the given URI root. + **Audio sub-system** - Make audio error logging handle log messages with non-ASCII chars. (Fixes: From 02ac0cae42be4217c61417b1b1fb80108d392d7d Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 23:34:00 +0100 Subject: [PATCH 138/151] docs: Add Mopidy.js on Node to changelog --- docs/changes.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/changes.rst b/docs/changes.rst index fd065b34..ef040b9e 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -45,6 +45,11 @@ v0.13.0 (in development) **HTTP frontend** +- Mopidy.js now works both from browsers and from Node.js environments. This + means that you now can make Mopidy clients in Node.js. Mopidy.js has been + published to the `npm registry `_ for easy + installation in Node.js projects. + - Upgrade Mopidy.js' build system Grunt from 0.3 to 0.4. - Upgrade Mopidy.js' dependencies when.js from 1.6.1 to 1.8.1. From bfd2010639bd0879c3564516efd237e9ede1c227 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 23:31:17 +0100 Subject: [PATCH 139/151] core: Let tracklist.add() lookup tracks by URI --- docs/changes.rst | 6 ++++++ mopidy/core/tracklist.py | 14 +++++++++++++- tests/core/tracklist_test.py | 29 +++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index ef040b9e..e3664013 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -24,6 +24,12 @@ v0.13.0 (in development) the Mopidy process will now always make it log tracebacks for all alive threads. +- :meth:`mopidy.core.TracklistController.add` now accepts an ``uri`` which it + will lookup in the libraries and then add to the tracklist. This is helpful + for e.g. web clients that doesn't want to transfer all track meta data back + to the server just to add it to the tracklist when the server already got all + the needed information easily available. (Fixes: :issue:`325`) + **Audio sub-system** - Make audio error logging handle log messages with non-ASCII chars. (Fixes: diff --git a/mopidy/core/tracklist.py b/mopidy/core/tracklist.py index 402e6c09..1c8f437f 100644 --- a/mopidy/core/tracklist.py +++ b/mopidy/core/tracklist.py @@ -62,10 +62,13 @@ class TracklistController(object): Is not reset before Mopidy is restarted. """ - def add(self, tracks, at_position=None): + def add(self, tracks=None, at_position=None, uri=None): """ Add the track or list of tracks to the tracklist. + If ``uri`` is given instead of ``tracks``, the URI is looked up in the + library and the resulting tracks are added to the tracklist. + If ``at_position`` is given, the tracks placed at the given position in the tracklist. If ``at_position`` is not given, the tracks are appended to the end of the tracklist. @@ -76,9 +79,18 @@ class TracklistController(object): :type tracks: list of :class:`mopidy.models.Track` :param at_position: position in tracklist to add track :type at_position: int or :class:`None` + :param uri: URI for tracks to add + :type uri: string :rtype: list of :class:`mopidy.models.TlTrack` """ + assert tracks is not None or uri is not None, \ + 'tracks or uri must be provided' + + if tracks is None and uri is not None: + tracks = self._core.library.lookup(uri) + tl_tracks = [] + for track in tracks: tl_track = TlTrack(self._next_tlid, track) self._next_tlid += 1 diff --git a/tests/core/tracklist_test.py b/tests/core/tracklist_test.py index 550cfe63..93d914ed 100644 --- a/tests/core/tracklist_test.py +++ b/tests/core/tracklist_test.py @@ -1,5 +1,8 @@ from __future__ import unicode_literals +import mock + +from mopidy.backends import base from mopidy.core import Core from mopidy.models import Track @@ -9,13 +12,31 @@ from tests import unittest class TracklistTest(unittest.TestCase): def setUp(self): self.tracks = [ - Track(uri='a', name='foo'), - Track(uri='b', name='foo'), - Track(uri='c', name='bar') + Track(uri='dummy1:a', name='foo'), + Track(uri='dummy1:b', name='foo'), + Track(uri='dummy1:c', name='bar'), ] - self.core = Core(audio=None, backends=[]) + + self.backend = mock.Mock() + self.backend.uri_schemes.get.return_value = ['dummy1'] + self.library = mock.Mock(spec=base.BaseLibraryProvider) + self.backend.library = self.library + + self.core = Core(audio=None, backends=[self.backend]) self.tl_tracks = self.core.tracklist.add(self.tracks) + def test_add_by_uri_looks_up_uri_in_library(self): + track = Track(uri='dummy1:x', name='x') + self.library.lookup().get.return_value = [track] + self.library.lookup.reset_mock() + + tl_tracks = self.core.tracklist.add(uri='dummy1:x') + + self.library.lookup.assert_called_once_with('dummy1:x') + self.assertEqual(1, len(tl_tracks)) + self.assertEqual(track, tl_tracks[0].track) + self.assertEqual(tl_tracks, self.core.tracklist.tl_tracks[-1:]) + def test_remove_removes_tl_tracks_matching_query(self): tl_tracks = self.core.tracklist.remove(name='foo') From f26db23de9de2ce7b579e9b880b70ffa683330bb Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 31 Mar 2013 00:19:40 +0100 Subject: [PATCH 140/151] mpd: Use add(uri=uri) instead of add(lookup(uri)) --- mopidy/frontends/mpd/protocol/current_playlist.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/mopidy/frontends/mpd/protocol/current_playlist.py b/mopidy/frontends/mpd/protocol/current_playlist.py index d1b0e59a..055d39e6 100644 --- a/mopidy/frontends/mpd/protocol/current_playlist.py +++ b/mopidy/frontends/mpd/protocol/current_playlist.py @@ -22,11 +22,9 @@ def add(context, uri): """ if not uri: return - tracks = context.core.library.lookup(uri).get() - if tracks: - context.core.tracklist.add(tracks) - return - raise MpdNoExistError('directory or file not found', command='add') + tl_tracks = context.core.tracklist.add(uri=uri).get() + if not tl_tracks: + raise MpdNoExistError('directory or file not found', command='add') @handle_request(r'^addid "(?P[^"]*)"( "(?P\d+)")*$') @@ -52,12 +50,11 @@ def addid(context, uri, songpos=None): raise MpdNoExistError('No such song', command='addid') if songpos is not None: songpos = int(songpos) - tracks = context.core.library.lookup(uri).get() - if not tracks: - raise MpdNoExistError('No such song', command='addid') if songpos and songpos > context.core.tracklist.length.get(): raise MpdArgError('Bad song index', command='addid') - tl_tracks = context.core.tracklist.add(tracks, at_position=songpos).get() + tl_tracks = context.core.tracklist.add(uri=uri, at_position=songpos).get() + if not tl_tracks: + raise MpdNoExistError('No such song', command='addid') return ('Id', tl_tracks[0].tlid) From 3d847862ae780d2e1958fbaed4bacc99201c2eff Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 31 Mar 2013 00:19:50 +0100 Subject: [PATCH 141/151] mpris: Use add(uri=uri) instead of add(lookup(uri)) --- mopidy/frontends/mpris/objects.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mopidy/frontends/mpris/objects.py b/mopidy/frontends/mpris/objects.py index a9a93b45..04a72676 100644 --- a/mopidy/frontends/mpris/objects.py +++ b/mopidy/frontends/mpris/objects.py @@ -279,9 +279,8 @@ class MprisObject(dbus.service.Object): return # NOTE Check if URI has MIME type known to the backend, if MIME support # is added to the backend. - tracks = self.core.library.lookup(uri).get() - if tracks: - tl_tracks = self.core.tracklist.add(tracks).get() + tl_tracks = self.core.tracklist.add(uri=uri).get() + if tl_tracks: self.core.playback.play(tl_tracks[0]) else: logger.debug('Track with URI "%s" not found in library.', uri) From 0cc7d8f9bf31d70f1caaa5eeef3ad237c00adf50 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 31 Mar 2013 03:03:10 +0200 Subject: [PATCH 142/151] docs: More on extensiondev --- docs/extensiondev.rst | 217 ++++++++++++++++++++++++++++++++---------- 1 file changed, 166 insertions(+), 51 deletions(-) diff --git a/docs/extensiondev.rst b/docs/extensiondev.rst index 05a62c2f..65747502 100644 --- a/docs/extensiondev.rst +++ b/docs/extensiondev.rst @@ -49,8 +49,8 @@ Mopidy-Soundspot==dev``. Mopidy extensions must be licensed under an Apache 2.0 (like Mopidy itself), BSD, MIT or more liberal license to be able to be enlisted in the Mopidy -Extension Registry. The license text should be included in the ``LICENSE`` file -in the root of the extension's Git repo. +documentation. The license text should be included in the ``LICENSE`` file in +the root of the extension's Git repo. Combining this together, we get the following folder structure for our extension, Mopidy-Soundspot:: @@ -60,14 +60,21 @@ extension, Mopidy-Soundspot:: README.rst # Document what it is and how to use it mopidy_soundspot/ # Your code __init__.py + config.ini # Default configuration for the extension ... setup.py # Installation script Example content for the most important files follows below. -README.rst ----------- +Example README.rst +================== + +The README file should quickly tell what the extension does, how to install it, +and how to configure it. The README should contain a development snapshot link +to a tarball of the latest development version of the extension. It's important +that the development snapshot link ends with ``#egg=mopidy-something-dev`` for +installation using ``pip install mopidy-something==dev`` to work. .. code-block:: rst @@ -104,19 +111,41 @@ README.rst - `Download development snapshot `_ -setup.py --------- +Example setup.py +================ + +The ``setup.py`` file must use setuptools/distribute, and not distutils. This +is because Mopidy extensions use setuptools' entry point functionality to +register themselves as available Mopidy extensions when they are installed on +your system. + +The example below also includes a couple of convenient tricks for reading the +package version from the source code so that it it's just defined in a single +place, and to reuse the README file as the long description of the package for +the PyPI registration. + +The package must have ``install_requires`` on ``setuptools`` and ``Mopidy``, in +addition to any other dependencies required by your extension. The +``entry_points`` part must be included. The ``mopidy.extension`` part cannot be +changed, but the innermost string should be changed. It's format is +``my_ext_name = my_py_module:MyExtClass``. ``my_ext_name`` should be a short +name for your extension, typically the part after "Mopidy-" in lowercase. This +name is used e.g. to name the config section for your extension. The +``my_py_module:MyExtClass`` part is simply the Python path to the extension +class that will connect the rest of the dots. :: import re from setuptools import setup + def get_version(filename): content = open(filename).read() metadata = dict(re.findall("__([a-z]+)__ = '([^']+)'", content)) return metadata['version'] + setup( name='Mopidy-Soundspot', version=get_version('mopidy_soundspot/__init__.py'), @@ -138,11 +167,11 @@ setup.py 'Mopidy', 'pysoundspot', ], - entry_points=[ + entry_points={ 'mopidy.extension': [ - 'mopidy_soundspot = mopidy_soundspot:EntryPoint', + 'soundspot = mopidy_soundspot:Extension', ], - ], + }, classifiers=[ 'Environment :: No Input/Output (Daemon)', 'Intended Audience :: End Users/Desktop', @@ -154,32 +183,46 @@ setup.py ) -mopidy_soundspot/__init__.py ----------------------------- +Example __init__.py +=================== + +The ``__init__.py`` file should be placed inside the ``mopidy_soundspot`` +Python package. The root of your Python package should have an ``__version__`` +attribute with a :pep:`386` compliant version number, for example "0.1". Next, +it should have a class named ``Extension`` which inherits from Mopidy's +extension base class. This is the class referred to in the ``entry_points`` +part of ``setup.py``. Any imports of other files in your extension should be +kept inside methods. This ensures that this file can be imported without +raising :exc:`ImportError` exceptions for missing dependencies, etc. :: + import os + from mopidy.exceptions import ExtensionError + from mopidy.utils import ext + __version__ = '0.1' - class EntryPoint(object): + class Extension(ext.Extension): name = 'Mopidy-Soundspot' version = __version__ @classmethod def get_default_config(cls): - return """ - [soundspot] - enabled = true - username = - password = - """ + config_file = os.path.join( + os.path.dirname(__file__), 'config.ini') + return open(config_file).read() @classmethod def validate_config(cls, config): + # ``config`` is the complete config document for the Mopidy + # instance. The extension is free to check any config value it is + # interested in, not just its own config values. + if not config.getboolean('soundspot', 'enabled'): return if not config.get('soundspot', 'username'): @@ -189,32 +232,63 @@ mopidy_soundspot/__init__.py @classmethod def validate_environment(cls): + # This method can validate anything it wants about the environment + # the extension is running in. Examples include checking if all + # dependencies are installed. + try: import pysoundspot except ImportError as e: raise ExtensionError('pysoundspot library not found', e) + # You will typically only implement one of the next three methods + # in a single extension. + @classmethod - def start_frontend(cls, core): + def get_frontend_class(cls): from .frontend import SoundspotFrontend - cls._frontend = SoundspotFrontend.start(core=core) + return SoundspotFrontend @classmethod - def stop_frontend(cls): - cls._frontend.stop() - - @classmethod - def start_backend(cls, audio): + def get_backend_class(cls): from .backend import SoundspotBackend - cls._backend = SoundspotBackend.start(audio=audio) + return SoundspotBackend @classmethod - def stop_backend(cls): - cls._backend.stop() + def get_gstreamer_element_classes(cls): + from .mixer import SoundspotMixer + return [SoundspotMixer] -mopidy_soundspot/frontend.py ----------------------------- +Example config.ini +================== + +The default configuration for the extension is located in a ``config.ini`` file +inside the Python package. It contains a single config section, with a name +matching the short name used for the extension in the ``entry_points`` part of +``setup.py``. + +All extensions should include an ``enabled`` config which should default to +``true``. Leave any configurations that doesn't have meaningful defaults blank, +like ``username`` and ``password``. + +.. code-block:: ini + + [soundspot] + enabled = true + username = + password = + + +Example frontend +================ + +If you want to *use* Mopidy's core API from your extension, then you want to +implement a frontend. + +The skeleton of a frontend would look like this. Notice that the frontend gets +passed a reference to the core API when it's created. See the +:ref:`frontend-api` for more details. :: @@ -222,6 +296,7 @@ mopidy_soundspot/frontend.py from mopidy.core import CoreListener + class SoundspotFrontend(pykka.ThreadingActor, CoreListener): def __init__(self, core): super(SoundspotFrontend, self).__init__() @@ -230,8 +305,15 @@ mopidy_soundspot/frontend.py # Your frontend implementation -mopidy_soundspot/backend.py ---------------------------- +Example backend +=============== + +If you want to extend Mopidy to support new music and playlist sources, you +want to implement a backend. A backend does not have access to Mopidy's core +API at all and got a bunch of interfaces to implement. + +The skeleton of a backend would look like this. See :ref:`backend-api` for more +details. :: @@ -239,6 +321,7 @@ mopidy_soundspot/backend.py from mopidy.backends import base + class SoundspotBackend(pykka.ThreadingActor, base.BaseBackend): def __init__(self, audio): super(SoundspotBackend, self).__init__() @@ -247,35 +330,67 @@ mopidy_soundspot/backend.py # Your backend implementation -Notes -===== +Example GStreamer element +========================= -An extension wants to: +If you want to extend Mopidy's GStreamer pipeline with new custom GStreamer +elements, you'll need to get Mopidy to register them in GStreamer before they +can be used. -- Be automatically found if installed - - Either register a setuptools entry points on installation, or - - Require a line of configuration to activate the extension +Basically, you just implement your GStreamer element in Python and then make +your :meth:`Extension.get_gstreamer_element_classes` method return a list with +the classes of all your custom GStreamer elements. -- Provide default config +For examples of custom GStreamer elements implemented in Python, see +:mod:`mopidy.audio.mixers`. -- Validate configuration - - Pass all configuration to every extension, let the extension complain on - anything it wants to +Implementation steps +==================== -- Validate presence of dependencies +A rough plan of how to make the above document the reality of how Mopidy +extensions work. - - Python packages (e.g. pyspotify) +1. Implement :class:`mopidy.utils.ext.Extension` base class and the + :exc:`mopidy.exceptions.ExtensionError` exception class. - - Other software +2. Switch from using distutils to setuptools to package and install Mopidy so + that we can register entry points for the bundled extensions and get + information about all extensions available on the system from + :mod:`pkg_resources`. - - The presence of other extensions can be validated in the configuration - validation step +3. Add :class:`Extension` classes for all existing frontends and backends. Make + sure to add default config files and config validation, even though this + will not be used at this implementation stage. -- Validate that needed TCP ports are free +4. Add entry points for the existing extensions in the ``setup.py`` file. -- Register new GStreamer elements +5. Rewrite the startup procedure to find extensions and thus frontends and + backends via :mod:`pkg_resouces` instead of the ``FRONTENDS`` and + ``BACKENDS`` settings. -- Be asked to start running +6. Remove the ``FRONTENDS`` and ``BACKENDS`` settings. -- Be asked to shut down +7. Switch to ini file based configuration, using :mod:`ConfigParser`. The + default config is the combination of a core config file plus the config from + each installed extension. To find the effective config for the system, the + following config sources are added together, with the later ones overriding + the earlier ones: + + - the default config, + + - ``/etc/mopidy.conf``, + + - ``~/.config/mopidy.conf``, and + + - any config file provided via command line arguments. + +8. Add command line options for: + + - printing the effective config, + + - overriding a config temporarily, + + - loading an additional config file, and + + - write a config value permanently to ``~/.config/mopidy.conf``. From 0fe5ff8712d340f65f50d3ea6d85829e6e44a2e4 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 31 Mar 2013 07:51:21 +0200 Subject: [PATCH 143/151] docs: js/README.rst was renamed to .md --- mopidy/frontends/http/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mopidy/frontends/http/__init__.py b/mopidy/frontends/http/__init__.py index 3be4993e..e81ddf3f 100644 --- a/mopidy/frontends/http/__init__.py +++ b/mopidy/frontends/http/__init__.py @@ -175,7 +175,7 @@ Getting the library for development on the library If you want to work on the Mopidy.js library itself, you'll find a complete development setup in the ``js/`` dir in our repo. The instructions in -``js/README.rst`` will guide you on your way. +``js/README.md`` will guide you on your way. Creating an instance From 82e94f00fe230fee9a556b5e0c05e8d7612a191c Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 31 Mar 2013 13:31:52 +0200 Subject: [PATCH 144/151] docs: Reduce depth of ToCs on front page --- docs/index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 5450ea5c..54745298 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -38,7 +38,7 @@ User documentation ================== .. toctree:: - :maxdepth: 3 + :maxdepth: 2 installation/index installation/raspberrypi @@ -54,7 +54,7 @@ Reference documentation ======================= .. toctree:: - :maxdepth: 3 + :maxdepth: 2 api/index modules/index @@ -64,7 +64,7 @@ Development documentation ========================= .. toctree:: - :maxdepth: 3 + :maxdepth: 2 development extensiondev From bc78a65fff1f5f52d95bb61f9526053e5d0d82db Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 31 Mar 2013 13:42:07 +0200 Subject: [PATCH 145/151] js: Upgrade when.js from 1.8.1 to 2.0.0 --- docs/changes.rst | 2 +- js/Gruntfile.js | 1 + js/buster.js | 12 +- js/lib/{when-1.8.1.js => when-2.0.0.js} | 868 ++++++++++----------- js/lib/when-define-shim.js | 11 + js/package.json | 2 +- js/src/mopidy.js | 2 +- js/test/mopidy-test.js | 10 +- mopidy/frontends/http/data/mopidy.js | 916 ++++++++++++----------- mopidy/frontends/http/data/mopidy.min.js | 4 +- 10 files changed, 967 insertions(+), 861 deletions(-) rename js/lib/{when-1.8.1.js => when-2.0.0.js} (51%) create mode 100644 js/lib/when-define-shim.js diff --git a/docs/changes.rst b/docs/changes.rst index c315922b..df4caa86 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -71,7 +71,7 @@ v0.13.0 (in development) - Upgrade Mopidy.js' build system Grunt from 0.3 to 0.4. -- Upgrade Mopidy.js' dependencies when.js from 1.6.1 to 1.8.1. +- Upgrade Mopidy.js' dependencies when.js from 1.6.1 to 2.0.0. - Expose :meth:`mopidy.core.Core.get_uri_schemes` to HTTP clients. It is available through Mopidy.js as ``mopidy.getUriSchemes()``. diff --git a/js/Gruntfile.js b/js/Gruntfile.js index 195decd6..3039e98c 100644 --- a/js/Gruntfile.js +++ b/js/Gruntfile.js @@ -24,6 +24,7 @@ module.exports = function (grunt) { files: { "<%= meta.files.concat %>": [ "lib/bane-*.js", + "lib/when-define-shim.js", "lib/when-*.js", "src/mopidy.js" ] diff --git a/js/buster.js b/js/buster.js index 37f41d8a..1cc517c8 100644 --- a/js/buster.js +++ b/js/buster.js @@ -2,7 +2,11 @@ var config = module.exports; config.browser_tests = { environment: "browser", - libs: ["lib/**/*.js"], + libs: [ + "lib/bane-*.js", + "lib/when-define-shim.js", + "lib/when-*.js" + ], sources: ["src/**/*.js"], testHelpers: ["test/**/*-helper.js"], tests: ["test/**/*-test.js"] @@ -10,7 +14,11 @@ config.browser_tests = { config.node_tests = { environment: "node", - libs: ["lib/**/*.js"], + libs: [ + "lib/bane-*.js", + "lib/when-define-shim.js", + "lib/when-*.js" + ], sources: ["src/**/*.js"], testHelpers: ["test/**/*-helper.js"], tests: ["test/**/*-test.js"] diff --git a/js/lib/when-1.8.1.js b/js/lib/when-2.0.0.js similarity index 51% rename from js/lib/when-1.8.1.js rename to js/lib/when-2.0.0.js index 05c5a429..78249532 100644 --- a/js/lib/when-1.8.1.js +++ b/js/lib/when-2.0.0.js @@ -9,34 +9,27 @@ * * @author Brian Cavalier * @author John Hann - * - * @version 1.8.1 + * @version 2.0.0 */ - (function(define) { 'use strict'; define(function () { - var reduceArray, slice, undef; - // // Public API - // - when.defer = defer; // Create a deferred - when.resolve = resolve; // Create a resolved promise - when.reject = reject; // Create a rejected promise + when.defer = defer; // Create a deferred + when.resolve = resolve; // Create a resolved promise + when.reject = reject; // Create a rejected promise - when.join = join; // Join 2 or more promises + when.join = join; // Join 2 or more promises - when.all = all; // Resolve a list of promises - when.map = map; // Array.map() for promises - when.reduce = reduce; // Array.reduce() for promises + when.all = all; // Resolve a list of promises + when.map = map; // Array.map() for promises + when.reduce = reduce; // Array.reduce() for promises - when.any = any; // One-winner race - when.some = some; // Multi-winner race + when.any = any; // One-winner race + when.some = some; // Multi-winner race - when.chain = chain; // Make a promise trigger another resolver - - when.isPromise = isPromise; // Determine if a thing is a promise + when.isPromise = isPromise; // Determine if a thing is a promise /** * Register an observer for a promise or immediate value. @@ -59,77 +52,6 @@ define(function () { return resolve(promiseOrValue).then(onFulfilled, onRejected, onProgress); } - /** - * Returns promiseOrValue if promiseOrValue is a {@link Promise}, a new Promise if - * promiseOrValue is a foreign promise, or a new, already-fulfilled {@link Promise} - * whose value is promiseOrValue if promiseOrValue is an immediate value. - * - * @param {*} promiseOrValue - * @returns {Promise} Guaranteed to return a trusted Promise. If promiseOrValue - * is trusted, returns promiseOrValue, otherwise, returns a new, already-resolved - * when.js promise whose resolution value is: - * * the resolution value of promiseOrValue if it's a foreign promise, or - * * promiseOrValue if it's a value - */ - function resolve(promiseOrValue) { - var promise; - - if(promiseOrValue instanceof Promise) { - // It's a when.js promise, so we trust it - promise = promiseOrValue; - - } else if(isPromise(promiseOrValue)) { - // Assimilate foreign promises - promise = assimilate(promiseOrValue); - } else { - // It's a value, create a fulfilled promise for it. - promise = fulfilled(promiseOrValue); - } - - return promise; - } - - /** - * Assimilate an untrusted thenable by introducing a trusted middle man. - * Not a perfect strategy, but possibly the best we can do. - * IMPORTANT: This is the only place when.js should ever call an untrusted - * thenable's then() on an. Don't expose the return value to the untrusted thenable - * - * @param {*} thenable - * @param {function} thenable.then - * @returns {Promise} - */ - function assimilate(thenable) { - var d = defer(); - - // TODO: Enqueue this for future execution in 2.0 - try { - thenable.then( - function(value) { d.resolve(value); }, - function(reason) { d.reject(reason); }, - function(update) { d.progress(update); } - ); - } catch(e) { - d.reject(e); - } - - return d.promise; - } - - /** - * Returns a rejected promise for the supplied promiseOrValue. The returned - * promise will be rejected with: - * - promiseOrValue, if it is a value, or - * - if promiseOrValue is a promise - * - promiseOrValue's value after it is fulfilled - * - promiseOrValue's reason after it is rejected - * @param {*} promiseOrValue the rejected value of the returned {@link Promise} - * @return {Promise} rejected {@link Promise} - */ - function reject(promiseOrValue) { - return when(promiseOrValue, rejected); - } - /** * Trusted Promise constructor. A Promise created from this constructor is * a trusted when.js promise. Any other duck-typed promise is considered @@ -142,18 +64,6 @@ define(function () { } Promise.prototype = { - /** - * Register a callback that will be called when a promise is - * fulfilled or rejected. Optionally also register a progress handler. - * Shortcut for .then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress) - * @param {function?} [onFulfilledOrRejected] - * @param {function?} [onProgress] - * @return {Promise} - */ - always: function(onFulfilledOrRejected, onProgress) { - return this.then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress); - }, - /** * Register a rejection handler. Shortcut for .then(undefined, onRejected) * @param {function?} onRejected @@ -163,6 +73,26 @@ define(function () { return this.then(undef, onRejected); }, + /** + * Ensures that onFulfilledOrRejected will be called regardless of whether + * this promise is fulfilled or rejected. onFulfilledOrRejected WILL NOT + * receive the promises' value or reason. Any returned value will be disregarded. + * onFulfilledOrRejected may throw or return a rejected promise to signal + * an additional error. + * @param {function} onFulfilledOrRejected handler to be called regardless of + * fulfillment or rejection + * @returns {Promise} + */ + ensure: function(onFulfilledOrRejected) { + var self = this; + + return this.then(injectHandler, injectHandler).yield(self); + + function injectHandler() { + return resolve(onFulfilledOrRejected()); + } + }, + /** * Shortcut for .then(function() { return value; }) * @param {*} value @@ -191,201 +121,291 @@ define(function () { return onFulfilled.apply(undef, array); }); }); + }, + + /** + * Shortcut for .then(onFulfilledOrRejected, onFulfilledOrRejected) + * @deprecated + */ + always: function(onFulfilledOrRejected, onProgress) { + return this.then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress); } }; /** - * Create an already-resolved promise for the supplied value - * @private + * Returns a resolved promise. The returned promise will be + * - fulfilled with promiseOrValue if it is a value, or + * - if promiseOrValue is a promise + * - fulfilled with promiseOrValue's value after it is fulfilled + * - rejected with promiseOrValue's reason after it is rejected + * @param {*} value + * @return {Promise} + */ + function resolve(value) { + return promise(function(resolve) { + resolve(value); + }); + } + + /** + * Returns a rejected promise for the supplied promiseOrValue. The returned + * promise will be rejected with: + * - promiseOrValue, if it is a value, or + * - if promiseOrValue is a promise + * - promiseOrValue's value after it is fulfilled + * - promiseOrValue's reason after it is rejected + * @param {*} promiseOrValue the rejected value of the returned {@link Promise} + * @return {Promise} rejected {@link Promise} + */ + function reject(promiseOrValue) { + return when(promiseOrValue, rejected); + } + + /** + * Creates a new Deferred with fully isolated resolver and promise parts, + * either or both of which may be given out safely to consumers. + * The resolver has resolve, reject, and progress. The promise + * only has then. * + * @return {{ + * promise: Promise, + * resolver: { + * resolve: function:Promise, + * reject: function:Promise, + * notify: function:Promise + * }}} + */ + function defer() { + var deferred, pending, resolved; + + // Optimize object shape + deferred = { + promise: undef, resolve: undef, reject: undef, notify: undef, + resolver: { resolve: undef, reject: undef, notify: undef } + }; + + deferred.promise = pending = promise(makeDeferred); + + return deferred; + + function makeDeferred(resolvePending, rejectPending, notifyPending) { + deferred.resolve = deferred.resolver.resolve = function(value) { + if(resolved) { + return resolve(value); + } + resolved = true; + resolvePending(value); + return pending; + }; + + deferred.reject = deferred.resolver.reject = function(reason) { + if(resolved) { + return resolve(rejected(reason)); + } + resolved = true; + rejectPending(reason); + return pending; + }; + + deferred.notify = deferred.resolver.notify = function(update) { + notifyPending(update); + return update; + }; + } + } + + /** + * Creates a new promise whose fate is determined by resolver. + * @private (for now) + * @param {function} resolver function(resolve, reject, notify) + * @returns {Promise} promise whose fate is determine by resolver + */ + function promise(resolver) { + var value, handlers = []; + + // Call the provider resolver to seal the promise's fate + try { + resolver(promiseResolve, promiseReject, promiseNotify); + } catch(e) { + promiseReject(e); + } + + // Return the promise + return new Promise(then); + + /** + * Register handlers for this promise. + * @param [onFulfilled] {Function} fulfillment handler + * @param [onRejected] {Function} rejection handler + * @param [onProgress] {Function} progress handler + * @return {Promise} new Promise + */ + function then(onFulfilled, onRejected, onProgress) { + return promise(function(resolve, reject, notify) { + handlers + // Call handlers later, after resolution + ? handlers.push(function(value) { + value.then(onFulfilled, onRejected, onProgress) + .then(resolve, reject, notify); + }) + // Call handlers soon, but not in the current stack + : enqueue(function() { + value.then(onFulfilled, onRejected, onProgress) + .then(resolve, reject, notify); + }); + }); + } + + /** + * Transition from pre-resolution state to post-resolution state, notifying + * all listeners of the ultimate fulfillment or rejection + * @param {*|Promise} val resolution value + */ + function promiseResolve(val) { + if(!handlers) { + return; + } + + value = coerce(val); + scheduleHandlers(handlers, value); + + handlers = undef; + } + + /** + * Reject this promise with the supplied reason, which will be used verbatim. + * @param {*} reason reason for the rejection + */ + function promiseReject(reason) { + promiseResolve(rejected(reason)); + } + + /** + * Issue a progress event, notifying all progress listeners + * @param {*} update progress event payload to pass to all listeners + */ + function promiseNotify(update) { + if(handlers) { + scheduleHandlers(handlers, progressing(update)); + } + } + } + + /** + * Coerces x to a trusted Promise + * + * @private + * @param {*} x thing to coerce + * @returns {Promise} Guaranteed to return a trusted Promise. If x + * is trusted, returns x, otherwise, returns a new, trusted, already-resolved + * Promise whose resolution value is: + * * the resolution value of x if it's a foreign promise, or + * * x if it's a value + */ + function coerce(x) { + if(x instanceof Promise) { + return x; + } else if (x !== Object(x)) { + return fulfilled(x); + } + + return promise(function(resolve, reject, notify) { + enqueue(function() { + try { + // We must check and assimilate in the same tick, but not the + // current tick, careful only to access promiseOrValue.then once. + var untrustedThen = x.then; + + if(typeof untrustedThen === 'function') { + fcall(untrustedThen, x, resolve, reject, notify); + } else { + // It's a value, create a fulfilled wrapper + resolve(fulfilled(x)); + } + + } catch(e) { + // Something went wrong, reject + reject(e); + } + }); + }); + } + + /** + * Create an already-fulfilled promise for the supplied value + * @private * @param {*} value * @return {Promise} fulfilled promise */ function fulfilled(value) { - var p = new Promise(function(onFulfilled) { + var self = new Promise(function (onFulfilled) { try { - return resolve(typeof onFulfilled == 'function' ? onFulfilled(value) : value); - } catch(e) { + return typeof onFulfilled == 'function' + ? coerce(onFulfilled(value)) : self; + } catch (e) { return rejected(e); } }); - return p; + return self; } /** - * Create an already-rejected {@link Promise} with the supplied - * rejection reason. + * Create an already-rejected promise with the supplied rejection reason. * @private - * * @param {*} reason * @return {Promise} rejected promise */ function rejected(reason) { - var p = new Promise(function(_, onRejected) { + var self = new Promise(function (_, onRejected) { try { - return resolve(typeof onRejected == 'function' ? onRejected(reason) : rejected(reason)); - } catch(e) { + return typeof onRejected == 'function' + ? coerce(onRejected(reason)) : self; + } catch (e) { return rejected(e); } }); - return p; + return self; } /** - * Creates a new, Deferred with fully isolated resolver and promise parts, - * either or both of which may be given out safely to consumers. - * The Deferred itself has the full API: resolve, reject, progress, and - * then. The resolver has resolve, reject, and progress. The promise - * only has then. - * - * @return {Deferred} + * Create a progress promise with the supplied update. + * @private + * @param {*} update + * @return {Promise} progress promise */ - function defer() { - var deferred, promise, handlers, progressHandlers, - _then, _notify, _resolve; - - /** - * The promise for the new deferred - * @type {Promise} - */ - promise = new Promise(then); - - /** - * The full Deferred object, with {@link Promise} and {@link Resolver} parts - * @class Deferred - * @name Deferred - */ - deferred = { - then: then, // DEPRECATED: use deferred.promise.then - resolve: promiseResolve, - reject: promiseReject, - progress: promiseNotify, // DEPRECATED: use deferred.notify - notify: promiseNotify, - - promise: promise, - - resolver: { - resolve: promiseResolve, - reject: promiseReject, - progress: promiseNotify, // DEPRECATED: use deferred.notify - notify: promiseNotify + function progressing(update) { + var self = new Promise(function (_, __, onProgress) { + try { + return typeof onProgress == 'function' + ? progressing(onProgress(update)) : self; + } catch (e) { + return progressing(e); } - }; + }); - handlers = []; - progressHandlers = []; - - /** - * Pre-resolution then() that adds the supplied callback, errback, and progback - * functions to the registered listeners - * @private - * - * @param {function?} [onFulfilled] resolution handler - * @param {function?} [onRejected] rejection handler - * @param {function?} [onProgress] progress handler - */ - _then = function(onFulfilled, onRejected, onProgress) { - var deferred, progressHandler; - - deferred = defer(); - - progressHandler = typeof onProgress === 'function' - ? function(update) { - try { - // Allow progress handler to transform progress event - deferred.notify(onProgress(update)); - } catch(e) { - // Use caught value as progress - deferred.notify(e); - } - } - : function(update) { deferred.notify(update); }; - - handlers.push(function(promise) { - promise.then(onFulfilled, onRejected) - .then(deferred.resolve, deferred.reject, progressHandler); - }); - - progressHandlers.push(progressHandler); - - return deferred.promise; - }; - - /** - * Issue a progress event, notifying all progress listeners - * @private - * @param {*} update progress event payload to pass to all listeners - */ - _notify = function(update) { - processQueue(progressHandlers, update); - return update; - }; - - /** - * Transition from pre-resolution state to post-resolution state, notifying - * all listeners of the resolution or rejection - * @private - * @param {*} value the value of this deferred - */ - _resolve = function(value) { - // Replace _then with one that directly notifies with the result. - _then = value.then; - // Replace _resolve so that this Deferred can only be resolved once - _resolve = resolve; - // Make _progress a noop, to disallow progress for the resolved promise. - _notify = identity; - - // Notify handlers - processQueue(handlers, value); - - // Free progressHandlers array since we'll never issue progress events - progressHandlers = handlers = undef; - - return value; - }; - - return deferred; - - /** - * Wrapper to allow _then to be replaced safely - * @param {function?} [onFulfilled] resolution handler - * @param {function?} [onRejected] rejection handler - * @param {function?} [onProgress] progress handler - * @return {Promise} new promise - */ - function then(onFulfilled, onRejected, onProgress) { - // TODO: Promises/A+ check typeof onFulfilled, onRejected, onProgress - return _then(onFulfilled, onRejected, onProgress); - } - - /** - * Wrapper to allow _resolve to be replaced - */ - function promiseResolve(val) { - return _resolve(resolve(val)); - } - - /** - * Wrapper to allow _reject to be replaced - */ - function promiseReject(err) { - return _resolve(rejected(err)); - } - - /** - * Wrapper to allow _notify to be replaced - */ - function promiseNotify(update) { - return _notify(update); - } + return self; } /** - * Determines if promiseOrValue is a promise or not. Uses the feature - * test from http://wiki.commonjs.org/wiki/Promises/A to determine if - * promiseOrValue is a promise. + * Schedule a task that will process a list of handlers + * in the next queue drain run. + * @private + * @param {Array} handlers queue of handlers to execute + * @param {*} value passed as the only arg to each handler + */ + function scheduleHandlers(handlers, value) { + enqueue(function() { + var handler, i = 0; + while (handler = handlers[i++]) { + handler(value); + } + }); + } + + /** + * Determines if promiseOrValue is a promise or not * * @param {*} promiseOrValue anything * @returns {boolean} true if promiseOrValue is a {@link Promise} @@ -407,8 +427,8 @@ define(function () { * @param {function?} [onRejected] rejection handler * @param {function?} [onProgress] progress handler * @returns {Promise} promise that will resolve to an array of howMany values that - * resolved first, or will reject with an array of (promisesOrValues.length - howMany) + 1 - * rejection reasons. + * resolved first, or will reject with an array of + * (promisesOrValues.length - howMany) + 1 rejection reasons. */ function some(promisesOrValues, howMany, onFulfilled, onRejected, onProgress) { @@ -416,62 +436,56 @@ define(function () { return when(promisesOrValues, function(promisesOrValues) { - var toResolve, toReject, values, reasons, deferred, fulfillOne, rejectOne, notify, len, i; + return promise(resolveSome).then(onFulfilled, onRejected, onProgress); - len = promisesOrValues.length >>> 0; + function resolveSome(resolve, reject, notify) { + var toResolve, toReject, values, reasons, fulfillOne, rejectOne, len, i; - toResolve = Math.max(0, Math.min(howMany, len)); - values = []; + len = promisesOrValues.length >>> 0; - toReject = (len - toResolve) + 1; - reasons = []; + toResolve = Math.max(0, Math.min(howMany, len)); + values = []; - deferred = defer(); + toReject = (len - toResolve) + 1; + reasons = []; - // No items in the input, resolve immediately - if (!toResolve) { - deferred.resolve(values); + // No items in the input, resolve immediately + if (!toResolve) { + resolve(values); - } else { - notify = deferred.notify; + } else { + rejectOne = function(reason) { + reasons.push(reason); + if(!--toReject) { + fulfillOne = rejectOne = noop; + reject(reasons); + } + }; - rejectOne = function(reason) { - reasons.push(reason); - if(!--toReject) { - fulfillOne = rejectOne = noop; - deferred.reject(reasons); - } - }; + fulfillOne = function(val) { + // This orders the values based on promise resolution order + values.push(val); + if (!--toResolve) { + fulfillOne = rejectOne = noop; + resolve(values); + } + }; - fulfillOne = function(val) { - // This orders the values based on promise resolution order - // Another strategy would be to use the original position of - // the corresponding promise. - values.push(val); - - if (!--toResolve) { - fulfillOne = rejectOne = noop; - deferred.resolve(values); - } - }; - - for(i = 0; i < len; ++i) { - if(i in promisesOrValues) { - when(promisesOrValues[i], fulfiller, rejecter, notify); + for(i = 0; i < len; ++i) { + if(i in promisesOrValues) { + when(promisesOrValues[i], fulfiller, rejecter, notify); + } } } + + function rejecter(reason) { + rejectOne(reason); + } + + function fulfiller(val) { + fulfillOne(val); + } } - - return deferred.promise.then(onFulfilled, onRejected, onProgress); - - function rejecter(reason) { - rejectOne(reason); - } - - function fulfiller(val) { - fulfillOne(val); - } - }); } @@ -529,50 +543,50 @@ define(function () { * input to contain {@link Promise}s and/or values, and mapFunc may return * either a value or a {@link Promise} * - * @param {Array|Promise} promise array of anything, may contain a mix + * @param {Array|Promise} array array of anything, may contain a mix * of {@link Promise}s and values * @param {function} mapFunc mapping function mapFunc(value) which may return * either a {@link Promise} or value * @returns {Promise} a {@link Promise} that will resolve to an array containing * the mapped output values. */ - function map(promise, mapFunc) { - return when(promise, function(array) { - var results, len, toResolve, resolve, i, d; + function map(array, mapFunc) { + return when(array, function(array) { - // Since we know the resulting length, we can preallocate the results - // array to avoid array expansions. - toResolve = len = array.length >>> 0; - results = []; - d = defer(); + return promise(resolveMap); - if(!toResolve) { - d.resolve(results); - } else { + function resolveMap(resolve, reject, notify) { + var results, len, toResolve, resolveOne, i; - resolve = function resolveOne(item, i) { - when(item, mapFunc).then(function(mapped) { - results[i] = mapped; + // Since we know the resulting length, we can preallocate the results + // array to avoid array expansions. + toResolve = len = array.length >>> 0; + results = []; - if(!--toResolve) { - d.resolve(results); + if(!toResolve) { + resolve(results); + } else { + + resolveOne = function(item, i) { + when(item, mapFunc).then(function(mapped) { + results[i] = mapped; + + if(!--toResolve) { + resolve(results); + } + }, reject, notify); + }; + + // Since mapFunc may be async, get all invocations of it into flight + for(i = 0; i < len; i++) { + if(i in array) { + resolveOne(array[i], i); + } else { + --toResolve; } - }, d.reject); - }; - - // Since mapFunc may be async, get all invocations of it into flight - for(i = 0; i < len; i++) { - if(i in array) { - resolve(array[i], i); - } else { - --toResolve; } } - } - - return d.promise; - }); } @@ -590,7 +604,7 @@ define(function () { * @returns {Promise} that will resolve to the final reduced value */ function reduce(promise, reduceFunc /*, initialValue */) { - var args = slice.call(arguments, 1); + var args = fcall(slice, arguments, 1); return when(promise, function(array) { var total; @@ -611,102 +625,94 @@ define(function () { }); } - /** - * Ensure that resolution of promiseOrValue will trigger resolver with the - * value or reason of promiseOrValue, or instead with resolveValue if it is provided. - * - * @param promiseOrValue - * @param {Object} resolver - * @param {function} resolver.resolve - * @param {function} resolver.reject - * @param {*} [resolveValue] - * @returns {Promise} - */ - function chain(promiseOrValue, resolver, resolveValue) { - var useResolveValue = arguments.length > 2; - - return when(promiseOrValue, - function(val) { - val = useResolveValue ? resolveValue : val; - resolver.resolve(val); - return val; - }, - function(reason) { - resolver.reject(reason); - return rejected(reason); - }, - function(update) { - typeof resolver.notify === 'function' && resolver.notify(update); - return update; - } - ); - } - // - // Utility functions + // Utilities, etc. // - /** - * Apply all functions in queue to value - * @param {Array} queue array of functions to execute - * @param {*} value argument passed to each function - */ - function processQueue(queue, value) { - var handler, i = 0; + var reduceArray, slice, fcall, nextTick, handlerQueue, + timeout, funcProto, call, arrayProto, undef; - while (handler = queue[i++]) { - handler(value); + // + // Shared handler queue processing + // + // Credit to Twisol (https://github.com/Twisol) for suggesting + // this type of extensible queue + trampoline approach for + // next-tick conflation. + + handlerQueue = []; + + /** + * Enqueue a task. If the queue is not currently scheduled to be + * drained, schedule it. + * @param {function} task + */ + function enqueue(task) { + if(handlerQueue.push(task) === 1) { + scheduleDrainQueue(); } } /** - * Helper that checks arrayOfCallbacks to ensure that each element is either - * a function, or null or undefined. - * @private - * @param {number} start index at which to start checking items in arrayOfCallbacks - * @param {Array} arrayOfCallbacks array to check - * @throws {Error} if any element of arrayOfCallbacks is something other than - * a functions, null, or undefined. + * Schedule the queue to be drained in the next tick. */ - function checkCallbacks(start, arrayOfCallbacks) { - // TODO: Promises/A+ update type checking and docs - var arg, i = arrayOfCallbacks.length; - - while(i > start) { - arg = arrayOfCallbacks[--i]; - - if (arg != null && typeof arg != 'function') { - throw new Error('arg '+i+' must be a function'); - } - } + function scheduleDrainQueue() { + nextTick(drainQueue); } /** - * No-Op function used in method replacement - * @private + * Drain the handler queue entirely or partially, being careful to allow + * the queue to be extended while it is being processed, and to continue + * processing until it is truly empty. */ - function noop() {} + function drainQueue() { + var task, i = 0; - slice = [].slice; + while(task = handlerQueue[i++]) { + task(); + } + + handlerQueue = []; + } + + // + // Capture function and array utils + // + /*global setImmediate:true*/ + + // capture setTimeout to avoid being caught by fake timers used in time based tests + timeout = setTimeout; + nextTick = typeof setImmediate === 'function' + ? typeof window === 'undefined' + ? setImmediate + : setImmediate.bind(window) + : typeof process === 'object' + ? process.nextTick + : function(task) { timeout(task, 0); }; + + // Safe function calls + funcProto = Function.prototype; + call = funcProto.call; + fcall = funcProto.bind + ? call.bind(call) + : function(f, context) { + return f.apply(context, slice.call(arguments, 2)); + }; + + // Safe array ops + arrayProto = []; + slice = arrayProto.slice; // ES5 reduce implementation if native not available // See: http://es5.github.com/#x15.4.4.21 as there are many - // specifics and edge cases. - reduceArray = [].reduce || + // specifics and edge cases. ES5 dictates that reduce.length === 1 + // This implementation deviates from ES5 spec in the following ways: + // 1. It does not check if reduceFunc is a Callable + reduceArray = arrayProto.reduce || function(reduceFunc /*, initialValue */) { /*jshint maxcomplexity: 7*/ - - // ES5 dictates that reduce.length === 1 - - // This implementation deviates from ES5 spec in the following ways: - // 1. It does not check if reduceFunc is a Callable - var arr, args, reduced, len, i; i = 0; - // This generates a jshint warning, despite being valid - // "Missing 'new' prefix when invoking a constructor." - // See https://github.com/jshint/jshint/issues/392 arr = Object(this); len = arr.length >>> 0; args = arguments; @@ -734,7 +740,6 @@ define(function () { // Do the actual reduce for(;i < len; ++i) { - // Skip holes if(i in arr) { reduced = reduceFunc(reduced, arr[i], i, arr); } @@ -743,17 +748,40 @@ define(function () { return reduced; }; + // + // Utility functions + // + + /** + * Helper that checks arrayOfCallbacks to ensure that each element is either + * a function, or null or undefined. + * @private + * @param {number} start index at which to start checking items in arrayOfCallbacks + * @param {Array} arrayOfCallbacks array to check + * @throws {Error} if any element of arrayOfCallbacks is something other than + * a functions, null, or undefined. + */ + function checkCallbacks(start, arrayOfCallbacks) { + // TODO: Promises/A+ update type checking and docs + var arg, i = arrayOfCallbacks.length; + + while(i > start) { + arg = arrayOfCallbacks[--i]; + + if (arg != null && typeof arg != 'function') { + throw new Error('arg '+i+' must be a function'); + } + } + } + + function noop() {} + function identity(x) { return x; } return when; }); -})(typeof define == 'function' && define.amd - ? define - : function (factory) { typeof exports === 'object' - ? (module.exports = factory()) - : (this.when = factory()); - } - // Boilerplate for AMD, Node, and browser global +})( + typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(); } ); diff --git a/js/lib/when-define-shim.js b/js/lib/when-define-shim.js new file mode 100644 index 00000000..ad135517 --- /dev/null +++ b/js/lib/when-define-shim.js @@ -0,0 +1,11 @@ +if (typeof window !== "undefined") { + window.define = function (factory) { + try { + delete window.define; + } catch (e) { + window.define = void 0; // IE + } + window.when = factory(); + }; + window.define.amd = {}; +} diff --git a/js/package.json b/js/package.json index d3398ca0..f950aee8 100644 --- a/js/package.json +++ b/js/package.json @@ -16,7 +16,7 @@ "dependencies": { "bane": "~0.4.0", "faye-websocket": "~0.4.4", - "when": "~1.8.1" + "when": "~2.0.0" }, "devDependencies": { "buster": "~0.6.12", diff --git a/js/src/mopidy.js b/js/src/mopidy.js index 011aec09..980256b5 100644 --- a/js/src/mopidy.js +++ b/js/src/mopidy.js @@ -242,7 +242,7 @@ Mopidy.prototype._handleEvent = function (eventMessage) { }; Mopidy.prototype._getApiSpec = function () { - this._send({method: "core.describe"}) + return this._send({method: "core.describe"}) .then(this._createApi.bind(this), this._handleWebSocketError) .then(null, this._handleWebSocketError); }; diff --git a/js/test/mopidy-test.js b/js/test/mopidy-test.js index b694fd7e..0bf97f60 100644 --- a/js/test/mopidy-test.js +++ b/js/test/mopidy-test.js @@ -610,16 +610,16 @@ buster.testCase("Mopidy", { assert.calledOnceWith(stub); }, - "gets Api description from server and calls _createApi": function () { + "gets Api description from server and calls _createApi": function (done) { var methods = {}; var sendStub = this.stub(this.mopidy, "_send"); sendStub.returns(when.resolve(methods)); var _createApiStub = this.stub(this.mopidy, "_createApi"); - this.mopidy._getApiSpec(); - - assert.calledOnceWith(sendStub, {method: "core.describe"}); - assert.calledOnceWith(_createApiStub, methods); + this.mopidy._getApiSpec().then(done(function () { + assert.calledOnceWith(sendStub, {method: "core.describe"}); + assert.calledOnceWith(_createApiStub, methods); + })); } }, diff --git a/mopidy/frontends/http/data/mopidy.js b/mopidy/frontends/http/data/mopidy.js index 20e43014..1669eaff 100644 --- a/mopidy/frontends/http/data/mopidy.js +++ b/mopidy/frontends/http/data/mopidy.js @@ -1,4 +1,4 @@ -/*! Mopidy.js - built 2013-03-12 +/*! Mopidy.js - built 2013-03-31 * http://www.mopidy.com/ * Copyright (c) 2013 Stein Magnus Jodal and contributors * Licensed under the Apache License, Version 2.0 */ @@ -166,6 +166,18 @@ return { createEventEmitter: createEventEmitter }; }); +if (typeof window !== "undefined") { + window.define = function (factory) { + try { + delete window.define; + } catch (e) { + window.define = void 0; // IE + } + window.when = factory(); + }; + window.define.amd = {}; +} + /** * A lightweight CommonJS Promises/A and when() implementation * when is part of the cujo.js family of libraries (http://cujojs.com/) @@ -175,34 +187,27 @@ * * @author Brian Cavalier * @author John Hann - * - * @version 1.8.1 + * @version 2.0.0 */ - (function(define) { 'use strict'; define(function () { - var reduceArray, slice, undef; - // // Public API - // - when.defer = defer; // Create a deferred - when.resolve = resolve; // Create a resolved promise - when.reject = reject; // Create a rejected promise + when.defer = defer; // Create a deferred + when.resolve = resolve; // Create a resolved promise + when.reject = reject; // Create a rejected promise - when.join = join; // Join 2 or more promises + when.join = join; // Join 2 or more promises - when.all = all; // Resolve a list of promises - when.map = map; // Array.map() for promises - when.reduce = reduce; // Array.reduce() for promises + when.all = all; // Resolve a list of promises + when.map = map; // Array.map() for promises + when.reduce = reduce; // Array.reduce() for promises - when.any = any; // One-winner race - when.some = some; // Multi-winner race + when.any = any; // One-winner race + when.some = some; // Multi-winner race - when.chain = chain; // Make a promise trigger another resolver - - when.isPromise = isPromise; // Determine if a thing is a promise + when.isPromise = isPromise; // Determine if a thing is a promise /** * Register an observer for a promise or immediate value. @@ -225,77 +230,6 @@ define(function () { return resolve(promiseOrValue).then(onFulfilled, onRejected, onProgress); } - /** - * Returns promiseOrValue if promiseOrValue is a {@link Promise}, a new Promise if - * promiseOrValue is a foreign promise, or a new, already-fulfilled {@link Promise} - * whose value is promiseOrValue if promiseOrValue is an immediate value. - * - * @param {*} promiseOrValue - * @returns {Promise} Guaranteed to return a trusted Promise. If promiseOrValue - * is trusted, returns promiseOrValue, otherwise, returns a new, already-resolved - * when.js promise whose resolution value is: - * * the resolution value of promiseOrValue if it's a foreign promise, or - * * promiseOrValue if it's a value - */ - function resolve(promiseOrValue) { - var promise; - - if(promiseOrValue instanceof Promise) { - // It's a when.js promise, so we trust it - promise = promiseOrValue; - - } else if(isPromise(promiseOrValue)) { - // Assimilate foreign promises - promise = assimilate(promiseOrValue); - } else { - // It's a value, create a fulfilled promise for it. - promise = fulfilled(promiseOrValue); - } - - return promise; - } - - /** - * Assimilate an untrusted thenable by introducing a trusted middle man. - * Not a perfect strategy, but possibly the best we can do. - * IMPORTANT: This is the only place when.js should ever call an untrusted - * thenable's then() on an. Don't expose the return value to the untrusted thenable - * - * @param {*} thenable - * @param {function} thenable.then - * @returns {Promise} - */ - function assimilate(thenable) { - var d = defer(); - - // TODO: Enqueue this for future execution in 2.0 - try { - thenable.then( - function(value) { d.resolve(value); }, - function(reason) { d.reject(reason); }, - function(update) { d.progress(update); } - ); - } catch(e) { - d.reject(e); - } - - return d.promise; - } - - /** - * Returns a rejected promise for the supplied promiseOrValue. The returned - * promise will be rejected with: - * - promiseOrValue, if it is a value, or - * - if promiseOrValue is a promise - * - promiseOrValue's value after it is fulfilled - * - promiseOrValue's reason after it is rejected - * @param {*} promiseOrValue the rejected value of the returned {@link Promise} - * @return {Promise} rejected {@link Promise} - */ - function reject(promiseOrValue) { - return when(promiseOrValue, rejected); - } - /** * Trusted Promise constructor. A Promise created from this constructor is * a trusted when.js promise. Any other duck-typed promise is considered @@ -308,18 +242,6 @@ define(function () { } Promise.prototype = { - /** - * Register a callback that will be called when a promise is - * fulfilled or rejected. Optionally also register a progress handler. - * Shortcut for .then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress) - * @param {function?} [onFulfilledOrRejected] - * @param {function?} [onProgress] - * @return {Promise} - */ - always: function(onFulfilledOrRejected, onProgress) { - return this.then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress); - }, - /** * Register a rejection handler. Shortcut for .then(undefined, onRejected) * @param {function?} onRejected @@ -329,6 +251,26 @@ define(function () { return this.then(undef, onRejected); }, + /** + * Ensures that onFulfilledOrRejected will be called regardless of whether + * this promise is fulfilled or rejected. onFulfilledOrRejected WILL NOT + * receive the promises' value or reason. Any returned value will be disregarded. + * onFulfilledOrRejected may throw or return a rejected promise to signal + * an additional error. + * @param {function} onFulfilledOrRejected handler to be called regardless of + * fulfillment or rejection + * @returns {Promise} + */ + ensure: function(onFulfilledOrRejected) { + var self = this; + + return this.then(injectHandler, injectHandler).yield(self); + + function injectHandler() { + return resolve(onFulfilledOrRejected()); + } + }, + /** * Shortcut for .then(function() { return value; }) * @param {*} value @@ -357,201 +299,291 @@ define(function () { return onFulfilled.apply(undef, array); }); }); + }, + + /** + * Shortcut for .then(onFulfilledOrRejected, onFulfilledOrRejected) + * @deprecated + */ + always: function(onFulfilledOrRejected, onProgress) { + return this.then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress); } }; /** - * Create an already-resolved promise for the supplied value - * @private + * Returns a resolved promise. The returned promise will be + * - fulfilled with promiseOrValue if it is a value, or + * - if promiseOrValue is a promise + * - fulfilled with promiseOrValue's value after it is fulfilled + * - rejected with promiseOrValue's reason after it is rejected + * @param {*} value + * @return {Promise} + */ + function resolve(value) { + return promise(function(resolve) { + resolve(value); + }); + } + + /** + * Returns a rejected promise for the supplied promiseOrValue. The returned + * promise will be rejected with: + * - promiseOrValue, if it is a value, or + * - if promiseOrValue is a promise + * - promiseOrValue's value after it is fulfilled + * - promiseOrValue's reason after it is rejected + * @param {*} promiseOrValue the rejected value of the returned {@link Promise} + * @return {Promise} rejected {@link Promise} + */ + function reject(promiseOrValue) { + return when(promiseOrValue, rejected); + } + + /** + * Creates a new Deferred with fully isolated resolver and promise parts, + * either or both of which may be given out safely to consumers. + * The resolver has resolve, reject, and progress. The promise + * only has then. * + * @return {{ + * promise: Promise, + * resolver: { + * resolve: function:Promise, + * reject: function:Promise, + * notify: function:Promise + * }}} + */ + function defer() { + var deferred, pending, resolved; + + // Optimize object shape + deferred = { + promise: undef, resolve: undef, reject: undef, notify: undef, + resolver: { resolve: undef, reject: undef, notify: undef } + }; + + deferred.promise = pending = promise(makeDeferred); + + return deferred; + + function makeDeferred(resolvePending, rejectPending, notifyPending) { + deferred.resolve = deferred.resolver.resolve = function(value) { + if(resolved) { + return resolve(value); + } + resolved = true; + resolvePending(value); + return pending; + }; + + deferred.reject = deferred.resolver.reject = function(reason) { + if(resolved) { + return resolve(rejected(reason)); + } + resolved = true; + rejectPending(reason); + return pending; + }; + + deferred.notify = deferred.resolver.notify = function(update) { + notifyPending(update); + return update; + }; + } + } + + /** + * Creates a new promise whose fate is determined by resolver. + * @private (for now) + * @param {function} resolver function(resolve, reject, notify) + * @returns {Promise} promise whose fate is determine by resolver + */ + function promise(resolver) { + var value, handlers = []; + + // Call the provider resolver to seal the promise's fate + try { + resolver(promiseResolve, promiseReject, promiseNotify); + } catch(e) { + promiseReject(e); + } + + // Return the promise + return new Promise(then); + + /** + * Register handlers for this promise. + * @param [onFulfilled] {Function} fulfillment handler + * @param [onRejected] {Function} rejection handler + * @param [onProgress] {Function} progress handler + * @return {Promise} new Promise + */ + function then(onFulfilled, onRejected, onProgress) { + return promise(function(resolve, reject, notify) { + handlers + // Call handlers later, after resolution + ? handlers.push(function(value) { + value.then(onFulfilled, onRejected, onProgress) + .then(resolve, reject, notify); + }) + // Call handlers soon, but not in the current stack + : enqueue(function() { + value.then(onFulfilled, onRejected, onProgress) + .then(resolve, reject, notify); + }); + }); + } + + /** + * Transition from pre-resolution state to post-resolution state, notifying + * all listeners of the ultimate fulfillment or rejection + * @param {*|Promise} val resolution value + */ + function promiseResolve(val) { + if(!handlers) { + return; + } + + value = coerce(val); + scheduleHandlers(handlers, value); + + handlers = undef; + } + + /** + * Reject this promise with the supplied reason, which will be used verbatim. + * @param {*} reason reason for the rejection + */ + function promiseReject(reason) { + promiseResolve(rejected(reason)); + } + + /** + * Issue a progress event, notifying all progress listeners + * @param {*} update progress event payload to pass to all listeners + */ + function promiseNotify(update) { + if(handlers) { + scheduleHandlers(handlers, progressing(update)); + } + } + } + + /** + * Coerces x to a trusted Promise + * + * @private + * @param {*} x thing to coerce + * @returns {Promise} Guaranteed to return a trusted Promise. If x + * is trusted, returns x, otherwise, returns a new, trusted, already-resolved + * Promise whose resolution value is: + * * the resolution value of x if it's a foreign promise, or + * * x if it's a value + */ + function coerce(x) { + if(x instanceof Promise) { + return x; + } else if (x !== Object(x)) { + return fulfilled(x); + } + + return promise(function(resolve, reject, notify) { + enqueue(function() { + try { + // We must check and assimilate in the same tick, but not the + // current tick, careful only to access promiseOrValue.then once. + var untrustedThen = x.then; + + if(typeof untrustedThen === 'function') { + fcall(untrustedThen, x, resolve, reject, notify); + } else { + // It's a value, create a fulfilled wrapper + resolve(fulfilled(x)); + } + + } catch(e) { + // Something went wrong, reject + reject(e); + } + }); + }); + } + + /** + * Create an already-fulfilled promise for the supplied value + * @private * @param {*} value * @return {Promise} fulfilled promise */ function fulfilled(value) { - var p = new Promise(function(onFulfilled) { + var self = new Promise(function (onFulfilled) { try { - return resolve(typeof onFulfilled == 'function' ? onFulfilled(value) : value); - } catch(e) { + return typeof onFulfilled == 'function' + ? coerce(onFulfilled(value)) : self; + } catch (e) { return rejected(e); } }); - return p; + return self; } /** - * Create an already-rejected {@link Promise} with the supplied - * rejection reason. + * Create an already-rejected promise with the supplied rejection reason. * @private - * * @param {*} reason * @return {Promise} rejected promise */ function rejected(reason) { - var p = new Promise(function(_, onRejected) { + var self = new Promise(function (_, onRejected) { try { - return resolve(typeof onRejected == 'function' ? onRejected(reason) : rejected(reason)); - } catch(e) { + return typeof onRejected == 'function' + ? coerce(onRejected(reason)) : self; + } catch (e) { return rejected(e); } }); - return p; + return self; } /** - * Creates a new, Deferred with fully isolated resolver and promise parts, - * either or both of which may be given out safely to consumers. - * The Deferred itself has the full API: resolve, reject, progress, and - * then. The resolver has resolve, reject, and progress. The promise - * only has then. - * - * @return {Deferred} + * Create a progress promise with the supplied update. + * @private + * @param {*} update + * @return {Promise} progress promise */ - function defer() { - var deferred, promise, handlers, progressHandlers, - _then, _notify, _resolve; - - /** - * The promise for the new deferred - * @type {Promise} - */ - promise = new Promise(then); - - /** - * The full Deferred object, with {@link Promise} and {@link Resolver} parts - * @class Deferred - * @name Deferred - */ - deferred = { - then: then, // DEPRECATED: use deferred.promise.then - resolve: promiseResolve, - reject: promiseReject, - progress: promiseNotify, // DEPRECATED: use deferred.notify - notify: promiseNotify, - - promise: promise, - - resolver: { - resolve: promiseResolve, - reject: promiseReject, - progress: promiseNotify, // DEPRECATED: use deferred.notify - notify: promiseNotify + function progressing(update) { + var self = new Promise(function (_, __, onProgress) { + try { + return typeof onProgress == 'function' + ? progressing(onProgress(update)) : self; + } catch (e) { + return progressing(e); } - }; + }); - handlers = []; - progressHandlers = []; - - /** - * Pre-resolution then() that adds the supplied callback, errback, and progback - * functions to the registered listeners - * @private - * - * @param {function?} [onFulfilled] resolution handler - * @param {function?} [onRejected] rejection handler - * @param {function?} [onProgress] progress handler - */ - _then = function(onFulfilled, onRejected, onProgress) { - var deferred, progressHandler; - - deferred = defer(); - - progressHandler = typeof onProgress === 'function' - ? function(update) { - try { - // Allow progress handler to transform progress event - deferred.notify(onProgress(update)); - } catch(e) { - // Use caught value as progress - deferred.notify(e); - } - } - : function(update) { deferred.notify(update); }; - - handlers.push(function(promise) { - promise.then(onFulfilled, onRejected) - .then(deferred.resolve, deferred.reject, progressHandler); - }); - - progressHandlers.push(progressHandler); - - return deferred.promise; - }; - - /** - * Issue a progress event, notifying all progress listeners - * @private - * @param {*} update progress event payload to pass to all listeners - */ - _notify = function(update) { - processQueue(progressHandlers, update); - return update; - }; - - /** - * Transition from pre-resolution state to post-resolution state, notifying - * all listeners of the resolution or rejection - * @private - * @param {*} value the value of this deferred - */ - _resolve = function(value) { - // Replace _then with one that directly notifies with the result. - _then = value.then; - // Replace _resolve so that this Deferred can only be resolved once - _resolve = resolve; - // Make _progress a noop, to disallow progress for the resolved promise. - _notify = identity; - - // Notify handlers - processQueue(handlers, value); - - // Free progressHandlers array since we'll never issue progress events - progressHandlers = handlers = undef; - - return value; - }; - - return deferred; - - /** - * Wrapper to allow _then to be replaced safely - * @param {function?} [onFulfilled] resolution handler - * @param {function?} [onRejected] rejection handler - * @param {function?} [onProgress] progress handler - * @return {Promise} new promise - */ - function then(onFulfilled, onRejected, onProgress) { - // TODO: Promises/A+ check typeof onFulfilled, onRejected, onProgress - return _then(onFulfilled, onRejected, onProgress); - } - - /** - * Wrapper to allow _resolve to be replaced - */ - function promiseResolve(val) { - return _resolve(resolve(val)); - } - - /** - * Wrapper to allow _reject to be replaced - */ - function promiseReject(err) { - return _resolve(rejected(err)); - } - - /** - * Wrapper to allow _notify to be replaced - */ - function promiseNotify(update) { - return _notify(update); - } + return self; } /** - * Determines if promiseOrValue is a promise or not. Uses the feature - * test from http://wiki.commonjs.org/wiki/Promises/A to determine if - * promiseOrValue is a promise. + * Schedule a task that will process a list of handlers + * in the next queue drain run. + * @private + * @param {Array} handlers queue of handlers to execute + * @param {*} value passed as the only arg to each handler + */ + function scheduleHandlers(handlers, value) { + enqueue(function() { + var handler, i = 0; + while (handler = handlers[i++]) { + handler(value); + } + }); + } + + /** + * Determines if promiseOrValue is a promise or not * * @param {*} promiseOrValue anything * @returns {boolean} true if promiseOrValue is a {@link Promise} @@ -573,8 +605,8 @@ define(function () { * @param {function?} [onRejected] rejection handler * @param {function?} [onProgress] progress handler * @returns {Promise} promise that will resolve to an array of howMany values that - * resolved first, or will reject with an array of (promisesOrValues.length - howMany) + 1 - * rejection reasons. + * resolved first, or will reject with an array of + * (promisesOrValues.length - howMany) + 1 rejection reasons. */ function some(promisesOrValues, howMany, onFulfilled, onRejected, onProgress) { @@ -582,62 +614,56 @@ define(function () { return when(promisesOrValues, function(promisesOrValues) { - var toResolve, toReject, values, reasons, deferred, fulfillOne, rejectOne, notify, len, i; + return promise(resolveSome).then(onFulfilled, onRejected, onProgress); - len = promisesOrValues.length >>> 0; + function resolveSome(resolve, reject, notify) { + var toResolve, toReject, values, reasons, fulfillOne, rejectOne, len, i; - toResolve = Math.max(0, Math.min(howMany, len)); - values = []; + len = promisesOrValues.length >>> 0; - toReject = (len - toResolve) + 1; - reasons = []; + toResolve = Math.max(0, Math.min(howMany, len)); + values = []; - deferred = defer(); + toReject = (len - toResolve) + 1; + reasons = []; - // No items in the input, resolve immediately - if (!toResolve) { - deferred.resolve(values); + // No items in the input, resolve immediately + if (!toResolve) { + resolve(values); - } else { - notify = deferred.notify; + } else { + rejectOne = function(reason) { + reasons.push(reason); + if(!--toReject) { + fulfillOne = rejectOne = noop; + reject(reasons); + } + }; - rejectOne = function(reason) { - reasons.push(reason); - if(!--toReject) { - fulfillOne = rejectOne = noop; - deferred.reject(reasons); - } - }; + fulfillOne = function(val) { + // This orders the values based on promise resolution order + values.push(val); + if (!--toResolve) { + fulfillOne = rejectOne = noop; + resolve(values); + } + }; - fulfillOne = function(val) { - // This orders the values based on promise resolution order - // Another strategy would be to use the original position of - // the corresponding promise. - values.push(val); - - if (!--toResolve) { - fulfillOne = rejectOne = noop; - deferred.resolve(values); - } - }; - - for(i = 0; i < len; ++i) { - if(i in promisesOrValues) { - when(promisesOrValues[i], fulfiller, rejecter, notify); + for(i = 0; i < len; ++i) { + if(i in promisesOrValues) { + when(promisesOrValues[i], fulfiller, rejecter, notify); + } } } + + function rejecter(reason) { + rejectOne(reason); + } + + function fulfiller(val) { + fulfillOne(val); + } } - - return deferred.promise.then(onFulfilled, onRejected, onProgress); - - function rejecter(reason) { - rejectOne(reason); - } - - function fulfiller(val) { - fulfillOne(val); - } - }); } @@ -695,50 +721,50 @@ define(function () { * input to contain {@link Promise}s and/or values, and mapFunc may return * either a value or a {@link Promise} * - * @param {Array|Promise} promise array of anything, may contain a mix + * @param {Array|Promise} array array of anything, may contain a mix * of {@link Promise}s and values * @param {function} mapFunc mapping function mapFunc(value) which may return * either a {@link Promise} or value * @returns {Promise} a {@link Promise} that will resolve to an array containing * the mapped output values. */ - function map(promise, mapFunc) { - return when(promise, function(array) { - var results, len, toResolve, resolve, i, d; + function map(array, mapFunc) { + return when(array, function(array) { - // Since we know the resulting length, we can preallocate the results - // array to avoid array expansions. - toResolve = len = array.length >>> 0; - results = []; - d = defer(); + return promise(resolveMap); - if(!toResolve) { - d.resolve(results); - } else { + function resolveMap(resolve, reject, notify) { + var results, len, toResolve, resolveOne, i; - resolve = function resolveOne(item, i) { - when(item, mapFunc).then(function(mapped) { - results[i] = mapped; + // Since we know the resulting length, we can preallocate the results + // array to avoid array expansions. + toResolve = len = array.length >>> 0; + results = []; - if(!--toResolve) { - d.resolve(results); + if(!toResolve) { + resolve(results); + } else { + + resolveOne = function(item, i) { + when(item, mapFunc).then(function(mapped) { + results[i] = mapped; + + if(!--toResolve) { + resolve(results); + } + }, reject, notify); + }; + + // Since mapFunc may be async, get all invocations of it into flight + for(i = 0; i < len; i++) { + if(i in array) { + resolveOne(array[i], i); + } else { + --toResolve; } - }, d.reject); - }; - - // Since mapFunc may be async, get all invocations of it into flight - for(i = 0; i < len; i++) { - if(i in array) { - resolve(array[i], i); - } else { - --toResolve; } } - } - - return d.promise; - }); } @@ -756,7 +782,7 @@ define(function () { * @returns {Promise} that will resolve to the final reduced value */ function reduce(promise, reduceFunc /*, initialValue */) { - var args = slice.call(arguments, 1); + var args = fcall(slice, arguments, 1); return when(promise, function(array) { var total; @@ -777,102 +803,94 @@ define(function () { }); } - /** - * Ensure that resolution of promiseOrValue will trigger resolver with the - * value or reason of promiseOrValue, or instead with resolveValue if it is provided. - * - * @param promiseOrValue - * @param {Object} resolver - * @param {function} resolver.resolve - * @param {function} resolver.reject - * @param {*} [resolveValue] - * @returns {Promise} - */ - function chain(promiseOrValue, resolver, resolveValue) { - var useResolveValue = arguments.length > 2; - - return when(promiseOrValue, - function(val) { - val = useResolveValue ? resolveValue : val; - resolver.resolve(val); - return val; - }, - function(reason) { - resolver.reject(reason); - return rejected(reason); - }, - function(update) { - typeof resolver.notify === 'function' && resolver.notify(update); - return update; - } - ); - } - // - // Utility functions + // Utilities, etc. // - /** - * Apply all functions in queue to value - * @param {Array} queue array of functions to execute - * @param {*} value argument passed to each function - */ - function processQueue(queue, value) { - var handler, i = 0; + var reduceArray, slice, fcall, nextTick, handlerQueue, + timeout, funcProto, call, arrayProto, undef; - while (handler = queue[i++]) { - handler(value); + // + // Shared handler queue processing + // + // Credit to Twisol (https://github.com/Twisol) for suggesting + // this type of extensible queue + trampoline approach for + // next-tick conflation. + + handlerQueue = []; + + /** + * Enqueue a task. If the queue is not currently scheduled to be + * drained, schedule it. + * @param {function} task + */ + function enqueue(task) { + if(handlerQueue.push(task) === 1) { + scheduleDrainQueue(); } } /** - * Helper that checks arrayOfCallbacks to ensure that each element is either - * a function, or null or undefined. - * @private - * @param {number} start index at which to start checking items in arrayOfCallbacks - * @param {Array} arrayOfCallbacks array to check - * @throws {Error} if any element of arrayOfCallbacks is something other than - * a functions, null, or undefined. + * Schedule the queue to be drained in the next tick. */ - function checkCallbacks(start, arrayOfCallbacks) { - // TODO: Promises/A+ update type checking and docs - var arg, i = arrayOfCallbacks.length; - - while(i > start) { - arg = arrayOfCallbacks[--i]; - - if (arg != null && typeof arg != 'function') { - throw new Error('arg '+i+' must be a function'); - } - } + function scheduleDrainQueue() { + nextTick(drainQueue); } /** - * No-Op function used in method replacement - * @private + * Drain the handler queue entirely or partially, being careful to allow + * the queue to be extended while it is being processed, and to continue + * processing until it is truly empty. */ - function noop() {} + function drainQueue() { + var task, i = 0; - slice = [].slice; + while(task = handlerQueue[i++]) { + task(); + } + + handlerQueue = []; + } + + // + // Capture function and array utils + // + /*global setImmediate:true*/ + + // capture setTimeout to avoid being caught by fake timers used in time based tests + timeout = setTimeout; + nextTick = typeof setImmediate === 'function' + ? typeof window === 'undefined' + ? setImmediate + : setImmediate.bind(window) + : typeof process === 'object' + ? process.nextTick + : function(task) { timeout(task, 0); }; + + // Safe function calls + funcProto = Function.prototype; + call = funcProto.call; + fcall = funcProto.bind + ? call.bind(call) + : function(f, context) { + return f.apply(context, slice.call(arguments, 2)); + }; + + // Safe array ops + arrayProto = []; + slice = arrayProto.slice; // ES5 reduce implementation if native not available // See: http://es5.github.com/#x15.4.4.21 as there are many - // specifics and edge cases. - reduceArray = [].reduce || + // specifics and edge cases. ES5 dictates that reduce.length === 1 + // This implementation deviates from ES5 spec in the following ways: + // 1. It does not check if reduceFunc is a Callable + reduceArray = arrayProto.reduce || function(reduceFunc /*, initialValue */) { /*jshint maxcomplexity: 7*/ - - // ES5 dictates that reduce.length === 1 - - // This implementation deviates from ES5 spec in the following ways: - // 1. It does not check if reduceFunc is a Callable - var arr, args, reduced, len, i; i = 0; - // This generates a jshint warning, despite being valid - // "Missing 'new' prefix when invoking a constructor." - // See https://github.com/jshint/jshint/issues/392 arr = Object(this); len = arr.length >>> 0; args = arguments; @@ -900,7 +918,6 @@ define(function () { // Do the actual reduce for(;i < len; ++i) { - // Skip holes if(i in arr) { reduced = reduceFunc(reduced, arr[i], i, arr); } @@ -909,21 +926,50 @@ define(function () { return reduced; }; + // + // Utility functions + // + + /** + * Helper that checks arrayOfCallbacks to ensure that each element is either + * a function, or null or undefined. + * @private + * @param {number} start index at which to start checking items in arrayOfCallbacks + * @param {Array} arrayOfCallbacks array to check + * @throws {Error} if any element of arrayOfCallbacks is something other than + * a functions, null, or undefined. + */ + function checkCallbacks(start, arrayOfCallbacks) { + // TODO: Promises/A+ update type checking and docs + var arg, i = arrayOfCallbacks.length; + + while(i > start) { + arg = arrayOfCallbacks[--i]; + + if (arg != null && typeof arg != 'function') { + throw new Error('arg '+i+' must be a function'); + } + } + } + + function noop() {} + function identity(x) { return x; } return when; }); -})(typeof define == 'function' && define.amd - ? define - : function (factory) { typeof exports === 'object' - ? (module.exports = factory()) - : (this.when = factory()); - } - // Boilerplate for AMD, Node, and browser global +})( + typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(); } ); +if (typeof module === "object" && typeof require === "function") { + var bane = require("bane"); + var websocket = require("faye-websocket"); + var when = require("when"); +} + function Mopidy(settings) { if (!(this instanceof Mopidy)) { return new Mopidy(settings); @@ -944,9 +990,17 @@ function Mopidy(settings) { } } +if (typeof module === "object" && typeof require === "function") { + Mopidy.WebSocket = websocket.Client; +} else { + Mopidy.WebSocket = window.WebSocket; +} + Mopidy.prototype._configure = function (settings) { + var currentHost = (typeof document !== "undefined" && + document.location.host) || "localhost"; settings.webSocketUrl = settings.webSocketUrl || - "ws://" + document.location.host + "/mopidy/ws/"; + "ws://" + currentHost + "/mopidy/ws/"; if (settings.autoConnect !== false) { settings.autoConnect = true; @@ -959,7 +1013,7 @@ Mopidy.prototype._configure = function (settings) { }; Mopidy.prototype._getConsole = function () { - var console = window.console || {}; + var console = typeof console !== "undefined" && console || {}; console.log = console.log || function () {}; console.warn = console.warn || function () {}; @@ -987,7 +1041,7 @@ Mopidy.prototype._delegateEvents = function () { Mopidy.prototype.connect = function () { if (this._webSocket) { - if (this._webSocket.readyState === WebSocket.OPEN) { + if (this._webSocket.readyState === Mopidy.WebSocket.OPEN) { return; } else { this._webSocket.close(); @@ -995,7 +1049,7 @@ Mopidy.prototype.connect = function () { } this._webSocket = this._settings.webSocket || - new WebSocket(this._settings.webSocketUrl); + new Mopidy.WebSocket(this._settings.webSocketUrl); this._webSocket.onclose = function (close) { this.emit("websocket:close", close); @@ -1060,17 +1114,17 @@ Mopidy.prototype._send = function (message) { var deferred = when.defer(); switch (this._webSocket.readyState) { - case WebSocket.CONNECTING: + case Mopidy.WebSocket.CONNECTING: deferred.resolver.reject({ message: "WebSocket is still connecting" }); break; - case WebSocket.CLOSING: + case Mopidy.WebSocket.CLOSING: deferred.resolver.reject({ message: "WebSocket is closing" }); break; - case WebSocket.CLOSED: + case Mopidy.WebSocket.CLOSED: deferred.resolver.reject({ message: "WebSocket is closed" }); @@ -1152,7 +1206,7 @@ Mopidy.prototype._handleEvent = function (eventMessage) { }; Mopidy.prototype._getApiSpec = function () { - this._send({method: "core.describe"}) + return this._send({method: "core.describe"}) .then(this._createApi.bind(this), this._handleWebSocketError) .then(null, this._handleWebSocketError); }; @@ -1204,3 +1258,7 @@ Mopidy.prototype._snakeToCamel = function (name) { return match.toUpperCase().replace("_", ""); }); }; + +if (typeof exports === "object") { + exports.Mopidy = Mopidy; +} diff --git a/mopidy/frontends/http/data/mopidy.min.js b/mopidy/frontends/http/data/mopidy.min.js index fd8a0baf..08ee1dac 100644 --- a/mopidy/frontends/http/data/mopidy.min.js +++ b/mopidy/frontends/http/data/mopidy.min.js @@ -1,5 +1,5 @@ -/*! Mopidy.js - built 2013-03-12 +/*! Mopidy.js - built 2013-03-31 * http://www.mopidy.com/ * Copyright (c) 2013 Stein Magnus Jodal and contributors * Licensed under the Apache License, Version 2.0 */ -function Mopidy(e){return this instanceof Mopidy?(this._settings=this._configure(e||{}),this._console=this._getConsole(),this._backoffDelay=this._settings.backoffDelayMin,this._pendingRequests={},this._webSocket=null,bane.createEventEmitter(this),this._delegateEvents(),this._settings.autoConnect&&this.connect(),void 0):new Mopidy(e)}("function"==typeof define&&define.amd&&function(e){define(e)}||"object"==typeof module&&function(e){module.exports=e()}||function(e){this.bane=e()})(function(){"use strict";function e(e,t,n){var o,r=n.length;if(r>0)for(o=0;r>o;++o)n[o](e,t);else setTimeout(function(){throw t.message=e+" listener threw error: "+t.message,t},0)}function t(e){if("function"!=typeof e)throw new TypeError("Listener is not function");return e}function n(e){return e.supervisors||(e.supervisors=[]),e.supervisors}function o(e,t){return e.listeners||(e.listeners={}),t&&!e.listeners[t]&&(e.listeners[t]=[]),t?e.listeners[t]:e.listeners}function r(e){return e.errbacks||(e.errbacks=[]),e.errbacks}function i(i){function c(t,n,o){try{n.listener.apply(n.thisp||i,o)}catch(s){e(t,s,r(i))}}return i=i||{},i.on=function(e,r,i){return"function"==typeof e?n(this).push({listener:e,thisp:r}):(o(this,e).push({listener:t(r),thisp:i}),void 0)},i.off=function(e,t){var i,s,c,f;if(!e){i=n(this),i.splice(0,i.length),s=o(this);for(c in s)s.hasOwnProperty(c)&&(i=o(this,c),i.splice(0,i.length));return i=r(this),i.splice(0,i.length),void 0}if("function"==typeof e?(i=n(this),t=e):i=o(this,e),!t)return i.splice(0,i.length),void 0;for(c=0,f=i.length;f>c;++c)if(i[c].listener===t)return i.splice(c,1),void 0},i.once=function(e,t,n){var o=function(){i.off(e,o),t.apply(this,arguments)};i.on(e,o,n)},i.bind=function(e,t){var n,o,r;if(t)for(o=0,r=t.length;r>o;++o){if("function"!=typeof e[t[o]])throw Error("No such method "+t[o]);this.on(t[o],e[t[o]],e)}else for(n in e)"function"==typeof e[n]&&this.on(n,e[n],e);return e},i.emit=function(e){var t,r,i=n(this),f=s.call(arguments);for(t=0,r=i.length;r>t;++t)c(e,i[t],f);for(i=o(this,e).slice(),f=s.call(arguments,1),t=0,r=i.length;r>t;++t)c(e,i[t],f)},i.errback=function(e){this.errbacks||(this.errbacks=[]),this.errbacks.push(t(e))},i}var s=Array.prototype.slice;return{createEventEmitter:i}}),function(e){"use strict";e(function(){function e(e,n,o,r){return t(e).then(n,o,r)}function t(e){var t;return t=e instanceof r?e:f(e)?n(e):i(e)}function n(e){var t=c();try{e.then(function(e){t.resolve(e)},function(e){t.reject(e)},function(e){t.progress(e)})}catch(n){t.reject(n)}return t.promise}function o(t){return e(t,s)}function r(e){this.then=e}function i(e){var n=new r(function(n){try{return t("function"==typeof n?n(e):e)}catch(o){return s(o)}});return n}function s(e){var n=new r(function(n,o){try{return t("function"==typeof o?o(e):s(e))}catch(r){return s(r)}});return n}function c(){function e(e,t,n){return l(e,t,n)}function n(e){return d(t(e))}function o(e){return d(s(e))}function i(e){return p(e)}var f,u,a,h,l,p,d;return u=new r(e),f={then:e,resolve:n,reject:o,progress:i,notify:i,promise:u,resolver:{resolve:n,reject:o,progress:i,notify:i}},a=[],h=[],l=function(e,t,n){var o,r;return o=c(),r="function"==typeof n?function(e){try{o.notify(n(e))}catch(t){o.notify(t)}}:function(e){o.notify(e)},a.push(function(n){n.then(e,t).then(o.resolve,o.reject,r)}),h.push(r),o.promise},p=function(e){return b(h,e),e},d=function(e){return l=e.then,d=t,p=_,b(a,e),h=a=m,e},f}function f(e){return e&&"function"==typeof e.then}function u(t,n,o,r,i){return g(2,arguments),e(t,function(t){function s(e){y(e)}function f(e){d(e)}var u,a,h,l,p,d,y,b,g,_;if(g=t.length>>>0,u=Math.max(0,Math.min(n,g)),h=[],a=g-u+1,l=[],p=c(),u)for(b=p.notify,y=function(e){l.push(e),--a||(d=y=k,p.reject(l))},d=function(e){h.push(e),--u||(d=y=k,p.resolve(h))},_=0;g>_;++_)_ in t&&e(t[_],f,s,b);else p.resolve(h);return p.promise.then(o,r,i)})}function a(e,t,n,o){function r(e){return t?t(e[0]):e[0]}return u(e,1,r,n,o)}function h(e,t,n,o){return g(1,arguments),p(e,_).then(t,n,o)}function l(){return p(arguments,_)}function p(t,n){return e(t,function(t){var o,r,i,s,f,u;if(i=r=t.length>>>0,o=[],u=c(),i)for(s=function(t,r){e(t,n).then(function(e){o[r]=e,--i||u.resolve(o)},u.reject)},f=0;r>f;f++)f in t?s(t[f],f):--i;else u.resolve(o);return u.promise})}function d(t,n){var o=w.call(arguments,1);return e(t,function(t){var r;return r=t.length,o[0]=function(t,o,i){return e(t,function(t){return e(o,function(e){return n(t,e,i,r)})})},v.apply(t,o)})}function y(t,n,o){var r=arguments.length>2;return e(t,function(e){return e=r?o:e,n.resolve(e),e},function(e){return n.reject(e),s(e)},function(e){return"function"==typeof n.notify&&n.notify(e),e})}function b(e,t){for(var n,o=0;n=e[o++];)n(t)}function g(e,t){for(var n,o=t.length;o>e;)if(n=t[--o],null!=n&&"function"!=typeof n)throw Error("arg "+o+" must be a function")}function k(){}function _(e){return e}var v,w,m;return e.defer=c,e.resolve=t,e.reject=o,e.join=l,e.all=h,e.map=p,e.reduce=d,e.any=a,e.some=u,e.chain=y,e.isPromise=f,r.prototype={always:function(e,t){return this.then(e,e,t)},otherwise:function(e){return this.then(m,e)},yield:function(e){return this.then(function(){return e})},spread:function(e){return this.then(function(t){return h(t,function(t){return e.apply(m,t)})})}},w=[].slice,v=[].reduce||function(e){var t,n,o,r,i;if(i=0,t=Object(this),r=t.length>>>0,n=arguments,1>=n.length)for(;;){if(i in t){o=t[i++];break}if(++i>=r)throw new TypeError}else o=n[1];for(;r>i;++i)i in t&&(o=e(o,t[i],i,t));return o},e})}("function"==typeof define&&define.amd?define:function(e){"object"==typeof exports?module.exports=e():this.when=e()}),Mopidy.prototype._configure=function(e){return e.webSocketUrl=e.webSocketUrl||"ws://"+document.location.host+"/mopidy/ws/",e.autoConnect!==!1&&(e.autoConnect=!0),e.backoffDelayMin=e.backoffDelayMin||1e3,e.backoffDelayMax=e.backoffDelayMax||64e3,e},Mopidy.prototype._getConsole=function(){var e=window.console||{};return e.log=e.log||function(){},e.warn=e.warn||function(){},e.error=e.error||function(){},e},Mopidy.prototype._delegateEvents=function(){this.off("websocket:close"),this.off("websocket:error"),this.off("websocket:incomingMessage"),this.off("websocket:open"),this.off("state:offline"),this.on("websocket:close",this._cleanup),this.on("websocket:error",this._handleWebSocketError),this.on("websocket:incomingMessage",this._handleMessage),this.on("websocket:open",this._resetBackoffDelay),this.on("websocket:open",this._getApiSpec),this.on("state:offline",this._reconnect)},Mopidy.prototype.connect=function(){if(this._webSocket){if(this._webSocket.readyState===WebSocket.OPEN)return;this._webSocket.close()}this._webSocket=this._settings.webSocket||new WebSocket(this._settings.webSocketUrl),this._webSocket.onclose=function(e){this.emit("websocket:close",e)}.bind(this),this._webSocket.onerror=function(e){this.emit("websocket:error",e)}.bind(this),this._webSocket.onopen=function(){this.emit("websocket:open")}.bind(this),this._webSocket.onmessage=function(e){this.emit("websocket:incomingMessage",e)}.bind(this)},Mopidy.prototype._cleanup=function(e){Object.keys(this._pendingRequests).forEach(function(t){var n=this._pendingRequests[t];delete this._pendingRequests[t],n.reject({message:"WebSocket closed",closeEvent:e})}.bind(this)),this.emit("state:offline")},Mopidy.prototype._reconnect=function(){this.emit("reconnectionPending",{timeToAttempt:this._backoffDelay}),setTimeout(function(){this.emit("reconnecting"),this.connect()}.bind(this),this._backoffDelay),this._backoffDelay=2*this._backoffDelay,this._backoffDelay>this._settings.backoffDelayMax&&(this._backoffDelay=this._settings.backoffDelayMax)},Mopidy.prototype._resetBackoffDelay=function(){this._backoffDelay=this._settings.backoffDelayMin},Mopidy.prototype.close=function(){this.off("state:offline",this._reconnect),this._webSocket.close()},Mopidy.prototype._handleWebSocketError=function(e){this._console.warn("WebSocket error:",e.stack||e)},Mopidy.prototype._send=function(e){var t=when.defer();switch(this._webSocket.readyState){case WebSocket.CONNECTING:t.resolver.reject({message:"WebSocket is still connecting"});break;case WebSocket.CLOSING:t.resolver.reject({message:"WebSocket is closing"});break;case WebSocket.CLOSED:t.resolver.reject({message:"WebSocket is closed"});break;default:e.jsonrpc="2.0",e.id=this._nextRequestId(),this._pendingRequests[e.id]=t.resolver,this._webSocket.send(JSON.stringify(e)),this.emit("websocket:outgoingMessage",e)}return t.promise},Mopidy.prototype._nextRequestId=function(){var e=-1;return function(){return e+=1}}(),Mopidy.prototype._handleMessage=function(e){try{var t=JSON.parse(e.data);t.hasOwnProperty("id")?this._handleResponse(t):t.hasOwnProperty("event")?this._handleEvent(t):this._console.warn("Unknown message type received. Message was: "+e.data)}catch(n){if(!(n instanceof SyntaxError))throw n;this._console.warn("WebSocket message parsing failed. Message was: "+e.data)}},Mopidy.prototype._handleResponse=function(e){if(!this._pendingRequests.hasOwnProperty(e.id))return this._console.warn("Unexpected response received. Message was:",e),void 0;var t=this._pendingRequests[e.id];delete this._pendingRequests[e.id],e.hasOwnProperty("result")?t.resolve(e.result):e.hasOwnProperty("error")?(t.reject(e.error),this._console.warn("Server returned error:",e.error)):(t.reject({message:"Response without 'result' or 'error' received",data:{response:e}}),this._console.warn("Response without 'result' or 'error' received. Message was:",e))},Mopidy.prototype._handleEvent=function(e){var t=e.event,n=e;delete n.event,this.emit("event:"+this._snakeToCamel(t),n)},Mopidy.prototype._getApiSpec=function(){this._send({method:"core.describe"}).then(this._createApi.bind(this),this._handleWebSocketError).then(null,this._handleWebSocketError)},Mopidy.prototype._createApi=function(e){var t=function(e){return function(){var t=Array.prototype.slice.call(arguments);return this._send({method:e,params:t})}.bind(this)}.bind(this),n=function(e){var t=e.split(".");return t.length>=1&&"core"===t[0]&&(t=t.slice(1)),t},o=function(e){var t=this;return e.forEach(function(e){e=this._snakeToCamel(e),t[e]=t[e]||{},t=t[e]}.bind(this)),t}.bind(this),r=function(r){var i=n(r),s=this._snakeToCamel(i.slice(-1)[0]),c=o(i.slice(0,-1));c[s]=t(r),c[s].description=e[r].description,c[s].params=e[r].params}.bind(this);Object.keys(e).forEach(r),this.emit("state:online")},Mopidy.prototype._snakeToCamel=function(e){return e.replace(/(_[a-z])/g,function(e){return e.toUpperCase().replace("_","")})}; \ No newline at end of file +function Mopidy(e){return this instanceof Mopidy?(this._settings=this._configure(e||{}),this._console=this._getConsole(),this._backoffDelay=this._settings.backoffDelayMin,this._pendingRequests={},this._webSocket=null,bane.createEventEmitter(this),this._delegateEvents(),this._settings.autoConnect&&this.connect(),void 0):new Mopidy(e)}if(("function"==typeof define&&define.amd&&function(e){define(e)}||"object"==typeof module&&function(e){module.exports=e()}||function(e){this.bane=e()})(function(){"use strict";function e(e,t,n){var o,i=n.length;if(i>0)for(o=0;i>o;++o)n[o](e,t);else setTimeout(function(){throw t.message=e+" listener threw error: "+t.message,t},0)}function t(e){if("function"!=typeof e)throw new TypeError("Listener is not function");return e}function n(e){return e.supervisors||(e.supervisors=[]),e.supervisors}function o(e,t){return e.listeners||(e.listeners={}),t&&!e.listeners[t]&&(e.listeners[t]=[]),t?e.listeners[t]:e.listeners}function i(e){return e.errbacks||(e.errbacks=[]),e.errbacks}function r(r){function c(t,n,o){try{n.listener.apply(n.thisp||r,o)}catch(s){e(t,s,i(r))}}return r=r||{},r.on=function(e,i,r){return"function"==typeof e?n(this).push({listener:e,thisp:i}):(o(this,e).push({listener:t(i),thisp:r}),void 0)},r.off=function(e,t){var r,s,c,f;if(!e){r=n(this),r.splice(0,r.length),s=o(this);for(c in s)s.hasOwnProperty(c)&&(r=o(this,c),r.splice(0,r.length));return r=i(this),r.splice(0,r.length),void 0}if("function"==typeof e?(r=n(this),t=e):r=o(this,e),!t)return r.splice(0,r.length),void 0;for(c=0,f=r.length;f>c;++c)if(r[c].listener===t)return r.splice(c,1),void 0},r.once=function(e,t,n){var o=function(){r.off(e,o),t.apply(this,arguments)};r.on(e,o,n)},r.bind=function(e,t){var n,o,i;if(t)for(o=0,i=t.length;i>o;++o){if("function"!=typeof e[t[o]])throw Error("No such method "+t[o]);this.on(t[o],e[t[o]],e)}else for(n in e)"function"==typeof e[n]&&this.on(n,e[n],e);return e},r.emit=function(e){var t,i,r=n(this),f=s.call(arguments);for(t=0,i=r.length;i>t;++t)c(e,r[t],f);for(r=o(this,e).slice(),f=s.call(arguments,1),t=0,i=r.length;i>t;++t)c(e,r[t],f)},r.errback=function(e){this.errbacks||(this.errbacks=[]),this.errbacks.push(t(e))},r}var s=Array.prototype.slice;return{createEventEmitter:r}}),"undefined"!=typeof window&&(window.define=function(e){try{delete window.define}catch(t){window.define=void 0}window.when=e()},window.define.amd={}),function(e){"use strict";e(function(){function e(e,t,o,i){return n(e).then(t,o,i)}function t(e){this.then=e}function n(e){return r(function(t){t(e)})}function o(t){return e(t,f)}function i(){function e(e,r,s){t.resolve=t.resolver.resolve=function(t){return i?n(t):(i=!0,e(t),o)},t.reject=t.resolver.reject=function(e){return i?n(f(e)):(i=!0,r(e),o)},t.notify=t.resolver.notify=function(e){return s(e),e}}var t,o,i;return t={promise:R,resolve:R,reject:R,notify:R,resolver:{resolve:R,reject:R,notify:R}},t.promise=o=r(e),t}function r(e){function n(e,t,n){return r(function(o,i,r){p?p.push(function(s){s.then(e,t,n).then(o,i,r)}):k(function(){h.then(e,t,n).then(o,i,r)})})}function o(e){p&&(h=s(e),a(p,h),p=R)}function i(e){o(f(e))}function c(e){p&&a(p,u(e))}var h,p=[];try{e(o,i,c)}catch(l){i(l)}return new t(n)}function s(e){return e instanceof t?e:e!==Object(e)?c(e):r(function(t,n,o){k(function(){try{var i=e.then;"function"==typeof i?j(i,e,t,n,o):t(c(e))}catch(r){n(r)}})})}function c(e){var n=new t(function(t){try{return"function"==typeof t?s(t(e)):n}catch(o){return f(o)}});return n}function f(e){var n=new t(function(t,o){try{return"function"==typeof o?s(o(e)):n}catch(i){return f(i)}});return n}function u(e){var n=new t(function(t,o,i){try{return"function"==typeof i?u(i(e)):n}catch(r){return u(r)}});return n}function a(e,t){k(function(){for(var n,o=0;n=e[o++];)n(t)})}function h(e){return e&&"function"==typeof e.then}function p(t,n,o,i,s){return m(2,arguments),e(t,function(t){function c(o,i,r){function s(e){l(e)}function c(e){p(e)}var f,u,a,h,p,l,d,y;if(d=t.length>>>0,f=Math.max(0,Math.min(n,d)),a=[],u=d-f+1,h=[],f)for(l=function(e){h.push(e),--u||(p=l=v,i(h))},p=function(e){a.push(e),--f||(p=l=v,o(a))},y=0;d>y;++y)y in t&&e(t[y],c,s,r);else o(a)}return r(c).then(o,i,s)})}function l(e,t,n,o){function i(e){return t?t(e[0]):e[0]}return p(e,1,i,n,o)}function d(e,t,n,o){return m(1,arguments),b(e,M).then(t,n,o)}function y(){return b(arguments,M)}function b(t,n){return e(t,function(t){function o(o,i,r){var s,c,f,u,a;if(f=c=t.length>>>0,s=[],f)for(u=function(t,c){e(t,n).then(function(e){s[c]=e,--f||o(s)},i,r)},a=0;c>a;a++)a in t?u(t[a],a):--f;else o(s)}return r(o)})}function w(t,n){var o=j(E,arguments,1);return e(t,function(t){var i;return i=t.length,o[0]=function(t,o,r){return e(t,function(t){return e(o,function(e){return n(t,e,r,i)})})},S.apply(t,o)})}function k(e){1===W.push(e)&&g()}function g(){D(_)}function _(){for(var e,t=0;e=W[t++];)e();W=[]}function m(e,t){for(var n,o=t.length;o>e;)if(n=t[--o],null!=n&&"function"!=typeof n)throw Error("arg "+o+" must be a function")}function v(){}function M(e){return e}e.defer=i,e.resolve=n,e.reject=o,e.join=y,e.all=d,e.map=b,e.reduce=w,e.any=l,e.some=p,e.isPromise=h,t.prototype={otherwise:function(e){return this.then(R,e)},ensure:function(e){function t(){return n(e())}var o=this;return this.then(t,t).yield(o)},yield:function(e){return this.then(function(){return e})},spread:function(e){return this.then(function(t){return d(t,function(t){return e.apply(R,t)})})},always:function(e,t){return this.then(e,e,t)}};var S,E,j,D,W,O,q,C,x,R;return W=[],O=setTimeout,D="function"==typeof setImmediate?"undefined"==typeof window?setImmediate:setImmediate.bind(window):"object"==typeof process?process.nextTick:function(e){O(e,0)},q=Function.prototype,C=q.call,j=q.bind?C.bind(C):function(e,t){return e.apply(t,E.call(arguments,2))},x=[],E=x.slice,S=x.reduce||function(e){var t,n,o,i,r;if(r=0,t=Object(this),i=t.length>>>0,n=arguments,1>=n.length)for(;;){if(r in t){o=t[r++];break}if(++r>=i)throw new TypeError}else o=n[1];for(;i>r;++r)r in t&&(o=e(o,t[r],r,t));return o},e})}("function"==typeof define&&define.amd?define:function(e){module.exports=e()}),"object"==typeof module&&"function"==typeof require)var bane=require("bane"),websocket=require("faye-websocket"),when=require("when");Mopidy.WebSocket="object"==typeof module&&"function"==typeof require?websocket.Client:window.WebSocket,Mopidy.prototype._configure=function(e){var t="undefined"!=typeof document&&document.location.host||"localhost";return e.webSocketUrl=e.webSocketUrl||"ws://"+t+"/mopidy/ws/",e.autoConnect!==!1&&(e.autoConnect=!0),e.backoffDelayMin=e.backoffDelayMin||1e3,e.backoffDelayMax=e.backoffDelayMax||64e3,e},Mopidy.prototype._getConsole=function(){var e=e!==void 0&&e||{};return e.log=e.log||function(){},e.warn=e.warn||function(){},e.error=e.error||function(){},e},Mopidy.prototype._delegateEvents=function(){this.off("websocket:close"),this.off("websocket:error"),this.off("websocket:incomingMessage"),this.off("websocket:open"),this.off("state:offline"),this.on("websocket:close",this._cleanup),this.on("websocket:error",this._handleWebSocketError),this.on("websocket:incomingMessage",this._handleMessage),this.on("websocket:open",this._resetBackoffDelay),this.on("websocket:open",this._getApiSpec),this.on("state:offline",this._reconnect)},Mopidy.prototype.connect=function(){if(this._webSocket){if(this._webSocket.readyState===Mopidy.WebSocket.OPEN)return;this._webSocket.close()}this._webSocket=this._settings.webSocket||new Mopidy.WebSocket(this._settings.webSocketUrl),this._webSocket.onclose=function(e){this.emit("websocket:close",e)}.bind(this),this._webSocket.onerror=function(e){this.emit("websocket:error",e)}.bind(this),this._webSocket.onopen=function(){this.emit("websocket:open")}.bind(this),this._webSocket.onmessage=function(e){this.emit("websocket:incomingMessage",e)}.bind(this)},Mopidy.prototype._cleanup=function(e){Object.keys(this._pendingRequests).forEach(function(t){var n=this._pendingRequests[t];delete this._pendingRequests[t],n.reject({message:"WebSocket closed",closeEvent:e})}.bind(this)),this.emit("state:offline")},Mopidy.prototype._reconnect=function(){this.emit("reconnectionPending",{timeToAttempt:this._backoffDelay}),setTimeout(function(){this.emit("reconnecting"),this.connect()}.bind(this),this._backoffDelay),this._backoffDelay=2*this._backoffDelay,this._backoffDelay>this._settings.backoffDelayMax&&(this._backoffDelay=this._settings.backoffDelayMax)},Mopidy.prototype._resetBackoffDelay=function(){this._backoffDelay=this._settings.backoffDelayMin},Mopidy.prototype.close=function(){this.off("state:offline",this._reconnect),this._webSocket.close()},Mopidy.prototype._handleWebSocketError=function(e){this._console.warn("WebSocket error:",e.stack||e)},Mopidy.prototype._send=function(e){var t=when.defer();switch(this._webSocket.readyState){case Mopidy.WebSocket.CONNECTING:t.resolver.reject({message:"WebSocket is still connecting"});break;case Mopidy.WebSocket.CLOSING:t.resolver.reject({message:"WebSocket is closing"});break;case Mopidy.WebSocket.CLOSED:t.resolver.reject({message:"WebSocket is closed"});break;default:e.jsonrpc="2.0",e.id=this._nextRequestId(),this._pendingRequests[e.id]=t.resolver,this._webSocket.send(JSON.stringify(e)),this.emit("websocket:outgoingMessage",e)}return t.promise},Mopidy.prototype._nextRequestId=function(){var e=-1;return function(){return e+=1}}(),Mopidy.prototype._handleMessage=function(e){try{var t=JSON.parse(e.data);t.hasOwnProperty("id")?this._handleResponse(t):t.hasOwnProperty("event")?this._handleEvent(t):this._console.warn("Unknown message type received. Message was: "+e.data)}catch(n){if(!(n instanceof SyntaxError))throw n;this._console.warn("WebSocket message parsing failed. Message was: "+e.data)}},Mopidy.prototype._handleResponse=function(e){if(!this._pendingRequests.hasOwnProperty(e.id))return this._console.warn("Unexpected response received. Message was:",e),void 0;var t=this._pendingRequests[e.id];delete this._pendingRequests[e.id],e.hasOwnProperty("result")?t.resolve(e.result):e.hasOwnProperty("error")?(t.reject(e.error),this._console.warn("Server returned error:",e.error)):(t.reject({message:"Response without 'result' or 'error' received",data:{response:e}}),this._console.warn("Response without 'result' or 'error' received. Message was:",e))},Mopidy.prototype._handleEvent=function(e){var t=e.event,n=e;delete n.event,this.emit("event:"+this._snakeToCamel(t),n)},Mopidy.prototype._getApiSpec=function(){return this._send({method:"core.describe"}).then(this._createApi.bind(this),this._handleWebSocketError).then(null,this._handleWebSocketError)},Mopidy.prototype._createApi=function(e){var t=function(e){return function(){var t=Array.prototype.slice.call(arguments);return this._send({method:e,params:t})}.bind(this)}.bind(this),n=function(e){var t=e.split(".");return t.length>=1&&"core"===t[0]&&(t=t.slice(1)),t},o=function(e){var t=this;return e.forEach(function(e){e=this._snakeToCamel(e),t[e]=t[e]||{},t=t[e]}.bind(this)),t}.bind(this),i=function(i){var r=n(i),s=this._snakeToCamel(r.slice(-1)[0]),c=o(r.slice(0,-1));c[s]=t(i),c[s].description=e[i].description,c[s].params=e[i].params}.bind(this);Object.keys(e).forEach(i),this.emit("state:online")},Mopidy.prototype._snakeToCamel=function(e){return e.replace(/(_[a-z])/g,function(e){return e.toUpperCase().replace("_","")})},"object"==typeof exports&&(exports.Mopidy=Mopidy); \ No newline at end of file From 22fbd9eff870dd1b0cc9fe82813beb7a851ac7fd Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 31 Mar 2013 13:36:32 +0200 Subject: [PATCH 146/151] js: Bump minor version --- js/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/package.json b/js/package.json index f950aee8..b208be3f 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "mopidy", - "version": "0.0.1", + "version": "0.1.0", "description": "Client lib for controlling a Mopidy music server over a WebSocket", "homepage": "http://www.mopidy.com/", "author": { From 48ab99c45739f56cb76ba63b1c74e0e1ee8a0fdb Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 31 Mar 2013 13:42:21 +0200 Subject: [PATCH 147/151] docs: Cleanup changelog --- docs/changes.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index df4caa86..e382ae3d 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -16,16 +16,16 @@ v0.13.0 (in development) **Core** -- Log a warning if a track isn't playable to make it more obvious that backend - X needs backend Y to be present for playback to work. - - Removed the :attr:`mopidy.settings.DEBUG_THREAD` setting and the :option:`--debug-thread` command line option. Sending SIGUSR1 to the Mopidy process will now always make it log tracebacks for all alive threads. +- Log a warning if a track isn't playable to make it more obvious that backend + X needs backend Y to be present for playback to work. + - :meth:`mopidy.core.TracklistController.add` now accepts an ``uri`` which it - will lookup in the libraries and then add to the tracklist. This is helpful + will lookup in the library and then add to the tracklist. This is helpful for e.g. web clients that doesn't want to transfer all track meta data back to the server just to add it to the tracklist when the server already got all the needed information easily available. (Fixes: :issue:`325`) From c25a6e4c78b8231d69688a619c71e0214c770ed6 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 31 Mar 2013 16:20:17 +0200 Subject: [PATCH 148/151] docs: Refining the extensiondev docs --- docs/extensiondev.rst | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/docs/extensiondev.rst b/docs/extensiondev.rst index 65747502..ff831b34 100644 --- a/docs/extensiondev.rst +++ b/docs/extensiondev.rst @@ -136,6 +136,8 @@ class that will connect the rest of the dots. :: + from __future__ import unicode_literals + import re from setuptools import setup @@ -197,8 +199,15 @@ raising :exc:`ImportError` exceptions for missing dependencies, etc. :: + from __future__ import unicode_literals + import os + import pygst + pygst.require('0.10') + import gst + import gobject + from mopidy.exceptions import ExtensionError from mopidy.utils import ext @@ -255,9 +264,13 @@ raising :exc:`ImportError` exceptions for missing dependencies, etc. return SoundspotBackend @classmethod - def get_gstreamer_element_classes(cls): + def register_gstreamer_elements(cls): from .mixer import SoundspotMixer - return [SoundspotMixer] + + gobject.type_register(SoundspotMixer) + gst.element_register( + SoundspotMixer, 'soundspotmixer', gst.RANK_MARGINAL) + Example config.ini @@ -334,12 +347,11 @@ Example GStreamer element ========================= If you want to extend Mopidy's GStreamer pipeline with new custom GStreamer -elements, you'll need to get Mopidy to register them in GStreamer before they -can be used. +elements, you'll need to register them in GStreamer before they can be used. Basically, you just implement your GStreamer element in Python and then make -your :meth:`Extension.get_gstreamer_element_classes` method return a list with -the classes of all your custom GStreamer elements. +your :meth:`Extension.register_gstreamer_elements` method register all your +custom GStreamer elements. For examples of custom GStreamer elements implemented in Python, see :mod:`mopidy.audio.mixers`. @@ -377,20 +389,22 @@ extensions work. following config sources are added together, with the later ones overriding the earlier ones: - - the default config, + - the default config built from Mopidy core and all installed extensions, - ``/etc/mopidy.conf``, - - ``~/.config/mopidy.conf``, and + - ``~/.config/mopidy.conf``, - - any config file provided via command line arguments. + - any config file provided via command line arguments, and + + - any config values provided via command line arguments. 8. Add command line options for: - - printing the effective config, + - loading an additional config file for this execution of Mopidy, - - overriding a config temporarily, + - setting a config value for this execution of Mopidy, - - loading an additional config file, and + - printing the effective config and exit, and - - write a config value permanently to ``~/.config/mopidy.conf``. + - write a config value permanently to ``~/.config/mopidy.conf`` and exit. From 4f8907bbeb60fbae07ac2d72a66f79876412153f Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 31 Mar 2013 16:46:03 +0200 Subject: [PATCH 149/151] mpd: Handle paths as bytes with unknown encoding, not UTF-8 or Unicode --- mopidy/backends/local/translator.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/mopidy/backends/local/translator.py b/mopidy/backends/local/translator.py index e5c214d7..a36be927 100644 --- a/mopidy/backends/local/translator.py +++ b/mopidy/backends/local/translator.py @@ -142,12 +142,6 @@ def _convert_mpd_data(data, tracks, music_dir): albumartist_kwargs[b'musicbrainz_id'] = ( data['musicbrainz_albumartistid']) - if data['file'][0] == '/': - path = data['file'][1:] - else: - path = data['file'] - path = urllib.unquote(path.encode('ascii')).decode('utf-8') - if artist_kwargs: artist = Artist(**artist_kwargs) track_kwargs[b'artists'] = [artist] @@ -160,7 +154,19 @@ def _convert_mpd_data(data, tracks, music_dir): album = Album(**album_kwargs) track_kwargs[b'album'] = album + if data['file'][0] == '/': + path = data['file'][1:] + else: + path = data['file'] + path = urllib.unquote(path.encode('utf-8')) + + if isinstance(music_dir, unicode): + music_dir = music_dir.encode('utf-8') + + # Make sure we only pass bytestrings to path_to_uri to avoid implicit + # decoding of bytestrings to unicode strings track_kwargs[b'uri'] = path_to_uri(music_dir, path) + track_kwargs[b'length'] = int(data.get('time', 0)) * 1000 track = Track(**track_kwargs) From d0082111b1a735306b4c3c5705594e343855fb2a Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 31 Mar 2013 16:52:37 +0200 Subject: [PATCH 150/151] Bump version number to 0.13.0 --- mopidy/__init__.py | 2 +- tests/version_test.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mopidy/__init__.py b/mopidy/__init__.py index 0a8e68aa..b091ef25 100644 --- a/mopidy/__init__.py +++ b/mopidy/__init__.py @@ -23,7 +23,7 @@ if (isinstance(pykka.__version__, basestring) warnings.filterwarnings('ignore', 'could not open display') -__version__ = '0.12.0' +__version__ = '0.13.0' from mopidy import settings as default_settings_module diff --git a/tests/version_test.py b/tests/version_test.py index a444ea1f..b199bb1f 100644 --- a/tests/version_test.py +++ b/tests/version_test.py @@ -35,5 +35,6 @@ class VersionTest(unittest.TestCase): self.assertLess(SV('0.9.0'), SV('0.10.0')) self.assertLess(SV('0.10.0'), SV('0.11.0')) self.assertLess(SV('0.11.0'), SV('0.11.1')) - self.assertLess(SV('0.11.1'), SV(__version__)) - self.assertLess(SV(__version__), SV('0.12.1')) + self.assertLess(SV('0.11.1'), SV('0.12.0')) + self.assertLess(SV('0.12.0'), SV(__version__)) + self.assertLess(SV(__version__), SV('0.13.1')) From 950ba2719773fcbb5abb44ffa9db318a0ff33e2d Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 31 Mar 2013 16:59:10 +0200 Subject: [PATCH 151/151] docs: Update changelog for v0.13.0 --- docs/changes.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index e382ae3d..ee1ea5d7 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -5,10 +5,12 @@ Changes This change log is used to track all major changes to Mopidy. -v0.13.0 (in development) -======================== +v0.13.0 (2013-03-31) +==================== -(in development) +The 0.13 release brings small improvements and bugfixes throughout Mopidy. +There are no major new features, just incremental improvement of what we +already have. **Dependencies**