|
@ -27,6 +27,7 @@ from ..compat import ( |
|
|
) |
|
|
) |
|
|
from ..utils import ( |
|
|
from ..utils import ( |
|
|
clean_html, |
|
|
clean_html, |
|
|
|
|
|
dict_get, |
|
|
error_to_compat_str, |
|
|
error_to_compat_str, |
|
|
ExtractorError, |
|
|
ExtractorError, |
|
|
float_or_none, |
|
|
float_or_none, |
|
@ -1652,6 +1653,9 @@ class YoutubeIE(YoutubeBaseInfoExtractor): |
|
|
def extract_view_count(v_info): |
|
|
def extract_view_count(v_info): |
|
|
return int_or_none(try_get(v_info, lambda x: x['view_count'][0])) |
|
|
return int_or_none(try_get(v_info, lambda x: x['view_count'][0])) |
|
|
|
|
|
|
|
|
|
|
|
def extract_token(v_info): |
|
|
|
|
|
return dict_get(v_info, ('account_playback_token', 'accountPlaybackToken', 'token')) |
|
|
|
|
|
|
|
|
player_response = {} |
|
|
player_response = {} |
|
|
|
|
|
|
|
|
# Get video info |
|
|
# Get video info |
|
@ -1741,7 +1745,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor): |
|
|
view_count = extract_view_count(get_video_info) |
|
|
view_count = extract_view_count(get_video_info) |
|
|
if not video_info: |
|
|
if not video_info: |
|
|
video_info = get_video_info |
|
|
video_info = get_video_info |
|
|
get_token = get_video_info.get('token') or get_video_info.get('account_playback_token') |
|
|
|
|
|
|
|
|
get_token = extract_token(get_video_info) |
|
|
if get_token: |
|
|
if get_token: |
|
|
# Different get_video_info requests may report different results, e.g. |
|
|
# Different get_video_info requests may report different results, e.g. |
|
|
# some may report video unavailability, but some may serve it without |
|
|
# some may report video unavailability, but some may serve it without |
|
@ -1752,7 +1756,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor): |
|
|
# due to YouTube measures against IP ranges of hosting providers. |
|
|
# due to YouTube measures against IP ranges of hosting providers. |
|
|
# Working around by preferring the first succeeded video_info containing |
|
|
# Working around by preferring the first succeeded video_info containing |
|
|
# the token if no such video_info yet was found. |
|
|
# the token if no such video_info yet was found. |
|
|
token = video_info.get('token') or video_info.get('account_playback_token') |
|
|
|
|
|
|
|
|
token = extract_token(video_info) |
|
|
if not token: |
|
|
if not token: |
|
|
video_info = get_video_info |
|
|
video_info = get_video_info |
|
|
break |
|
|
break |
|
@ -1769,28 +1773,6 @@ class YoutubeIE(YoutubeBaseInfoExtractor): |
|
|
raise ExtractorError( |
|
|
raise ExtractorError( |
|
|
'YouTube said: %s' % unavailable_message, expected=True, video_id=video_id) |
|
|
'YouTube said: %s' % unavailable_message, expected=True, video_id=video_id) |
|
|
|
|
|
|
|
|
token = video_info.get('token') or video_info.get('account_playback_token') |
|
|
|
|
|
if not token: |
|
|
|
|
|
if 'reason' in video_info: |
|
|
|
|
|
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) |
|
|
|
|
|
countries = regions_allowed.split(',') if regions_allowed else None |
|
|
|
|
|
self.raise_geo_restricted( |
|
|
|
|
|
msg=video_info['reason'][0], countries=countries) |
|
|
|
|
|
reason = video_info['reason'][0] |
|
|
|
|
|
if 'Invalid parameters' in reason: |
|
|
|
|
|
unavailable_message = extract_unavailable_message() |
|
|
|
|
|
if unavailable_message: |
|
|
|
|
|
reason = unavailable_message |
|
|
|
|
|
raise ExtractorError( |
|
|
|
|
|
'YouTube said: %s' % reason, |
|
|
|
|
|
expected=True, video_id=video_id) |
|
|
|
|
|
else: |
|
|
|
|
|
raise ExtractorError( |
|
|
|
|
|
'"token" parameter not in video info for unknown reason', |
|
|
|
|
|
video_id=video_id) |
|
|
|
|
|
|
|
|
|
|
|
if video_info.get('license_info'): |
|
|
if video_info.get('license_info'): |
|
|
raise ExtractorError('This video is DRM protected.', expected=True) |
|
|
raise ExtractorError('This video is DRM protected.', expected=True) |
|
|
|
|
|
|
|
@ -2296,6 +2278,29 @@ class YoutubeIE(YoutubeBaseInfoExtractor): |
|
|
if f.get('vcodec') != 'none': |
|
|
if f.get('vcodec') != 'none': |
|
|
f['stretched_ratio'] = ratio |
|
|
f['stretched_ratio'] = ratio |
|
|
|
|
|
|
|
|
|
|
|
if not formats: |
|
|
|
|
|
token = extract_token(video_info) |
|
|
|
|
|
if not token: |
|
|
|
|
|
if 'reason' in video_info: |
|
|
|
|
|
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) |
|
|
|
|
|
countries = regions_allowed.split(',') if regions_allowed else None |
|
|
|
|
|
self.raise_geo_restricted( |
|
|
|
|
|
msg=video_info['reason'][0], countries=countries) |
|
|
|
|
|
reason = video_info['reason'][0] |
|
|
|
|
|
if 'Invalid parameters' in reason: |
|
|
|
|
|
unavailable_message = extract_unavailable_message() |
|
|
|
|
|
if unavailable_message: |
|
|
|
|
|
reason = unavailable_message |
|
|
|
|
|
raise ExtractorError( |
|
|
|
|
|
'YouTube said: %s' % reason, |
|
|
|
|
|
expected=True, video_id=video_id) |
|
|
|
|
|
else: |
|
|
|
|
|
raise ExtractorError( |
|
|
|
|
|
'"token" parameter not in video info for unknown reason', |
|
|
|
|
|
video_id=video_id) |
|
|
|
|
|
|
|
|
self._sort_formats(formats) |
|
|
self._sort_formats(formats) |
|
|
|
|
|
|
|
|
self.mark_watched(video_id, video_info, player_response) |
|
|
self.mark_watched(video_id, video_info, player_response) |
|
|