|
@@ -60,6 +60,11 @@ try:
|
|
|
except ImportError: # Python 2
|
|
except ImportError: # Python 2
|
|
|
import httplib as compat_http_client
|
|
import httplib as compat_http_client
|
|
|
|
|
|
|
|
|
|
+try:
|
|
|
|
|
+ from urllib.error import HTTPError as compat_HTTPError
|
|
|
|
|
+except ImportError: # Python 2
|
|
|
|
|
+ from urllib2 import HTTPError as compat_HTTPError
|
|
|
|
|
+
|
|
|
try:
|
|
try:
|
|
|
from subprocess import DEVNULL
|
|
from subprocess import DEVNULL
|
|
|
compat_subprocess_get_DEVNULL = lambda: DEVNULL
|
|
compat_subprocess_get_DEVNULL = lambda: DEVNULL
|
|
@@ -476,7 +481,7 @@ def formatSeconds(secs):
|
|
|
def make_HTTPS_handler(opts):
|
|
def make_HTTPS_handler(opts):
|
|
|
if sys.version_info < (3,2):
|
|
if sys.version_info < (3,2):
|
|
|
# Python's 2.x handler is very simplistic
|
|
# Python's 2.x handler is very simplistic
|
|
|
- return YoutubeDLHandlerHTTPS()
|
|
|
|
|
|
|
+ return compat_urllib_request.HTTPSHandler()
|
|
|
else:
|
|
else:
|
|
|
import ssl
|
|
import ssl
|
|
|
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
|
|
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
|
|
@@ -485,11 +490,11 @@ def make_HTTPS_handler(opts):
|
|
|
context.verify_mode = (ssl.CERT_NONE
|
|
context.verify_mode = (ssl.CERT_NONE
|
|
|
if opts.no_check_certificate
|
|
if opts.no_check_certificate
|
|
|
else ssl.CERT_REQUIRED)
|
|
else ssl.CERT_REQUIRED)
|
|
|
- return YoutubeDLHandlerHTTPS(context=context)
|
|
|
|
|
|
|
+ return compat_urllib_request.HTTPSHandler(context=context)
|
|
|
|
|
|
|
|
class ExtractorError(Exception):
|
|
class ExtractorError(Exception):
|
|
|
"""Error during info extraction."""
|
|
"""Error during info extraction."""
|
|
|
- def __init__(self, msg, tb=None, expected=False):
|
|
|
|
|
|
|
+ def __init__(self, msg, tb=None, expected=False, cause=None):
|
|
|
""" tb, if given, is the original traceback (so that it can be printed out).
|
|
""" tb, if given, is the original traceback (so that it can be printed out).
|
|
|
If expected is set, this is a normal error message and most likely not a bug in youtube-dl.
|
|
If expected is set, this is a normal error message and most likely not a bug in youtube-dl.
|
|
|
"""
|
|
"""
|
|
@@ -502,6 +507,7 @@ class ExtractorError(Exception):
|
|
|
|
|
|
|
|
self.traceback = tb
|
|
self.traceback = tb
|
|
|
self.exc_info = sys.exc_info() # preserve original exception
|
|
self.exc_info = sys.exc_info() # preserve original exception
|
|
|
|
|
+ self.cause = cause
|
|
|
|
|
|
|
|
def format_traceback(self):
|
|
def format_traceback(self):
|
|
|
if self.traceback is None:
|
|
if self.traceback is None:
|
|
@@ -569,8 +575,7 @@ class ContentTooShortError(Exception):
|
|
|
self.downloaded = downloaded
|
|
self.downloaded = downloaded
|
|
|
self.expected = expected
|
|
self.expected = expected
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-class YoutubeDLHandler_Template: # Old-style class, like HTTPHandler
|
|
|
|
|
|
|
+class YoutubeDLHandler(compat_urllib_request.HTTPHandler):
|
|
|
"""Handler for HTTP requests and responses.
|
|
"""Handler for HTTP requests and responses.
|
|
|
|
|
|
|
|
This class, when installed with an OpenerDirector, automatically adds
|
|
This class, when installed with an OpenerDirector, automatically adds
|
|
@@ -603,8 +608,8 @@ class YoutubeDLHandler_Template: # Old-style class, like HTTPHandler
|
|
|
ret.code = code
|
|
ret.code = code
|
|
|
return ret
|
|
return ret
|
|
|
|
|
|
|
|
- def _http_request(self, req):
|
|
|
|
|
- for h, v in std_headers.items():
|
|
|
|
|
|
|
+ def http_request(self, req):
|
|
|
|
|
+ for h,v in std_headers.items():
|
|
|
if h in req.headers:
|
|
if h in req.headers:
|
|
|
del req.headers[h]
|
|
del req.headers[h]
|
|
|
req.add_header(h, v)
|
|
req.add_header(h, v)
|
|
@@ -619,7 +624,7 @@ class YoutubeDLHandler_Template: # Old-style class, like HTTPHandler
|
|
|
del req.headers['Youtubedl-user-agent']
|
|
del req.headers['Youtubedl-user-agent']
|
|
|
return req
|
|
return req
|
|
|
|
|
|
|
|
- def _http_response(self, req, resp):
|
|
|
|
|
|
|
+ def http_response(self, req, resp):
|
|
|
old_resp = resp
|
|
old_resp = resp
|
|
|
# gzip
|
|
# gzip
|
|
|
if resp.headers.get('Content-encoding', '') == 'gzip':
|
|
if resp.headers.get('Content-encoding', '') == 'gzip':
|
|
@@ -633,16 +638,8 @@ class YoutubeDLHandler_Template: # Old-style class, like HTTPHandler
|
|
|
resp.msg = old_resp.msg
|
|
resp.msg = old_resp.msg
|
|
|
return resp
|
|
return resp
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-class YoutubeDLHandler(YoutubeDLHandler_Template, compat_urllib_request.HTTPHandler):
|
|
|
|
|
- http_request = YoutubeDLHandler_Template._http_request
|
|
|
|
|
- http_response = YoutubeDLHandler_Template._http_response
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-class YoutubeDLHandlerHTTPS(YoutubeDLHandler_Template, compat_urllib_request.HTTPSHandler):
|
|
|
|
|
- https_request = YoutubeDLHandler_Template._http_request
|
|
|
|
|
- https_response = YoutubeDLHandler_Template._http_response
|
|
|
|
|
-
|
|
|
|
|
|
|
+ https_request = http_request
|
|
|
|
|
+ https_response = http_response
|
|
|
|
|
|
|
|
def unified_strdate(date_str):
|
|
def unified_strdate(date_str):
|
|
|
"""Return a string with the date in the format YYYYMMDD"""
|
|
"""Return a string with the date in the format YYYYMMDD"""
|