From 17e1d257849186801bd08ebcff9ef30459552968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Mon, 2 Feb 2026 09:09:50 +0100 Subject: [PATCH] [scrolller] add 'user' extractor (#8961) --- docs/supportedsites.md | 2 +- gallery_dl/extractor/scrolller.py | 26 +++++++++++ .../extractor/utils/scrolller_graphql.py | 33 ++++++++++++++ scripts/supportedsites.py | 1 + test/results/scrolller.py | 45 +++++++++++++++++++ 5 files changed, 106 insertions(+), 1 deletion(-) diff --git a/docs/supportedsites.md b/docs/supportedsites.md index e6caa176..481024eb 100644 --- a/docs/supportedsites.md +++ b/docs/supportedsites.md @@ -988,7 +988,7 @@ Consider all listed sites to potentially be NSFW. Scrolller https://scrolller.com/ - Followed Subreddits, Posts, Subreddits + Followed Subreddits, Posts, Subreddits, Reddit Users Supported diff --git a/gallery_dl/extractor/scrolller.py b/gallery_dl/extractor/scrolller.py index a48fdb60..b4693ae8 100644 --- a/gallery_dl/extractor/scrolller.py +++ b/gallery_dl/extractor/scrolller.py @@ -170,6 +170,32 @@ class ScrolllerSubredditExtractor(ScrolllerExtractor): "SubredditChildrenQuery", variables, subreddit["children"]) +class ScrolllerUserExtractor(ScrolllerExtractor): + """Extractor for media from a scrolller Reddit user""" + subcategory = "user" + directory_fmt = ("{category}", "User", "{posted_by}") + pattern = BASE_PATTERN + r"/reddit-user/([^/?#]+)(?:/?\?([^#]+))?" + example = "https://scrolller.com/reddit-user/USER" + + def posts(self): + query = "UserPostsQuery" + variables = { + "username": text.unquote(self.groups[0]), + "iterator": None, + "limit" : 40, + "filter" : None, + "sortBy" : "RANDOM", + "isNsfw" : True, + } + + posts = self._request_graphql(query, variables)["getUserPosts"] + if not posts.get("items"): + posts = None + variables["isNsfw"] = False + + return self._pagination(query, variables, posts) + + class ScrolllerFollowingExtractor(ScrolllerExtractor): """Extractor for followed scrolller subreddits""" subcategory = "following" diff --git a/gallery_dl/extractor/utils/scrolller_graphql.py b/gallery_dl/extractor/utils/scrolller_graphql.py index bb7d1d7d..115766cc 100644 --- a/gallery_dl/extractor/utils/scrolller_graphql.py +++ b/gallery_dl/extractor/utils/scrolller_graphql.py @@ -25,6 +25,39 @@ query SubredditPostQuery( } """ +UserPostsQuery = """\ +query UserPostsQuery( + $username: String! + $iterator: String + $limit: Int! + $filter: GalleryFilter + $sortBy: GallerySortBy + $isNsfw: Boolean +) { + getUserPosts( + data: { + username: $username + iterator: $iterator + limit: $limit + filter: $filter + sortBy: $sortBy + isNsfw: $isNsfw + } + ) { + iterator items { + __typename id url title posted_by reddit_posted_by subredditId + subredditTitle subredditUrl subredditIsFollowing redditPath isNsfw + hasAudio fullLengthSource gfycatSource redgifsSource ownerAvatar + username displayName favoriteCount isPaid tags commentsCount + commentsRepliesCount duration createdAt isFavorite + albumContent { mediaSources { url width height isOptimized } } + mediaSources { url width height isOptimized } + blurredMediaSources { url width height isOptimized type } + } + } +} +""" + SubredditQuery = """\ query SubredditQuery( $url: String! diff --git a/scripts/supportedsites.py b/scripts/supportedsites.py index 96c30de9..f62aea8b 100755 --- a/scripts/supportedsites.py +++ b/scripts/supportedsites.py @@ -414,6 +414,7 @@ SUBCATEGORY_MAP = { "books": "Book Searches", }, "scrolller": { + "user" : "Reddit Users", "following": "Followed Subreddits", }, "sexcom": { diff --git a/test/results/scrolller.py b/test/results/scrolller.py index bed3e1cf..cebec5f9 100644 --- a/test/results/scrolller.py +++ b/test/results/scrolller.py @@ -115,4 +115,49 @@ __tests__ = ( "#auth" : True, }, +{ + "#url" : "https://scrolller.com/reddit-user/Jonttufromesbo", + "#class" : scrolller.ScrolllerUserExtractor, + "#pattern" : ( + r"https://images\.scrolller\.com/\w+/cabin-in-northern-finland-93vjsuxmcz.jpg", + r"https://images\.scrolller\.com/\w+/northern-lights-in-northern-finland-6ibp3516z1.jpg", + ), + + "blurredMediaSources": [], + "commentsCount" : 0, + "commentsRepliesCount": 0, + "count" : 1, + "createdAt" : "iso:8601", + "displayName" : None, + "duration" : None, + "extension" : "jpg", + "favoriteCount" : 0, + "filename" : str, + "fullLengthSource": None, + "gfycatSource" : None, + "hasAudio" : False, + "width" : {1080, 2048}, + "height" : {1350, 1638}, + "id" : {10478722, 32426595}, + "isFavorite" : False, + "isNsfw" : False, + "isOptimized" : False, + "isPaid" : False, + "num" : 0, + "ownerAvatar" : None, + "posted_by" : "Jonttufromesbo", + "redditPath" : r"re:/r/AmateurPhotography/comments/\w+/\w+/", + "reddit_posted_by": "Jonttufromesbo", + "redgifsSource" : None, + "subredditId" : 413, + "subredditIsFollowing": False, + "subredditTitle" : "AmateurPhotography", + "subredditUrl" : "/r/AmateurPhotography", + "tags" : None, + "title" : str, + "url" : "re:https://images.scrolller.com/.+", + "username" : "", + "mediaSources" : list +}, + )