mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-11-21 20:46:36 -05:00
[youtube:tab] Extract video thumbnails from playlist (#2096)
closes #1184 Co-Authored-by: coletdjnz, pukkandan
This commit is contained in:
parent
774a46c53d
commit
a709d87335
1 changed files with 34 additions and 39 deletions
|
@ -667,6 +667,30 @@ def _get_text(data, *path_list, max_runs=None):
|
|||
if text:
|
||||
return text
|
||||
|
||||
@staticmethod
|
||||
def _extract_thumbnails(data, *path_list):
|
||||
"""
|
||||
Extract thumbnails from thumbnails dict
|
||||
@param path_list: path list to level that contains 'thumbnails' key
|
||||
"""
|
||||
thumbnails = []
|
||||
for path in path_list or [()]:
|
||||
for thumbnail in traverse_obj(data, (*variadic(path), 'thumbnails', ...), default=[]):
|
||||
thumbnail_url = url_or_none(thumbnail.get('url'))
|
||||
if not thumbnail_url:
|
||||
continue
|
||||
# Sometimes youtube gives a wrong thumbnail URL. See:
|
||||
# https://github.com/yt-dlp/yt-dlp/issues/233
|
||||
# https://github.com/ytdl-org/youtube-dl/issues/28023
|
||||
if 'maxresdefault' in thumbnail_url:
|
||||
thumbnail_url = thumbnail_url.split('?')[0]
|
||||
thumbnails.append({
|
||||
'url': thumbnail_url,
|
||||
'height': int_or_none(thumbnail.get('height')),
|
||||
'width': int_or_none(thumbnail.get('width')),
|
||||
})
|
||||
return thumbnails
|
||||
|
||||
@staticmethod
|
||||
def extract_relative_time(relative_time_text):
|
||||
"""
|
||||
|
@ -783,6 +807,8 @@ def _extract_video(self, renderer):
|
|||
overlay_style = traverse_obj(
|
||||
renderer, ('thumbnailOverlays', ..., 'thumbnailOverlayTimeStatusRenderer', 'style'), get_all=False, expected_type=str)
|
||||
badges = self._extract_badges(renderer)
|
||||
thumbnails = self._extract_thumbnails(renderer, 'thumbnail')
|
||||
|
||||
return {
|
||||
'_type': 'url',
|
||||
'ie_key': YoutubeIE.ie_key(),
|
||||
|
@ -794,6 +820,7 @@ def _extract_video(self, renderer):
|
|||
'view_count': view_count,
|
||||
'uploader': uploader,
|
||||
'channel_id': channel_id,
|
||||
'thumbnails': thumbnails,
|
||||
'upload_date': strftime_or_none(timestamp, '%Y%m%d'),
|
||||
'live_status': ('is_upcoming' if scheduled_timestamp is not None
|
||||
else 'was_live' if 'streamed' in time_text.lower()
|
||||
|
@ -2903,25 +2930,7 @@ def feed_entry(name):
|
|||
if f.get('vcodec') != 'none':
|
||||
f['stretched_ratio'] = ratio
|
||||
break
|
||||
|
||||
thumbnails = []
|
||||
thumbnail_dicts = traverse_obj(
|
||||
(video_details, microformats), (..., ..., 'thumbnail', 'thumbnails', ...),
|
||||
expected_type=dict, default=[])
|
||||
for thumbnail in thumbnail_dicts:
|
||||
thumbnail_url = thumbnail.get('url')
|
||||
if not thumbnail_url:
|
||||
continue
|
||||
# Sometimes youtube gives a wrong thumbnail URL. See:
|
||||
# https://github.com/yt-dlp/yt-dlp/issues/233
|
||||
# https://github.com/ytdl-org/youtube-dl/issues/28023
|
||||
if 'maxresdefault' in thumbnail_url:
|
||||
thumbnail_url = thumbnail_url.split('?')[0]
|
||||
thumbnails.append({
|
||||
'url': thumbnail_url,
|
||||
'height': int_or_none(thumbnail.get('height')),
|
||||
'width': int_or_none(thumbnail.get('width')),
|
||||
})
|
||||
thumbnails = self._extract_thumbnails((video_details, microformats), (..., ..., 'thumbnail'))
|
||||
thumbnail_url = search_meta(['og:image', 'twitter:image'])
|
||||
if thumbnail_url:
|
||||
thumbnails.append({
|
||||
|
@ -3584,7 +3593,6 @@ def _extract_uploader(cls, data):
|
|||
|
||||
def _extract_from_tabs(self, item_id, ytcfg, data, tabs):
|
||||
playlist_id = title = description = channel_url = channel_name = channel_id = None
|
||||
thumbnails_list = []
|
||||
tags = []
|
||||
|
||||
selected_tab = self._extract_selected_tab(tabs)
|
||||
|
@ -3603,26 +3611,13 @@ def _extract_from_tabs(self, item_id, ytcfg, data, tabs):
|
|||
description = renderer.get('description', '')
|
||||
playlist_id = channel_id
|
||||
tags = renderer.get('keywords', '').split()
|
||||
thumbnails_list = (
|
||||
try_get(renderer, lambda x: x['avatar']['thumbnails'], list)
|
||||
or try_get(
|
||||
self._extract_sidebar_info_renderer(data, 'playlistSidebarPrimaryInfoRenderer'),
|
||||
lambda x: x['thumbnailRenderer']['playlistVideoThumbnailRenderer']['thumbnail']['thumbnails'],
|
||||
list)
|
||||
or [])
|
||||
|
||||
thumbnails = []
|
||||
for t in thumbnails_list:
|
||||
if not isinstance(t, dict):
|
||||
continue
|
||||
thumbnail_url = url_or_none(t.get('url'))
|
||||
if not thumbnail_url:
|
||||
continue
|
||||
thumbnails.append({
|
||||
'url': thumbnail_url,
|
||||
'width': int_or_none(t.get('width')),
|
||||
'height': int_or_none(t.get('height')),
|
||||
})
|
||||
thumbnails = (
|
||||
self._extract_thumbnails(renderer, 'avatar')
|
||||
or self._extract_thumbnails(
|
||||
self._extract_sidebar_info_renderer(data, 'playlistSidebarPrimaryInfoRenderer'),
|
||||
('thumbnailRenderer', 'playlistVideoThumbnailRenderer', 'thumbnail')))
|
||||
|
||||
if playlist_id is None:
|
||||
playlist_id = item_id
|
||||
if title is None:
|
||||
|
|
Loading…
Reference in a new issue