From 0b49712b62315ae522e444ae57871bd489aa81e2 Mon Sep 17 00:00:00 2001 From: CasualYouTuber31 <21147925+CasualYT31@users.noreply.github.com> Date: Wed, 4 Feb 2026 06:24:21 +0000 Subject: [PATCH] [tiktok] use time cursor for story requests (#8991) --- gallery_dl/extractor/tiktok.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/gallery_dl/extractor/tiktok.py b/gallery_dl/extractor/tiktok.py index a60277c7..e183fec4 100644 --- a/gallery_dl/extractor/tiktok.py +++ b/gallery_dl/extractor/tiktok.py @@ -914,19 +914,22 @@ class TiktokPaginationCursor: class TiktokTimeCursor(TiktokPaginationCursor): - def __init__(self, *, reverse=True): + def __init__(self, *, reverse=True, has_more_attribute="hasMore", + cursor_attribute="cursor"): super().__init__() self.cursor = 0 # If we expect the cursor to go up or down as we go to the next page. # True for down, False for up. self.reverse = reverse + self.has_more_key = has_more_attribute + self.cursor_key = cursor_attribute def current_page(self): return self.cursor def next_page(self, data, query_parameters): skip_fallback_logic = self.cursor == 0 - new_cursor = int(data.get("cursor", 0)) + new_cursor = int(data.get(self.cursor_key, 0)) no_cursor = not new_cursor if not skip_fallback_logic: # If the new cursor doesn't go in the direction we expect, use the @@ -938,7 +941,7 @@ class TiktokTimeCursor(TiktokPaginationCursor): elif no_cursor: raise exception.ExtractionError("Could not extract next cursor") self.cursor = new_cursor - return not data.get("hasMore", False) + return not data.get(self.has_more_key, False) def fallback_cursor(self, data): try: @@ -968,6 +971,12 @@ class TiktokPopularTimeCursor(TiktokTimeCursor): return -50_000 +class TiktokStoryTimeCursor(TiktokTimeCursor): + def __init__(self): + super().__init__(reverse=False, has_more_attribute="HasMoreAfter", + cursor_attribute="MaxCursor") + + class TiktokLegacyTimeCursor(TiktokPaginationCursor): def __init__(self): super().__init__() @@ -1472,7 +1481,7 @@ class TiktokStoryItemListRequest(TiktokItemListRequest): assert query_parameters["loadBackward"] in ["true", "false"] def cursor_type(self, query_parameters): - return TiktokItemCursor + return TiktokStoryTimeCursor class TiktokStoryBatchItemListRequest(TiktokItemListRequest):