diff --git a/.pylintrc b/.pylintrc index 1d438dc..73fb4e1 100644 --- a/.pylintrc +++ b/.pylintrc @@ -351,7 +351,7 @@ single-line-if-stmt=no allow-any-import-level= # Allow explicit reexports by alias from a package __init__. -allow-reexport-from-package=no +allow-reexport-from-package=yes # Allow wildcard imports from modules that define __all__. allow-wildcard-with-all=no diff --git a/instaloader/__init__.py b/instaloader/__init__.py index 39e7538..5f6bb20 100644 --- a/instaloader/__init__.py +++ b/instaloader/__init__.py @@ -1,7 +1,7 @@ """Download pictures (or videos) along with their captions and other metadata from Instagram.""" -__version__ = '4.12' +__version__ = '4.12.2' try: @@ -13,11 +13,26 @@ else: win_unicode_console.enable() from .exceptions import * -from .instaloader import Instaloader -from .instaloadercontext import InstaloaderContext, RateController -from .lateststamps import LatestStamps -from .nodeiterator import NodeIterator, FrozenNodeIterator, resumable_iteration -from .structures import (Hashtag, Highlight, Post, PostSidecarNode, PostComment, PostCommentAnswer, PostLocation, - Profile, Story, StoryItem, TopSearchResults, TitlePic, - load_structure_from_file, save_structure_to_file, - load_structure, get_json_structure) +from .instaloader import Instaloader as Instaloader +from .instaloadercontext import (InstaloaderContext as InstaloaderContext, + RateController as RateController) +from .lateststamps import LatestStamps as LatestStamps +from .nodeiterator import (NodeIterator as NodeIterator, + FrozenNodeIterator as FrozenNodeIterator, + resumable_iteration as resumable_iteration) +from .structures import (Hashtag as Hashtag, + Highlight as Highlight, + Post as Post, + PostSidecarNode as PostSidecarNode, + PostComment as PostComment, + PostCommentAnswer as PostCommentAnswer, + PostLocation as PostLocation, + Profile as Profile, + Story as Story, + StoryItem as StoryItem, + TopSearchResults as TopSearchResults, + TitlePic as TitlePic, + load_structure_from_file as load_structure_from_file, + save_structure_to_file as save_structure_to_file, + load_structure as load_structure, + get_json_structure as get_json_structure) diff --git a/instaloader/instaloader.py b/instaloader/instaloader.py index 344f51c..30ea42b 100644 --- a/instaloader/instaloader.py +++ b/instaloader/instaloader.py @@ -722,7 +722,7 @@ class Instaloader: # Download the image(s) / video thumbnail and videos within sidecars if desired downloaded = True if post.typename == 'GraphSidecar': - if self.download_pictures or self.download_videos: + if (self.download_pictures or self.download_videos) and post.mediacount > 0: if not _all_already_downloaded( filename_template, enumerate( (post.get_is_videos()[i] diff --git a/instaloader/nodeiterator.py b/instaloader/nodeiterator.py index 37544d7..2c8b583 100644 --- a/instaloader/nodeiterator.py +++ b/instaloader/nodeiterator.py @@ -7,7 +7,7 @@ from datetime import datetime, timedelta from lzma import LZMAError from typing import Any, Callable, Dict, Iterable, Iterator, NamedTuple, Optional, Tuple, TypeVar -from .exceptions import AbortDownloadException, InvalidArgumentException, QueryReturnedBadRequestException +from .exceptions import AbortDownloadException, InvalidArgumentException from .instaloadercontext import InstaloaderContext class FrozenNodeIterator(NamedTuple): @@ -66,7 +66,7 @@ class NodeIterator(Iterator[T]): See also :func:`resumable_iteration` for a high-level context manager that handles a resumable iteration. """ - _graphql_page_length = 50 + _graphql_page_length = 12 _shelf_life = timedelta(days=29) def __init__(self, @@ -98,23 +98,13 @@ class NodeIterator(Iterator[T]): pagination_variables: Dict[str, Any] = {'first': NodeIterator._graphql_page_length} if after is not None: pagination_variables['after'] = after - try: - data = self._edge_extractor( - self._context.graphql_query( - self._query_hash, {**self._query_variables, **pagination_variables}, self._query_referer - ) + data = self._edge_extractor( + self._context.graphql_query( + self._query_hash, {**self._query_variables, **pagination_variables}, self._query_referer ) - self._best_before = datetime.now() + NodeIterator._shelf_life - return data - except QueryReturnedBadRequestException: - new_page_length = int(NodeIterator._graphql_page_length / 2) - if new_page_length >= 12: - NodeIterator._graphql_page_length = new_page_length - self._context.error("HTTP Error 400 (Bad Request) on GraphQL Query. Retrying with shorter page length.", - repeat_at_end=False) - return self._query(after) - else: - raise + ) + self._best_before = datetime.now() + NodeIterator._shelf_life + return data def __iter__(self): return self