|
|
@ -17,6 +17,8 @@ from ..compat import (
|
|
|
|
compat_chr,
|
|
|
|
compat_chr,
|
|
|
|
compat_parse_qs,
|
|
|
|
compat_parse_qs,
|
|
|
|
compat_urllib_parse,
|
|
|
|
compat_urllib_parse,
|
|
|
|
|
|
|
|
compat_urllib_parse_unquote,
|
|
|
|
|
|
|
|
compat_urllib_parse_unquote_plus,
|
|
|
|
compat_urllib_request,
|
|
|
|
compat_urllib_request,
|
|
|
|
compat_urlparse,
|
|
|
|
compat_urlparse,
|
|
|
|
compat_str,
|
|
|
|
compat_str,
|
|
|
@ -865,7 +867,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
|
# Extract original video URL from URL with redirection, like age verification, using next_url parameter
|
|
|
|
# Extract original video URL from URL with redirection, like age verification, using next_url parameter
|
|
|
|
mobj = re.search(self._NEXT_URL_RE, url)
|
|
|
|
mobj = re.search(self._NEXT_URL_RE, url)
|
|
|
|
if mobj:
|
|
|
|
if mobj:
|
|
|
|
url = proto + '://www.youtube.com/' + compat_urllib_parse.unquote(mobj.group(1)).lstrip('/')
|
|
|
|
url = proto + '://www.youtube.com/' + compat_urllib_parse_unquote(mobj.group(1)).lstrip('/')
|
|
|
|
video_id = self.extract_id(url)
|
|
|
|
video_id = self.extract_id(url)
|
|
|
|
|
|
|
|
|
|
|
|
# Get video webpage
|
|
|
|
# Get video webpage
|
|
|
@ -973,7 +975,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
|
# uploader
|
|
|
|
# uploader
|
|
|
|
if 'author' not in video_info:
|
|
|
|
if 'author' not in video_info:
|
|
|
|
raise ExtractorError('Unable to extract uploader name')
|
|
|
|
raise ExtractorError('Unable to extract uploader name')
|
|
|
|
video_uploader = compat_urllib_parse.unquote_plus(video_info['author'][0])
|
|
|
|
video_uploader = compat_urllib_parse_unquote_plus(video_info['author'][0])
|
|
|
|
|
|
|
|
|
|
|
|
# uploader_id
|
|
|
|
# uploader_id
|
|
|
|
video_uploader_id = None
|
|
|
|
video_uploader_id = None
|
|
|
@ -1000,7 +1002,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
|
self._downloader.report_warning('unable to extract video thumbnail')
|
|
|
|
self._downloader.report_warning('unable to extract video thumbnail')
|
|
|
|
video_thumbnail = None
|
|
|
|
video_thumbnail = None
|
|
|
|
else: # don't panic if we can't find it
|
|
|
|
else: # don't panic if we can't find it
|
|
|
|
video_thumbnail = compat_urllib_parse.unquote_plus(video_info['thumbnail_url'][0])
|
|
|
|
video_thumbnail = compat_urllib_parse_unquote_plus(video_info['thumbnail_url'][0])
|
|
|
|
|
|
|
|
|
|
|
|
# upload date
|
|
|
|
# upload date
|
|
|
|
upload_date = self._html_search_meta(
|
|
|
|
upload_date = self._html_search_meta(
|
|
|
@ -1062,7 +1064,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
|
self._downloader.report_warning('unable to extract video duration')
|
|
|
|
self._downloader.report_warning('unable to extract video duration')
|
|
|
|
video_duration = None
|
|
|
|
video_duration = None
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
video_duration = int(compat_urllib_parse.unquote_plus(video_info['length_seconds'][0]))
|
|
|
|
video_duration = int(compat_urllib_parse_unquote_plus(video_info['length_seconds'][0]))
|
|
|
|
|
|
|
|
|
|
|
|
# annotations
|
|
|
|
# annotations
|
|
|
|
video_annotations = None
|
|
|
|
video_annotations = None
|
|
|
@ -1609,7 +1611,7 @@ class YoutubeSearchURLIE(InfoExtractor):
|
|
|
|
|
|
|
|
|
|
|
|
def _real_extract(self, url):
|
|
|
|
def _real_extract(self, url):
|
|
|
|
mobj = re.match(self._VALID_URL, url)
|
|
|
|
mobj = re.match(self._VALID_URL, url)
|
|
|
|
query = compat_urllib_parse.unquote_plus(mobj.group('query'))
|
|
|
|
query = compat_urllib_parse_unquote_plus(mobj.group('query'))
|
|
|
|
|
|
|
|
|
|
|
|
webpage = self._download_webpage(url, query)
|
|
|
|
webpage = self._download_webpage(url, query)
|
|
|
|
result_code = self._search_regex(
|
|
|
|
result_code = self._search_regex(
|
|
|
|