|
|
@@ -2348,18 +2348,18 @@ class YoutubeSearchIE(SearchInfoExtractor, YoutubePlaylistIE): |
|
|
|
videos = [] |
|
|
|
limit = n |
|
|
|
|
|
|
|
url_query = { |
|
|
|
'search_query': query.encode('utf-8'), |
|
|
|
} |
|
|
|
url_query.update(self._EXTRA_QUERY_ARGS) |
|
|
|
result_url = 'https://www.youtube.com/results?' + compat_urllib_parse_urlencode(url_query) |
|
|
|
|
|
|
|
for pagenum in itertools.count(1): |
|
|
|
url_query = { |
|
|
|
'search_query': query.encode('utf-8'), |
|
|
|
'page': pagenum, |
|
|
|
'spf': 'navigate', |
|
|
|
} |
|
|
|
url_query.update(self._EXTRA_QUERY_ARGS) |
|
|
|
result_url = 'https://www.youtube.com/results?' + compat_urllib_parse_urlencode(url_query) |
|
|
|
data = self._download_json( |
|
|
|
result_url, video_id='query "%s"' % query, |
|
|
|
note='Downloading page %s' % pagenum, |
|
|
|
errnote='Unable to download API page') |
|
|
|
errnote='Unable to download API page', |
|
|
|
query={'spf': 'navigate'}) |
|
|
|
html_content = data[1]['body']['content'] |
|
|
|
|
|
|
|
if 'class="search-message' in html_content: |
|
|
@@ -2371,6 +2371,12 @@ class YoutubeSearchIE(SearchInfoExtractor, YoutubePlaylistIE): |
|
|
|
videos += new_videos |
|
|
|
if not new_videos or len(videos) > limit: |
|
|
|
break |
|
|
|
next_link = self._html_search_regex( |
|
|
|
r'href="(/results\?[^"]*\bsp=[^"]+)"[^>]*>\s*<span[^>]+class="[^"]*\byt-uix-button-content\b[^"]*"[^>]*>Next', |
|
|
|
html_content, 'next link', default=None) |
|
|
|
if next_link is None: |
|
|
|
break |
|
|
|
result_url = compat_urlparse.urljoin('https://www.youtube.com/', next_link) |
|
|
|
|
|
|
|
if len(videos) > n: |
|
|
|
videos = videos[:n] |
|
|
|