From 5c46b83f8193afdd29071f7c20a269e23c421738 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Tue, 18 Aug 2015 23:03:36 +0200 Subject: [PATCH] stream: Switch to using http download helper --- mopidy/stream/actor.py | 44 ++++------------------------------- tests/stream/test_playback.py | 16 ++++++------- 2 files changed, 13 insertions(+), 47 deletions(-) diff --git a/mopidy/stream/actor.py b/mopidy/stream/actor.py index cc9632d5..8066403b 100644 --- a/mopidy/stream/actor.py +++ b/mopidy/stream/actor.py @@ -3,13 +3,10 @@ from __future__ import absolute_import, unicode_literals import fnmatch import logging import re -import time import urlparse import pykka -import requests - from mopidy import audio as audio_lib, backend, exceptions, stream from mopidy.audio import scan, utils from mopidy.internal import http, playlists @@ -77,6 +74,10 @@ class StreamPlaybackProvider(backend.PlaybackProvider): super(StreamPlaybackProvider, self).__init__(audio, backend) self._config = config self._scanner = backend._scanner + self._session = http.get_requests_session( + proxy_config=config['proxy'], + user_agent='%s/%s' % ( + stream.Extension.dist_name, stream.Extension.version)) def translate_uri(self, uri): try: @@ -90,7 +91,7 @@ class StreamPlaybackProvider(backend.PlaybackProvider): scan_result.mime.startswith('application/')): return uri - content = self._download(uri) + content = http.download(self._session, uri) if content is None: return None @@ -98,38 +99,3 @@ class StreamPlaybackProvider(backend.PlaybackProvider): if tracks: # TODO Test streams and return first that seems to be playable return tracks[0] - - def _download(self, uri): - timeout = self._config['stream']['timeout'] / 1000.0 - - session = http.get_requests_session( - proxy_config=self._config['proxy'], - user_agent='%s/%s' % ( - stream.Extension.dist_name, stream.Extension.version)) - - try: - response = session.get( - uri, stream=True, timeout=timeout) - except requests.exceptions.Timeout: - logger.warning( - 'Download of stream playlist (%s) failed due to connection ' - 'timeout after %.3fs', uri, timeout) - return None - - deadline = time.time() + timeout - content = [] - for chunk in response.iter_content(4096): - content.append(chunk) - if time.time() > deadline: - logger.warning( - 'Download of stream playlist (%s) failed due to download ' - 'taking more than %.3fs', uri, timeout) - return None - - if not response.ok: - logger.warning( - 'Problem downloading stream playlist %s: %s', - uri, response.reason) - return None - - return b''.join(content) diff --git a/tests/stream/test_playback.py b/tests/stream/test_playback.py index 4da87ae0..0da13fa6 100644 --- a/tests/stream/test_playback.py +++ b/tests/stream/test_playback.py @@ -112,12 +112,12 @@ def test_translate_uri_when_playlist_download_fails(provider, caplog): result = provider.translate_uri(URI) assert result is None - assert 'Problem downloading stream playlist' in caplog.text() + assert 'Problem downloading' in caplog.text() def test_translate_uri_times_out_if_connection_times_out(provider, caplog): - with mock.patch.object(actor.requests, 'Session') as session_mock: - get_mock = session_mock.return_value.get + with mock.patch.object(provider, '_session') as session_mock: + get_mock = session_mock.get get_mock.side_effect = requests.exceptions.Timeout result = provider.translate_uri(URI) @@ -125,8 +125,8 @@ def test_translate_uri_times_out_if_connection_times_out(provider, caplog): get_mock.assert_called_once_with(URI, timeout=1.0, stream=True) assert result is None assert ( - 'Download of stream playlist (%s) failed due to connection ' - 'timeout after 1.000s' % URI in caplog.text()) + 'Download of %r failed due to connection timeout after 1.000s' % URI + in caplog.text()) @responses.activate @@ -134,12 +134,12 @@ def test_translate_uri_times_out_if_download_is_slow(provider, caplog): responses.add( responses.GET, URI, body=BODY, content_type='audio/x-mpegurl') - with mock.patch.object(actor, 'time') as time_mock: + with mock.patch('mopidy.internal.http.time') as time_mock: time_mock.time.side_effect = [0, TIMEOUT + 1] result = provider.translate_uri(URI) assert result is None assert ( - 'Download of stream playlist (%s) failed due to download taking ' - 'more than 1.000s' % URI in caplog.text()) + 'Download of %r failed due to download taking more than 1.000s' % + URI in caplog.text())