|
|
@ -47,7 +47,6 @@ from ..utils import (
|
|
|
|
unsmuggle_url,
|
|
|
|
unsmuggle_url,
|
|
|
|
uppercase_escape,
|
|
|
|
uppercase_escape,
|
|
|
|
urlencode_postdata,
|
|
|
|
urlencode_postdata,
|
|
|
|
ISO3166Utils,
|
|
|
|
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -371,6 +370,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_SUBTITLE_FORMATS = ('ttml', 'vtt')
|
|
|
|
_SUBTITLE_FORMATS = ('ttml', 'vtt')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_GEO_BYPASS = False
|
|
|
|
|
|
|
|
|
|
|
|
IE_NAME = 'youtube'
|
|
|
|
IE_NAME = 'youtube'
|
|
|
|
_TESTS = [
|
|
|
|
_TESTS = [
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -917,7 +918,12 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
|
# itag 212
|
|
|
|
# itag 212
|
|
|
|
'url': '1t24XAntNCY',
|
|
|
|
'url': '1t24XAntNCY',
|
|
|
|
'only_matching': True,
|
|
|
|
'only_matching': True,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
# geo restricted to JP
|
|
|
|
|
|
|
|
'url': 'sJL6WA-aGkQ',
|
|
|
|
|
|
|
|
'only_matching': True,
|
|
|
|
|
|
|
|
},
|
|
|
|
]
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
@ -1376,11 +1382,11 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
|
if 'token' not in video_info:
|
|
|
|
if 'token' not in video_info:
|
|
|
|
if 'reason' in video_info:
|
|
|
|
if 'reason' in video_info:
|
|
|
|
if 'The uploader has not made this video available in your country.' in video_info['reason']:
|
|
|
|
if 'The uploader has not made this video available in your country.' in video_info['reason']:
|
|
|
|
regions_allowed = self._html_search_meta('regionsAllowed', video_webpage, default=None)
|
|
|
|
regions_allowed = self._html_search_meta(
|
|
|
|
if regions_allowed:
|
|
|
|
'regionsAllowed', video_webpage, default=None)
|
|
|
|
raise ExtractorError('YouTube said: This video is available in %s only' % (
|
|
|
|
countries = regions_allowed.split(',') if regions_allowed else None
|
|
|
|
', '.join(map(ISO3166Utils.short2full, regions_allowed.split(',')))),
|
|
|
|
self.raise_geo_restricted(
|
|
|
|
expected=True)
|
|
|
|
msg=video_info['reason'][0], countries=countries)
|
|
|
|
raise ExtractorError(
|
|
|
|
raise ExtractorError(
|
|
|
|
'YouTube said: %s' % video_info['reason'][0],
|
|
|
|
'YouTube said: %s' % video_info['reason'][0],
|
|
|
|
expected=True, video_id=video_id)
|
|
|
|
expected=True, video_id=video_id)
|
|
|
@ -2126,6 +2132,10 @@ class YoutubeChannelIE(YoutubePlaylistBaseInfoExtractor):
|
|
|
|
'id': 'UUs0ifCMCm1icqRbqhUINa0w',
|
|
|
|
'id': 'UUs0ifCMCm1icqRbqhUINa0w',
|
|
|
|
'title': 'Uploads from Deus Ex',
|
|
|
|
'title': 'Uploads from Deus Ex',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
}, {
|
|
|
|
|
|
|
|
# geo restricted to JP
|
|
|
|
|
|
|
|
'url': 'https://www.youtube.com/user/kananishinoSMEJ',
|
|
|
|
|
|
|
|
'only_matching': True,
|
|
|
|
}]
|
|
|
|
}]
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
@classmethod
|
|
|
|