|
|
@ -16,6 +16,7 @@ from ..jsinterp import JSInterpreter |
|
|
|
from ..swfinterp import SWFInterpreter |
|
|
|
from ..compat import ( |
|
|
|
compat_chr, |
|
|
|
compat_HTTPError, |
|
|
|
compat_kwargs, |
|
|
|
compat_parse_qs, |
|
|
|
compat_urllib_parse_unquote, |
|
|
@ -288,10 +289,25 @@ class YoutubeEntryListBaseInfoExtractor(YoutubeBaseInfoExtractor): |
|
|
|
if not mobj: |
|
|
|
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'] |
|
|
|
if not content_html.strip(): |
|
|
|
# Some webpages show a "Load more" button but they don't |
|
|
|