|
@@ -16,6 +16,7 @@ from ..jsinterp import JSInterpreter
|
|
from ..swfinterp import SWFInterpreter
|
|
from ..swfinterp import SWFInterpreter
|
|
from ..compat import (
|
|
from ..compat import (
|
|
compat_chr,
|
|
compat_chr,
|
|
|
|
+ compat_HTTPError,
|
|
compat_kwargs,
|
|
compat_kwargs,
|
|
compat_parse_qs,
|
|
compat_parse_qs,
|
|
compat_urllib_parse_unquote,
|
|
compat_urllib_parse_unquote,
|
|
@@ -288,10 +289,25 @@ class YoutubeEntryListBaseInfoExtractor(YoutubeBaseInfoExtractor):
|
|
if not mobj:
|
|
if not mobj:
|
|
break
|
|
break
|
|
|
|
|
|
- more = self._download_json(
|
|
|
|
- 'https://youtube.com/%s' % mobj.group('more'), playlist_id,
|
|
|
|
- 'Downloading page #%s' % page_num,
|
|
|
|
- transform_source=uppercase_escape)
|
|
|
|
|
|
+ count = 0
|
|
|
|
+ retries = 3
|
|
|
|
+ while count <= retries:
|
|
|
|
+ try:
|
|
|
|
+ # Downloading page may result in intermittent 5xx HTTP error
|
|
|
|
+ # that is usually worked around with a retry
|
|
|
|
+ more = self._download_json(
|
|
|
|
+ 'https://youtube.com/%s' % mobj.group('more'), playlist_id,
|
|
|
|
+ 'Downloading page #%s%s'
|
|
|
|
+ % (page_num, ' (retry #%d)' % count if count else ''),
|
|
|
|
+ transform_source=uppercase_escape)
|
|
|
|
+ break
|
|
|
|
+ except ExtractorError as e:
|
|
|
|
+ if isinstance(e.cause, compat_HTTPError) and e.cause.code in (500, 503):
|
|
|
|
+ count += 1
|
|
|
|
+ if count <= retries:
|
|
|
|
+ continue
|
|
|
|
+ raise
|
|
|
|
+
|
|
content_html = more['content_html']
|
|
content_html = more['content_html']
|
|
if not content_html.strip():
|
|
if not content_html.strip():
|
|
# Some webpages show a "Load more" button but they don't
|
|
# Some webpages show a "Load more" button but they don't
|