diff --git a/instaloader/instaloader.py b/instaloader/instaloader.py index 6d08c8b..773b51a 100644 --- a/instaloader/instaloader.py +++ b/instaloader/instaloader.py @@ -856,7 +856,7 @@ class Instaloader: """ self.context.log("Retrieving saved posts...") assert self.context.username is not None # safe due to @_requires_login; required by typechecker - node_iterator = Profile.from_username(self.context, self.context.username).get_saved_posts() + node_iterator = Profile.own_profile(self.context).get_saved_posts() self.posts_download_loop(node_iterator, ":saved", fast_update, post_filter, max_count=max_count, total_count=node_iterator.count) diff --git a/instaloader/nodeiterator.py b/instaloader/nodeiterator.py index c74b88c..c72fe46 100644 --- a/instaloader/nodeiterator.py +++ b/instaloader/nodeiterator.py @@ -81,11 +81,13 @@ class NodeIterator(Iterator[T]): self._node_wrapper = node_wrapper self._query_variables = query_variables if query_variables is not None else {} self._query_referer = query_referer - self._data = first_data self._page_index = 0 self._total_index = 0 - self._best_before = (None if first_data is None else - datetime.now() + NodeIterator._shelf_life) + if first_data is not None: + self._data = first_data + self._best_before = datetime.now() + NodeIterator._shelf_life + else: + self._data = self._query() def _query(self, after: Optional[str] = None) -> Dict: pagination_variables = {'first': NodeIterator._graphql_page_length} # type: Dict[str, Any] @@ -113,8 +115,6 @@ class NodeIterator(Iterator[T]): return self def __next__(self) -> T: - if self._data is None: - self._data = self._query() if self._page_index < len(self._data['edges']): node = self._data['edges'][self._page_index]['node'] page_index, total_index = self._page_index, self._total_index @@ -193,8 +193,12 @@ class NodeIterator(Iterator[T]): self._query_referer != frozen.query_referer or self._context.username != frozen.context_username): raise InvalidArgumentException("Mismatching resume information.") + if not frozen.best_before: + raise InvalidArgumentException("\"best before\" date missing.") + if frozen.remaining_data is None: + raise InvalidArgumentException("\"remaining_data\" missing.") self._total_index = frozen.total_index - self._best_before = datetime.fromtimestamp(frozen.best_before) if frozen.best_before else None + self._best_before = datetime.fromtimestamp(frozen.best_before) self._data = frozen.remaining_data diff --git a/instaloader/structures.py b/instaloader/structures.py index 6c53071..430aebb 100644 --- a/instaloader/structures.py +++ b/instaloader/structures.py @@ -579,6 +579,17 @@ class Profile: context.profile_id_cache[profile_id] = profile return profile + @classmethod + def own_profile(cls, context: InstaloaderContext): + """Return own profile if logged-in. + + :param context: :attr:`Instaloader.context` + + .. versionadded:: 4.5.2""" + if not context.is_logged_in: + raise LoginRequiredException("--login required to access own profile.") + return cls(context, context.graphql_query("d6f4427fbe92d846298cf93df0b937d3", {})["data"]["user"]) + def _asdict(self): json_node = self._node.copy() # remove posts to avoid "Circular reference detected" exception @@ -802,7 +813,6 @@ class Profile: if self.username != self._context.username: raise LoginRequiredException("--login={} required to get that profile's saved posts.".format(self.username)) - self._obtain_metadata() return NodeIterator( self._context, 'f883d95537fbcd400f466f63d42bd8a1', @@ -810,7 +820,6 @@ class Profile: lambda n: Post(self._context, n), {'id': self.userid}, 'https://www.instagram.com/{0}/'.format(self.username), - self._metadata('edge_saved_media'), ) def get_tagged_posts(self) -> NodeIterator[Post]: