|
|
|
@ -2925,7 +2925,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
|
|
# Obtain from MPD's maximum seq value
|
|
|
|
|
old_mpd_url = mpd_url
|
|
|
|
|
last_error = ctx.pop('last_error', None)
|
|
|
|
|
expire_fast = immediate or last_error and isinstance(last_error, HTTPError) and last_error.status == 403
|
|
|
|
|
expire_fast = immediate or (last_error and isinstance(last_error, HTTPError) and last_error.status == 403)
|
|
|
|
|
mpd_url, stream_number, is_live = (mpd_feed(format_id, 5 if expire_fast else 18000)
|
|
|
|
|
or (mpd_url, stream_number, False))
|
|
|
|
|
if not refresh_sequence:
|
|
|
|
@ -3995,8 +3995,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
|
|
return prs, player_url
|
|
|
|
|
|
|
|
|
|
def _needs_live_processing(self, live_status, duration):
|
|
|
|
|
if (live_status == 'is_live' and self.get_param('live_from_start')
|
|
|
|
|
or live_status == 'post_live' and (duration or 0) > 2 * 3600):
|
|
|
|
|
if ((live_status == 'is_live' and self.get_param('live_from_start'))
|
|
|
|
|
or (live_status == 'post_live' and (duration or 0) > 2 * 3600)):
|
|
|
|
|
return live_status
|
|
|
|
|
|
|
|
|
|
def _extract_formats_and_subtitles(self, streaming_data, video_id, player_url, live_status, duration):
|
|
|
|
@ -4192,7 +4192,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
|
|
skip_manifests = set(self._configuration_arg('skip'))
|
|
|
|
|
if (not self.get_param('youtube_include_hls_manifest', True)
|
|
|
|
|
or needs_live_processing == 'is_live' # These will be filtered out by YoutubeDL anyway
|
|
|
|
|
or needs_live_processing and skip_bad_formats):
|
|
|
|
|
or (needs_live_processing and skip_bad_formats)):
|
|
|
|
|
skip_manifests.add('hls')
|
|
|
|
|
|
|
|
|
|
if not self.get_param('youtube_include_dash_manifest', True):
|
|
|
|
@ -4390,14 +4390,14 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
|
|
expected_type=dict)
|
|
|
|
|
|
|
|
|
|
translated_title = self._get_text(microformats, (..., 'title'))
|
|
|
|
|
video_title = (self._preferred_lang and translated_title
|
|
|
|
|
video_title = ((self._preferred_lang and translated_title)
|
|
|
|
|
or get_first(video_details, 'title') # primary
|
|
|
|
|
or translated_title
|
|
|
|
|
or search_meta(['og:title', 'twitter:title', 'title']))
|
|
|
|
|
translated_description = self._get_text(microformats, (..., 'description'))
|
|
|
|
|
original_description = get_first(video_details, 'shortDescription')
|
|
|
|
|
video_description = (
|
|
|
|
|
self._preferred_lang and translated_description
|
|
|
|
|
(self._preferred_lang and translated_description)
|
|
|
|
|
# If original description is blank, it will be an empty string.
|
|
|
|
|
# Do not prefer translated description in this case.
|
|
|
|
|
or original_description if original_description is not None else translated_description)
|
|
|
|
@ -6837,7 +6837,7 @@ class YoutubeTabIE(YoutubeTabBaseInfoExtractor):
|
|
|
|
|
tab_url = urljoin(base_url, traverse_obj(
|
|
|
|
|
tab, ('endpoint', 'commandMetadata', 'webCommandMetadata', 'url')))
|
|
|
|
|
|
|
|
|
|
tab_id = (tab_url and self._get_url_mobj(tab_url)['tab'][1:]
|
|
|
|
|
tab_id = ((tab_url and self._get_url_mobj(tab_url)['tab'][1:])
|
|
|
|
|
or traverse_obj(tab, 'tabIdentifier', expected_type=str))
|
|
|
|
|
if tab_id:
|
|
|
|
|
return {
|
|
|
|
|