diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 7d085a33e7..2439fc82bd 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -1539,7 +1539,7 @@ class YoutubeDL(object): def get_entry(i): return ie_entries[i - 1] else: - if not isinstance(ie_entries, PagedList): + if not isinstance(ie_entries, (PagedList, LazyList)): ie_entries = LazyList(ie_entries) def get_entry(i): @@ -3374,13 +3374,13 @@ class YoutubeDL(object): from .postprocessor.embedthumbnail import has_mutagen from .cookies import SQLITE_AVAILABLE, KEYRING_AVAILABLE - lib_str = ', '.join(sorted(filter(None, ( + lib_str = join_nonempty( compat_pycrypto_AES and compat_pycrypto_AES.__name__.split('.')[0], - has_websockets and 'websockets', + KEYRING_AVAILABLE and 'keyring', has_mutagen and 'mutagen', SQLITE_AVAILABLE and 'sqlite', - KEYRING_AVAILABLE and 'keyring', - )))) or 'none' + has_websockets and 'websockets', + delim=', ') or 'none' write_debug('Optional libraries: %s' % lib_str) proxy_map = {} diff --git a/yt_dlp/extractor/instagram.py b/yt_dlp/extractor/instagram.py index 4694c9a33b..0e726423e0 100644 --- a/yt_dlp/extractor/instagram.py +++ b/yt_dlp/extractor/instagram.py @@ -74,6 +74,7 @@ class InstagramBaseIE(InfoExtractor): class InstagramIOSIE(InfoExtractor): + IE_DESC = 'IOS instagram:// URL' _VALID_URL = r'instagram://media\?id=(?P[\d_]+)' _TESTS = [{ 'url': 'instagram://media?id=482584233761418119', @@ -241,7 +242,7 @@ class InstagramIE(InstagramBaseIE): if 'www.instagram.com/accounts/login' in urlh.geturl().rstrip('/'): self.raise_login_required('You need to log in to access this content') - (media, video_url, description, thumbnail, timestamp, uploader, + (media, video_url, description, thumbnails, timestamp, uploader, uploader_id, like_count, comment_count, comments, height, width) = [None] * 12 @@ -366,8 +367,8 @@ class InstagramIE(InstagramBaseIE): if description is not None: description = lowercase_escape(description) - if not thumbnail: - thumbnail = self._og_search_thumbnail(webpage) + if not thumbnails: + thumbnails = self._og_search_thumbnail(webpage) return { 'id': video_id, diff --git a/yt_dlp/extractor/vlive.py b/yt_dlp/extractor/vlive.py index 4340b1d4c9..8fccf1b63b 100644 --- a/yt_dlp/extractor/vlive.py +++ b/yt_dlp/extractor/vlive.py @@ -12,6 +12,7 @@ from ..compat import ( from ..utils import ( ExtractorError, int_or_none, + LazyList, merge_dicts, str_or_none, strip_or_none, @@ -363,11 +364,10 @@ class VLiveChannelIE(VLiveBaseIE): if board.get('boardType') not in ('STAR', 'VLIVE_PLUS'): raise ExtractorError(f'Board {board_name!r} is not supported', expected=True) - entries = self._entries(posts_id or channel_id, board_name) - first_video = next(entries) - channel_name = first_video['channel'] + entries = LazyList(self._entries(posts_id or channel_id, board_name)) + channel_name = entries[0]['channel'] return self.playlist_result( - itertools.chain([first_video], entries), + entries, f'{channel_id}-{posts_id}' if posts_id else channel_id, f'{channel_name} - {board_name}' if channel_name and board_name else channel_name) diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py index 25554c8625..7bcd6e7dc6 100644 --- a/yt_dlp/extractor/youtube.py +++ b/yt_dlp/extractor/youtube.py @@ -4429,7 +4429,7 @@ class YoutubeYtUserIE(InfoExtractor): def _real_extract(self, url): user_id = self._match_id(url) return self.url_result( - 'https://www.youtube.com/user/%s' % user_id, + 'https://www.youtube.com/user/%s/videos' % user_id, ie=YoutubeTabIE.ie_key(), video_id=user_id) diff --git a/yt_dlp/postprocessor/__init__.py b/yt_dlp/postprocessor/__init__.py index 07c87b76a8..4ae230d2f2 100644 --- a/yt_dlp/postprocessor/__init__.py +++ b/yt_dlp/postprocessor/__init__.py @@ -2,6 +2,7 @@ from ..utils import load_plugins +from .common import PostProcessor from .embedthumbnail import EmbedThumbnailPP from .exec import ExecPP, ExecAfterDownloadPP from .ffmpeg import ( @@ -39,5 +40,5 @@ def get_postprocessor(key): return globals()[key + 'PP'] -__all__ = [name for name in globals().keys() if name.endswith('IE')] -__all__.append('FFmpegPostProcessor') +__all__ = [name for name in globals().keys() if name.endswith('PP')] +__all__.extend(('PostProcessor', 'FFmpegPostProcessor')) diff --git a/yt_dlp/utils.py b/yt_dlp/utils.py index cd453f3675..f07eef61f0 100644 --- a/yt_dlp/utils.py +++ b/yt_dlp/utils.py @@ -6586,5 +6586,5 @@ def number_of_digits(number): def join_nonempty(*values, delim='-', from_dict=None): if from_dict is not None: - values = operator.itemgetter(values)(from_dict) + values = map(from_dict.get, values) return delim.join(map(str, filter(None, values)))