From f94eedbe1dcf2812db81a3901a4d8043841ef5da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Sun, 7 Sep 2025 17:33:32 +0200 Subject: [PATCH] [twitter] continue searches on empty response (#8173) stop when receiving more than 3 empty responses in a row --- gallery_dl/extractor/twitter.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/gallery_dl/extractor/twitter.py b/gallery_dl/extractor/twitter.py index c919cb82..7f58e6d1 100644 --- a/gallery_dl/extractor/twitter.py +++ b/gallery_dl/extractor/twitter.py @@ -1447,7 +1447,8 @@ class TwitterAPI(): "includePromotedContent": False, } return self._pagination_tweets( - endpoint, variables, ("bookmark_timeline_v2", "timeline"), False) + endpoint, variables, ("bookmark_timeline_v2", "timeline"), + stop_tweets=128) def search_timeline(self, query, product="Latest"): endpoint = "/graphql/4fpceYZ6-YQCx_JSl_Cn_A/SearchTimeline" @@ -1460,7 +1461,8 @@ class TwitterAPI(): } return self._pagination_tweets( endpoint, variables, - ("search_by_raw_query", "search_timeline", "timeline")) + ("search_by_raw_query", "search_timeline", "timeline"), + stop_tweets=3) def community_query(self, community_id): endpoint = "/graphql/2W09l7nD7ZbxGQHXvfB22w/CommunityQuery" @@ -1870,11 +1872,12 @@ class TwitterAPI(): params["cursor"] = extr._update_cursor(cursor) def _pagination_tweets(self, endpoint, variables, - path=None, stop_tweets=True, + path=None, stop_tweets=0, features=None, field_toggles=None): extr = self.extractor original_retweets = (extr.retweets == "original") pinned_tweet = extr.pinned + stop_tweets_max = stop_tweets params = {"variables": None} if cursor := extr._init_cursor(): @@ -2067,8 +2070,15 @@ class TwitterAPI(): tweet.get("rest_id")) continue - if stop_tweets and not tweet: - return extr._update_cursor(None) + if tweet: + stop_tweets = stop_tweets_max + else: + if stop_tweets <= 0: + return extr._update_cursor(None) + self.log.debug( + "No Tweet results (%s/%s)", + stop_tweets_max - stop_tweets + 1, stop_tweets_max) + stop_tweets -= 1 if not cursor or cursor == variables.get("cursor"): return extr._update_cursor(None) variables["cursor"] = extr._update_cursor(cursor)