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):
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 = {}
class InstagramIOSIE(InfoExtractor):
+ IE_DESC = 'IOS instagram:// URL'
_VALID_URL = r'instagram://media\?id=(?P<id>[\d_]+)'
_TESTS = [{
'url': 'instagram://media?id=482584233761418119',
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
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,
from ..utils import (
ExtractorError,
int_or_none,
+ LazyList,
merge_dicts,
str_or_none,
strip_or_none,
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)
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)
from ..utils import load_plugins
+from .common import PostProcessor
from .embedthumbnail import EmbedThumbnailPP
from .exec import ExecPP, ExecAfterDownloadPP
from .ffmpeg import (
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'))
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)))