|
|
|
@ -2583,7 +2583,11 @@ class YoutubePlaylistsIE(YoutubePlaylistsBaseInfoExtractor):
|
|
|
|
|
}]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class YoutubeSearchIE(SearchInfoExtractor, YoutubePlaylistIE):
|
|
|
|
|
class YoutubeSearchBaseInfoExtractor(YoutubePlaylistBaseInfoExtractor):
|
|
|
|
|
_VIDEO_RE = r'href="\s*/watch\?v=(?P<id>[0-9A-Za-z_-]{11})(?:[^"]*"[^>]+\btitle="(?P<title>[^"]+))?'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class YoutubeSearchIE(SearchInfoExtractor, YoutubeSearchBaseInfoExtractor):
|
|
|
|
|
IE_DESC = 'YouTube.com searches'
|
|
|
|
|
# there doesn't appear to be a real limit, for example if you search for
|
|
|
|
|
# 'python' you get more than 8.000.000 results
|
|
|
|
@ -2617,8 +2621,7 @@ class YoutubeSearchIE(SearchInfoExtractor, YoutubePlaylistIE):
|
|
|
|
|
raise ExtractorError(
|
|
|
|
|
'[youtube] No video results', expected=True)
|
|
|
|
|
|
|
|
|
|
new_videos = self._ids_to_results(orderedSet(re.findall(
|
|
|
|
|
r'href="/watch\?v=(.{11})', html_content)))
|
|
|
|
|
new_videos = list(self._process_page(html_content))
|
|
|
|
|
videos += new_videos
|
|
|
|
|
if not new_videos or len(videos) > limit:
|
|
|
|
|
break
|
|
|
|
@ -2641,11 +2644,10 @@ class YoutubeSearchDateIE(YoutubeSearchIE):
|
|
|
|
|
_EXTRA_QUERY_ARGS = {'search_sort': 'video_date_uploaded'}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class YoutubeSearchURLIE(YoutubePlaylistBaseInfoExtractor):
|
|
|
|
|
class YoutubeSearchURLIE(YoutubeSearchBaseInfoExtractor):
|
|
|
|
|
IE_DESC = 'YouTube.com search URLs'
|
|
|
|
|
IE_NAME = 'youtube:search_url'
|
|
|
|
|
_VALID_URL = r'https?://(?:www\.)?youtube\.com/results\?(.*?&)?(?:search_query|q)=(?P<query>[^&]+)(?:[&]|$)'
|
|
|
|
|
_VIDEO_RE = r'href="\s*/watch\?v=(?P<id>[0-9A-Za-z_-]{11})(?:[^"]*"[^>]+\btitle="(?P<title>[^"]+))?'
|
|
|
|
|
_TESTS = [{
|
|
|
|
|
'url': 'https://www.youtube.com/results?baz=bar&search_query=youtube-dl+test+video&filters=video&lclk=video',
|
|
|
|
|
'playlist_mincount': 5,
|
|
|
|
|