When downloading through a proxy i sometimes get a "timed out" error:
```
ERROR:deemix:[XXXX - YYYY] ('timed out',)
Traceback (most recent call last):
File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/urllib3/response.py", line 438, in _error_catcher
yield
File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/urllib3/response.py", line 519, in read
data = self._fp.read(amt) if not fp_closed else b""
File "/usr/lib/python3.6/http/client.py", line 463, in read
n = self.readinto(b)
File "/usr/lib/python3.6/http/client.py", line 507, in readinto
n = self.fp.readinto(b)
File "/usr/lib/python3.6/socket.py", line 586, in readinto
return self._sock.recv_into(b)
File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/eventlet/green/ssl.py", line 252, in recv_into
return self._base_recv(nbytes, flags, into=True, buffer_=buffer)
File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/eventlet/green/ssl.py", line 267, in _base_recv
read = self.read(nbytes, buffer_)
File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/eventlet/green/ssl.py", line 187, in read
super(GreenSSLSocket, self).read, *args, **kwargs)
File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/eventlet/green/ssl.py", line 167, in _call_trampolining
timeout_exc=timeout_exc('timed out'))
File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/eventlet/hubs/__init__.py", line 159, in trampoline
return hub.switch()
File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/eventlet/hubs/hub.py", line 313, in switch
return self.greenlet.switch()
ssl.SSLError: ('timed out',)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/[REDACTED]/gits/RemixDev/deemix/deemix/app/downloadjob.py", line 748, in downloadWrapper
result = self.download(trackAPI_gw)
File "/[REDACTED]/gits/RemixDev/deemix/deemix/app/downloadjob.py", line 578, in download
raise e
File "/[REDACTED]/gits/RemixDev/deemix/deemix/app/downloadjob.py", line 576, in download
trackDownloaded = downloadMusic(track, trackAPI_gw)
File "/[REDACTED]/gits/RemixDev/deemix/deemix/app/downloadjob.py", line 572, in downloadMusic
raise e
File "/[REDACTED]/gits/RemixDev/deemix/deemix/app/downloadjob.py", line 524, in downloadMusic
self.streamTrack(stream, track)
File "/[REDACTED]/gits/RemixDev/deemix/deemix/app/downloadjob.py", line 694, in streamTrack
for chunk in request.iter_content(2048 * 3):
File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/requests/models.py", line 753, in generate
for chunk in self.raw.stream(chunk_size, decode_content=True):
File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/urllib3/response.py", line 576, in stream
data = self.read(amt=amt, decode_content=decode_content)
File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/urllib3/response.py", line 541, in read
raise IncompleteRead(self._fp_bytes_read, self.length_remaining)
File "/usr/lib/python3.6/contextlib.py", line 99, in __exit__
self.gen.throw(type, value, traceback)
File "/[REDACTED]/gits/RemixDev/test/venv/lib/python3.6/site-packages/urllib3/response.py", line 449, in _error_catcher
raise SSLError(e)
urllib3.exceptions.SSLError: ('timed out',)
```
I'm not sure why this is, but redownload always works.
Catching `urllib3.exceptions.SSLError` in `downloadjob.py` works a treat, e.g.:
```diff
diff --git a/deemix/app/downloadjob.py b/deemix/app/downloadjob.py
index 033df13..b12f6eb 100644
--- a/deemix/app/downloadjob.py
+++ b/deemix/app/downloadjob.py
@@ -13,6 +13,7 @@ import errno
from ssl import SSLError
from os import makedirs
from tempfile import gettempdir
+from urllib3.exceptions import SSLError as u3SSLError
from deemix.app.queueitem import QISingle, QICollection
from deemix.app.track import Track, AlbumDoesntExists
@@ -554,7 +555,7 @@ class DownloadJob:
raise DownloadFailed("notAvailableNoAlternative")
else:
raise DownloadFailed("notAvailable")
- except (request_exception.ConnectionError, request_exception.ChunkedEncodingError) as e:
+ except (request_exception.ConnectionError, request_exception.ChunkedEncodingError, u3SSLError) as e:
if writepath.is_file(): writepath.unlink()
logger.warn(f"[{track.mainArtist['name']} - {track.title}] Error while downloading the track, trying again in 5s...")
eventlet.sleep(5)
```