stream: Switch to using http download helper

This commit is contained in:
Thomas Adamcik 2015-08-18 23:03:36 +02:00 committed by Stein Magnus Jodal
parent 0ebddbefa1
commit 5c46b83f81
2 changed files with 13 additions and 47 deletions

View File

@ -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)

View File

@ -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())